19

私はこのイメージを持っています。これは英国の地図です (南アイルランドを除く):

イギリスの地図

緯度と経度を取得し、英国の左端の経度と右端の経度を取得し、それらを使用してマップ上のポイントを配置する場所を計算することで、このマップにプロットすることに成功しました。

これはコードです (Processing.js で使用しますが、js などとして使用できます):

// Size of the map
int width = 538;
int height = 811;
// X and Y boundaries
float westLong = -8.166667;
float eastLong = 1.762833;
float northLat = 58.666667;
float southLat = 49.95;

void drawPoint(float latitude, float longitude){

 fill(#000000);

 x = width * ((westLong-longitude)/(westLong-eastLong));
 y = (height * ((northLat-latitude)/(northLat-southLat)));

 console.log(x + ", " + y);
 ellipseMode(RADIUS);
 ellipse(x, y, 2, 2);    

}

ただし、これらの値にメルカトル図法を実装することはできませんでした。プロットはかなり正確ですが、十分ではなく、この投影で解決できます。

私はそれを行う方法を理解できません。私が見つけたすべての例は、全世界でそれを行う方法を説明しています. これは、プロジェクションを実装する方法を説明する例の良いリソースですが、私はそれを機能させることができませんでした.

もう 1 つのリソースは、英国の境界ボックスの緯度と経度の値を取得した英国の極値です。それらはここにもあります:

northLat = 58.666667; 
northLong = -3.366667; 
eastLat = 52.481167; 
eastLong = 1.762833; 
southLat = 49.95;
southLong = -5.2; 
westLat = 54.45;
westLong = -8.166667;

誰かがこれで私を助けることができれば、私はそれを大いに感謝します!

ありがとう

4

10 に答える 10

46

あなたが探していたものを正確に実行する関数を作成しました。少し遅いのはわかっていますが、他にも興味を持っている人がいるかもしれません。

メルカトル図法である地図が必要で、地図の緯度/経度の位置を知る必要があります。MapBoxの無料ソフトウェアであるTileMillから、緯度/経度位置が完全に一致する、カスタマイズされた優れたメルカトル図法を取得できます。

私はこのスクリプトを使用しており、いくつかの Google Earth の位置でテストしました。ピクセルレベルで完璧に機能しました。実際、私はこれを別のマップまたはより大きなマップでテストしませんでした。お役に立てば幸いです。

ラファエル ;)

<?php

$mapWidth = 1500;
$mapHeight = 1577;

$mapLonLeft = 9.8;
$mapLonRight = 10.2;
$mapLonDelta = $mapLonRight - $mapLonLeft;

$mapLatBottom = 53.45;
$mapLatBottomDegree = $mapLatBottom * M_PI / 180;

function convertGeoToPixel($lat, $lon)
{
    global $mapWidth, $mapHeight, $mapLonLeft, $mapLonDelta, $mapLatBottom, $mapLatBottomDegree;

    $x = ($lon - $mapLonLeft) * ($mapWidth / $mapLonDelta);

    $lat = $lat * M_PI / 180;
    $worldMapWidth = (($mapWidth / $mapLonDelta) * 360) / (2 * M_PI);
    $mapOffsetY = ($worldMapWidth / 2 * log((1 + sin($mapLatBottomDegree)) / (1 - sin($mapLatBottomDegree))));
    $y = $mapHeight - (($worldMapWidth / 2 * log((1 + sin($lat)) / (1 - sin($lat)))) - $mapOffsetY);

    return array($x, $y);
}

$position = convertGeoToPixel(53.7, 9.95);
echo "x: ".$position[0]." / ".$position[1];

?>

以下は、TileMill で作成し、この例で使用した画像です。地図画像

于 2012-05-01T17:36:23.243 に答える
12

Raphael Wichmann が投稿したものに加えて (ちなみにありがとう!)、 actionscript の逆関数は次のとおりです。

function convertPixelToGeo(tx:Number, ty:Number):Point
{   
    /* called worldMapWidth in Raphael's Code, but I think that's the radius since it's the map width or circumference divided by 2*PI  */   
    var worldMapRadius:Number = mapWidth / mapLonDelta * 360/(2 * Math.PI);     
    var mapOffsetY:Number = ( worldMapRadius / 2 * Math.log( (1 + Math.sin(mapLatBottomRadian) ) / (1 - Math.sin(mapLatBottomRadian))  ));
    var equatorY:Number = mapHeight + mapOffsetY;   
    var a:Number = (equatorY-ty)/worldMapRadius;

    var lat:Number = 180/Math.PI * (2 * Math.atan(Math.exp(a)) - Math.PI/2);
    var long:Number = mapLonLeft+tx/mapWidth*mapLonDelta;
    return new Point(lat,long);
}
于 2012-11-10T16:04:30.803 に答える
9

Raphael から提供された PHP コードを JavaScript に変換したところ、それが機能し、このコードが自分で機能することを確認できました。ラファエルのすべての功績。

/*
var mapWidth = 1500;
var mapHeight = 1577;

var mapLonLeft = 9.8;
var mapLonRight = 10.2;
var mapLonDelta = mapLonRight - mapLonLeft;

var mapLatBottom = 53.45;
var mapLatBottomDegree = mapLatBottom * Math.PI / 180;
*/

function convertGeoToPixel(latitude, longitude ,
                           mapWidth , // in pixels
                           mapHeight , // in pixels
                           mapLonLeft , // in degrees
                           mapLonDelta , // in degrees (mapLonRight - mapLonLeft);
                           mapLatBottom , // in degrees
                           mapLatBottomDegree) // in Radians
{
    var x = (longitude - mapLonLeft) * (mapWidth / mapLonDelta);

    latitude = latitude * Math.PI / 180;
    var worldMapWidth = ((mapWidth / mapLonDelta) * 360) / (2 * Math.PI);
    var mapOffsetY = (worldMapWidth / 2 * Math.log((1 + Math.sin(mapLatBottomDegree)) / (1 - Math.sin(mapLatBottomDegree))));
    var y = mapHeight - ((worldMapWidth / 2 * Math.log((1 + Math.sin(latitude)) / (1 - Math.sin(latitude)))) - mapOffsetY);

    return { "x": x , "y": y};
}
于 2014-12-05T09:51:29.097 に答える
8

すべての平面地図がメルカトル図法であるとは限らないことに注意してください。特にそのマップについて詳しく知らないと、確かなことはわかりません。世界の小さな領域のほとんどのマップは、円錐型の投影である可能性が高く、マップ上の関心のある領域は、グローバル メルカトル図法よりも「平坦」です。これは、赤道から遠ざかるほど特に重要になります (そして、英国はそれが問題になるほど十分に離れています)。

試行している計算を使用して「十分に近づける」ことができる場合がありますが、最高の精度を得るには、適切に定義された投影法を持つマップを使用するか、独自のマップを作成することをお勧めします。

于 2010-01-20T18:41:22.017 に答える
4

少し前に質問されたことは知っていますが、Proj4JS ライブラリは、JavaScript で異なる地図投影法を変換するのに理想的です。

英国の地図は、横メルカトル図法に基づく OSGB の National Grid を使用する傾向があります。すなわち。従来のメルカトル図法に似ていますが、「赤道」が子午線になるように 90 度回転しています。

于 2010-11-18T22:48:03.070 に答える
0

Proj4JS 固有の緯度/経度投影の厄介な側面を回避したい場合は、D3 を使用できます。D3 は、多くの組み込み投影を提供し、美しくレンダリングします。これは、方位図法のいくつかのフレーバーのインタラクティブな例です。私は、USA マップには Albers を好みます。

D3 がエンド ユーザーのオプションでない場合 (たとえば、IE 7/8 をサポートする必要がある場合)、D3 でレンダリングし、D3 が生成する結果の SVG ファイルから xy 座標を取得できます。次に、それらの xy 座標を Raphael でレンダリングできます。

于 2012-11-10T16:36:02.627 に答える