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
但两者的设计目标不同。
| 对比 | Shapefile | GeoJSON |
|---|---|---|
| 基础形式 | 多文件 | JSON |
| Web开发 | 一般 | 非常适合 |
| 人类可读 | 较差 | 较好 |
| GIS软件支持 | 非常广泛 | 非常广泛 |
| 属性结构 | 传统 | 灵活 |
| 大型数据 | 一般 | 一般 |
| 数据交换 | 非常常见 | 非常常见 |
简单理解:
Shapefile
↓
传统GIS数据交换
GeoJSON
↓
Web GIS数据交换
Shapefile与GeoPackage
GeoPackage也是现代GIS常见的数据格式。
| 对比 | Shapefile | GeoPackage |
|---|---|---|
| 文件数量 | 多个 | 通常一个 |
| 基础技术 | DBF + 二进制文件 | SQLite |
| 多图层 | 不方便 | 支持 |
| 属性能力 | 较传统 | 更灵活 |
| 空间数据库能力 | 较弱 | 较强 |
| 现代GIS | 仍广泛使用 | 推荐 |
| 数据交换 | 非常常见 | 非常适合 |
例如Shapefile:
roads.shp
roads.shx
roads.dbf
roads.prj
GeoPackage:
city.gpkg
一个GeoPackage还可以包含:
roads
buildings
rivers
parks
多个图层。
Shapefile与GeoParquet
GeoParquet主要面向现代大规模数据分析。
| 对比 | Shapefile | GeoParquet |
|---|---|---|
| 存储方式 | 传统文件集合 | 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 数据