矢量数据格式有哪些?数据结构和质检方法
刚接触 GIS 项目时,很多同学会先问:矢量数据到底用什么格式保存,SHP、GeoJSON、GeoPackage、PostGIS 又该怎么选?更麻烦的是,同一份道路、地块或管线图层,打开后可能出现字段乱码、面要素自相交、坐标系不对、线段断开、面积统计异常。本文从实际数据交付场景出发,讲清楚矢量数据格式有哪些、常见几何结构,以及数据质检的可复用方法。
先说结论:格式选择不能只看“软件能不能打开”,还要看数据规模、字段类型、坐标系、拓扑关系、多人协作和后续发布方式。日常制图和分析可以从 GeoPackage 或 File Geodatabase 开始,WebGIS 交换常用 GeoJSON,传统测绘交付仍常见 Shapefile,大规模共享和服务化则优先考虑 PostGIS。
矢量数据格式有哪些:先按用途选择容器
这个问题不是单纯背名词。一个格式本质上是在回答三件事:几何怎么存,属性怎么存,空间参考和索引怎么配合。不同项目对这三件事的要求不同,所以格式选择也不同。
- Shapefile。兼容性强,很多测绘和规划项目仍在使用;缺点是由多个文件组成,字段名长度有限,不适合复杂字段和现代协作。
- GeoPackage。单文件 SQLite 容器,可存多个图层、索引和属性,适合 QGIS 项目交换和中小规模成果归档。
- File Geodatabase。ArcGIS Pro 生态常用,适合较完整的工程数据组织、子类型、域值和较大数据量管理。
- GeoJSON。文本格式,适合 WebGIS、接口交换和调试;大数据量时体积较大,浏览器加载压力明显。
- KML/KMZ。适合 Google Earth 浏览、简单标注和成果展示,不适合严肃的数据生产和拓扑管理。
- PostGIS。把空间数据放进 PostgreSQL,适合多用户编辑、空间查询、服务发布和长期数据资产管理。

问题背景:为什么同一份数据换格式后会出错
真实项目里,问题通常不是“打不开”,而是打开以后不可信。比如规划红线从 CAD 转成 SHP 后字段被截断,村界面图层合并后出现空洞,管线数据导入数据库后坐标偏到国外,GeoJSON 发给前端后页面卡顿。这些问题都和格式、结构和质检流程有关。
最常见的根因有四类。第一,格式能力不一致,例如 Shapefile 对字段名、编码和单字段类型支持有限。第二,坐标系元数据丢失或被误指定,导致数据显示位置正确但量算错误。第三,几何合法性没有检查,面自相交、线重复、点重叠会影响叠加分析。第四,WebGIS 或数据库场景没有建立空间索引,查询和渲染性能会明显下降。
不要把格式转换当作“另存为”。一次合格的转换至少要验证坐标系、字段、要素数量、几何类型、范围和关键拓扑关系。
核心原理:矢量数据结构由几何、属性和空间参考组成
矢量数据结构的核心是用坐标串描述真实世界对象。点表示井盖、站点、采样点;线表示道路、河流、管线;面表示地块、行政区、湖泊。几何本身只说明形状和位置,属性表才说明对象的名称、编号、等级、用途、权属或时间等业务信息。
一个完整图层通常包含四部分:
- 几何。点、折线、多边形、多点、多线、多面,以及是否包含 Z 值或 M 值。
- 属性。字段名、字段类型、编码、空值规则、唯一编号和业务分类。
- 空间参考。地理坐标系、投影坐标系、坐标单位、EPSG 编码或自定义投影参数。
- 索引与约束。空间索引、属性索引、主键、唯一约束、拓扑规则或域值范围。
理解这套结构后,很多错误就容易定位。面积计算不对,通常先查投影坐标系;道路分析断网,先查线端点是否连接;行政区统计漏算,先查面是否重叠、缝隙或自相交;字段统计异常,先看字段类型是不是文本而不是数值。
步骤一:按项目场景选择矢量数据格式
如果你只是学习 GIS 或做单机分析,建议优先使用 GeoPackage。它是单文件,复制方便,能存多个图层,也比一组 Shapefile 文件更不容易丢失组成部分。QGIS 中可以直接新建 GeoPackage 图层,ArcGIS Pro 也能读取常见矢量格式。
如果项目在 ArcGIS Pro 体系内生产,并且需要域值、子类型、较复杂的数据组织,File Geodatabase 更合适。如果要给 Leaflet、OpenLayers 或后端接口做轻量交换,GeoJSON 更直观,但上线前要控制要素数量、字段冗余和坐标精度。
如果团队需要多人编辑、权限控制、空间查询和地图服务发布,建议把核心数据放入 PostGIS。这样可以用数据库约束控制字段质量,用空间索引提高查询效率,也方便通过 GeoServer、MapServer 或自研接口发布服务。
| 格式 | 适合场景 | 主要限制 |
|---|---|---|
| Shapefile | 传统交付、跨软件交换、简单点线面图层 | 多文件组成,字段名和类型受限,编码容易出问题 |
| GeoPackage | QGIS 项目、课程练习、中小数据归档 | 多人并发编辑能力有限,超大数据需评估性能 |
| File Geodatabase | ArcGIS Pro 工程化生产、完整成果库 | 更依赖 Esri 生态,跨平台自动化需提前测试 |
| GeoJSON | WebGIS 前端、接口调试、轻量数据交换 | 文本体积大,不适合直接承载大规模图层 |
| PostGIS | 数据资产管理、多用户协作、空间查询和服务发布 | 需要数据库维护、权限设计和备份策略 |
步骤二:用 QGIS 或 ArcGIS Pro 检查结构是否正确
拿到一份数据后,不要马上叠加分析。先在 QGIS 或 ArcGIS Pro 中检查图层属性、空间参考和几何类型。这个步骤可以快速发现“看起来能显示,但实际不能分析”的隐患。
- 查看图层坐标系。确认 EPSG 编码、单位和项目坐标系是否一致。经纬度坐标不能直接用于严肃面积和长度统计。
- 查看几何类型。道路应是线,地块应是面,采样点应是点;混合几何会影响很多处理工具。
- 查看字段结构。编号字段是否唯一,分类字段是否有空值,面积和长度字段是否是数值类型。
- 查看范围。图层范围是否落在项目区域内,是否存在异常远点导致范围被拉大。
- 查看要素数量。转换前后要素数量是否一致,是否出现空几何或重复要素。
QGIS 中可用“图层属性”“字段统计”“检查有效性”“拓扑检查器”等工具。ArcGIS Pro 中可用“修复几何”“检查几何”“添加空间索引”“汇总统计数据”等工具。工具名称不同,但检查逻辑是一致的。
步骤三:矢量数据质检的可复用流程
矢量数据质检建议分成六步做,而不是只跑一个“修复几何”。因为几何合法只是底线,项目交付还要关注坐标、属性、拓扑和业务规则。
- 坐标系质检。检查图层声明坐标系、实际坐标范围和项目要求是否一致。不要把“定义投影”和“投影转换”混为一谈。
- 几何合法性质检。检查空几何、自相交、多边形环方向异常、重复节点、零长度线和零面积面。
- 拓扑质检。面图层检查重叠和缝隙,线图层检查悬挂点和伪节点,点图层检查重复点和是否落入目标区域。
- 属性质检。检查必填字段、唯一编号、分类值范围、字段类型、中文编码和异常空值。
- 数量与范围质检。比较转换前后要素数量、总长度、总面积、外包范围和关键统计值。
- 抽样复核。在地图上人工查看典型区域,特别是边界、交叉口、拼接线和数据来源切换位置。
如果数据进入 PostGIS,可以把部分规则写成 SQL,形成可重复检查。例如查找无效几何、重复编号和缺少空间索引的问题。
-- 检查无效几何
SELECT id, ST_IsValidReason(geom)
FROM parcel
WHERE NOT ST_IsValid(geom);
-- 检查重复业务编号
SELECT parcel_code, COUNT(*)
FROM parcel
GROUP BY parcel_code
HAVING COUNT(*) > 1;
-- 检查是否已有空间索引
SELECT indexname, indexdef
FROM pg_indexes
WHERE tablename = 'parcel';
对于 Python 自动化,可以用 GeoPandas 批量检查字段、坐标系、空几何和范围。下面示例适合做交付前的轻量体检,不替代完整拓扑质检。
import geopandas as gpd
gdf = gpd.read_file("parcel.gpkg", layer="parcel")
print("CRS:", gdf.crs)
print("Feature count:", len(gdf))
print("Geometry types:", gdf.geometry.geom_type.value_counts())
print("Empty geometry:", gdf.geometry.is_empty.sum())
print("Null geometry:", gdf.geometry.isna().sum())
print("Bounds:", gdf.total_bounds)
required_fields = ["parcel_code", "land_use"]
for field in required_fields:
print(field, "null count:", gdf[field].isna().sum())
常见坑点:格式转换后不要只看图能不能显示
- 把坐标系定义错当作转换。如果数据本身是 CGCS2000 投影坐标,却被强行定义成 WGS84,经纬度显示可能完全错位。
- 忽略 Shapefile 字段限制。长字段名被截断后,脚本、样式和统计模板可能找不到原字段。
- GeoJSON 直接上生产大图层。前端一次加载几万到几十万要素时,解析和渲染都会成为瓶颈,应考虑切片、矢量瓦片或服务端过滤。
- 面图层没有做拓扑检查。叠加分析时,重叠和缝隙会让统计结果出现重复或漏算。
- 数据库导入后忘记建空间索引。PostGIS 中没有 GiST 索引时,空间查询性能可能非常差。
- 只修复不记录。质检报告应记录发现的问题、修复方法和剩余风险,方便后续追溯。
矢量数据与栅格数据的区别:什么时候不要互相替代
矢量数据与栅格数据的区别主要体现在表达方式。前者用点、线、面表达离散对象,适合道路、地块、行政区、管线、POI 等边界明确的对象;后者用像元矩阵表达连续表面,适合遥感影像、高程、温度、降雨和土地覆盖概率。
项目中不要简单地说哪一种更高级。地块确权、管线巡检、道路网络分析更依赖点线面结构;坡度分析、影像分类、适宜性评价更依赖栅格。两类数据经常结合使用,例如用行政区面统计栅格人口,用道路缓冲区裁剪遥感影像,或者把分类栅格矢量化后做地类汇总。
| 对比项 | 矢量 | 栅格 |
|---|---|---|
| 表达对象 | 点、线、面等边界明确的实体 | 连续表面或规则像元矩阵 |
| 典型数据 | 道路、宗地、行政区、管线、站点 | 影像、DEM、温度、降雨、土地覆盖 |
| 适合分析 | 叠加、缓冲、网络、拓扑、空间查询 | 栅格计算、地形分析、分类、连续面建模 |
| 主要风险 | 拓扑错误、字段错误、坐标系错误 | 分辨率不匹配、重采样误差、像元对齐问题 |
工具和方法对比:QGIS、ArcGIS Pro、GeoPandas、PostGIS怎么分工
单个工具很难覆盖全部数据生命周期。桌面软件适合可视化检查和人工编辑,脚本适合批量重复检查,数据库适合长期管理和服务化。
- QGIS。适合学习、格式转换、坐标处理、拓扑检查和快速制图。GeoPackage 工作流尤其顺手。
- ArcGIS Pro。适合企业级工程数据、地理数据库、制图表达和较完整的地理处理流程。
- GeoPandas。适合批量读取、字段检查、格式转换和自动化报告,但复杂拓扑规则需要配合其他工具。
- PostGIS。适合空间索引、SQL 质检、多用户协作、服务发布和生产数据资产管理。
一个稳妥的流程是:先在 QGIS 或 ArcGIS Pro 中人工确认样本和坐标,再用 GeoPandas 批量扫描字段和基础几何问题,最后把正式数据导入 PostGIS,建立索引、约束和质检 SQL。这样既能看得见问题,也能让检查过程可重复。
实践检查清单
交付或入库前,可以按下面清单快速复核:
- 项目要求的格式是否明确,是否需要同时交付源数据、发布数据和备份数据。
- 坐标系是否正确声明,是否完成必要的投影转换。
- 几何类型是否单一,是否存在空几何、无效几何和异常范围。
- 点线面拓扑规则是否符合业务要求,例如面不重叠、线端点连接、点落入指定面。
- 字段名、字段类型、编码、必填项和唯一编号是否符合数据字典。
- 转换前后要素数量、面积、长度和关键字段统计是否一致或差异可解释。
- WebGIS 使用的数据是否做了简化、分页、切片或服务端过滤。
- PostGIS 表是否建立主键、空间索引和必要的属性索引。
- 质检结果是否形成记录,修复动作是否可追溯。
FAQ:格式、结构、质检和栅格对比
矢量数据格式有哪些,新手应该先学哪几个?
常见答案包括 Shapefile、GeoPackage、GeoJSON、File Geodatabase、KML/KMZ 和 PostGIS。新手建议先掌握 Shapefile 的兼容性和限制,再把 GeoPackage 作为日常练习格式,最后学习 GeoJSON 和 PostGIS,分别对应 WebGIS 交换和数据库管理。
矢量数据结构是不是只包含点线面?
不是。矢量数据结构除了点、线、面几何,还包括属性字段、空间参考、索引和约束。做分析时,这些内容同样重要。只有几何没有字段,无法表达业务含义;只有字段没有正确坐标系,空间分析结果也不可靠。
矢量数据质检必须用专业软件吗?
矢量数据质检可以组合完成。QGIS 和 ArcGIS Pro 适合交互式检查、修复几何和查看拓扑问题;GeoPandas 适合批量扫描字段和基础几何;PostGIS 适合把重复规则写成 SQL。关键不是工具越多越好,而是每次都按同一套规则检查。
矢量数据与栅格数据的区别会影响格式选择吗?
会。矢量数据与栅格数据的区别决定了它们适合的存储和分析方法。道路、边界和管线应优先保存为点线面;遥感影像、DEM 和连续环境变量应保存为栅格。不要为了统一格式而强行转换,否则会引入精度损失或拓扑问题。
为什么 Shapefile 打开正常,但字段和中文经常出问题?
Shapefile 兼容性好,但它是较老的格式,字段名长度、字段类型和编码处理都有历史限制。跨软件传递时,中文编码、长字段名和日期字段最容易出问题。若没有强制交付要求,日常编辑和归档更建议使用 GeoPackage 或数据库。
总结
理解矢量数据,不要停留在“点线面”和“能打开”两个层面。真正可用的数据必须同时满足格式合适、结构清楚、坐标正确、属性可靠和拓扑可检查。格式负责承载,结构负责表达,质检负责让结果可信。
实际工作中可以记住一个顺序:先根据应用场景选择格式,再检查几何和字段结构,随后按坐标、几何、拓扑、属性、数量和范围做质检,最后根据发布方式决定是否进入 PostGIS、GeoJSON 或矢量瓦片流程。这样处理,数据在制图、分析和 WebGIS 发布中都更稳定。