如何在Shapely 2.0中查找字典内目标多边形的最近排他多边形
Shapely 2.0 查找字典中多边形的最近邻(排除自身)
问题场景
我有一个存储多个Polygon的字典:
poly_dict = {'1': <Polygon1>, '2': <Polygon2>}
已通过Shapely 2.0创建STRtree,但新版本的nearest方法没有旧版的exclusive参数,调用时会返回传入的同一个几何体。需要实现:传入bldg_id为'1'时返回'2',传入'2'时返回'1'。
原代码示例:
# 创建STRtree poly_rtree = STRtree(list(poly_dict.values())) # Shapely 2.0创建STRtree的方式 # 旧版Shapely可用如下方法 # rtree.nearest_item(poly_dict[bldg_id], exclusive=True) # Shapely 2.0使用`nearest`方法 nearest_poly = rtree.nearest(poly_dict[bldg_id]) # 会返回自身
解决方案
方法一:利用STRtree的k近邻查询(高效,适合大数据量)
通过获取前k个最近邻,再过滤掉自身来得到目标结果,步骤如下:
- 先建立索引与字典键的双向映射,因为STRtree是基于字典值的列表创建的,列表索引和字典键的顺序一一对应:
# 建立索引到建筑ID的映射 index_to_id = {idx: bldg_id for idx, bldg_id in enumerate(poly_dict.keys())} # 建立建筑ID到索引的映射,方便快速定位目标多边形的索引 id_to_index = {bldg_id: idx for idx, bldg_id in enumerate(poly_dict.keys())}
- 编写函数获取最近邻ID:
def get_nearest_poly_id(bldg_id): target_poly = poly_dict[bldg_id] target_idx = id_to_index[bldg_id] # 获取前2个最近的多边形索引(k值需至少为2,确保能排除自身) nearest_indices = poly_rtree.nearest(target_poly, k=2) # 过滤掉自身索引,返回剩余的最近邻ID for idx in nearest_indices: if idx != target_idx: return index_to_id[idx]
调用示例:
print(get_nearest_poly_id('1')) # 输出 '2' print(get_nearest_poly_id('2')) # 输出 '1'
方法二:遍历计算距离(简单,适合小数据量)
如果多边形数量不多,直接遍历字典中所有多边形,计算目标与其他多边形的距离,排除自身后取距离最小的那个:
def get_nearest_poly_id(bldg_id): target_poly = poly_dict[bldg_id] min_distance = float('inf') nearest_id = None for pid, poly in poly_dict.items(): if pid == bldg_id: continue current_dist = target_poly.distance(poly) if current_dist < min_distance: min_distance = current_dist nearest_id = pid return nearest_id
注意事项
- 如果字典中包含3个及以上多边形,方法一中的
k值可适当调大(比如设为总多边形数),避免因存在多个等距最近邻导致漏选。 - 确保所有多边形使用相同的坐标系统,否则距离计算结果会不准确。
内容的提问来源于stack exchange,提问作者jss367
相关产品推荐
相关产品推荐

