Shapefile

ESRI Shapefile（shp），或簡稱shapefile，是美國環境系統研究所公司（ESRI）開發的空間數據開放格式。目前，該文件格式已經成為了地理資訊軟體界的開放標準，這表明ESRI公司在全球的地理資訊系統市場的重要性。Shapefile也是重要的交換格式，能夠在ESRI與其他公司的產品之間進行數據互操作。

Shapefile文件用於描述幾何體對象：點、折線與多邊形。例如，Shapefile文件可以存儲井、河流、湖泊等空間對象的幾何位置。除了幾何位置，shp文件也可以存儲這些空間對象的屬性，例如河流的名字、城市的溫度等等。

## 概覽

Shapefile屬於一種矢量圖形格式，它能夠保存幾何圖形的位置及相關屬性。但這種格式沒法存儲地理數據的拓撲資訊。Shapefile在九十年代初的ArcView GIS的第二個版本被首次應用。目前，許多自由的程序或商業的程序都可以讀取Shapefile。

Shapefile是一種比較原始的矢量數據存儲方式，它僅僅能夠存儲幾何體的位置數據，而無法在一個文件之中同時存儲這些幾何體的屬性數據。因此，Shapefile還必須附帶一個二維表用於存儲Shapefile中每個幾何體的屬性資訊。Shapefile中許多幾何體能夠代表複雜的地理事物，並為他們提供強大而精確的計算能力。

Shapefile文件指的是一種文件存儲的方法，實際上該種文件格式是由多個文件組成的。其中，要組成一個Shapefile，有三個文件是必不可少的，它們分別是".shp", ".shx"與 ".dbf"文件。表示同一數據的一組文件其文件名前綴應該相同。例如，存儲一個關於湖的幾何與屬性數據，就必須有lake.shp，lake.shx與lake.dbf三個文件。而其中「真正」的Shapefile的後綴為shp，然而僅有這個文件數據是不完整的，必須要把其他兩個附帶上才能構成一組完整的地理數據。除了這三個必須的文件以外，還有八個可選的文件，使用它們可以增強空間數據的表達能力。所有的文件名都必須遵循MS DOS的8.3文件名標準（文件前綴名8個字符，後綴名3個字符，如shapefil.shp），以方便與一些老的應用程式保持兼容性，儘管現在許多新的程序都能夠支持長文件名。此外，所有的文件都必須位於同一個目錄之中。

必須的文件:

- .shp — 圖形格式，用於保存元素的幾何實體。
- .shx — 圖形索引格式。幾何體位置索引，記錄每一個幾何體在shp文件之中的位置，能夠加快向前或向後搜索一個幾何體的效率。
- .dbf — 屬性數據格式，以dBase III+ 的數據表格式存儲每個幾何形狀的屬性數據。

其他可選的文件：

- .prj — 投影格式，用於保存地理坐標系統與投影資訊，是一個存儲well-known text投影描述符的文本文件。
- .sbn and .sbx — 幾何體的空間索引
- .fbn and .fbx — 只讀的Shapefiles的幾何體的空間索引
- .ain and .aih — 列表中活動欄位的屬性索引。
- .ixs — 可讀寫Shapefile文件的地理編碼索引
- .mxs — 可讀寫Shapefile文件的地理編碼索引(ODB格式)
- .atx — .dbf文件的屬性索引，其文件名格式為shapefile.columnname.atx (ArcGIS 8及之後的版本)
- .shp.xml — 以XML格式保存元數據。
- .cpg — 用於描述.dbf文件的代碼頁，指明其使用的字符編碼。

在每個.shp, .shx與.dbf文件之中，圖形在每個文件的排序是一致的。也就是說，.shp的第一條記錄與.shx及.dbf之中的第一條記錄相對應，如此類推。此外，在.shp與.shx之中，有許多欄位的字節序是不一樣的。因此使用者在編寫讀取這些文件格式的程序時，必須十分小心地處理不同文件的不同字節序。

Shapefile通常以X與Y的方式來處理地理坐標，一般X對應經度，Y對應緯度，使用者必須注意X，Y的順序。

### Shapefile圖形格式 (.shp)

Shapefile格式的主文件包含了地理參照數據。該文件由一個定長的文件頭和一個或若干個變長的記錄數據組成。每一條變長數據記錄包含一個記錄頭和一些記錄內容。詳細的數據存儲格式由Esri Shapefile技術描述.提供。注意，雖然Shapefile文件的後綴名與AutoCAD的圖形字體源格式它們的文件後綴名相同的，都是.shp，請不要把它們混淆。

主文件頭包含17個欄位，共100個字節，其中包含九個4位元組（32位有符號整數，int32）整數欄位，緊接著是八個8位元組（雙精度浮點數）有符號浮點數欄位。

字節｜類型｜字節序｜用途

0–3｜int32｜大端序｜文件編號 (永遠是十六進位數0x0000270a)

4–23｜int32｜大端序｜五個沒有被使用的32位整數

24–27｜int32｜大端序｜文件長度，包括文件頭。（用16位整數表示）

28–31｜int32｜小端序｜版本

32–35｜int32｜小端序｜圖形類型（參見下面）

36–67｜double｜小端序｜最小外接矩形 (MBR)，也就是一個包含shapefile之中所有圖形的矩形。以四個浮點數表示，分別是X坐標最小值，Y坐標最小值,X坐標最大值，Y坐標最大值。

68–83｜double｜小端序｜Z坐標值的範圍。以兩個浮點數表示，分別是Z坐標的最小值與Z坐標的最大值。

84–99｜double｜小端序｜M坐標值的範圍。以兩個浮點數表示，分別是M坐標的最小值與M坐標的最大值。

然後這個文件包含不定數目的變長數據記錄，每個數據記錄以一個8位元組記錄頭開始：

字節｜類型｜字節序｜用途

0–3｜int32｜大端序｜記錄編號 (從1開始)

4–7｜int32｜大端序｜記錄長度（以16位整數表示）

在記錄頭的後面就是實際的記錄：

字節｜類型｜字節序｜用途

0–3｜int32｜小端序｜圖形類型（參見下面）

4–｜圖形內容

變長記錄的內容由圖形的類型決定。Shapefile支持以下的圖形類型：

值｜圖形類型｜欄位

0｜空圖形｜無

1｜Point（點）｜X, Y

3｜Polyline（折線）｜（最小包圍矩形）MBR，組成部分數目，點的數目，所有組成部分，所有點

5｜Polygon（多邊形）｜（最小包圍矩形）MBR，組成部分數目，點的數目，所有組成部分，所有點

8｜MultiPoint（多點）｜（最小包圍矩形）MBR，點的數目，所有點

11｜PointZ（帶Z與M坐標的點）｜X, Y, Z, M

13｜PolylineZ（帶Z或M坐標的折線）｜必須的: （最小包圍矩形）MBR，組成部分數目，點的數目，所有組成部分，所有點，Z坐標範圍, Z坐標陣列 可選的: M坐標範圍, M坐標陣列

15｜PolygonZ（帶Z或M坐標的多邊形）｜必須的: （最小包圍矩形）MBR，組成部分數目，點的數目，所有組成部分，所有點，Z坐標範圍, Z坐標陣列 可選的: M坐標範圍, M坐標陣列

18｜MultiPointZ（帶Z或M坐標的多點）｜必須的: （最小包圍矩形）MBR，點的數目，所有點， Z坐標範圍, Z坐標陣列 可選的: M坐標範圍, M坐標陣列

21｜PointM（帶M坐標的點）｜X, Y, M

23｜PolylineM（帶M坐標的折線）｜必須的: （最小包圍矩形）MBR，組成部分數目，點的數目，所有組成部分，所有點 可選的: M坐標範圍, M坐標陣列

25｜PolygonM（帶M坐標的多邊形）｜必須的: （最小包圍矩形）MBR，組成部分數目，點的數目，所有組成部分，所有點 可選的: M坐標範圍, M坐標陣列

28｜MultiPointM（帶M坐標的多點）｜必須的: （最小包圍矩形）MBR，點的數目，所有點 可選的: M坐標範圍, M坐標陣列

31｜MultiPatch｜必須的: （最小包圍矩形）MBR，組成部分數目，點的數目，所有組成部分，所有點，Z坐標範圍, Z坐標陣列 可選的: M坐標範圍, M坐標陣列

在普通的使用中，Shapefile通常包含點、折線與多邊形。帶有Z坐標的形狀是三維的。帶有M坐標的形狀是包含一個使用者指定的測量值，該測量值定義在每一個點坐標之上。三維的Shapefile十分罕見。此外，實際應用中通常，Shapefile的M測量值這個功能已經被其他功能更加強大和穩健的資料庫取代，Shapefile一般只負責幾何數據。

### Shapefile圖形索引格式(.shx)

Shapefile的文件索引包含與.shp文件相同的100個字節的文件頭，然後跟隨著不定數目的8位元組定長記錄，每個記錄都有兩個欄位：

字節｜類型｜字節序｜用途

0–3｜int32｜大端序｜記錄位移（用16位整數表示）

4–7｜int32｜大端序｜記錄長度（用16位整數表示）

因為這個圖形索引每個數據項都是定長的，因此程序只要在這個圖形索引中向前或向後遍歷，讀取索引中所記錄的記錄位移與記錄長度，程序就可以很快地向前或向後遍歷整個Shapefile，在.shp文件中找到任意一個幾何體的正確位置。

### Shapefile屬性格式(.dbf)

每個圖形的屬性數據存儲在dBase格式的數據表之中。屬性數據也可以存儲在另一種開放的數據表格式xBase格式之中。在開源Shapefile函式庫Shapefile C library中就是這樣存儲。

### Shapefile投影格式(.prj)

.prj文件中的資訊包含了.shp文件中幾何數據所使用的經緯度坐標系統。儘管這個文件不是必須的，一般使用都會提供它，這樣使用者就無需猜測所給的坐標的經緯度系統。ArcGIS Desktop 9及以後的版本使用well-known text格式來生成坐標系統描述資訊。以前的ArcGIS版本和某些第三方軟體通常生成如下的這種格式：

老的投影文件格式樣例：

Projection UTM

Zunits NO

Units METERS

Spheroid CLARKE1866

Xshift 0.0000000000

Yshift -4000000.0000000000

Parameters

-108 0 0.000 /* longitude

36 0 0.000 /* latitude

新的WKT格式樣例：

GEOGCS"GCS_North_American_1927",DATUM"D_North_American_1927",SPHEROID"Clarke_1866",6378206.4,294.9786982,PRIMEM"Greenwich",0,UNIT"Degree",0.0174532925199433

.prj文件中包含以下資訊：

- 經緯度坐標系統或地圖投影的名稱
- 測量基準
- 橢球體參數
- 本初子午線
- 所使用的單位
- 用於定義地圖投影的參數，例如：
- 緯度原點
- 縮放比例
- 中央經線
- 北偽偏移
- 東偽偏移
- 標準緯線

### Shapefile空間索引格式(.sbn)

這是一個二進位的空間索引文件，僅僅可以應用在ESRI的軟體之中。其文件格式沒有公開的文檔，其他廠商也沒有實現這個文件。.sbn並不是必須的，因為.shp文件之中已經包含了所有的解析空間數據所需的資訊。

## 限制

### Shapefile與拓撲

Shapefile無法存儲拓撲資訊。在ESRI的文件格式中，ArcInfo 的Coverage、以及Personal/File/Enterprise地理資料庫，能夠保存地理要素的拓撲資訊。

### 空間表達

在shapefile文件之中，所有的折線與多邊形都是用點來定義，點與點之間採用線性插值，也就是說點與點之間都是用線段相連。在數據採集時，點與點之間的距離決定了該文件所使用的比例。當圖形放大超過一定比例的時候，圖形就會呈現出鋸齒。要使圖形看上去更加平滑，那麼就必須使用更多的點，這樣就會消耗更大的存儲空間。在這種情況下，樣條函數可以很精確地表達不同形狀的曲線而且占據相對更少的空間，但是目前shapefile並不支持樣條曲線。

### 數據存儲量

.shp文件或.dbf文件最大的體積不能夠超過2 GB（或231位）。也就是說，一個shapefile最多只能夠存儲七千萬個點坐標。文件所能夠存儲的幾何體的數目取決於單個要素所使用的頂點的數目。

屬性資料庫格式所使用的.dbf文件基於一個比較古老的dBase標準。這種資料庫格式天生有許多限制，例如：

- 無法存儲空值。這對於數量數據來說是一個嚴重的問題，因為空值通常都用0來代替，這樣會歪曲很多統計表達的結果。
- 對欄位名或存儲值中的Unicode支持不理想。
- 欄位名最多只能夠有10個字符。
- 最多只能夠有255個欄位。
- 只支持以下的數據類型：浮點類型（13位元組存儲空間），整數（4或9位元組存儲空間），日期（不能夠存儲時間，8位元組存儲空間）和文本（最大254位元組存儲空間）
- 浮點數有可能包含捨入錯誤，因為它們以文本的形式保存。

### 混合幾何類型

由於在每一條幾何記錄中都有該記錄的幾何類型，所以理論上一個shapefile是可以存儲混合的幾何類型。但實際上規範中指出在同一shapefile之中所有非空的幾何體都必須是同一類型。因此shapefile被限制為僅僅可以混合存儲空幾何體和另一單一幾何體，該幾何體的類型必須與文件頭中定義的類型一致。例如，一個shapefile文件不可能同時包含折線與多邊形數據，所以，在實際的地理事物描述中，井（點類型）、河（折線類型）與湖（多邊形類型）必須分開存儲在三個不同的文件之中。

## 外部連結

- Shapefile 文件擴展（英文） – Esri ArcGIS 10.0 在線幫助(2010)
- Esri Shapefile 技術描述（英文） – Esri白皮書, 1998年6月
- shapelib.maptools.org - 開放的shapefile讀寫C函數庫
- Python Shapefile 函數庫 - 開源的（MIT許可證）shapefile讀寫Python函數庫

## 基本資料

- 擴展名：.shp, .shx, .dbf
- 類型：地理資訊系統
- 所有者：ESRI
- 標準： Shapefile技術描述