左上隅と右下隅の緯度/経度が指定されている場合、WGS-84緯度/経度で地図の位置を取得
質問
たとえば、openstreetmaps.orgからの地図があるとします。 地図の左上隅と右下隅のWGS-84緯度/経度を知っています。 特定のWGS-84緯度/経度座標から地図上の他の位置を見つけるにはどうすればよいですか?
解決
マップがおおよそ通り/都市レベルである場合、メルカトル図法を使用します(< a href = "http://www.openstreetmap.org" rel = "nofollow noreferrer"> openstreetmap.org のように思われますが、極に近すぎないため、線形補間は十分に正確です。次のことを想定しています:
- TL =左上隅の緯度/経度
- BR =右下隅の緯度/経度
- P =地図上で探したい地点の緯度/経度
- (w、h)=持っている地図の幅と高さ(ピクセル?)
- マップ画像の原点(0,0)は、左上隅にあります
、Pに対応する(x、y)位置を次のように補間できます:
x = w * (P.lon - TL.lon) / (BR.lon - TL.lon)
y = h * (P.lat - TL.lat) / (BR.lat - TL.lat)
よくある落とし穴:
-
緯度/経度表記規則では、緯度が最初に、経度が2番目にリストされています。 「水平」の前。これは、画像座標の一般的なX、Y表記とは逆です。
-
北方向(「アップ」)に進むと緯度の値が増加しますが、ダウンするとマップ画像のy座標が増加する場合があります。
-
マップがより広いエリアをカバーしている場合、線形補間は緯度に対して正確ではありません。 1度の緯度にまたがり、地球の居住可能なゾーン(たとえば、ベイエリア)にあるマップの場合、中心緯度は0.2%程度ずれています。これは、1ピクセル未満(サイズによって異なります) / p>
それがあなたのニーズに十分に正確であれば、ここでやめることができます!
Pの緯度からピクセルのy位置までのより正確な計算は、メルカトル計算から始まります。緯度P.latの場合、赤道で始まる投影上のY位置は次のようになります(探しているy値とは異なり、Yは赤道で始まり、増加するため、大文字のYを使用します北に向かって):
Y = k * ln((1 + sin(P.lat)) / (1 - sin(P.lat)))
定数 k は、マップの垂直スケーリングに依存しますが、これは不明な場合があります。幸いなことに、y(TL)-y(BR)= hであることを推測できます。それは私たちを取得します:
k = h / (ln((1 + sin(TL.lat)) / (1 - sin(TL.lat))) - ln((1 + sin(BR.lat)) / (1 - sin(BR.lat))))
(yikes!これは括弧の4つのレベルです!) k がわかっていれば、任意の緯度のY位置を見つけるための式ができました。 (1)y値は赤道ではなくTL.latから始まり、(2)yは北ではなく南に向かって増加します。これにより、次のことがわかります。
Y(TL.lat) = k * ln((1 + sin(TL.lat)) / (1 - sin(TL.lat)))
Y(P.lat) = k * ln((1 + sin(P.lat )) / (1 - sin(P.lat )))
y(P.lat) = -(Y(P.lat) - Y(TL.lat))
これにより、次のことがわかります。
x = w * (P.lon - TL.lon) / (BR.lon - TL.lon) // like before
y = -(Y(P.lat) - Y(TL.lat)) // where Y(anything) depends just on h, TL.lat and BR.lat