SHP
ESRI開發的文件格式
shape文件由ESRI開發,一個ESRI(EnvironmentalSystemsResearchInstitute)的shape文件包括一個主文件,一個索引文件,和一個dBASE表。其中主文件的後綴就是.shp
目錄
文件格式
shp文件由固定長度的文件頭和接著的變長度記錄組成。每個變長度記錄是由固定長度的記錄頭和接
著的變長度記錄內容組成。
SHAPE文件格式
SDE,ARC/INFO,PCARC/INFO,DataAutomationKit(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,
SHP
例子
主文件:counties.shp索引文件:counties.shxdBASE表:counties.dbf數字類型一個shape文件存儲整數
和雙精度數,本文檔的餘數指以下類型:
整數:有符號32位整數(4位元組)
雙精度:有符號64位IEEE雙精度浮點數(8位元組)浮點數必須是數字的值。負無窮,正無窮和非數字
(NaN)值在shape文件不被允許。然而shape文件支持'沒有數據'的值這樣的概念,但是只用于衡量。
某些小於-1038被shape文件讀取程序用來代表'沒有數據'的值。
下面的第一節描述shape文件的總體結構和組織。第二節描述shape文件支持的每種shape類型的記錄內容。
主文件的組織
主文件(.shp)由固定長度的文件頭和接著的變長度記錄組成。每個變長度記錄是由固定長度的記錄頭和接
著的變長度記錄內容組成。
文件頭
記錄頭記錄內容
Shape文件中所有的內容可以被分為二類:
與數據相關的:
。主文件記錄內容
。主文件頭的數據描述域(Shape類型,邊界盒等)
與文件管理相關的:
。文件和記錄長度
。記錄偏移等
整數和雙精度整數在文件頭中組成數據描述域,在主文件的記錄內容是小ndian(PC或Intel)位元組順序。組
成文件的其餘部分和文件管理的整數和雙精度浮點數是大endian(Sun或Motorola)位元組順序。
主文件頭
主文件頭100位元組長。表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顯示文件記錄頭中
域的位元組位置,值,類型和位元組順序。在表中,位置是相對於記錄的開始的。
位置域值類型位元組順序
0位元組記錄數目記錄數目整數大
4位元組內容長度內容長度整數大
記錄數目從1開始。
一個記錄的內容長度是按16位字衡量的記錄內容長度。每個記錄因此為文件的總長度貢獻(4+內容長度)
個16位字,正如文件頭是24位元組一樣。
主文件記錄內容
Shape文件記錄內容包含一個shape類型和接著的該shape的幾何數據。記錄內容的長度依賴於在一個shape
中部分和vertices的數目。對每種shape類型,我們首先描述該shape然後是它在磁碟上的存儲鏡像。在表3到
16,位置是相對於記錄內容的開始。
空shape
shape類型為0指代一種不帶幾何數據的空shape,每種要素類型(點,線,多邊形等)都支持空,在同一個
shape文件中有點和空的點是有效的。常常空shape是放東西的地方;在shape文件產生時被使用和在產生后
更被廣泛地使用。
位置域值類型數目位元組順序
0位元組shape類型0整數1小
在X,Y位置的Shape類型
點一個點包括一對以X,Y順序排列的雙精度的坐標
Point
{
DoubleX//X坐標
DoubleY//Y坐標
}
表4點記錄內容
位置域值類型數目位元組順序
0位元組shape類型1整數1小
4位元組XX雙精度1小
12位元組YY雙精度1小
多點一個多點代表一個點的集合:
MultiPoint
{
Double[4]Box//邊界盒
IntegerNumPoints//點的數目
Point[NumPoints]Points//在集合中的點
}
邊界盒以Xmin,Ymin,Xmax,Ymax存儲。
表5多點記錄內容
位置域值類型數目位元組順序
0位元組shape類型8整數1小
4位元組BoxBox雙精度4小
36位元組NumPointsNumPoints整數1小
40位元組PointsPoints點NumPoints小
PolyLine一條PolyLine是指一條包含一個或多個部分的有序的vertices的集合。一個部分是指二個或多個點
彼此連接的順序。部分間彼此相連或不連。部分間彼此可能相交或不相交。
因為該定義沒有禁止有確定坐標的連續點,shape文件的讀程序必須掌握這樣的情況。在另外,退化
(degenerate)和可能導致零長度的結果是不被允許的。
PolyLine
{
Double[4]Box//邊界盒
IntegerNumParts//部分的數目
IntegerNumPoints//點的總數目
Point[NumPoints]Points//所有部分的點
}
PolyLine的域在以下為更詳細的描述:
Box被存儲的PolyLine的邊界盒,以Xmin,Ymin,Xmax,Ymax的順序存儲。
NumParts在PolyLine中部分的數目。
NumPoints所有部分的點的總數目。
PartsNumParts長度的數列。為每條PolyLine存儲它在點數列中的第一個點的索引。數列索引是從0開始
的。
PointsNumPoints長度的數列。在PolyLine中的每一部分的點被尾到尾存儲。
表6PolyLine記錄內容
位置域值類型數目位元組順序
0位元組shape類型3整數1小
4位元組BoxBox雙精度4小
36位元組NumPartsNumParts整數1小
40位元組NumPointsNumPoints整數1小
44位元組PartsParts整數NumParts小
X位元組PointsPoints點NumPoints小
注意:X=44+4*NumParts多邊形一個多邊形包含一個或多個環。一個環是四或多個點彼此相連組成的一個
閉合的彼此不相交的環。一個多邊形可能包括多個外環,一個環的vertices的順序和方向指示環的哪一邊是多
邊形的內部。在多邊形中的洞的環的vertices是逆時針方向的。一個環組成的多邊形總是順時針方向的。一個
多邊形的環是被做為它的一部分的。因為該定義沒有禁止有確定坐標的連續的點,shape文件讀程序必須解
決這種情況。在另外,退化(degenerate)和可能導致零長度的結果是不被允許的。多邊形的結構被定義為
PolyLine結構,正如下文:
{
Double[4]Box//邊界盒
IntegerNumParts//部分的數目
IntegerNumPoints//點的總數目
Point[NumPoints]Points//所有部分的點
}
多邊形的域在以下為更詳細的描述:
NumParts在多邊形中環的數目。
NumPoints所有環的點的總數目。
圖2中的例子圖演示了多邊形的表現。該圖中的多邊形有一個洞,總共是8個vertices。
關於多邊形shape有以下重要注意事項:
存儲在shape文件中的多邊形必須是clean,一個clean的多邊形是指這樣的一個多邊形:
1.沒有自交。這意味著屬於一個環的一段可能不與另一個環的一段相交。一個多邊形
的環可能在vetices處彼此相交,但不是在沿段處。重合的段被認為是相交的。
2.在定義多邊形的線的正確一邊有多邊形的內部。一個觀察者以vertex順序沿環走時,右邊的鄰居是多邊
形的內部。一個獨環的多邊形的vertices因此都是順時針的。在這些多邊形中的洞有一個逆時針的方向。當定
義在多邊形中的洞同樣是順時針時,發生"Dirty"多邊形錯誤。這會導致內部的重疊。
圖2一個多邊形的實例
在此例中,NumParts等於2,NumPoints等於10。注意洞多邊形的點的順序是逆序的。
05
部分:05
0123456789
點:v1v2v3v4v1v5v8v7v6v5
表7多邊形記錄內容
位置域值類型數目位元組順序
0位元組shape類型5整數1小
4位元組BoxBox雙精度4小
36位元組NumPartsNumParts整數1小
40位元組NumPointsNumPoints整數1小
44位元組PartsParts整數NumParts小
X位元組PointsPoints點NumPoints小
注意:X=44+4*NumParts
在X,Y空間中衡量的shape類型該種shape有一個額外的坐標M,注意"沒有數據"的值可以被指定為M的一個
值。
PointM一個PointM包括一對以X,Y順序排列的雙精度的坐標,再加上衡量M。
PointM
{
DoubleX//X坐標
DoubleY//Y坐標
DoubleM//M衡量
}
表8PointM記錄內容
位置域值類型數目位元組順序
0位元組shape類型21整數1小
4位元組XX雙精度1小
12位元組YY雙精度1小
20位元組MM雙精度1小
多PointM一個多PointM代表一個PointM的集合:
MultiPoint
{
Double[4]Box//邊界盒
IntegerNumPoints//點的數目
Point[NumPoints]Points//在集合中的點
Double[2]MRange//衡量M的上下界
Double[NumPoints]MArray//衡量
}
多PointM的域在以下為更詳細的描述:
Box被存儲的多PointM的邊界盒,以Xmin,Ymin,Xmax,Ymax的順序存儲。
NumPoints點的總數目。
PointsNumPoints長的點的數列。
MArrayNumPoints長的衡量的數組。
表9多PointM記錄內容
位置域值類型數目位元組順序
0位元組shape類型28整數1小
4位元組BoxBox雙精度4小
36位元組NumPointsNumPoints整數1小
40位元組PointsPoints點NumPoints小
X*位元組MminMmin雙精度1小
X+8*位元組MmaxMmax雙精度1小
X+16*位元組MarryMarry雙精度NumPoints小
注意:X=40+(16*NumPoints)*可選的
多LineM一條shape文件的多LineM包含一個或多個部分。指一條包含一個或多個部分的有序的vertices的集
PolyLineM
{
Double[4]Box//邊界盒
IntegerNumParts//部分的數目
IntegerNumPoints//點的總數目
Point[NumPoints]Points//所有部分的點
Double[2]MRange//衡量M的上下界
Double[NumPoints]MArray//所有點的衡量
}
PolyLineM的域在以下為更詳細的描述:
Box被存儲的PolyLineM的邊界盒,以Xmin,Ymin,Xmax,Ymax的順序存儲。
NumParts在PolyLineM中部分的數目。
NumPoints所有部分的點的總數目。
PartsNumParts長度的數列。為每條PolyLineV存儲它在點數列中的第一個點的索引。數列索引是從0開
始的。
PointsNumPoints長度的數列。在PolyLineM中的每一部分的點被尾到尾存儲。
表10PolyLineM記錄內容
位置域值類型數目位元組順序
0位元組shape類型23整數1小
4位元組BoxBox雙精度4小
36位元組NumPartsNumParts整數1小
40位元組NumPointsNumPoints整數1小
44位元組PartsParts整數NumParts小
X位元組PointsPoints點NumPoints小
Y*位元組MminMmin雙精度1小
Y+8*位元組MmaxMmax雙精度1小
Y+16*位元組MarryMarry雙精度NumPoints小
注意:X=44+4*NumPartsY=40+(16*NumPoints)*可選的
多邊形M一個多邊形M包含一個或多個環。一個環是四或多個點彼此相連組成的一個閉合的彼此不相交的
環。注意相交是在X,Y空間計算,而不是在X,Y,M空間。一個多邊形可能包括多個外環,一個多邊形的環是被
做為它的一部分的。
多邊形M的結構被定義為PolyLineM結構,正如下文:
PolygonM
{
Double[4]Box//邊界盒
IntegerNumParts//部分的數目
IntegerNumPoints//點的總數目
Point[NumPoints]Points//所有部分的點
Double[2]MRange//衡量M的上下界
Double[NumPoints]MArray//所有點的衡量
}
多邊形M的域在以下為更詳細的描述:
Box被存儲的多邊形的邊界盒,以Xmin,Ymin,Xmax,Ymax的順序存儲。
NumParts在多邊形M中環的數目。
NumPoints所有環的點的總數目。
PartsNumParts長度的數列。為每條環存儲它在點數列中的第一個點的索引。數列索引是從0開始的。
PointsNumPoints長度的數列。在多邊形中的每一個環的點被尾到尾存儲。環2的點跟在環1的點之後,
如此下去。部分數列對每一環保持開始點的數列索引。在環間點之間沒有界限。
MRange以Mmin,Mmax順序存儲的多PointM的最小,最大值。
MArrayNumPoints長的衡量的數組,在多PointM每部分的衡量被被尾到尾存儲部分2的點跟在部分1的點之
關於PolygonMshape有以下注意事項:
環是閉合的(第一個和最後一個vetex必須是一樣的)在點數列中環的順序是不重要的。
表11多邊形M的記錄內容
位置域值類型數目位元組順序
0位元組shape類型5整數1小
4位元組BoxBox雙精度4小
36位元組NumPartsNumParts整數1小
40位元組NumPointsNumPoints整數1小
44位元組PartsParts整數NumParts小
X位元組PointsPoints點NumPoints小
Y*位元組MminMmin雙精度1小
Y+8*位元組MmaxMmax雙精度1小
Y+16*位元組MarryMarry雙精度NumPoints小
注意:X=44+4*NumPartsY=40+(16*NumPoints)*可選的在X,Y,Z空間中衡量的shape類型該種
shape有一個額外的坐標M,注意"沒有數據"的值可以被指定為M的一個值。
PointZ一個PointZ包括一對以X,Y,Z順序排列的雙精度的坐標,再加上衡量M。
PointM
{
DoubleX//X坐標
DoubleY//Y坐標
DoubleZ//Z坐標
DoubleM//M衡量
}
表12PointZ記錄內容
位置域值類型數目位元組順序
0位元組shape類型21整數1小
4位元組XX雙精度1小
12位元組YY雙精度1小
20位元組ZZ雙精度1小
28位元組MeasureM雙精度1小
多PointZ一個多PointZ代表一個PointZ的集合:
MultiPoint
{
Double[4]Box//邊界盒
IntegerNumPoints//點的數目
Point[NumPoints]Points//在集合中的點
Double[2]ZRange//Z的上下界
Double[NumPoints]ZArray//Z的值
Double[2]MRange//衡量M的上下界
Double[NumPoints]MArray//衡量
}
邊界盒是以Xmin,Ymin,Xmax,Ymax的順序存儲。ZRange是以Mmin,Mmax順序存儲的,MRange是以
Mmin,Mmax順序存儲的。
表9多PointM記錄內容
位置域值類型數目位元組順序
0位元組shape類型28整數1小
4位元組BoxBox雙精度4小
36位元組NumPointsNumPoints整數1小
40位元組PointsPoints點NumPoints小
X位元組ZminZmin雙精度1小
X+8位元組ZmaxZmax雙精度1小
X+16位元組ZarryZarry雙精度NumPoints小
Y*位元組MminMmin雙精度1小
Y+8*位元組MmaxMmax雙精度1小
Y+16*位元組MarryMarry雙精度NumPoints小
注意:X=40+(16*NumPoints)Y=X+16+(8*NumPoints)*可選的
多LineZ一條shape文件的多LineZ包含一個或多個部分。指一條包含一個或多個部分的有序的vertices的集
合。一個部分是指二個或多個點彼此連接的順序。部分間彼此相連或不連。部分間彼此可能相交或不相交。
PolyLineZ
{
Double[4]Box//邊界盒
IntegerNumParts//部分的數目
IntegerNumPoints//點的總數目
Point[NumPoints]Points//所有部分的點
Double[2]ZRange//Z的上下界
Double[NumPoints]ZArray//Z的值
Double[2]MRange//衡量M的上下界
Double[NumPoints]MArray//所有點的衡量
}
PolyLineZ的域在以下為更詳細的描述:
Box被存儲的PolyLineZ的邊界盒,以Xmin,Ymin,Xmax,Ymax的順序存儲。
NumParts在PolyLineZ中部分的數目。
NumPoints所有部分的點的總數目。
PartsNumParts長度的數列。為每條PolyLineZ存儲它在點數列中的第一個點的索引。數列索引是從0開
始的。
PointsNumPoints長度的數列。在PolyLineZ中的每一部分的點被尾到尾存儲。部分2的點跟在部分1的點
之後,如此下去。部分數列對每一部分保持開始點的數列索引。在部分間點之間沒有界限。
ZRange以Zmin,Zmax順序存儲的多PointZ的最小,最大值。
MRange以Mmin,Mmax順序存儲的多PointZ的最小,最大值。
表14PolyLineZ記錄內容
位置域值類型數目位元組順序
0位元組shape類型23整數1小
4位元組BoxBox雙精度4小
36位元組NumPartsNumParts整數1小
40位元組NumPointsNumPoints整數1小
44位元組PartsParts整數NumParts小
X位元組PointsPoints點NumPoints小
Y位元組ZminZmin雙精度1小
Y+8位元組ZmaxZmax雙精度1小
Y+16位元組ZarryZarry雙精度NumPoints小
Z*位元組MminMmin雙精度1小
Z+8*位元組MmaxMmax雙精度1小
Z+16*位元組MarryMarry雙精度NumPoints小
多邊形Z的結構被定義為PolyLineZ結構,正如下文:
PolygonZ
{
Double[4]Box//邊界盒
IntegerNumParts//部分的數目
IntegerNumPoints//點的總數目
Point[NumPoints]Points//所有部分的點
Double[2]ZRange//Z的上下界
Double[NumPoints]ZArray//Z的值
Double[2]MRange//衡量M的上下界
Double[NumPoints]MArray//所有點的衡量
表15多邊形Z的記錄內容
位置域值類型數目位元組順序
0位元組shape類型15整數1小
4位元組BoxBox雙精度4小
36位元組NumPartsNumParts整數1小
40位元組NumPointsNumPoints整數1小
44位元組PartsParts整數NumParts小
X位元組PointsPoints點NumPoints小
Y位元組ZminZmin雙精度1小
Y+8位元組ZmaxZmax雙精度1小
Y+16位元組ZarryZarry雙精度NumPoints小
Z*位元組MminMmin雙精度1小
Z+8*位元組MmaxMmax雙精度1小
Z+16*位元組MarryMarry雙精度NumPoints小
注意:X=44+4*NumPartsY=X+(16*NumPoints)Z=Y+16+(8*NumPoints)*可選的多Patch一個
MultiPatch包括許多表面斑塊。每個表面斑塊描述了一個表面。MultiPatch的表面斑塊是指比如它的部分,
控制一個MultiPatch部分的vertices順序是如何被解釋的部分類型。一個MultiPatch的部分可以是以下類型:
三角形條帶三角形的連接條帶,此處每個頂點(在開始二個后)完成一個新三角形。一個新三角形總是
通過把新頂點和二個臨近的原有點相連而得到。
三角形扇三角形的連接扇,此處每個頂點(在開始二個后)完成一個新三角形。一個新三角形總是通過把
新頂點和一個個臨近的原有點及這部分的第一個頂點相連而得到。
外環多邊形的外環。
內環多邊形的洞。
第一環未定義類型的多邊形的第一個環。
環未定義類型的多邊形的環。
一個簡單的三角形條帶或三角形扇代表一個簡單的表面斑塊。參見圖3看這些部分類型的例子。帶環的部分
的序列能描述有洞的多邊形表面。該序列典型包括一個外環,代表斑塊的外邊界,用許多內環代表洞。當用
代表表現帶洞的多邊形斑塊環的集合的個體環是不知道,整個序列以第一環開始,接著是其他的環。不跟著
第一環后的環的序列被認為是沒有洞的外環的序列。
圖3MultiPatch部分例子
用來對部分類型進行編碼的值有:
值部分類型
0三角形條帶
1三角形扇
2外環
3內環
4第一環
5環
MultiPatch
{
Double[4]Box//邊界盒
IntegerNumParts//部分的數目
IntegerNumPoints//點的總數目
Integer[NumParts]Parts//在部分中第一個點的索引
Integer[NumParts]PartsTypes//部分類型
Point[NumPoints]Points//所有部分的點
Double[2]ZRange//Z的上下界
Double[NumPoints]ZArray//Z的值
Double[2]MRange//衡量M的上下界
Double[NumPoints]MArray//所有點的衡量