2.3 常用 GIS 数据格式


2.3 常用 GIS 数据格式

本节摘要:空间数据交换靠格式。本节讲 Shapefile、GeoJSON、GeoTIFF、KML 等常用格式——选对格式才能交换和存储。

本节地图

阅读完本节,你应当能够:

  1. 区分矢量格式和栅格格式
  2. 选对场景的格式
  3. 用工具转换格式

概念脉络

一、矢量格式

格式 特点 适合
Shapefile 老牌,多文件(.shp/.shx/.dbf),字段名限长 传统 GIS 交换
GeoJSON JSON 文本,可读,Web 友好 Web 传输、小数据
GPKG (GeoPackage) SQLite 单文件,OGC 标准,矢量栅格都能存 现代单文件交换
KML/KMZ Google Earth 格式,XML 地图标注、展示

图 2-3 数据格式对比

图 2-3 数据格式对比

二、栅格格式

格式 特点
GeoTIFF TIFF + 地理信息,栅格标准
COG (Cloud Optimized GeoTIFF) 云优化 GeoTIFF,按需读取
JPEG2000 压缩好,支持瓦片

栅格影像用 GeoTIFF,云端用 COG(按需读范围不用全下载)。

三、GeoJSON 示例

{ "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;

五、选型要点

  • Web 传输:GeoJSON(小数据)、矢量瓦片(大数据)
  • 单文件交换:GeoPackage(现代)、Shapefile(兼容老)
  • 栅格影像:GeoTIFF、云端 COG
  • 展示标注:KML/KMZ(Google Earth 生态)

⚠️ 常见坑:Shapefile 字段名超 10 字符被截断——它是老格式限制。用 GeoPackage 或 GeoJSON 没这限制。

💡 关键直觉:Web 用 GeoJSON,单文件交换用 GeoPackage,传统用 Shapefile,栅格用 GeoTIFF/COG。用 GDAL/OGR 转换格式。

六、Shapefile 的多文件结构

Shapefile 不是单文件,是一组配套文件,拷贝时必须一起复制,少了任何一个都可能打不开:

扩展名 作用
.shp 几何数据(必选)
.shx 几何索引(必选)
.dbf 属性数据(必选)
.prj 坐标系定义(强烈建议保留)
.cpg 属性编码(中文属性常需要)
.sbn/.sbx 空间索引(可选)

最容易犯的错是只拷了 .shp 三个文件、丢了 .prj——几何能打开,但坐标系信息丢了,叠加到底图上错位,排查半天。所以规范的做法是:交付 Shapefile 时打成一个压缩包,解压后五个基础文件齐全再入库。

七、GeoPackage 为什么是更好的交换格式

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 叠加一个已知位置的底图抽查几个点,确认无误再交付。

九、格式选型的决策清单

  • 给第三方系统做数据交换 → GeoPackage(现代)或 Shapefile(对方强制)
  • Web 接口传输小数据 → GeoJSON,浏览器原生解析
  • 大范围矢量在线渲染 → 矢量瓦片(第 3 章详述),不要直接传整个 GeoJSON
  • 遥感影像存储 → GeoTIFF,云端访问用 COG
  • 地图标注共享 → KML/KMZ,兼容 Google Earth
  • 长期归档 → GeoPackage 或数据库导出备份,避免依赖单个二进制文件

十、编码与兼容性注意事项

格式转换里最隐蔽的问题不是坐标而是编码:

  • 中文乱码:Shapefile 的 .dbf 属性默认是若干种编码,中文数据通常需要 .cpg 文件声明编码(如 UTF-8 或 GBK)。用 ogr2ogr 转换时加 -lco ENCODING=UTF-8,避免入库后属性乱码。
  • GeoJSON 编码:GeoJSON 规范要求 UTF-8,绝大多数现代工具都符合;遇到老工具生成的乱码 GeoJSON,先检查文件头编码。
  • 坐标顺序:GeoJSON 里经纬度顺序是经度在前;部分工具(如某些投影库)用纬度在前,混用会导致点跑到海里去。
  • 字段类型兼容:Shapefile 的 dbf 字段类型有限(字符、数字、日期),转 GeoPackage 或 GeoJSON 时字段类型更灵活,但反过来可能丢失精度。

十一、数据格式的备份与归档

GIS 数据归档建议"双保险":数据库导出 SQL 备份加原始格式文件备份。数据库备份用 pg_dump 保留结构和空间扩展;原始文件归档保留坐标系和元数据。定期做一次恢复演练,确认备份真的能用。长期项目里"数据还能找回来"比"功能有多炫"更关键。

要点串联

  • 矢量格式:Shapefile(老/多文件)、GeoJSON(Web/文本)、GeoPackage(现代单文件)、KML(展示)。
  • 栅格格式:GeoTIFF(标准)、COG(云优化按需读)、JPEG2000。
  • GeoJSON:坐标 WGS84 经度在前,Web 原生友好。
  • 转换:GDAL/OGR(ogr2ogr/gdal_translate)、PostGIS(shp2pgsql/ST_AsGeoJSON)。
  • 选型:Web 用 GeoJSON,交换用 GeoPackage,传统用 Shapefile,影像用 GeoTIFF/COG。

第 2 章结束。下一章把这些数据发布成服务。


作者与出处
原作者: 灏天文库
来源:灏天文库
整理: 灏天文库整理
由灏天文库平台收录,内容或由平台用户上传,仅供学习交流
发布者: 作者: 灏天文库 转发
评论区 (0)
U