GIS

Shapefile是什么

了解Shapefile的基本概念、文件组成、Geometry类型、属性数据、坐标系以及Shapefile与GeoJSON、GeoPackage、GeoParquet的区别。

阅读约 69 分钟

Shapefile是什么

Shapefile是一种非常经典的GIS矢量数据格式。

它最早由Esri推出,目前已经成为GIS领域中非常常见的数据交换格式之一。

Shapefile主要用于保存:

  • 线
  • 属性数据
  • 坐标参考系统

虽然名称叫做:

Shapefile

但它实际上并不是一个单独的文件,而是由多个文件共同组成的一组数据文件。

最常见的文件扩展名包括:

.shp
.shx
.dbf
.prj

因此:

Shapefile是一组共同组成一个GIS图层的文件,而不是单独的.shp文件。

Shapefile包含什么

一个典型的Shapefile可能是:

roads.shp
roads.shx
roads.dbf
roads.prj

其中:

.shp
    ↓
Geometry

.shx
    ↓
Geometry索引

.dbf
    ↓
属性数据

.prj
    ↓
坐标参考系统

可以理解为:

Shapefile
├── Geometry
├── Attribute
├── Index
└── CRS

.shp文件

.shp是Shapefile最核心的文件。

它主要保存Geometry。

例如道路:

roads.shp
    ↓
LineString
    ↓
道路空间形状

城市:

cities.shp
    ↓
Point
    ↓
城市位置

行政区:

boundary.shp
    ↓
Polygon
    ↓
行政区边界

因此可以简单理解为:

.shp
    ↓
空间几何数据

.shx文件

.shx是Shapefile的空间索引文件。

它用于帮助快速定位.shp中的Geometry。

可以理解为:

.shp
    ↓
真正的Geometry

.shx
    ↓
Geometry索引

数据读取时:

读取Geometry
    ↓
查询索引
    ↓
快速定位数据

.shx通常与.shp配套存在。

.dbf文件

.dbf用于保存属性数据。

例如道路数据:

id | name | type | speed
---|------|------|------
1  | 长安街 | road | 60
2  | 二环路 | road | 80

其中:

name
type
speed

都是属性。

而道路本身的空间形状存储在:

.shp

中。

因此:

.shp
    ↓
Geometry

.dbf
    ↓
Attributes

两者共同组成GIS Feature的数据。

.prj文件

.prj用于保存坐标参考系统信息。

例如:

EPSG:4326

或者其他投影坐标系。

.prj通常保存的是坐标参考系统的文本定义,而不是简单地保存一个EPSG数字。

可以理解为:

.shp
    ↓
坐标

.prj
    ↓
这些坐标是什么坐标系

如果缺少.prj,GIS软件可能无法正确判断空间数据使用的坐标系。

Shapefile的基本结构

一个完整的Shapefile可以理解为:

roads
├── roads.shp
├── roads.shx
├── roads.dbf
└── roads.prj

对应:

roads.shp
    ↓
Geometry

roads.shx
    ↓
Index

roads.dbf
    ↓
Attributes

roads.prj
    ↓
CRS

所以:

发送Shapefile数据时,通常不能只发送.shp文件。

Shapefile中的Geometry

Shapefile可以保存常见的矢量Geometry。

例如:

Point
MultiPoint
Polyline
Polygon

在GIS概念中可以理解为:

Point
    ↓
点

Polyline
    ↓
线

Polygon
    ↓
面

例如:

cities
    ↓
Point

roads
    ↓
Polyline

buildings
    ↓
Polygon

Point Shapefile

Point Shapefile用于保存点状空间对象。

例如:

  • 城市
  • 门店
  • 学校
  • 医院
  • 摄像头
  • 充电桩
  • POI

数据结构可以理解为:

Feature
├── Geometry
│   └── Point
│
└── Attributes

例如:

POINT
    ↓
116.397, 39.908

Polyline Shapefile

Polyline用于保存线状对象。

例如:

  • 道路
  • 河流
  • 铁路
  • 管线
  • GPS轨迹

结构:

Feature
├── Geometry
│   └── Polyline
│
└── Attributes

Geometry可以由多个坐标组成:

Point
  ↓
Point
  ↓
Point
  ↓
Point

最终形成一条线。

Polygon Shapefile

Polygon用于保存区域对象。

例如:

  • 行政区
  • 地块
  • 建筑物
  • 湖泊
  • 公园
  • 土地利用区域

结构:

Feature
├── Geometry
│   └── Polygon
│
└── Attributes

Polygon通常由闭合的环组成。

例如:

A → B → C → D → A

Shapefile中的属性数据

Shapefile使用.dbf保存属性数据。

例如:

id | name | type | area
---|------|------|-----
1  | 北京 | city | 16410
2  | 上海 | city | 6340

Geometry和属性之间通过Feature记录对应。

可以理解为:

Feature
├── Geometry
│   └── Point
│
└── Attributes
    ├── id
    ├── name
    └── type

Geometry与属性的对应关系

假设有三个城市:

Geometry
├── Point 1
├── Point 2
└── Point 3

对应属性:

Attributes
├── 北京
├── 上海
└── 广州

GIS软件会将Geometry和对应属性组织成Feature。

因此:

Geometry 1
    +
Attribute 1
    ↓
Feature 1

Shapefile字段限制

Shapefile的属性表存在一些传统格式限制。

例如字段名通常受到较严格的长度限制。

传统Shapefile的DBF字段名通常最多使用10个字符。

例如:

population

可以使用。

但:

population_count_2026

这样的字段名可能需要缩短。

因此在设计Shapefile属性表时,需要注意字段名称兼容性。

Shapefile字段类型

Shapefile的DBF属性表主要支持传统字段类型,例如:

Character
Numeric
Float
Date
Logical

相比现代数据库格式,类型支持更加有限。

因此:

复杂JSON
数组
嵌套对象
长文本

并不是Shapefile属性表擅长处理的数据。

Shapefile与坐标系

Shapefile的空间坐标主要存储在:

.shp

而坐标参考系统通常通过:

.prj

描述。

例如:

.shp
    ↓
116.397
39.908

.prj
    ↓
WGS 84

因此:

Geometry
    +
CRS
    ↓
正确空间位置

如果.prj缺失或者定义错误,就可能出现地图位置错误。

Shapefile与EPSG:4326

Shapefile可以保存WGS 84经纬度数据。

例如:

X = 116.397
Y = 39.908

如果使用:

EPSG:4326

通常可以理解为:

经度 = 116.397
纬度 = 39.908

但实际使用时,仍然应该以.prj中的坐标参考系统定义为准。

Shapefile与EPSG:3857

Shapefile也可以保存投影坐标。

例如Web GIS常见的:

EPSG:3857

这时坐标通常不再是:

经度
纬度

而是:

X
Y

对应投影平面上的坐标值。

因此:

Shapefile
    ↓
Geometry
    ↓
CRS
    ↓
解释Coordinates

Shapefile与GeoJSON

GeoJSON是现代Web GIS中非常常见的数据格式。

Shapefile和GeoJSON都可以保存:

Point
Line
Polygon
Attributes

但两者的设计目标不同。

对比ShapefileGeoJSON
基础形式多文件JSON
Web开发一般非常适合
人类可读较差较好
GIS软件支持非常广泛非常广泛
属性结构传统灵活
大型数据一般一般
数据交换非常常见非常常见

简单理解:

Shapefile
    ↓
传统GIS数据交换

GeoJSON
    ↓
Web GIS数据交换

Shapefile与GeoPackage

GeoPackage也是现代GIS常见的数据格式。

对比ShapefileGeoPackage
文件数量多个通常一个
基础技术DBF + 二进制文件SQLite
多图层不方便支持
属性能力较传统更灵活
空间数据库能力较弱较强
现代GIS仍广泛使用推荐
数据交换非常常见非常适合

例如Shapefile:

roads.shp
roads.shx
roads.dbf
roads.prj

GeoPackage:

city.gpkg

一个GeoPackage还可以包含:

roads
buildings
rivers
parks

多个图层。

Shapefile与GeoParquet

GeoParquet主要面向现代大规模数据分析。

对比ShapefileGeoParquet
存储方式传统文件集合Parquet列式存储
大数据一般非常适合
云存储一般非常适合
数据分析一般非常适合
属性结构有传统限制更灵活
GIS兼容非常广泛越来越广泛
Web GIS一般通常作为后端数据

可以理解为:

Shapefile
    ↓
传统GIS

GeoParquet
    ↓
GIS大数据

Shapefile与WKT

WKT主要用于表示Geometry。

例如:

POINT (116.397 39.908)

Shapefile则保存完整GIS图层。

可以理解为:

WKT
    ↓
Geometry文本

Shapefile
    ↓
Geometry
+
Attributes
+
CRS
+
Index

因此两者不是同一层级的数据格式。

Shapefile与CSV

CSV主要保存表格数据。

例如:

id,name,longitude,latitude
1,北京,116.397,39.908
2,上海,121.473,31.230

CSV本身并不天然包含标准Geometry。

通常需要:

CSV
 ↓
经度 + 纬度
 ↓
Point
 ↓
Shapefile

而Shapefile直接保存空间Geometry。

Shapefile文件必须一起使用

这是使用Shapefile时非常重要的一点。

例如:

roads.shp
roads.shx
roads.dbf
roads.prj

它们的文件名应该保持一致:

roads.shp
roads.shx
roads.dbf
roads.prj

而不是:

roads.shp
road.shx
data.dbf
map.prj

在数据交换时,通常应该将相关文件一起压缩:

roads.zip
├── roads.shp
├── roads.shx
├── roads.dbf
└── roads.prj

为什么Shapefile经常使用ZIP

由于Shapefile由多个文件组成,因此在线上传和下载时通常会将它们打包:

roads.shp
roads.shx
roads.dbf
roads.prj

压缩为:

roads.zip

这样可以避免:

缺少.shx
缺少.dbf
缺少.prj

导致GIS数据无法正常读取。

Shapefile常见应用

行政区数据

china.shp
    ↓
Polygon
    ↓
行政区边界

道路数据

roads.shp
    ↓
Polyline
    ↓
道路网络

建筑物数据

buildings.shp
    ↓
Polygon
    ↓
建筑物边界

POI数据

poi.shp
    ↓
Point
    ↓
兴趣点

Shapefile数据处理流程

典型处理流程:

Shapefile
    ↓
读取.shp
    ↓
读取.shx
    ↓
读取.dbf
    ↓
读取.prj
    ↓
Geometry + Attributes + CRS
    ↓
GIS Layer

如果需要转换:

Shapefile
    ↓
GIS数据读取
    ↓
转换
    ├── GeoJSON
    ├── GeoPackage
    ├── GeoParquet
    ├── KML
    └── CSV

Shapefile与Web GIS

Shapefile不太适合作为浏览器直接使用的数据格式。

Web GIS通常会先进行转换:

Shapefile
    ↓
后端处理
    ↓
GeoJSON
    ↓
浏览器
    ↓
Vector Layer

对于大规模数据,还可以:

Shapefile
    ↓
GeoParquet
    ↓
空间分析
    ↓
MVT
    ↓
Web地图

Shapefile常见问题

只有.shp文件可以吗?

通常不建议。

完整Shapefile至少通常需要:

.shp
.shx
.dbf

如果需要正确描述坐标系,还应包含:

.prj

为什么地图位置不对?

常见原因包括:

.prj缺失
.prj错误
坐标系判断错误
坐标转换错误

为什么属性字段名称被截断?

因为Shapefile传统DBF格式存在字段名长度限制。

Shapefile可以保存多个图层吗?

一个Shapefile通常对应一个图层。

如果有多个图层:

roads.shp
buildings.shp
rivers.shp
parks.shp

通常需要多个Shapefile。

如果希望一个文件保存多个图层,可以考虑:

GeoPackage

Shapefile的优势

尽管Shapefile是一种较传统的格式,但它仍然非常重要。

主要优势包括:

  • GIS软件兼容性非常好
  • 历史数据非常丰富
  • 数据交换非常常见
  • 结构简单
  • 工具支持广泛
  • 容易转换为其他GIS格式

因此在实际GIS项目中仍然经常遇到Shapefile。

Shapefile的局限

Shapefile也存在明显限制:

多文件
字段名限制
属性类型有限
单图层
传统格式

对于现代空间数据平台,更复杂的数据可能会选择:

GeoPackage
GeoParquet
PostGIS

GIS格式选择

可以按照场景选择:

传统GIS数据
    ↓
Shapefile

Web GIS
    ↓
GeoJSON

本地空间数据库
    ↓
GeoPackage

大规模空间分析
    ↓
GeoParquet

服务器空间数据库
    ↓
PostGIS

Geometry文本
    ↓
WKT

Shapefile知识结构

可以把Shapefile总结为:

Shapefile
│
├── .shp
│   └── Geometry
│
├── .shx
│   └── Geometry Index
│
├── .dbf
│   └── Attributes
│
└── .prj
    └── CRS

核心关系:

.shp
    ↓
Geometry

.dbf
    ↓
Attributes

.prj
    ↓
CRS

.shx
    ↓
Index

Geometry + Attributes
    ↓
Feature
    ↓
GIS Layer

Shapefile转换体系

Shapefile经常作为GIS数据转换的输入格式:

Shapefile
    │
    ├──→ GeoJSON
    │
    ├──→ GeoPackage
    │
    ├──→ GeoParquet
    │
    ├──→ KML
    │
    └──→ CSV

例如Web GIS:

Shapefile
    ↓
GeoJSON
    ↓
OpenLayers
    ↓
Vector Layer
    ↓
Map

大规模分析:

Shapefile
    ↓
GeoParquet
    ↓
DuckDB / GeoPandas / Spark
    ↓
Spatial Analysis

总结

Shapefile是一种经典的GIS矢量数据格式,主要由多个文件共同组成。

最重要的文件包括:

.shp
    ↓
Geometry

.shx
    ↓
Index

.dbf
    ↓
Attributes

.prj
    ↓
CRS

可以记住:

Shapefile不是一个文件,而是一组文件;.shp保存Geometry,.dbf保存属性,.shx提供索引,.prj描述坐标参考系统。

在现代GIS数据处理中,可以根据场景选择:

Shapefile
    ↓
传统GIS交换

GeoJSON
    ↓
Web GIS

GeoPackage
    ↓
本地空间数据库

GeoParquet
    ↓
大规模空间数据分析

PostGIS
    ↓
服务器空间数据库

理解Shapefile之后,就可以进一步学习Shapefile数据读取、Shapefile转GeoJSON、Shapefile转GeoPackage以及Shapefile转GeoParquet等GIS数据处理技术。

🧰

相关工具

使用 IYATools 在线工具快速处理 GIS 数据