将经度纬度转换为米

时间:2010-06-11 16:17:06

标签: mapping coordinates latitude-longitude

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

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

3 个答案:

答案 0 :(得分:17)

首先,我认为您的latitudelongitude已被撤消。经度测量X,纬度测量Y.

纬度很容易变成南北距离。我们知道360度是穿过两极的地球周围的整圆,that distance is 40008000 meters。只要您不需要考虑由于地球不是完美球形而导致的误差,公式为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坐标的尝试都会涉及一些妥协。当您转换的区域小到足以考虑平坦时,上面导出的公式I效果最好,并且可以忽略南北线的微小曲率和非平行度。有一个完整的科学来映射预测;如果你想看到一些可能性,一个好的起点可能是Wikipedia。此特定投影称为the Equirectangular projection,并添加了一些缩放。

答案 1 :(得分:2)

Harvesine功能是您所需要的。 在moveable-types查看它有距离,方位,中点和其他东西Javascript实现工作真的很好。

<强> 更新

我找到了Harvesine函数in another stackoverflow question

的Java实现

答案 2 :(得分: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");