檔案格式
shp檔案由固定長度的
檔案頭和接著的變長度記錄組成。每個變長度記錄是由固定長度的記錄頭和接
著的變長度記錄內容組成。
SHAPE檔案格式
SDE,ARC/INFO,PC ARC/INFO,Data Automation Kit(DAK)和ArcCAD軟體提供了shape 到coverage的數據
轉換器,ARC/INFO同樣提供了coverage到shape的轉換器。為了和其他數據格式交換,shape檔案的格式在
本報告中被出版。其他數據流,比如來自
全球定位系統(GPS)接收機的數據能同樣被存為shape檔案或X,Y事
件表。
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,
dBASE表的後綴是.dbf。檔案名稱中的所有字母在對檔案名稱敏感的作業系統中都是小寫的。
例子
主檔案:counties.shp
索引檔案:counties.shx dBASE表:counties.dbf數字類型一個shape檔案存儲整數
和雙精度數,本文檔的餘數指以下類型:
雙精度:有符號64位IEEE
雙精度浮點數(8位元組)浮點數必須是數字的值。負無窮,正無窮和非數字
(NaN)值在shape檔案不被允許。然而shape檔案支持'沒有數據'的值這樣的概念,但是只用於衡量。
某些小於-1038被shape檔案讀取程式用來代表'沒有數據'的值。
下面的第一節描述shape檔案的總體結構和組織。第二節描述shape檔案支持的每種shape類型的記錄內容。
主檔案的組織
主檔案(.shp)由固定長度的檔案頭和接著的變長度記錄組成。每個變長度記錄是由固定長度的記錄頭和接
著的變長度記錄內容組成。圖1圖解了主檔案的結構。
圖 1 主檔案的結構
檔案頭
記錄頭記錄內容
Shape檔案中所有的內容可以被分為二類:
與數據相關的:
。主檔案記錄內容
。主檔案頭的數據描述域(Shape 類型,邊界盒等)
與檔案管理相關的:
。檔案和記錄長度
。記錄偏移等
整數和雙精度整數在
檔案頭中組成數據描述域,在主檔案的記錄內容是小ndian(PC或Intel)
位元組順序。組
成檔案的其餘部分和檔案管理的整數和
雙精度浮點數是大endian(Sun或Motorola)位元組順序。
主檔案頭
主檔案頭100位元組長。表1顯示帶有位元組位置,值,類型和位元組順序的檔案頭中的域。
在此表中,位置是相對於檔案的開始。
表 1 主檔案頭的描述
0位元組檔案代碼9994 整數大
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 多線
5 多邊形
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的實際幅度。最小邊界X和Y直交的(潛在的M,Z)長方形包含了所有的
shape。若shape檔案是空的(沒有記錄),min,Ymin,Xmax,Ymax的值是未被定義的。Mmin和Mmax能包含
shape檔案用來衡量不包含衡量的shape類型的'沒有數據'的值(參見2頁的數字類型),記錄頭
每個記錄的頭存儲了記錄的數目和記錄內容的長度。記錄頭有一個固定長度8位元組。表2顯示檔案記錄頭中
域的位元組位置,值,類型和
位元組順序。在表中,位置是相對於記錄的開始的。
表 2 主檔案記錄頭檔案的描述
位置域 值 類型 位元組順序
0位元組記錄數目記錄數目整數大
4位元組內容長度內容長度整數大
記錄數目從1開始。
一個記錄的內容長度是按16位字衡量的記錄內容長度。每個記錄因此為檔案的總長度貢獻(4+內容長度)
主檔案記錄內容
Shape檔案記錄內容包含一個shape類型和接著的該shape的幾何數據。記錄內容的長度依賴於在一個shape
中部分和vertices的數目。對每種shape類型,我們首先描述該shape然後是它在磁碟上的存儲鏡像。在表3到
16,位置是相對於記錄內容的開始。
空shape
shape類型為0指代一種不帶幾何數據的空shape,每種要素類型(點,線,多邊形等)都支持空,在同一個
shape檔案中有點和空的點是有效的。常常空shape是放東西的地方;在shape檔案產生時被使用和在產生後
更被廣泛地使用。
表 3 空shape記錄內容
位置域 值 類型 數目位元組順序
在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 //所有點的衡量