Shapefile
副檔名 |
.shp, .shx, .dbf |
---|---|
網路媒體型式 | application/vnd.shp、application/vnd.shx、application/vnd.dbf |
開發者 | ESRI |
格式類型 | 地理資訊系統 |
標準 | Shapefile技術描述 |
ESRI Shapefile(shp),或簡稱shapefile,是美國環境系統研究所公司(ESRI)開發的空間數據開放格式。[1]目前,該檔案格式已經成為了地理資訊軟件界的開放標準,這表明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技術描述.[1]提供。注意,雖然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[2]中就是這樣儲存。
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最多只能夠儲存七千萬個點坐標。[3]檔案所能夠儲存的幾何體的數目取決於單個要素所使用的頂點的數目。
屬性資料庫格式所使用的.dbf檔案基於一個比較古老的dBase標準。這種資料庫格式天生有許多限制,例如:[3]
- 無法儲存空值。這對於數量數據來說是一個嚴重的問題,因為空值通常都用0來代替,這樣會歪曲很多統計表達的結果。
- 對欄位名或儲存值中的Unicode支援不理想。
- 欄位名最多只能夠有10個字元。
- 最多只能夠有255個欄位。
- 只支援以下的資料類型:浮點類型(13位元組儲存空間),整數(4或9位元組儲存空間),日期(不能夠儲存時間,8位元組儲存空間)和文字(最大254位元組儲存空間)
- 浮點數有可能包含捨入錯誤,因為它們以文字的形式儲存。
混合幾何類型
[編輯]由於在每一條幾何記錄中都有該記錄的幾何類型,所以理論上一個shapefile是可以儲存混合的幾何類型。但實際上規範中指出在同一shapefile之中所有非空的幾何體都必須是同一類型。因此shapefile被限制為僅僅可以混合儲存空幾何體和另一單一幾何體,該幾何體的類型必須與檔案頭中定義的類型一致。例如,一個shapefile檔案不可能同時包含折線與多邊形數據,所以,在實際的地理事物描述中,井(點類型)、河(折線類型)與湖(多邊形類型)必須分開儲存在三個不同的檔案之中。
參見
[編輯]參考
[編輯]- ^ 1.0 1.1 Esri. Esri Shapefile technical description (PDF). July 1998 [2007-07-04]. (原始內容存檔 (PDF)於2019-09-27).
- ^ Shapefile C Library V1.2. [2011-02-27]. (原始內容存檔於2018-06-23).
- ^ 3.0 3.1 ArcGIS Desktop 9.3 Help – Geoprocessing considerations for shapefile output. Esri. April 24, 2009 [2011-02-27]. (原始內容存檔於2016-03-04).
外部連結
[編輯]- Shapefile 檔案擴充(英文)(頁面存檔備份,存於互聯網檔案館) – Esri ArcGIS 10.0 線上幫助(2010)
- Esri Shapefile 技術描述(英文)(頁面存檔備份,存於互聯網檔案館) – Esri白皮書, 1998年6月
- shapelib.maptools.org(頁面存檔備份,存於互聯網檔案館) - 開放的shapefile讀寫C函式庫
- Python Shapefile 函式庫(頁面存檔備份,存於互聯網檔案館) - 開源的(MIT許可證)shapefile讀寫Python函式庫