当给出左上角和右下角'lat / lon时WGS-84 lat / lon时获取地图位置

时间:2009-09-12 15:28:36

标签: mapping wgs84

假设我有一张地图,例如来自openstreetmaps.org。 我知道地图左上角和右下角的WGS-84纬度/经度。 如何从给定的WGS-84纬度/经度坐标中找到地图上的其他位置?

1 个答案:

答案 0 :(得分:4)

如果地图大致是街道/城市级别,使用mercator projection(如openstreetmap.org似乎),并且不太靠近极点,线性插值可能足够准确。假设如下:

  • TL =左上角的纬度/经度
  • BR =右下角的lat / lon
  • 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)

常见问题:

  • 纬度/经度表示法约定纬度优先和经度秒,即“水平”之前的“垂直”。这与图像坐标的常见x,y表示法相反。

  • 向北方向(“向上”)移动时纬度值会增加,而在向下移动时,地图图像中的y坐标可能会增加。

  • 如果地图覆盖的区域较大,则线性插值对于纬度不会那么准确。对于跨越一个纬度并且位于地球可居住区域(例如海湾区域)的地图,中心纬度将偏离0.2%左右,这可能小于一个像素(取决于大小)< / 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!这是括号的四个级别!)已知 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