将经度纬度转换为米

Sim*_*mon 8 mapping latitude-longitude coordinates

我需要一个将gps位置映射到x/y值的函数,如下所示:

getXYpos(GeoPoint relativeNullPoint, GeoPoint p){
   deltaLatitude=p.latitude-relativeNullPoint.latitude;
   deltaLongitude=p.longitude-relativeNullPoint.longitude;
   ...
   resultX=latitude (or west to east) distance in meters from p to relativeNullPoint
   resultY=longitude (or south to north) distance in meters from p to relativeNullPoint
}
Run Code Online (Sandbox Code Playgroud)

我已经看到了"两个geoPoints距离"的一些实现,但它们都只计算了空中线距离.我认为deltaLongitude可以直接转换为米,但deltaLatitude取决于经度.有谁知道如何解决这个问题?

Mar*_*som 18

首先,我认为你的纬度经度都有所逆转.经度测量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
Run Code Online (Sandbox Code Playgroud)

我选择使用relativeNullPoint纬度进行X计算.这样做的好处是,如果您使用相同的经度转换多个点,它们将具有相同的X; 南北线将是垂直的.

再次编辑:我应该指出这是一个非常简单的公式,你应该知道它的局限性.显然地球不是平坦的,因此任何将其映射到XY坐标的尝试都会涉及一些妥协.当您转换的区域小到足以考虑平坦时,上面导出的公式I效果最好,并且可以忽略南北线的微小曲率和非平行度.有一个完整的科学来映射预测; 如果你想看到一些可能性,一个好的起点就是维基百科.这种特定投影称为Equirectangular投影,增加了一些缩放.