我需要一个将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取决于经度。有谁知道如何解决这个问题?
答案 0 :(得分:17)
首先,我认为您的latitude和longitude已被撤消。经度测量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上有PHP,Java和Javascript这样的库,例如。
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");