我怎样才能快速地估计两(纬度,经度)点之间的距离?(How can I quickly estima

2019-08-18 12:05发布

我希望能够拿到两(纬度,经度)点之间的距离的估计。 我想冲,因为这将是A *图搜索,我想它要 。 积分将相隔至多800公里。

Answer 1:

这些问题的答案,以半正弦波(两个GPS点之间的方位和距离)在Python公式提供回答你的问题Python实现。

使用下面执行就我一个旧的笔记本电脑进行迭代10万,在不到1秒 。 我觉得你的目的,这应该是足够了。 但是,您优化性能之前,你就应该剖析什么。

 from math import radians, cos, sin, asin, sqrt def haversine(lon1, lat1, lon2, lat2): """ Calculate the great circle distance between two points on the earth (specified in decimal degrees) """ # convert decimal degrees to radians lon1, lat1, lon2, lat2 = map(radians, [lon1, lat1, lon2, lat2]) # haversine formula dlon = lon2 - lon1 dlat = lat2 - lat1 a = sin(dlat/2)**2 + cos(lat1) * cos(lat2) * sin(dlon/2)**2 c = 2 * asin(sqrt(a)) # Radius of earth in kilometers is 6371 km = 6371* c return km 

低估haversine(lat1, long1, lat2, long2) * 0.90或任何因素你想要的。 我不知道怎样引入错误的低估是非常有用的。



Answer 2:

由于距离比较小,可以用等距离长方圆柱距离近似。 这种近似比使用半正矢式更快。 因此,从您的基准点(LAT1 / lon1)到您正在测试(LAT2 / lon2),使用下面的公式得到点的距离。 重要提示:您需要将所有经/纬度点转换为弧度:

R = 6371  // radius of the earth in km
x = (lon2 - lon1) * cos( 0.5*(lat2+lat1) )
y = lat2 - lat1
d = R * sqrt( x*x + y*y )

由于“R”是公里,距离“d”将在公里。

参考: http://www.movable-type.co.uk/scripts/latlong.html



Answer 3:

对速度的一个想法是转变经度/纬度协调成3D(X,Y,Z)坐标。 预处理点后,使用点之间的欧氏距离与实际距离的快速计算冲。



Answer 4:

对于最大速度,你可以创造这样一个彩虹表为坐标的距离。 这听起来像你已经知道你正在使用的区域,因此它似乎是,预先计算它们可能是可行的。 然后,你可以加载最近的组合,只是使用它。

例如,在美国大陆,经度是一个55度的跨度和纬度是20,这将是1100个整数点。 所有可能的组合之间的距离是一个握手问题是由第(n-1)(n)的回答/ 2或大约600K的组合。 这似乎是相当可行的存储和检索。 如果您提供您的要求的更多信息,我可以更具体。



Answer 5:

如果点之间的距离相对较小(米到几公里范围内),那么快速的方法之一可能是

from math import cos, sqrt
def qick_distance(Lat1, Long1, Lat2, Long2):
    x = Lat2 - Lat1
    y = (Long2 - Long1) * cos((Lat2 + Lat1)*0.00872664626)  
    return 111.138 * sqrt(x*x + y*y)

纬度,经度是弧度,在公里的距离。

从半正矢距离偏差在1%的数量级,而速度增益比〜10倍以上。

0.00872664626 = 0.5 * PI / 180,

111.138 -是对应于赤道到1度的距离,你可以用你的中间值替换它喜欢这里https://www.cartographyunchained.com/cgsta1/或用简单的查找表替换它。



Answer 6:

请使用下面的代码。

def distance(lat1, lng1, lat2, lng2):
    #return distance as meter if you want km distance, remove "* 1000"
    radius = 6371 * 1000 

    dLat = (lat2-lat1) * math.pi / 180
    dLng = (lng2-lng1) * math.pi / 180

    lat1 = lat1 * math.pi / 180
    lat2 = lat2 * math.pi / 180

    val = sin(dLat/2) * sin(dLat/2) + sin(dLng/2) * sin(dLng/2) * cos(lat1) * cos(lat2)    
    ang = 2 * atan2(sqrt(val), sqrt(1-val))
    return radius * ang


Answer 7:

为了计算2点之间的半正矢距离u可以简单地使用mpu.haversine_distance()文库,如下所示:

>>> import mpu
>>> munich = (48.1372, 11.5756)
>>> berlin = (52.5186, 13.4083)
>>> round(mpu.haversine_distance(munich, berlin), 1)
>>> 504.2


文章来源: How can I quickly estimate the distance between two (latitude, longitude) points?