Python中的ST_Distance_Sphere()?

时间:2017-02-16 15:03:59

标签: python postgresql postgis

我正在开发一个Python项目,我有两个纬度/长度对,我想计算它们之间的距离。在其他项目中,我使用ST_Distance_Sphere(a.loc_point,b.loc_point)计算了Postgres中的距离,但我想避免将所有数据加载到Postgres中,以便我可以计算距离差异。我已经搜索过,但一直无法找到我想要的内容,这是一个纯粹的Python实现,所以我不必将我的数据加载到Postgres中。

我知道还有其他距离计算将地球视为一个完美的球体,但由于精度差,这些还不够好,这就是为什么我想使用PostGIS ST_Distance_Sphere()函数(或等价物) 。

以下是我想计算距离的几个Lat / Long样本:

Lat, Long 1: (49.8755, 6.07594)
Lat, Long 2: (49.87257, 6.0784)

我无法想象我是第一个问这个问题的人,但有没有人知道如何使用ST_Distance_Sphere()纯粹从Python脚本中进行纬度/长距离计算?

4 个答案:

答案 0 :(得分:3)

我建议使用 geopy 包 - 请参阅文档中的enter image description here部分...

针对您的具体情况:

m_pRootStg

答案 1 :(得分:1)

这是一个基本函数,用于计算完美球体上两个坐标之间的距离,半径=地球半径

df = df.apply(lambda x: [x.values[i] if x.values[i] not in x.values[i+1:] else np.nan for i in range(len(x))], axis=1)

希望这有帮助!

答案 2 :(得分:1)

请参阅此How can I quickly estimate the distance between two (latitude, longitude) points?

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)) 
    km = 6367 * c
    return km

作者:Aaron D

您可以通过添加miles = km * 0.621371

来修改它以返回里程

答案 3 :(得分:0)

除了这里提供的答案之外,我已经找到了另一种方法。使用python的hasrsine模块。

from haversine import haversine as h

# Return results in meters (*1000)
print '{0:30}{1:12}'.format("haversine module:", h(a, b)*1000)

我在Postgres中使用ST_Distance_Sphere(a,b)测试了所有三个答案加上hasrsine模块。所有答案都非常好(谢谢),但来自Sishaar Rao的所有数学答案(计算)都是最接近的。结果如下:

# Short Distance Test
ST_Distance_Sphere(a, b):     370.43790478    
vincenty:                     370.778186438
great_circle:                 370.541763803
calcd:                        370.437386736
haversine function:           370.20481753
haversine module:             370.437394767

#Long Distance test:
ST_Distance_Sphere(a, b):     1011734.50495159
vincenty:                     1013450.40832
great_circle:                 1012018.16318
calcd:                        1011733.11203
haversine function:           1011097.90053
haversine module:             1011733.11203