用途:将空间数据整理为干净、经过校验、可直接分析的产物,并保证流程可重复。这是 GIS 实际工作中耗时最多、也最容易产生隐性错误的环节。
格式选择:GeoParquet 适合分析交换、大矢量与列式工作流,但部分旧版桌面 GIS 尚不能读取;GeoPackage 适合桌面 GIS 交换与多图层项目,规模大时慢于 Parquet 且有 SQLite 锁问题;FlatGeobuf 适合流式与 HTTP range 读取,仅支持单图层;COG 用于所有栅格交付;Zarr/NetCDF 用于多维数据(时间×波段×y×x),单幅栅格属过度设计;Shapefile 仅在旧工具强制要求时使用,存在列名 10 字符、2 GB 上限、编码混乱、多文件脆弱等问题;CSV + WKT/经纬度适合简单点交换,但无 CRS 元数据,需显式记录。
数据获取:小范围 OSM 用 osmnx,大范围用 Geofabrik PBF 加 pyrosm/osmium,过滤前先检查标签值分布;大规模建筑与地点用 Overture Maps(S3/Azure 上的 GeoParquet,用 DuckDB spatial 查询);卫星/栅格用 pystac-client 加 odc-stac 访问 STAC API;边界优先权威国家源,全球工作可用 Natural Earth/GADM/geoBoundaries 并记录版本。每次获取都要记录来源 URL、查询参数、检索日期与许可,写入数据旁的 DATA_SOURCES.md。
CRS 工程:以 EPSG:4326 或源 CRS 存储,分析时用适合范围的投影 CRS,如本地 UTM(gdf.estimate_utm_crs())、国家网格或等面积投影(EPSG:6933/Mollweide)。亚米级精度需注意基准面转换与转换网格(必要时 pyproj.network.set_network_enabled(True))。不要通过删除或覆盖 CRS 来“修复”错位图层,应借助已知地标诊断哪一层有误。
清洗管线:运行 scripts/clean_vector.py 或其 clean_vector() 函数作为标准卫生处理,删除空/无效几何、用 make_valid 修复、去重、重投影并打印统计报告,避免静默数据丢失。随后规范化文本属性(去空白、折叠空格、按语言环境大小写折叠,注意土耳其语 İ/ı 与德语 ß)、显式转换 dtype,并对后续要过滤的每个分类字段展示 value_counts()。
规模化策略:可放入内存时用 GeoPandas 加 Shapely 2 向量化操作,确保使用空间索引(sjoin、query_bulk),手写循环为 O(n²);超出内存的单机场景用 DuckDB spatial 扩展查询 GeoParquet(谓词下推加空间 SQL)或 dask-geopandas;需要服务化/并发/事务时用 PostGIS;栅格用窗口读取(rasterio.windows)与分块 xarray 加 dask,切勿把 50 GB 镶嵌一次性 read() 进内存。
流水线规范:各步骤幂等,输入输出显式落盘,重跑不破坏状态;在昂贵阶段(下载、大连接)后以 GeoParquet/GPKG 设检查点;每阶段记录行/要素/像素进出统计;写出前按稳定键排序以保证 diff 有意义。
常见陷阱:CSV 未声明经纬度列 CRS;Shapefile 导出时列名被静默截断;旧文件编码乱码(先试 encoding="utf-8" 再试 cp1252);单图层混合几何类型(Polygon 与 MultiPolygon 会破坏部分工具,用 .explode() 或提升为 Multi*);朴素重投影后跨越反经线与极点的几何;下载“最新”数据却未记录版本/日期导致不可复现。
执行约定:先盘点来源与契约,带溯源获取,检查 CRS、模式、几何与规模,确定性清洗,校验,写出可分析产物;依据规模、几何、并发与下游访问需求选择格式与引擎,绝不静默推断 CRS 或做破坏性修复;每阶段核对要素或像素计数,断言 CRS 与几何不变量,空间抽样输出并重跑确认幂等;对含糊 CRS、混合单位、无效编码、有损格式转换或无法解释的行丢失应隔离而非猜测;交付物包括已校验数据集、机器可读模式与 CRS、溯源清单、统计日志、被拒记录报告与可复现流水线。使用版本敏感格式或 API 前查阅权威来源登记表并记录检查日期。