來自:http://blog.csdn.net/gisfarmer/article/details/3861611
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表: ounties.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 //點的總數目
Integer[NumParts] Parts //在部分中第一個點的索引
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 //點的總數目
Integer[NumParts] Parts //在部分中第一個點的索引
Point[NumPoints] Points //所有部分的點
}
多邊形的域在以下爲更詳細的描述:
Box 被存儲的多邊形的邊界盒,以Xmin,Ymin,Xmax,Ymax的順序存儲。
NumParts 在多邊形中環的數目。
NumPoints 所有環的點的總數目。
Parts NumParts長度的數列。爲每條環存儲它在點數列中的第一個點的索引。數列索引是從0開始的。
Points NumPoints長度的數列。在多邊形中的每一個環的點被尾到尾存儲。環2的點跟在環1的點之後,如此下去。部分數列對每一環保持開始點的數列索引。在環間點之間沒有界限。
圖 2中的例子圖演示了多邊形的表現。該圖中的多邊形有一個洞,總共是8個vertices。
關於多邊形shape有以下重要注意事項:
環是閉合的(第一個和最後一個vetex必須是一樣的)在點數列中環的順序是不重要的。
存儲在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 Range 以Mmin,Mmax順序存儲的多PointM的最小,最大值。
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 //點的總數目
Integer[NumParts] Parts //在部分中第一個點的索引
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的點之後,如此下去。部分數列對每一部分保持開始點的數列索引。
在部分間點之間沒有界限。
M Range 以Mmin,Mmax順序存儲的多PointM的最小,最大值。
M Array NumPoints長的衡量的數組,在多PointM每部分的衡量被被尾到尾存儲部分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 //點的總數目
Integer[NumParts] Parts //在部分中第一個點的索引
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 //點的總數目
Integer[NumParts] Parts //在部分中第一個點的索引
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的最小,最大值。
M Array NumPoints長的衡量的數組,在多PointZ每部分的衡量被被尾到尾存儲部分2的點跟在部分1的點之後,如此下去。部分數列對每一部分保持開始點的數列索引。在部分間點之間沒有界限。
表 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 小
注意:X=44+4* NumParts Y = X+(16* NumPoints)Z=Y+16+(8* NumPoints) *可選的多邊形Z 一個多邊形Z包含一個或多個環。一個環是四或多個點彼此相連組成的一個閉合的彼此不相交的環。一個多邊形可能包括多個外環,一個多邊形Z的環是被做爲它的一部分的。
多邊形Z的結構被定義爲PolyLineZ結構,正如下文:
PolygonZ
{
Double[4] Box //邊界盒
Integer NumParts //部分的數目
Integer NumPoints //點的總數目
Integer[NumParts] Parts //在部分中第一個點的索引
Point[NumPoints] Points //所有部分的點
Double[2] Z Range //Z的上下界
Double[NumPoints] Z Array //Z的值
Double[2] M Range //衡量M的上下界
Double[NumPoints] M Array //所有點的衡量
}
多邊形Z的域在以下爲更詳細的描述:
Box 被存儲的多邊形的邊界盒,以Xmin,Ymin,Xmax,Ymax的順序存儲。
NumParts 在多邊形Z中環的數目。
NumPoints 所有環的點的總數目。
Parts NumParts長度的數列。爲每條環存儲它在點數列中的第一個點的索引。數列索引是從0開始的。
Points NumPoints長度的數列。在多邊形中的每一個環的點被尾到尾存儲。環2的點跟在環1的點之後,如此下去。部分數列對每一環保持開始點的數列索引。在環間點之間沒有界限。
ZRange 以Zmin,Zmax順序存儲的多PointZ的最小,最大值。
Z Array NumPoints長的衡量的數組,在多PointZ每部分的衡量被被尾到尾存儲部分2的點跟在部分1的點之後,如此下去。部分數列對每一部分保持開始點的數列索引。在部分間點之間沒有界限。
M Range 以Mmin,Mmax順序存儲的多PointZ的最小,最大值。
M Array NumPoints長的衡量的數組,在多PointZ每部分的衡量被被尾到尾存儲部分2的點跟在部分1的點之後,如此下去。部分數列對每一部分保持開始點的數列索引。在部分間點之間沒有界限。
關於PolygonZ shape有以下注意事項:
環是閉合的(第一個和最後一個vetex必須是一樣的)在點數列中環的順序是不重要的。
表 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 看這些部分類型的例子。帶環的部分的序列能描述有洞的多邊形表面。該序列典型包括一個外環,代表斑塊的外邊界,用許多內環代表洞。當用代表表現帶洞的多邊形斑塊環的集合的個體環是不知道,整個序列以第一環開始,接着是其他的環。不跟着第一環後的環的序列被認爲是沒有洞的外環的序列。
用來對部分類型進行編碼的值有:
值 部分類型
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 //所有點的衡量
}
多邊形Z的域在以下爲更詳細的描述:
Box 被存儲的多邊形的邊界盒,以Xmin,Ymin,Xmax,Ymax的順序存儲。
NumParts 在多邊形Z中環的數目。
NumPoints 所有環的點的總數目。
Parts NumParts長度的數列。爲每條環存儲它在點數列中的第一個點的索引。數列索引是從0開始的。
PartsType NumParts長度的數列,存儲每一部分的類型。
Points NumPoints長度的數列。在多邊形中的每一個環的點被尾到尾存儲。環2的點跟在環1的點之後,如此下去。部分數列對每一環保持開始點的數列索引。在環間點之間沒有界限。
ZRange 以Zmin,Zmax順序存儲的多PointZ的最小,最大值。
Z Array NumPoints長的衡量的數組,在多PointZ每部分的衡量被被尾到尾存儲部分2的點跟在部分1的點之後,如此下去。部分數列對每一部分保持開始點的數列索引。在部分間點之間沒有界限。
M Range 以Mmin,Mmax順序存儲的多PointZ的最小,最大值。
M Array NumPoints長的衡量的數組,在多PointZ每部分的衡量被被尾到尾存儲部分2的點跟在部分1的點之後,如此下去。部分數列對每一部分保持開始點的數列索引。在部分間點之間沒有界限。