1. 程式人生 > >C#不用ArcEngine,生成Shp檔案(一)---------shapefile資料說明

C#不用ArcEngine,生成Shp檔案(一)---------shapefile資料說明

由於篇幅限制本篇就來單獨介紹一下.shp檔案的結構;下面會持續更新,下一篇帖程式碼,介紹讀取.shp檔案和生成.shp檔案的方法。


Shape files資料說明

Shapefile檔案是美國環境系統研究所(ESRI)所研製的GIS檔案系統格式檔案,是工業標準的向量資料檔案。 Shapefile將空間特徵表中的非拓撲幾何物件和屬性資訊儲存在資料集中,特徵表中的幾何物件存為以座標點集表示的圖形檔案—SHP檔案,Shapefile檔案並不含拓撲(Topological)資料結構。一個Shape檔案包括三個檔案:一個主檔案(*.shp),一個索引檔案(*.shx),和一個dBASE(*.dbf)

表。主檔案是一個直接存取,變長度記錄的檔案,其中每個記錄描述構成一個地理特徵(Feature)的所有vertices座標值。在索引檔案中,每條記錄包含對應主檔案記錄距離主檔案頭開始的偏移量,dBASE表包含SHP檔案中每一個Feature的特徵屬性,表中幾何記錄和屬性資料之間的一一對應關係是基於記錄數目的ID。在dBASE檔案中的屬性記錄必須和主檔案中的記錄順序是相同的。圖形資料和屬性資料通過索引號建立一一對應的關係。


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 格式的索引檔案,那麼這個記錄項為真,否則為空。

dbf檔案中的資料型別:

程式碼

資料型別

允許輸入的資料

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