为了完成此任务,您需要比一个纬度/经度对更多的信息。
在这个阶段,您提供的信息缺少两个方面:
- 您的图像覆盖的区域有多大(以纬度/经度表示)?根据您提供的信息,我不知道图像是否显示了1米宽或1公里宽的区域。
- 您参考坐标(-37.803134,145.132377)指的是图像上的哪个位置?是其中一个角落吗?还是中间的某个地方?
我还假设您的图像是朝南/北对齐的 - 例如,北方不会指向左上角。那会使事情变得复杂。
最简单的方法是确定(0,0)像素和(1017,915)像素分别对应于哪些纬度/经度坐标。然后,您可以通过插值确定与给定纬度/经度坐标相对应的像素。
简要概述该过程,假设您的(-37.803134,145.132377)纬度/经度对应于(0,0)像素,并且您已经发现您的(1017,915)像素对应于纬度/经度为(-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个像素。我会让你自己计算水平等价物-基本上是相同的。
注意在
MAP_HEIGHT
中使用
-1
的原因是,如果从零开始,则最大像素数为915,而不是916。
编辑:我想借此机会指出的一件事是,这是一种近似方法。实际上,纬度和经度坐标与其他形式的笛卡尔坐标之间没有简单的线性关系,原因包括制作地图时使用的投影方式以及地球不是一个完美的球体。在小范围内,此近似足够接近,没有显着的差异,但在较大的尺度上,可能会出现差异。根据您的需求,结果可能有所不同。 (感谢uray,他下面的答案提醒我这种情况)。