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

如何从Kontur人口数据中筛选指定边界框内的多边形?

解决Kontur人口数据集边界框筛选为空的问题

问题根源

你用geometry.within(bbox)筛选时,要求多边形完全被边界框包裹,但Kontur的人口格网是精细的小单元,很多位于柏林边界的格网只是和你的边界框相交,并非完全在内部,所以返回空结果。另外,直接覆盖原GPKG文件可能引发读写冲突,也不建议这么做。

修正方案

推荐使用Geopandas内置的clip()函数,它专门处理空间裁剪,会保留所有与边界框相交或完全在内部的要素,更符合你的需求:

import geopandas as gpd
from shapely.geometry import box

# 读取原数据集
data = gpd.read_file('C:/Users/Julian/Downloads/kontur_population.gpkg/kontur_population.gpkg')

# 定义柏林边界框
bounding_box = {
    "min_lon": 12.927785560520098,
    "max_lon": 13.94903874307725,
    "min_lat": 52.284843473119714,
    "max_lat": 52.77168805093944
}

# 创建边界框几何对象
bbox = box(
    bounding_box["min_lon"],
    bounding_box["min_lat"],
    bounding_box["max_lon"],
    bounding_box["max_lat"]
)

# 转换边界框坐标系与数据集匹配(确保一致)
bbox_gdf = gpd.GeoDataFrame({'geometry': [bbox]}, crs=data.crs)

# 执行裁剪
clipped_data = gpd.clip(data, bbox_gdf)

# 写入新文件(不要覆盖原文件)
clipped_data.to_file('C:/Users/Julian/Downloads/berlin_kontur_population.gpkg', driver="GPKG")

# 验证结果
print(f"裁剪后共保留 {len(clipped_data)} 条要素")

备选方案(用intersects)

如果不想用clip(),可以把within换成intersects,同样能保留相交的要素:

clipped_data = data[data.geometry.intersects(bbox)]

额外注意事项

  • 检查数据集坐标系:执行print(data.crs)确认是EPSG:4326(WGS84经纬度),如果你的边界框用的是其他坐标系,需要先转换。
  • 避免覆盖原文件:始终写入新文件,防止数据丢失。

内容的提问来源于stack exchange,提问作者Julian

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 22:30:27