複製鏈接
請複製以下鏈接發送給好友

SHP

(SHP西普)

鎖定
shape文件由ESRI開發,一個ESRI(Environmental Systems Research Institute)的shape文件包括一個主文件,一個索引文件,和一個dBASE表。其中主文件的後綴就是.shp
中文名
SHP
製    作
WESTWOOD
文件格式
SHAPE
點陣文件
柵格圖形文件
數    據
全球定位系統(GPS)

SHP文件格式

shp文件由固定長度的文件頭和接着的變長度記錄組成。每個變長度記錄是由固定長度的記錄頭和接
着的變長度記錄內容組成。
SDE,ARC/INFO,PC ARC/INFO,Data Automation Kit(DAK)和ArcCAD軟件提供了shape 到coverage的數據
轉換器,ARC/INFO同樣提供了coverage到shape的轉換器。為了和其他數據格式交換,shape文件的格式在
本報告中被出版。其他數據流,比如來自全球定位系統(GPS)接收機的數據能同樣被存為shape文件或X,Y事
件表。

SHP文件產生

Shape文件技術描述計算機程序能通過使用本節的技術描述來產生,讀,寫shape文件。
一個ESRI的shape文件包括一個主文件,一個索引文件,和一個dBASE表。主文件是一個直接存取,變量記
錄長度文件,其中每個記錄描述一個有它自己的vertices列表的shape。在索引文件中,每個記錄包含對應主
文件記錄離主文件頭開始的偏移,dBASE表包含一feature一個記錄的feature的特徵。幾何和屬性間的一一對
應關係是基於記錄數目的。在dBASE文件中的屬性記錄必須和主文件中的記錄是相同順序的。
命名習慣所有文件名都符合8.3命名習慣。主文件,索引文件和dBASE文件有相同的前綴。前綴必須是由字
符或數字(a-Z,0-9)開始,後跟0到7個字符(a-Z,0-9,_,)主文件的後綴是.shp,索引文件的後綴是.shx,
SHP SHP [1]
dBASE表的後綴是.dbf。文件名中的所有字母在對文件名敏感的操作系統中都是小寫的。
例子
主文件:counties.shp索引文件:counties.shx dBASE表:counties.dbf數字類型一個shape文件存儲整數
雙精度數,本文檔的餘數指以下類型:
整數:有符號32位整數(4字節)
雙精度:有符號64位IEEE雙精度浮點數(8字節)浮點數必須是數字的值。負無窮正無窮和非數字
NaN)值在shape文件不被允許。然而shape文件支持'沒有數據'的值這樣的概念,但是隻用於衡量。
某些小於-1038被shape文件讀取程序用來代表'沒有數據'的值。
下面的第一節描述shape文件的總體結構和組織。第二節描述shape文件支持的每種shape類型的記錄內容。
主文件的組織
主文件(.shp)由固定長度的文件頭和接着的變長度記錄組成。每個變長度記錄是由固定長度的記錄頭和接
着的變長度記錄內容組成。圖1圖解了主文件的結構。
圖 1 主文件的結構
文件頭
記錄頭記錄內容
Shape文件中所有的內容可以被分為二類:
與數據相關的:
。主文件記錄內容
。主文件頭的數據描述域(Shape 類型,邊界盒等)
文件管理相關的:
。文件和記錄長度
。記錄偏移等
整數和雙精度整數在文件頭中組成數據描述域,在主文件的記錄內容是小ndian(PC或Intel)字節順序。組
成文件的其餘部分和文件管理的整數和雙精度浮點數是大endian(Sun或Motorola)字節順序。

SHP主文件頭

主文件頭100字節長。表1顯示帶有字節位置,值,類型和字節順序的文件頭中的域。
在此表中,位置是相對於文件的開始。
表 1 主文件頭的描述
位置域 值 類型字節順序
0字節文件代碼9994 整數大
4字節未被使用0 整數大
8字節未被使用0 整數大
12字節未被使用0 整數大
16字節未被使用0 整數大
20字節未被使用0 整數大
24字節文件長度文件長度整數大
28字節版本 1000 整數小
32字節Shape類型Shape類型整數小
36字節邊界盒 Xmin 雙精度小
44字節邊界盒 Ymin 雙精度小
52字節邊界盒 Xmax 雙精度小
60字節邊界盒 Ymax 雙精度小
68字節* 邊界盒Zmin 雙精度小
76字節* 邊界盒Zmax 雙精度小
84字節* 邊界盒Mmin 雙精度 小
92字節* 邊界盒Mmax 雙精度小
*未被使用,值為0.0,若沒有被衡量或是Z軸。
文件長度的值是在16位字下文件的總長度(包括組成文件頭的50個16位字)。在shape文件中的所有非空
shape被需要是同種shape類型。Shape類型的值如下:
值 shape類型
0 空shape
1 點
3 多線
8 多點
11 點Z
13 多線Z
15 多邊形Z
18 多點Z
21 點M
23 多線M
25 多邊形M
28 多點M
31 多斑塊
沒有被定義的Shape 類型值(2,4,6等直到33)為將來可能的使用而保留。shape文件被侷限於包含
以上定義的同種shape類型。在將來shape文件可以被允許包含多於一種shape類型。若混合shape類型被實
現,文件頭中的shape類型將標識該文件。
主文件頭的邊界盒存儲文件中shape的實際幅度。最小邊界X和Y直交的(潛在的M,Z)長方形包含了所有的
shape。若shape文件是空的(沒有記錄),min,Ymin,Xmax,Ymax的值是未被定義的。Mmin和Mmax能包含
shape文件用來衡量不包含衡量的shape類型的'沒有數據'的值(參見2頁的數字類型),記錄頭
每個記錄的頭存儲了記錄的數目和記錄內容的長度。記錄頭有一個固定長度8字節。表2顯示文件記錄頭中
域的字節位置,值,類型和字節順序。在表中,位置是相對於記錄的開始的。
表 2 主文件記錄頭文件的描述
位置域 值 類型 字節順序
0字節記錄數目記錄數目整數大
4字節內容長度內容長度整數大
記錄數目從1開始。
一個記錄的內容長度是按16位字衡量的記錄內容長度。每個記錄因此為文件的總長度貢獻(4+內容長度)
個16位字,正如文件頭是24字節一樣。
主文件記錄內容
Shape文件記錄內容包含一個shape類型和接着的該shape的幾何數據。記錄內容的長度依賴於在一個shape
中部分和vertices的數目。對每種shape類型,我們首先描述該shape然後是它在磁盤上的存儲鏡像。在表3到
16,位置是相對於記錄內容的開始。
空shape
shape類型為0指代一種不帶幾何數據的空shape,每種要素類型(點,線,多邊形等)都支持空,在同一個
shape文件中有點和空的點是有效的。常常空shape是放東西的地方;在shape文件產生時被使用和在產生後
更被廣泛地使用。
表 3 空shape記錄內容
位置域 值 類型 數目字節順序
0字節shape類型0 整數1 小
在X,Y位置的Shape類型
點 一個點包括一對以X,Y順序排列的雙精度的座標
Point
{
Double X //X座標
Double Y //Y座標
}
表 4 點記錄內容
位置域 值 類型 數目字節順序
0字節shape類型1 整數1 小
4字節X X 雙精度1 小
12字節Y Y 雙精度1 小
多點一個多點代表一個點的集合:
MultiPoint
{
Double[4] Box //邊界盒
Integer NumPoints //點的數目
Point[NumPoints] Points //在集合中的點
}
邊界盒以Xmin,Ymin,Xmax,Ymax存儲。
表 5 多點記錄內容
位置域 值 類型 數目字節順序
0字節shape類型8 整數1 小
4字節Box Box 雙精度4 小
36字節NumPoints NumPoints 整數1 小
40字節Points Points 點 NumPoints 小
PolyLine 一條PolyLine是指一條包含一個或多個部分的有序的vertices的集合。一個部分是指二個或多個點
彼此連接的順序。部分間彼此相連或不連。部分間彼此可能相交或不相交。
因為該定義沒有禁止有確定座標的連續點,shape文件的讀程序必須掌握這樣的情況。在另外,退化
(degenerate)和可能導致零長度的結果是不被允許的。
PolyLine
{
Double[4] Box //邊界盒
Integer NumParts //部分的數目
Integer NumPoints //點的總數目
Point[NumPoints] Points //所有部分的點
}
PolyLine的域在以下為更詳細的描述:
Box 被存儲的PolyLine的邊界盒,以Xmin,Ymin,Xmax,Ymax的順序存儲
NumParts 在PolyLine中部分的數目。
NumPoints 所有部分的點的總數目。
Parts NumParts長度的數列。為每條PolyLine存儲它在點數列中的第一個點的索引。數列索引是從0開始
的。
Points NumPoints長度的數列。在PolyLine中的每一部分的點被尾到尾存儲。部分2的點跟在部分1的點之
後,如此下去。部分數列對每一部分保持開始點的數列索引。
在部分間點之間沒有界限。
表 6 PolyLine記錄內容
位置域 值 類型 數目字節順序
0字節shape類型3 整數1 小
4字節Box Box 雙精度4 小
36字節NumParts NumParts 整數1 小
40字節NumPoints NumPoints 整數1 小
44字節Parts Parts 整數NumParts 小
X字節Points Points 點 NumPoints 小
注意:X=44+4* NumParts多邊形一個多邊形包含一個或多個環。一個環是四或多個點彼此相連組成的一個
閉合的彼此不相交的環。一個多邊形可能包括多個外環,一個環的vertices的順序和方向指示環的哪一邊是多
邊形的內部。在多邊形中的洞的環的vertices是逆時針方向的。一個環組成的多邊形總是順時針方向的。一個
多邊形的環是被做為它的一部分的。因為該定義沒有禁止有確定座標的連續的點,shape文件讀程序必須解
決這種情況。在另外,退化(degenerate)和可能導致零長度的結果是不被允許的。多邊形的結構被定義為
PolyLine結構,正如下文:
Polygon
{
Double[4] Box //邊界盒
Integer NumParts //部分的數目
Integer NumPoints //點的總數目
Point[NumPoints] Points //所有部分的點
}
多邊形的域在以下為更詳細的描述:
NumParts 在多邊形中環的數目。
NumPoints 所有環的點的總數目。
圖 2中的例子圖演示了多邊形的表現。該圖中的多邊形有一個洞,總共是8個vertices。
關於多邊形shape有以下重要注意事項:
存儲在shape文件中的多邊形必須是clean,一個clean的多邊形是指這樣的一個多邊形:
1. 沒有自交。這意味着屬於一個環的一段可能不與另一個環的一段相交。一個多邊形
的環可能在vetices處彼此相交,但不是在沿段處。重合的段被認為是相交的。
2. 在定義多邊形的線的正確一邊有多邊形的內部。一個觀察者以vertex順序沿環走時,右邊的鄰居是多邊
形的內部。一個獨環的多邊形的vertices因此都是順時針的。在這些多邊形中的洞有一個逆時針的方向。當定
義在多邊形中的洞同樣是順時針時,發生"Dirty"多邊形錯誤。這會導致內部的重疊。
圖 2 一個多邊形的實例
在此例中,NumParts等於2,NumPoints等於10。注意洞多邊形的點的順序是逆序的。
0 5
部 分 : 0 5
0 1 2 3 4 5 6 7 8 9
點 : v1 v2 v3 v4 v1 v5 v8 v7 v6 v5
表 7 多邊形記錄內容
位置域 值 類型 數目字節順序
0字節shape類型5 整數1 小
4字節Box Box 雙精度4 小
36字節NumParts NumParts 整數1 小
40字節NumPoints NumPoints 整數1 小
44字節Parts Parts 整數NumParts 小
X字節Points Points 點 NumPoints 小
注意:X=44+4* NumParts
在X,Y空間中衡量的shape類型該種shape有一個額外的座標M,注意"沒有數據"的值可以被指定為M的一個
值。
PointM 一個PointM包括一對以X,Y順序排列的雙精度的座標,再加上衡量M。
PointM
{
Double X //X 座標
Double Y //Y 座標
Double M //M 衡量
}
表 8 PointM記錄內容
位置域 值 類型 數目字節順序
0字節shape類型21 整數1 小
4字節X X 雙精度1 小
12字節Y Y 雙精度1 小
20字節M M 雙精度 1 小
多PointM 一個多PointM代表一個PointM的集合:
MultiPoint
{
Double[4] Box //邊界盒
Integer NumPoints //點的數目
Point[NumPoints] Points //在集合中的點
Double[2] M Range //衡量M的上下界
Double[NumPoints] M Array //衡量
}
多PointM的域在以下為更詳細的描述:
Box 被存儲的多PointM的邊界盒,以Xmin,Ymin,Xmax,Ymax的順序存儲。
NumPoints 點的總數目。
Points NumPoints長的點的數列。
M Array NumPoints長的衡量的數組。
表 9 多PointM記錄內容
位置域 值 類型 數目字節順序
0字節shape類型28 整數1 小
4字節Box Box 雙精度4 小
36字節NumPoints NumPoints 整數1 小
40字節Points Points 點 NumPoints 小
X*字節Mmin Mmin 雙精度1 小
X+8*字節Mmax Mmax 雙精度1 小
X+16*字節Marry Marry 雙精度 NumPoints 小
注意:X = 40+(16* NumPoints) *可選的
多LineM 一條shape文件的多LineM包含一個或多個部分。指一條包含一個或多個部分的有序的vertices的集
PolyLineM
{
Double[4] Box //邊界盒
Integer NumParts //部分的數目
Integer NumPoints //點的總數目
Point[NumPoints] Points //所有部分的點
Double[2] M Range //衡量M的上下界
Double[NumPoints] M Array //所有點的衡量
}
PolyLineM的域在以下為更詳細的描述:
Box 被存儲的PolyLineM的邊界盒,以Xmin,Ymin,Xmax,Ymax的順序存儲。
NumParts 在PolyLineM中部分的數目。
NumPoints 所有部分的點的總數目。
Parts NumParts長度的數列。為每條PolyLineV存儲它在點數列中的第一個點的索引。數列索引是從0開
始的。
Points NumPoints長度的數列。在PolyLineM中的每一部分的點被尾到尾存儲。部分2的點跟在部分1的點
之後,如此下去。部分數列對每一部分保持開始點的數列索引。
在部分間點之間沒有界限。
表 10 PolyLineM記錄內容
位置域 值 類型 數目字節順序
0字節shape類型23 整數1 小
4字節Box Box 雙精度4 小
36字節NumParts NumParts 整數1 小
40字節NumPoints NumPoints 整數1 小
44字節Parts Parts 整數NumParts 小
X字節Points Points 點 NumPoints 小
Y*字節Mmin Mmin 雙精度1 小
Y+8*字節Mmax Mmax 雙精度1 小
Y+16*字節Marry Marry 雙精度 NumPoints 小
注意:X=44+4* NumParts Y = 40+(16* NumPoints) *可選的
多邊形M 一個多邊形M包含一個或多個環。一個環是四或多個點彼此相連組成的一個閉合的彼此不相交的
環。注意相交是在X,Y空間計算,而不是在X,Y,M空間。一個多邊形可能包括多個外環,一個多邊形的環是被
做為它的一部分的。
多邊形M的結構被定義為PolyLineM結構,正如下文:
PolygonM
{
Double[4] Box //邊界盒
Integer NumParts //部分的數目
Integer NumPoints //點的總數目
Point[NumPoints] Points //所有部分的點
Double[2] M Range //衡量M的上下界
Double[NumPoints] M Array //所有點的衡量
}
多邊形M的域在以下為更詳細的描述:
Box 被存儲的多邊形的邊界盒,以Xmin,Ymin,Xmax,Ymax的順序存儲。
NumParts 在多邊形M中環的數目。
NumPoints 所有環的點的總數目。
Parts NumParts長度的數列。為每條環存儲它在點數列中的第一個點的索引。數列索引是從0開始的。
Points NumPoints長度的數列。在多邊形中的每一個環的點被尾到尾存儲。環2的點跟在環1的點之後,
如此下去。部分數列對每一環保持開始點的數列索引。在環間點之間沒有界限。
M Range 以Mmin,Mmax順序存儲的多PointM的最小,最大值
M Array NumPoints長的衡量的數組,在多PointM每部分的衡量被被尾到尾存儲部分2的點跟在部分1的點之
關於PolygonM shape有以下注意事項:
環是閉合的(第一個和最後一個vetex必須是一樣的)在點數列中環的順序是不重要的。
表 11 多邊形M的記錄內容
位置域 值 類型 數目字節順序
0字節shape類型5 整數1 小
4字節Box Box 雙精度4 小
36字節NumParts NumParts 整數1 小
40字節NumPoints NumPoints 整數1 小
44字節Parts Parts 整數NumParts 小
X字節Points Points 點 NumPoints 小
Y*字節Mmin Mmin 雙精度1 小
Y+8*字節Mmax Mmax 雙精度1 小
Y+16*字節Marry Marry 雙精度 NumPoints 小
注意:X=44+4* NumParts Y = 40+(16* NumPoints) *可選的在X,Y,Z空間中衡量的shape類型該種
shape有一個額外的座標M,注意"沒有數據"的值可以被指定為M的一個值。
PointZ 一個PointZ包括一對以X,Y,Z順序排列的雙精度的座標,再加上衡量M。
PointM
{
Double X //X 座標
Double Y //Y 座標
Double Z //Z 座標
Double M //M 衡量
}
表 12 PointZ記錄內容
位置域 值 類型 數目字節順序
0字節shape類型21 整數1 小
4字節X X 雙精度1 小
12字節Y Y 雙精度1 小
20字節Z Z 雙精度1 小
28字節Measure M 雙精度 1 小
多PointZ 一個多PointZ代表一個PointZ的集合:
MultiPoint
{
Double[4] Box //邊界盒
Integer NumPoints //點的數目
Point[NumPoints] Points //在集合中的點
Double[2] Z Range //Z的上下界
Double[NumPoints] Z Array //Z的值
Double[2] M Range //衡量M的上下界
Double[NumPoints] M Array //衡量
}
邊界盒是以Xmin,Ymin,Xmax,Ymax的順序存儲。Z Range是以Mmin,Mmax順序存儲的,M Range是以
Mmin,Mmax順序存儲的。
表 9 多PointM記錄內容
位置域 值 類型 數目字節順序
0字節shape類型28 整數1 小
4字節Box Box 雙精度4 小
36字節NumPoints NumPoints 整數1 小
40字節Points Points 點 NumPoints 小
X字節Zmin Zmin 雙精度1 小
X+8字節Zmax Zmax 雙精度1 小
X+16字節Zarry Zarry 雙精度 NumPoints 小
Y*字節Mmin Mmin 雙精度1 小
Y+8*字節Mmax Mmax 雙精度1 小
Y+16*字節Marry Marry 雙精度 NumPoints 小
注意:X = 40+(16* NumPoints)Y=X+16+(8* NumPoints) *可選的
多LineZ 一條shape文件的多LineZ包含一個或多個部分。指一條包含一個或多個部分的有序的vertices的集
合。一個部分是指二個或多個點彼此連接的順序。部分間彼此相連或不連。部分間彼此可能相交或不相交。
PolyLineZ
{
Double[4] Box //邊界盒
Integer NumParts //部分的數目
Integer NumPoints //點的總數目
Point[NumPoints] Points //所有部分的點
Double[2] Z Range //Z的上下界
Double[NumPoints] Z Array //Z的值
Double[2] M Range //衡量M的上下界
Double[NumPoints] M Array //所有點的衡量
}
PolyLineZ的域在以下為更詳細的描述:
Box 被存儲的PolyLineZ的邊界盒,以Xmin,Ymin,Xmax,Ymax的順序存儲。
NumParts 在PolyLineZ中部分的數目。
NumPoints 所有部分的點的總數目。
Parts NumParts長度的數列。為每條PolyLineZ存儲它在點數列中的第一個點的索引。數列索引是從0開
始的。
Points NumPoints長度的數列。在PolyLineZ中的每一部分的點被尾到尾存儲。部分2的點跟在部分1的點
之後,如此下去。部分數列對每一部分保持開始點的數列索引。在部分間點之間沒有界限。
ZRange 以Zmin,Zmax順序存儲的多PointZ的最小,最大值。
Z Array NumPoints長的衡量的數組,在多PointZ每部分的衡量被被尾到尾存儲部分2的點跟在部分1的點之
後,如此下去。部分數列對每一部分保持開始點的數列索引。在部分間點之間沒有界限。
M Range 以Mmin,Mmax順序存儲的多PointZ的最小,最大值。
表 14 PolyLineZ記錄內容
位置域 值 類型 數目字節順序
0字節shape類型23 整數1 小
4字節Box Box 雙精度4 小
36字節NumParts NumParts 整數1 小
40字節NumPoints NumPoints 整數1 小
44字節Parts Parts 整數NumParts 小
X字節Points Points 點 NumPoints 小
Y字節Zmin Zmin 雙精度1 小
Y+8字節Zmax Zmax 雙精度1 小
Y+16字節Zarry Zarry 雙精度 NumPoints 小
Z*字節Mmin Mmin 雙精度1 小
Z+8*字節Mmax Mmax 雙精度 1 小
Z+16*字節Marry Marry 雙精度 NumPoints 小
多邊形Z的結構被定義為PolyLineZ結構,正如下文:
PolygonZ
{
Double[4] Box //邊界盒
Integer NumParts //部分的數目
Integer NumPoints //點的總數目
Point[NumPoints] Points //所有部分的點
Double[2] Z Range //Z的上下界
Double[NumPoints] Z Array //Z的值
Double[2] M Range //衡量M的上下界
Double[NumPoints] M Array //所有點的衡量
表 15 多邊形Z的記錄內容
位置域 值 類型 數目字節順序
0字節shape類型15 整數1 小
4字節Box Box 雙精度4 小
36字節NumParts NumParts 整數1 小
40字節NumPoints NumPoints 整數1 小
44字節Parts Parts 整數NumParts 小
X字節Points Points 點 NumPoints 小
Y字節Zmin Zmin 雙精度1 小
Y+8字節Zmax Zmax 雙精度1 小
Y+16字節Zarry Zarry 雙精度 NumPoints 小
Z*字節Mmin Mmin 雙精度1 小
Z+8*字節Mmax Mmax 雙精度 1 小
Z+16*字節Marry Marry 雙精度 NumPoints 小
注意:X=44+4* NumParts Y = X+(16* NumPoints)Z=Y+16+(8* NumPoints)*可選的多Patch 一個
MultiPatch 包括許多表面斑塊。每個表面斑塊描述了一個表面。MultiPatch的表面斑塊是指比如它的部分,
控制一個MultiPatch部分的vertices順序是如何被解釋的部分類型。一個MultiPatch的部分可以是以下類型:
三角形條帶三角形的連接條帶,此處每個頂點(在開始二個後)完成一個新三角形。一個新三角形總是
通過把新頂點和二個臨近的原有點相連而得到。
三角形扇三角形的連接扇,此處每個頂點(在開始二個後)完成一個新三角形。一個新三角形總是通過把
新頂點和一個個臨近的原有點及這部分的第一個頂點相連而得到。
外環 多邊形的外環。
內環多邊形的洞。
第一環未定義類型的多邊形的第一個環。
環 未定義類型的多邊形的環。
一個簡單的三角形條帶或三角形扇代表一個簡單的表面斑塊。參見圖3 看這些部分類型的例子。帶環的部分
的序列能描述有洞的多邊形表面。該序列典型包括一個外環,代表斑塊的外邊界,用許多內環代表洞。當用
代表表現帶洞的多邊形斑塊環的集合的個體環是不知道,整個序列以第一環開始,接着是其他的環。不跟着
第一環後的環的序列被認為是沒有洞的外環的序列。
圖 3 MultiPatch 部分例子
用來對部分類型進行編碼的值有:
值 部分類型
0 三角形條帶
1 三角形扇
2 外環
3 內環
4 第一環
5 環
MultiPatch
{
Double[4] Box //邊界盒
Integer NumParts //部分的數目
Integer NumPoints //點的總數目
Integer[NumParts] Parts //在部分中第一個點的索引
Integer[NumParts] PartsTypes //部分類型
Point[NumPoints] Points //所有部分的點
Double[2] Z Range //Z的上下界
Double[NumPoints] Z Array //Z的值
Double[2] M Range //衡量M的上下界
Double[NumPoints] M Array //所有點的衡量
參考資料