如何从邮政编码级别的shapefile中提取美国本土区域
Python中移除邮政编码Shapefile中小岛的解决方案
针对你手中的美国人口普查局ZCTA Shapefile,以下是两种基于面积过滤移除小岛的实现方式:
方法一:利用现有面积字段快速过滤
你的数据中已经包含ALAND20字段(记录陆地面积,单位为平方米),直接基于该字段设置阈值过滤即可:
import geopandas as gpd # 读取原始Shapefile gdf = gpd.read_file("cb_2017_us_zcta510_500k.shp") # 设置面积阈值(单位:平方米,可根据需求调整) area_threshold = 10000 # 保留面积不小于阈值的区域 filtered_gdf = gdf[gdf["ALAND20"] >= area_threshold] # 保存处理后的文件 filtered_gdf.to_file("filtered_zcta.shp")
方法二:手动计算多边形面积过滤(无现成面积字段时使用)
如果数据中没有自带的面积字段,或者需要直接基于几何图形计算面积,需先转换到等面积投影坐标系(避免经纬度坐标系计算面积的误差):
import geopandas as gpd gdf = gpd.read_file("cb_2017_us_zcta510_500k.shp") # 转换为北美阿尔伯斯等面积投影(EPSG:5070,适合美国本土及阿拉斯加区域) gdf_proj = gdf.to_crs(epsg=5070) # 计算每个多边形的面积(单位:平方米) gdf_proj["calc_area"] = gdf_proj.geometry.area # 设置阈值并过滤 area_threshold = 10000 filtered_gdf_proj = gdf_proj[gdf_proj["calc_area"] >= area_threshold] # 可选:转换回原坐标系 filtered_gdf = filtered_gdf_proj.to_crs(gdf.crs) # 保存结果 filtered_gdf.to_file("filtered_zcta.shp")
注意事项
- 面积阈值需根据实际需求调整,比如针对阿拉斯加的小岛可适当降低阈值
- 必须使用等面积投影坐标系计算面积,否则经纬度坐标系下的面积结果无实际地理意义
内容的提问来源于stack exchange,提问作者ℕʘʘḆḽḘ
相关产品推荐
相关产品推荐

