如何从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
相关产品推荐
相关产品推荐

