我有一些城市的地理坐标(纬度和经度),想获得 x,y 坐标,以便将它们绘制成地图。
该地图是标准地图,例如http://www.wordtravels.com/images/map/Spain/Fuerteventura_map.jpg。
我尝试了几个我发现的公式,但似乎没有一个真正有效:(。简单的 javascript 代码或 ruby 会是最好的:)
我有一些城市的地理坐标(纬度和经度),想获得 x,y 坐标,以便将它们绘制成地图。
该地图是标准地图,例如http://www.wordtravels.com/images/map/Spain/Fuerteventura_map.jpg。
我尝试了几个我发现的公式,但似乎没有一个真正有效:(。简单的 javascript 代码或 ruby 会是最好的:)
有许多方法可以以不同程度的精度解决这个问题。但是,它们都归结为执行与您的地图对应的投影。
如果您知道您的地图属于墨卡托投影类型,那么可以简单地将纬度/经度坐标视为 X/Y,并进行适当的缩放和平移。也就是说,您会找到一个简单的 ax+b 和 cy+d 来完成这项工作。
如果您的地图不是墨卡托投影(因为它可能不是如果它试图使比例保持一致,正如这个似乎所做的那样),那么您最好的选择是假设它是一个“接地”投影。(这适用于小型陆地。)在这种情况下,您需要首先将纬度/经度投影到三维坐标系中。
z=sin(lat)
x=cos(lat)*sin(long)
y=cos(lat)*cos(long)
正 z 指向北极。正 y 指向 0、0,正 x 指向 lat 0 long 90(东),正 lat/long 是北和东。当然,您必须先转换为弧度。
所有这一切都假设一个球形地球,这并不完全正确,但它足够接近,除非你发射远程迫击炮弹。
无论如何,一旦有了 XYZ,就需要旋转和缩放地图。要绕 Z 轴旋转,只需在投影到三个维度之前减去基本经度。这样做可以使您的地图以零经度为中心,以实现最简单的数学运算。
完成此操作后,您只需要向前旋转地球,直到原始地图正面。在 yz 轴上进行 2-d 旋转来执行此操作。使用http://en.wikipedia.org/wiki/Coordinate_rotations_and_reflections找出那部分。
最后,您的 x,z 坐标将与您的地图的 x,y 坐标很好地对齐,以获得如前所述的适当比例/平移。
也许这会有所帮助,我只使用 javascript 为美国完成了一个实现。
除了上述答案之外,还有一个开源 proj4js 库,它可以在各种地图投影之间执行转换。它由 OpenLayers 内部用于此类事情,并支持许多流行的投影和坐标系。
使用 Google Maps API,您可以将 jpg 叠加在地图上并正确定位。
这是一个示例 http://code.google.com/apis/maps/documentation/javascript/examples/overlay-hideshow.html
这是关于叠加层的 api 页面 http://code.google.com/apis/maps/documentation/javascript/overlays.html