假设我有一张地图,例如来自openstreetmaps.org。 我知道地图左上角和右下角的WGS-84纬度/经度。 如何从给定的WGS-84纬度/经度坐标中找到地图上的其他位置?
答案 0 :(得分:4)
如果地图大致是街道/城市级别,使用mercator projection(如openstreetmap.org似乎),并且不太靠近极点,线性插值可能足够准确。假设如下:
,我们可以将对应于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