python - Python:找到两个点列表之间最近点的最佳方法
问题描述
我有两个 geopandas 数据框gdf1
和gdf2
. 对于中的每个点,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
解决方案
推荐阅读
- r - 展开矩阵并在R中按键替换行名和列名
- java - 尝试反序列化 json 时出现 NullPointerException
- javascript - 如何为 contenteditable="true" 内容添加内联工具栏?
- javascript - 如何通过其类名获取兄弟元素,然后仅使用 Javascript 将其隐藏?
- javascript - jsGrid - 样式背景组单元格
- acumatica - 通过 Rest API 开具发票
- oracle - 在 oracle 中使用 AWS 负载均衡器而不是 PEX_WEB_SERVICE.MAKE_REST_REQUEST POST 方法中的静态 IP 时面临问题
- python-3.x - python中嵌套循环中的`break`跳过原始循环的下一次迭代
- android - Android gradle 构建同步失败
- discord - DM用户他们被禁止的原因