要做到这一点,您需要更多信息,而不仅仅是一个纬度/经度对。
在这个阶段,您提供的信息缺少两点:
- 您的图像覆盖的区域有多大(以纬度/经度计)?根据您提供的信息,我不知道图片显示的区域是一米宽还是一公里宽。
- 您的参考坐标(-37.803134、145.132377)指的是图像上的哪个点?它是角落之一吗?在中间的某个地方?
我还将假设您的图像是南北对齐的 - 例如,它没有指向左上角的北。这往往会使事情复杂化。
最简单的方法是准确计算出 (0, 0) 像素和 (1017, 915) 像素对应的纬度/经度坐标。然后你可以通过interpolation找出给定lat/lon坐标对应的像素。
为了简要概述该过程,假设您的 (-37.803134, 145.132377) lat/lon 对应于您的 (0, 0) 像素,并且您发现您的 (1017, 915) 像素对应于 lat/朗(-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%。最后一位将其转换为等效像素。
HTH!
编辑好的,根据您的评论,我可以更具体一点。鉴于您似乎使用左上角作为主要参考点,我将使用以下定义:
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,他在下面的回答提醒了我就是这种情况)。