SHP

SHP

shape檔案由ESRI開發,一個ESRI(Environmental Systems Research Institute)的shape檔案包括一個主檔案,一個索引檔案,和一個dBASE表。其中主檔案的後綴就是.shp

基本介紹

  • 中文名:SHP
  • 製作:WESTWOOD
  • 檔案格式:SHAPE
  • 點陣檔案:柵格圖形檔案
  • 數據全球定位系統(GPS)
檔案格式
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。檔案名稱中的所有字母在對檔案名稱敏感的作業系統中都是小寫的。
SHP
例子
主檔案: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)位元組順序。
主檔案頭
主檔案頭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 多線
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類型將標識該檔案。
主檔案頭的邊界盒存儲檔案中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 //所有點的衡量

相關詞條

熱門詞條

聯絡我們