Shapefile 文件结构解析与在线查看
Shapefile 是由 ESRI(Environmental Systems Research Institute)开发的一种矢量地理数据格式,广泛应用于 GIS 领域。许多开发者初次接触时容易产生一个误解:认为 Shapefile 就是单个 .shp 文件。实际上,一个完整的 Shapefile 是由多个文件组成的文件集合,这些文件共享相同的主文件名,但扩展名不同。
核心文件组成
一个标准的 Shapefile 至少包含以下三个核心文件,缺一不可:
.shp—— 存储几何数据.dbf—— 存储属性数据.shx—— 存储空间索引
此外,常见的可选文件还包括 .prj(投影信息)、.cpg(编码声明)等。
.shp 文件:几何数据
.shp 文件以二进制格式存储几何要素的坐标数据,是 Shapefile 的核心。它支持三种基本几何类型:
- 点(Point):单个坐标对,如兴趣点位置
- 线(LineString/PolyLine):有序坐标序列,如道路、河流
- 面(Polygon):闭合环坐标,如行政区划、地块边界
文件内部通过文件头(File Header)记录几何类型、边界范围等元信息,随后以记录(Record)为单位逐一存储每个要素的几何数据。
.dbf 文件:属性数据
.dbf 文件采用 dBASE 表格式存储属性数据,其结构类似一张数据库表。每行对应一个几何要素,每列代表一个属性字段。例如,一个省级行政区划 Shapefile 的 .dbf 可能包含 名称、人口、面积 等字段。
需要注意的是,dBASE 格式存在字段名长度限制(通常为 10 个字符),且日期字段以 `YYYYMMDD` 字符串形式存储。
.shx 文件:空间索引
.shx 文件是几何记录的偏移索引,本质上是一个定长记录的索引表。它记录了每个要素在 .shp 文件中的起始偏移量和内容长度,使得程序可以快速定位到特定要素,而无需从头遍历整个 .shp 文件。
浏览器端解析
得益于 JavaScript 生态的发展,现在可以直接在浏览器中解析 Shapefile。常用的方案是使用 shpjs 库,它支持以下两种输入方式:
- 分别上传
.shp和.dbf文件进行解析 - 直接解析
.zip打包文件(推荐,避免文件遗漏)
import shp from 'shpjs';
// 解析 zip 打包的 Shapefile
const geojson = await shp(zipBuffer);
console.log(geojson); // GeoJSON FeatureCollection转换为 GeoJSON
shpjs 解析后会自动将结果转换为 GeoJSON 的 FeatureCollection 结构。每个几何要素变为一个 Feature,.dbf 中的属性自动映射到 Feature.properties,方便后续在 Leaflet、Mapbox 等地图库中直接渲染。
注意事项
在实际使用中,有几个常见问题需要特别关注:
- 文件编码:中文属性常出现乱码。旧版 Shapefile 多使用 GBK 编码,而 GeoJSON 标准要求 UTF-8。解析时需注意编码转换,
.cpg文件可声明所用编码。 - 多部件几何:一个面要素可能由多个独立环组成(如岛屿群),解析后对应 GeoJSON 的
MultiPolygon类型。 - 空几何处理:某些要素可能存在空几何,需在转换时做容错处理,避免渲染异常。
- 文件完整性:缺少
.shx或.dbf会导致解析失败,建议以.zip形式打包传输所有相关文件。
在线查看工具
如果你想快速查看 Shapefile 的内容而无需安装桌面 GIS 软件,可以使用在线工具直接解析并在地图上可视化。访问 Shapefile 在线查看工具,上传 .zip 文件即可自动解析并展示几何图形与属性表。