首页 > 解决方案 > Python:找到两个点列表之间最近点的最佳方法

问题描述

我有两个 geopandas 数据框gdf1gdf2. 对于中的每个点,gdf1我想找到最近的点gdf2并分配距离。

gdf1:
    geometry
0   POINT (-3.77112 40.23927)
1   POINT (-3.75284 40.26475)
2   POINT (-3.79914 40.28567)
3   POINT (-3.86045 40.32046)
4   POINT (-3.76161 40.33219)

gdf2:
    geometry
0   POINT (-3.98696 40.62067)
1   POINT (-3.99659 40.61013)

这就是我正在做的

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)) 
    r = 6371 # Radius of earth in kilometers. Use 3956 for miles
    return c * r

这就是我正在做的事情,但我想知道是否有可能以更优雅的方式完成相同的任务。

idx = []
dist = []
for i in gdf1.index:
    p1 = gdf1['geometry'][i]
    lon1 = p1.x
    lat1 = p1.y
    minD = 100000000
    for j in gdf2.index:
        p2 = gdf2['geometry'][j]
        lon2 = p2.x
        lat2 = p2.y
        d = haversine(lon1, lat1, lon2, lat2)
        if d < minD:
            minD = d
            tmpD = d
            tmpJ = j
    idx.append(tmpJ)
    dist.append(tmpD)
gdf1['dist'] = dist
gdf1['idx']  = idx

标签: python

解决方案


推荐阅读