将地理坐标(经纬度)映射到地图(x,y)

问题描述:

我有一些城市的地理坐标(经度&经度),并希望得到x,y坐标,因此可以将它们绘制成地图。将地理坐标(经纬度)映射到地图(x,y)

该地图属于非标准地图,例如http://www.wordtravels.com/images/map/Spain/Fuerteventura_map.jpg

我试了几个公式推我发现,但没有一个似乎真的工作:(。简单的JavaScript代码或红宝石将是最好的:)

除了上面的答案,还有一个开源的proj4js库,它执行各种地图投影之间的转换。它由OpenLayers在内部用于这种事情,并支持许多流行的投影和坐标系统。

+1

进一步思考,假设你的位图是一个标准的投影,它应该工作,但是你必须确定你自己的投影参数(经络,缩放等)。这应该是可能的,但可能不适合地图投影新手。 – winwaed 2010-12-06 03:43:34

+1

谢谢,我能够从提到的图书馆中提取所需的公式:) – gucki 2010-12-11 01:08:53

你不会找到它,除非方便你在一个非常小的工作规模(并接近赤道)。*的Geographic coordinate system是一个很好的开始...

更容易的路径可能是使用类似web mapping的东西,并坚持你的纬度和经度。

使用Google Maps API,您可以将jpg覆盖在地图上并正确放置。

下面是一个例子 http://code.google.com/apis/maps/documentation/javascript/examples/overlay-hideshow.html

,这里是大约覆盖 http://code.google.com/apis/maps/documentation/javascript/overlays.html

有很多种方法与不同的精确度来解决这个问题的API页面。然而,它们都归结为执行与您的地图相对应的投影。

如果您知道您的地图是墨卡托投影品种,那么可以简单地将经纬度坐标视为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长90(东),正lat/long指向北和东。当然,你必须先转换为弧度。

所有这一切都假设了一个球形的地球,这并不完全正确,但它足够接近,除非你正在发射远程迫击炮弹。

无论如何,一旦你有了你的XYZ,那么你需要旋转和缩放地图。要围绕Z轴旋转,只需在投影到三维之前减去基本经度。这样做是为了将您的地图放在零经度上,以实现最简单的数学运算。

完成此操作后,您只需将球形向前旋转,直到原始地图朝前。在y-z轴上进行2-d旋转。使用http://en.wikipedia.org/wiki/Coordinate_rotations_and_reflections来确定这一部分。

最后,您的x,z坐标将与您的地图的x,y坐标非常一致,以便如前所述进行适当的缩放/平移。

也许这会有所帮助,我已经使用javascript完成了美国的实施。

演示/代码:http://the55.net/_11/sketch/us_map