您需要更多信息,而不仅仅是一个纬度/经度对才能做到这一点。
在这个阶段,您提供的信息缺少两件事:
- 您的图像覆盖了多大的区域(以纬度/经度计)?根据您提供的信息,我不知道图像显示的区域是一米宽还是一公里宽。
- 您的参考坐标(-37.803134、145.132377)指的是图像上的哪个点?它是角落之一吗?中间某处?
我还将假设您的图像是南北对齐的 - 例如,它没有指向左上角的北。这往往会使事情复杂化。
最简单的方法是准确计算出 (0, 0) 像素和 (1017, 915) 像素对应的纬度/经度坐标。然后您可以通过插值计算出与给定纬度/经度坐标对应的像素。
为了简要概述该过程,假设您的 (-37.803134, 145.132377) lat/lon 对应于您的 (0, 0) 像素,并且您发现您的 (1017, 915) 像素对应于 lat/lon (- 37.798917、145.138535)。假设像素 (0, 0) 在左下角的通常约定,这意味着北在图像中向上。
然后,如果您对目标坐标(-37.801465, 145.134984)感兴趣,您可以计算出图像上对应的像素数,如下所示:
pixelY = ((targetLat - minLat) / (maxLat - minLat)) * (maxYPixel - minYPixel)
= ((-37.801465 - -37.803134) / (-37.798917 - -37.803134)) * (915 - 0)
= 362.138
也就是说,对应的像素是距离图像底部362个像素。然后,您可以对水平像素位置执行完全相同的操作,但使用经度和 X 像素。
该部分计算((targetLat - minLat) / (maxLat - minLat))
出您在两个参考坐标之间的距离,并给出 0 表示您在第一个坐标,1 表示第二个坐标,中间的数字表示中间的位置。因此,例如,它将产生 0.25 表示您在两个参考坐标之间向北的 25%。最后一位将其转换为等效像素。
!
编辑好的,根据您的评论,我可以更具体一点。鉴于您似乎使用左上角作为主要参考点,我将使用以下定义:
minLat = -37.803134
maxLat = -37.806232
MAP_HEIGHT = 916
然后,如果我们使用示例坐标 (-37.804465, 145.134984),则相应像素相对于左上角的 Y 坐标为:
pixelY = ((targetLat - minLat) / (maxLat - minLat)) * (MAP_HEIGHT - 1)
= ((-37.804465 - -37.803134) / (-37.806232 - -37.803134)) * 915
= 393.11
因此,对应的像素是从顶部向下 393 个像素。我会让你自己计算出水平等价物——基本上是一样的。注意-1
带是因为如果MAP_HEIGHT
从零开始,最大像素数是 915,而不是 916。
编辑:我想借此机会指出的一件事是这是一个近似值。实际上,纬度和经度坐标与其他形式的笛卡尔坐标之间没有简单的线性关系,原因有很多,包括制作地图时使用的投影,以及地球不是一个完美的球体这一事实。在小范围内,这种近似值足够接近,不会产生显着差异,但在更大的范围内,差异可能会变得很明显。根据您的需要,YMMV。(感谢 uray,他在下面的回答提醒了我就是这种情况)。