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 位元組（雙精度浮點數）有符號浮點數欄位。

然後這個檔案包含不定數目的變長資料記錄，每個資料記錄以一個 8 位元組記錄頭開始：

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

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

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

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

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

因為這個圖形索引每個資料項都是定長的，因此程式只要在這個圖形索引中向前或向後遍歷，讀取索引中所記錄的記錄位移與記錄長度，程式就可以很快地向前或向後遍歷整個 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 函數庫