首先,我认为您的纬度和经度颠倒了。经度测量 X,纬度测量 Y。
纬度容易变成南北距离。我们知道 360 度是通过两极绕地球一圈,这个距离是 40008000 米。只要您不需要考虑由于地球不是完美的球形而导致的误差,公式就是deltaLatitude * 40008000 / 360
。
正如您所怀疑的,棘手的部分是将经度转换为 X。由于这取决于您需要决定使用哪个纬度的纬度 - 您可以选择起点的纬度、目的地的纬度或两者之间的任意点。赤道(纬度 0)的周长为 40075160 米。给定纬度的圆的周长与余弦成正比,因此公式为deltaLongitude * 40075160 * cos(latitude) / 360
。
编辑:您的评论表明您在使用经度公式时遇到了问题;您可能在调用时使用了度数而不是弧度cos
,这是一个常见的新手错误。为了确保没有歧义,这里是 Python 中的工作代码。
def asRadians(degrees):
return degrees * pi / 180
def getXYpos(relativeNullPoint, p):
""" Calculates X and Y distances in meters.
"""
deltaLatitude = p.latitude - relativeNullPoint.latitude
deltaLongitude = p.longitude - relativeNullPoint.longitude
latitudeCircumference = 40075160 * cos(asRadians(relativeNullPoint.latitude))
resultX = deltaLongitude * latitudeCircumference / 360
resultY = deltaLatitude * 40008000 / 360
return resultX, resultY
我选择使用 relativeNullPoint 纬度进行 X 计算。这样做的好处是,如果您转换具有相同经度的多个点,它们将具有相同的 X;南北线将是垂直的。
再次编辑:我应该指出这是一个非常简单的公式,您应该知道它的局限性。显然地球不是平坦的,因此任何将其映射到 XY 坐标的尝试都会涉及一些妥协。当您要转换的区域足够小以考虑平坦时,我上面得出的公式最有效,并且可以忽略南北线的轻微曲率和不平行性。映射投影是一门完整的科学。如果您想了解一些可能性,一个好的起点是Wikipedia。这种特定的投影称为Equirectangular 投影,并增加了一些缩放比例。