You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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个最近邻,再过滤掉自身来得到目标结果,步骤如下:

  1. 先建立索引与字典键的双向映射,因为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())}
  1. 编写函数获取最近邻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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 22:38:18