本节摘要:空间数据交换靠格式。本节讲 Shapefile、GeoJSON、GeoTIFF、KML 等常用格式——选对格式才能交换和存储。
阅读完本节,你应当能够:
| 格式 | 特点 | 适合 |
|---|---|---|
| Shapefile | 老牌,多文件(.shp/.shx/.dbf),字段名限长 | 传统 GIS 交换 |
| GeoJSON | JSON 文本,可读,Web 友好 | Web 传输、小数据 |
| GPKG (GeoPackage) | SQLite 单文件,OGC 标准,矢量栅格都能存 | 现代单文件交换 |
| KML/KMZ | Google Earth 格式,XML | 地图标注、展示 |

| 格式 | 特点 |
|---|---|
| GeoTIFF | TIFF + 地理信息,栅格标准 |
| COG (Cloud Optimized GeoTIFF) | 云优化 GeoTIFF,按需读取 |
| JPEG2000 | 压缩好,支持瓦片 |
栅格影像用 GeoTIFF,云端用 COG(按需读范围不用全下载)。
{ "type": "FeatureCollection", "features": [ { "type": "Feature", "geometry": {"type": "Point", "coordinates": [116.4, 39.9]}, "properties": {"name": "北京"} } ] }
GeoJSON 坐标默认 WGS84(EPSG:4326),经度在前纬度在后。
用 GDAL/OGR 工具转换:
# Shapefile 转 GeoJSON ogr2ogr -f GeoJSON output.geojson input.shp # GeoTIFF 转 COG gdal_translate input.tif output.tif -co TILED=YES -co COPY_SRC_OVERVIEWS=YES
PostGIS 也能直接导入导出:
-- 导入 Shapefile shp2pgsql -s 4326 input.shp table_name | psql db -- 导出 GeoJSON SELECT ST_AsGeoJSON(geom) FROM cities;
⚠️ 常见坑:Shapefile 字段名超 10 字符被截断——它是老格式限制。用 GeoPackage 或 GeoJSON 没这限制。
💡 关键直觉:Web 用 GeoJSON,单文件交换用 GeoPackage,传统用 Shapefile,栅格用 GeoTIFF/COG。用 GDAL/OGR 转换格式。
Shapefile 不是单文件,是一组配套文件,拷贝时必须一起复制,少了任何一个都可能打不开:
| 扩展名 | 作用 |
|---|---|
| .shp | 几何数据(必选) |
| .shx | 几何索引(必选) |
| .dbf | 属性数据(必选) |
| .prj | 坐标系定义(强烈建议保留) |
| .cpg | 属性编码(中文属性常需要) |
| .sbn/.sbx | 空间索引(可选) |
最容易犯的错是只拷了 .shp 三个文件、丢了 .prj——几何能打开,但坐标系信息丢了,叠加到底图上错位,排查半天。所以规范的做法是:交付 Shapefile 时打成一个压缩包,解压后五个基础文件齐全再入库。
GeoPackage(.gpkg)本质是一个 SQLite 数据库文件,一张表存一个图层,支持矢量、栅格、样式甚至扩展数据,一次交换一个文件就够了。它比 Shapefile 强在:字段名不用受 10 字符限制、属性支持更多类型、可以存坐标系定义、体积控制更好。OGC 把它定为标准,QGIS、ArcGIS、GDAL 全支持。如果项目没有强制的老格式要求,新数据交换优先用 GeoPackage。
一个真实场景:客户交付了一套 Shapefile(北京 54 坐标系),项目要求入库到 PostGIS(CGCS2000),并给前端提供 GeoJSON。三步完成:
# 第一步:查看源数据的坐标系 ogrinfo -so input.shp input | grep -i 'id' # 第二步:转坐标系并入库 PostGIS(用 GDAL 直接写库) ogr2ogr -f PostgreSQL PG:"dbname=gis user=postgres" \ -s_srs EPSG:4214 -t_srs EPSG:4490 \ -nlt PROMOTE_TO_MULTI input.shp # 第三步:从 PostGIS 导出 GeoJSON 给前端 ogr2ogr -f GeoJSON output.geojson \ PG:"dbname=gis user=postgres" -sql "SELECT name, geom FROM parcels"
注意第二步里 -s_srs 和 -t_srs 必须写对,源坐标系标错、目标坐标系标错都会导致坐标错乱。转换后用 QGIS 叠加一个已知位置的底图抽查几个点,确认无误再交付。
格式转换里最隐蔽的问题不是坐标而是编码:
-lco ENCODING=UTF-8,避免入库后属性乱码。GIS 数据归档建议"双保险":数据库导出 SQL 备份加原始格式文件备份。数据库备份用 pg_dump 保留结构和空间扩展;原始文件归档保留坐标系和元数据。定期做一次恢复演练,确认备份真的能用。长期项目里"数据还能找回来"比"功能有多炫"更关键。
第 2 章结束。下一章把这些数据发布成服务。