C#不用ArcEngine,生成Shp檔案(一)---------shapefile資料說明
由於篇幅限制本篇就來單獨介紹一下.shp檔案的結構;下面會持續更新,下一篇帖程式碼,介紹讀取.shp檔案和生成.shp檔案的方法。
Shape files資料說明
Shapefile檔案是美國環境系統研究所(ESRI)所研製的GIS檔案系統格式檔案,是工業標準的向量資料檔案。 Shapefile將空間特徵表中的非拓撲幾何物件和屬性資訊儲存在資料集中,特徵表中的幾何物件存為以座標點集表示的圖形檔案—SHP檔案,Shapefile檔案並不含拓撲(Topological)資料結構。一個Shape檔案包括三個檔案:一個主檔案(*.shp),一個索引檔案(*.shx),和一個dBASE(*.dbf)
1. 座標檔案的結構說明
座標檔案(.shp)用於記錄空間座標資訊。它由標頭檔案和實體資訊兩部分構成。
1) 座標檔案的檔案頭
座標檔案的檔案頭是一個長度固定(100 bytes)的記錄段,一共有9個int型和7個double型資料。
座標檔案的結構:
檔案頭 |
|
記錄頭 |
記錄內容 |
記錄頭 |
記錄內容 |
記錄頭 |
記錄內容 |
記錄頭 |
記錄內容 |
……
……
記錄頭 |
記錄內容 |
shapefiles 標頭檔案表:
起始位置 |
名稱 |
數值 |
型別 |
位序 |
0 |
File Code |
9994 |
Integer |
big |
4 |
Unused |
0 |
Integer |
big |
8 |
Unused |
0 |
Integer |
big |
12 |
Unused |
0 |
Integer |
big |
16 |
Unused |
0 |
Integer |
big |
20 |
Unused |
0 |
Integer |
big |
24 |
檔案長度 |
檔案的實際長度 |
Integer |
big |
28 |
版本號 |
1000 |
Integer |
Little |
32 |
幾何型別 |
表示這個Shapefile檔案所記錄的空間資料的幾何型別 |
Integer |
Little |
36 |
Xmin |
空間資料所佔空間範圍的X方向最小值 |
Double |
Little |
44 |
Ymin |
空間資料所佔空間範圍的Y方向最小值 |
Double |
Little |
52 |
Xmax |
空間資料所佔空間範圍的X方向最大值 |
Double |
Little |
60 |
Ymax |
空間資料所佔空間範圍的Y方向最大值 |
Double |
Little |
68* |
Zmin |
空間資料所佔空間範圍的Z方向最小值 |
Double |
Little |
76* |
Zmax |
空間資料所佔空間範圍的Z方向最大值 |
Double |
Little |
84* |
Mmin |
最小Measure值 |
Double |
Little |
92* |
Mmax |
最大Measure值 |
Double |
Little |
(2) Shapefile檔案支援的幾何型別(ShapeType)
Shapefile檔案所支援的幾何型別:
編號 |
幾何型別 |
0 |
Null Shape(表示這個Shapefile檔案不含座標) |
1 |
Point(表示Shapefile檔案記錄的是點狀目標,但不是多點) |
3 |
PolyLine(表示Shapefile檔案記錄的是線狀目標) |
5 |
Polygon(表示Shapefile檔案記錄的是面狀目標) |
8 |
MultiPoint(表示Shapefile檔案記錄的是多點,即點集合) |
11 |
PointZ(表示Shapefile檔案記錄的是三維點狀目標) |
13 |
PolyLineZ(表示Shapefile檔案記錄的是三維線狀目標) |
15 |
PolygonZ(表示Shapefile檔案記錄的是三維面狀目標) |
18 |
MultiPointZ(表示Shapefile檔案記錄的是三維點集合目標) |
21 |
PointM(表示含有Measure值的點狀目標) |
23 |
PolyLineM(表示含有Measure值的線狀目標) |
25 |
PolygonM(表示含有Measure值的面狀目標) |
28 |
MultiPointM(表示含有Measure值的多點目標) |
31 |
MultiPatch(表示複合目標) |
2) 實體資訊的內容
實體資訊負責記錄座標資訊,它以記錄段為基本單位,每一個記錄段記錄一個地理實體目標的座標資訊,每個記錄段分為記錄頭和記錄內容兩部分。
記錄頭的內容包括記錄號(Record Number)和座標記錄長度(Content Length) 兩個記錄項。它們的位序都是big。記錄號(Record Number)和座標記錄長度(Content Length) 兩個記錄項都是int型,並且shapefile檔案中的記錄號都是從1開始的。
記錄內容包括目標的幾何型別(ShapeType)和具體的座標記錄(X、Y) ,記錄內容因要素幾何型別的不同其具體的內容及格式都有所不同。下面分別介紹點狀目標(Point)、線狀目標(PolyLine)和麵狀目標(Polygon)三種幾何型別的.shp檔案的記錄內容:
(1) 點狀目標
shapefile中的點狀目標由一對X、Y座標構成,座標值為雙精度型(double)。點狀目標的記錄內容如表2.4:
記錄項 |
數值 |
資料型別 |
長度 |
個數 |
位序 |
幾何型別(ShapeType) |
1(表示點狀目標) |
int型 |
4 |
1 |
Little |
X方向座標 |
X方向座標值 |
double型 |
8 |
1 |
Little |
Y方向座標 |
Y方向座標值 |
double型 |
8 |
1 |
Little |
(2) 線狀目標
shapefile中的線狀目標是由一系列點座標串構成,一個線目標可能包括多個子線段,子線段之間可以是相離的,同時子線段之間也可以相交。Shapefile允許出現多個座標完全相同的連續點,當讀取檔案時一定要注意這種情況,但是不允許出現某個退化的、長度為0的子線段出現。線狀目標的記錄內容:
記錄項 |
數值 |
資料型別 |
長度 |
個數 |
位序 |
幾何型別(ShapeType) |
3(表示線狀目標) |
int型 |
4 |
1 |
Little |
座標範圍(Box) |
表示當前線目標的座標範圍 |
double型 |
32 |
4 |
Little |
子線段個數(NumParts) |
表示構成當前線目標的子線段的個數 |
int型 |
4 |
1 |
Little |
座標點數(NumPoints) |
表示構成當前線目標所包含的座標點個數 |
int型 |
4 |
1 |
Little |
Parts陣列 |
記錄了每個子線段的座標在Points陣列中的起始位置 |
int型 |
4×NumParts |
NumParts |
Little |
Points陣列 |
記錄了所有的座標資訊 |
Point型 |
根據點個數來確定 |
NumPoints |
Little |
(3) 面狀目標
shapefile中 的面狀目標是由多個子環構成,每個子環是由至少四個頂點構成的封閉的、無自相交現象的環。對於含有島的多邊形,構成它的環有內外環之分,每個環的頂點的排列順序或者方向說明了這個環到底是內環還是外環。一個內環的頂點是按照逆時針順序排列的;而對於外環,它的頂點排列順序是順時針方向。如果一個多邊形只由 一個環構成,那麼它的頂點排列順序肯定是順時針方向。
每條多邊形記錄的資料結構與線目標的資料結構完全相同,
Polygon
{
Double[4] Box // 當前面狀目標的座標範圍
Integer NumParts // 當前面目標所包含的子環的個數
Integer NumPoints // 構成當前面狀目標的所有頂點的個數
Integer[NumParts] Parts // 每個子環的第一個座標點在Points的位置
Point[NumPoints] Points // 記錄所有座標點的陣列
}
對於一個shapefile中的多邊形,它必須滿足下面三個條件:
l 構成多邊形的每個子環都必須是閉合的,即每個子環的第一個頂點跟最後一個頂點是同一個點;
l 每個子環在Points陣列中的排列順序並不重要,但每個子環的頂點必須按照一定的順序連續排列;
l 儲存在shapefile 中的多邊形必須是乾淨的。所謂一個乾淨的多邊形,它必須滿足兩點:
¨ 沒有自相交現象。這就要求任何一個子環不能跟其它的子環相交,共線的現 象也將被當作相交。但是允許兩個子環的頂點重合;
¨ 對於一個不含島的多邊形或者是含島的多邊形的外環,它們的頂點排列順序必須是順時針方向;而對於內環,它的排列順序必須是逆時針方向。所謂的“髒多邊形”就是指頂點排列順序為順時針的內環。
面狀目標的記錄內容:
記錄項 |
數值 |
資料型別 |
長度 |
個數 |
位序 |
幾何型別(ShapeType) |
5(表示面狀目標) |
int型 |
4 |
1 |
Little |
座標範圍(Box) |
表示當前面目標的座標範圍 |
double型 |
32 |
4 |
Little |
子線段個數(NumParts) |
表示構成當前面狀目標的子環的個數 |
int型 |
4 |
1 |
Little |
座標點數(NumPoints) |
表示構成當前面狀目標所包含的座標點個數 |
int型 |
4 |
1 |
Little |
Parts陣列 |
記錄了每個子環的座標在Points陣列中的起始位置 |
int型 |
4×NumParts |
NumParts |
Little |
2. 屬性檔案的結構說明
屬性檔案(.dbf)用於記錄屬性資訊。它是一個標準的DBF檔案,也是由標頭檔案和實體資訊兩部分構成。
檔案頭 |
|
記錄1 |
|
記錄2 |
|
記錄3 |
|
記錄4 |
|
……
……
記錄n |
1) 屬性檔案的檔案頭
其中檔案頭部分的長度是不定長的,它主要對DBF檔案作了一些總體說明(見表2.7),其中最主要的是對這個DBF檔案的記錄項的資訊進行了詳細地描述,比如對每個記錄項的名稱、資料型別、長度等資訊都有具體的說明。
屬性檔案(.dbf)的檔案頭:
在檔案中的位置 |
內容 |
說明 |
0 |
1個位元組 |
表示當前的版本資訊 |
1-3 |
3個位元組 |
表示最近的更新日期,按照YYMMDD格式。 |
4-7 |
1個32位數 |
檔案中的記錄條數。 |
8-9 |
1個16位數 |
檔案頭中的位元組數。 |
10-11 |
1個16位數 |
一條記錄中的位元組長度。 |
12-13 |
2個位元組 |
保留位元組,用於以後新增新的說明性資訊時使用,這裡用0來填寫。 |
14 |
1個位元組 |
表示未完成的操作。 |
15 |
1個位元組 |
dBASE IV編密碼標記。 |
16-27 |
12個位元組 |
保留位元組,用於多使用者處理時使用。 |
28 |
1個位元組 |
DBF檔案的MDX標識。在建立一個DBF 表時 ,如果使用了MDX 格式的索引檔案,那麼 DBF 表的表頭中的這個位元組就自動被設定了一個標誌,當你下次試圖重新開啟這個DBF表的時候,資料引擎會自動識別這個標誌,如果此標誌為真,則資料引擎將試圖開啟相應的MDX 檔案。 |
29 |
1個位元組 |
Language driver ID. |
30-31 |
2個位元組 |
保留位元組,用於以後新增新的說明性資訊時使用,這裡用0來填寫。 |
32-X |
(n*32)個位元組 |
記錄項資訊描述陣列。n表示記錄項的個數。這個陣列的結構在表2.8中有詳細的解釋。 |
X+1 |
1個位元組 |
作為記錄項終止標識。 |
位置 |
內容 |
說明 |
0-10 |
11個位元組 |
記錄項名稱,是ASCII碼值。 |
11 |
1個位元組 |
記錄項的資料型別,是ASCII碼值。(B、C、D、G、L、M和N,具體的解釋見表2.9)。 |
12-15 |
4個位元組 |
保留位元組,用於以後新增新的說明性資訊時使用,這裡用0來填寫。 |
16 |
1個位元組 |
記錄項長度,二進位制型。 |
17 |
1個位元組 |
記錄項的精度,二進位制型。 |
18-19 |
2個位元組 |
保留位元組,用於以後新增新的說明性資訊時使用,這裡用0來填寫。 |
20 |
1個位元組 |
工作區ID。 |
21-30 |
10個位元組 |
保留位元組,用於以後新增新的說明性資訊時使用,這裡用0來填寫。 |
31 |
1個位元組 |
MDX標識。如果存在一個MDX 格式的索引檔案,那麼這個記錄項為真,否則為空。 |
程式碼 |
資料型別 |
允許輸入的資料 |
B |
二進位制型 |
各種字元。 |
C |
字元型 |
各種字元。 |
D |
日期型 |
用於區分年、月、日的數字和一個字元,內部儲存按照YYYYMMDD格式。 |
G |
(General or OLE) |
各種字元。 |
N |
數值型(Numeric) |
- . 0 1 2 3 4 5 6 7 8 9 |
L |
邏輯型(Logical) |
? Y y N n T t F f (? 表示沒有初始化)。 |
M |
(Memo) |
各種字元。 |
2) 屬性檔案的實體資訊
實體資訊部分就是一條條屬性記錄,每條記錄都是由若干個記錄項構成,因此只要依次迴圈讀取每條記錄就可以了。
3. 索引檔案的結構說明
索引檔案(.shx)主要包含座標檔案的索引資訊,檔案中每個記錄包含對應的座標檔案記錄距離座標檔案的檔案頭的偏移量。通過索引檔案可以很方便地在座標檔案中定位到指定目標的座標資訊。
索引檔案也是由標頭檔案和實體資訊兩部分構成(如圖2.5),其中檔案頭部分是一個長度固定(100 bytes)的記錄段,其內容與座標檔案的檔案頭基本一致。它的實體資訊以記錄為基本單位,每一條記錄包括偏移量(offset)和記錄段長度(Content Length)兩個記錄項,它們的位序都是big,兩個記錄項都是int型。
索引檔案的結構:
檔案頭 |
|
記錄1 |
|
記錄2 |
|
記錄3 |
|
記錄4 |
|
……
……
記錄n |
記錄項 |
數值 |
資料型別 |
長度 |
個數 |
位序 |
位移量(Offset) |
表示座標檔案中的對應記錄的起始位置相對於座標檔案起始位置的位移量。 |
int型 |
4 |
1 |
Big |
記錄長度 (Content Length) |
表示座標檔案中的對應記錄的長度。 |
int型 |
4 |
1 |
Big |