11

我需要一个将 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
}

我已经看到了“两个地理点的距离”的一些实现,但它们都只是计算航线距离。我认为 deltaLongitude 可以直接转换为米,但 deltaLatitude 取决于经度。有谁知道如何解决这个问题?

4

3 回答 3

21

首先,我认为您的纬度经度颠倒了。经度测量 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 投影,并增加了一些缩放比例。

于 2010-06-11T17:05:45.313 回答
2

Harvesine 函数是您所需要的。在moveable-types中查看它有 Distance、Bearing、Midpoint 和其他 Javascript 实现工作非常好的东西。

更新

在另一个 stackoverflow 问题中找到了 Harvesine 函数的 Java 实现

于 2010-06-11T16:19:24.383 回答
1

jstott.me.uk 上有PHPJavaJavascript的库可以执行此操作,例如

var lld1 = new LatLng(40.718119, -73.995667); // New York
document.write("New York Lat/Long: " + lld1.toString() + "<br />");
var lld2 = new LatLng(51.499981, -0.125313);  // London
document.write("London Lat/Long: " + lld2.toString() + "<br />");
var d = lld1.distance(lld2);
document.write("Surface Distance between New York and London: " + d + "km");
于 2010-06-11T16:25:31.870 回答