我希望能够拿到两(纬度,经度)点之间的距离的估计。 我想冲,因为这将是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