ESRI白皮書——ESRI Shapefile 技術描述

    ESRI Shapefile 技術描述 —— ESRI白皮書 —— 1998年6月

   

目錄

一、爲什麼使用Shapefile?

1.1、Shapefile可以被怎樣創建?

二、Shapefile技術說明

2.1、命名規範

2.2、數值類型

三、主文件的組織結構

3.1、字節順序

3.2、主文件頭

3.3、記錄頭

四、主文件的記錄內容

4.1、無形狀

4.2、X、Y空間中的圖形類型

4.2.1 點(Point)

4.2.2 多點(MultiPoint)


    這份文檔定義了shapefile(.shp)空間數據格式,以及描述了爲什麼shapefile是重要的。它列出了ESRI的軟件工具,這些軟件工具能夠直接創建shapefile或者將其他格式數據轉成shapefile數據。這份文檔也提供了不使用ESRI軟件的情況下,自己編寫程序來創建shapefile的技術信息,以滿足某些組織想編寫他們自己的數據轉換軟件的願望。

一、爲什麼使用Shapefile?

    shapefile將要素的非拓撲幾何信息和屬性信息存儲在一個數據集中,其中,要素的幾何結構被存儲爲由矢量座標集合組成的幾何圖形中。

    因爲shapefile不具有拓撲數據結構,所以它相比其他格式的數據具有更快的繪製速度和編輯能力shapefile處理重疊的(因爲不具有拓撲特性)或者非連續的單個要素也通常只需較少的磁盤空間以及簡單的讀、取。

    shapefile可以支持點、線以及區域要素,區域要素表現爲閉環、兩次數字化的多邊形。屬性信息承載在dBASE格式文件中,每個屬性記錄和幾何信息記錄具有一一對應的關係。

1.1、Shapefile可以被怎樣創建?

    shapefile可以由以下四種通用方式創建:

  • 導出    ——    使用ARC/INFO,PC ARC/INFO,Spatial Database Engine(SDE)、ArcView GIS、商業地圖這些軟件可以將任何數據源導出爲shapefile數據。
  • 數字化    ——    使用ArcView GIS要素創建工具可以直接數字化幾何形狀從而創建Shapefile數據
  • 編程    ——    使用Avenue(ArcView GIS),MapObjects、ARC Macro Language(AML)(ARC/INFO),或者Simple Macro Language(SML)(PC ARC/INFO)軟件,你可以在你自己的程序中創建Shapefile數據。
  • 依據Shapefile規範編寫一個程序直接創建Shapefile數據

    SDE、ARC/INFO、PC ARC/INFO、Data Automation Kit(DAK)和ArcCAD軟件提供shapecoverage的轉換工具,ARC/INFO也提供了一個coverageshape的轉換工具。關於其他數據格式的轉換,這份白皮書中發佈了相關shapefile規範。其他數據流,例如來自GPS接收器的數據,也可以被存儲爲shapefile或者X,Y事件表。

二、Shapefile技術說明

    這節會介紹使用技術規範來創建計算機程序以用於讀、寫shapefile

    一個ESRI shapefile數據集由一個主文件、一個索引文件和一個dBASE表組成。主文件是一個可直接訪問的、可變記錄長度的文件,其中,每個記錄描述一個具有頂點列表的圖形。在索引文件中,每個記錄包含對應的主文件記錄距離主文件開頭的偏移量。dBASE表也以記錄的方式包含每個要素的要素屬性。幾何信息和屬性信息基於記錄號建立一對一關係,在dBASE文件中的記錄順序必須與主文件中的記錄順序相同。

2.1、命名規範

    所有文件名都遵循8.3命名規則。主文件、索引文件和dBASE文件具有相同的文件名前綴,文件名前綴必須以字母、數字字符開頭(a-Z,0-9),後跟0個或最多7個字符(a-Z,0-9,_,-)。主文件的文件名後綴是.shp,索引文件的文件名後綴是.shxdBASE表的文件名後綴是.dbf。在區分大小寫文件名的操作系統中,文件名中的所有字母都是小寫字母。

    示例:

        主文件:counties.shp

        索引文件:counties.shx

        dBASE表:counties.dbf

2.2、數值類型

    shapefile數據存儲整形雙精度的數字,本文檔的其餘部分將引用以下類型:

  •     Interger: Signed 32-bit integer(4 bytes)
  •     Double:Signed 64-bit IEEE double-precision floating point number(8 bytes)

    浮點數必須是數字值,shapefile不允許Positive infinityNegative infinityNot-a-Number(NaN)。然而,shapefile支持"no data"值的概念,但是它們目前只用於測量,shapefile讀取器認爲任何小於-10^38的浮點數都代表"no data"值。


    下面的第一部分描述shapefile的常規結構和組織,第二部分描述shapefile支持的每種類型圖形的記錄內容。

三、主文件的組織結構

    主文件包含一個固定長度文件頭,後面跟着可變長度的記錄。每一個可變長記錄由一個固定長度的記錄頭(注意,不是文件頭)和可變長記錄內容構成。圖1說明了主文件的組織結構:

                                                                                圖1 

3.1、字節順序

    shapefile中所有的內容可以被分爲兩個類型:

    ①相關的數據

  • 主文件記錄內容
  • 主文件頭的數據描述字段(Shape TypeBounding Box等等)

    ②相關的文件管理

  • 文件長度和記錄長度
  • 記錄偏移量,等等

    構成文件頭中的數據描述字段和主文件中的記錄內容的整數和雙精度整數以小字節序(低字節序)順序排列,構成文件其餘部分和文件管理的整數和雙精度浮點數以大字節序(高字節序)順序排列。

3.2、主文件頭

    主文件頭有100字節的長度。表1展示了文件頭中的字段及其字節位置、值、類型和字節順序。在表中,位置字段相對於文件起始。

    文件長度的值是16位(2字節)字文件的總長度(包括組成文件頭的50個16位字,50*2字節=100字節,所以主文件有100字節的長度)。

    一個shapefile數據中的所有非空圖形都必須具有相同的圖形類型(Shape Type),圖形類型對應的值如下:

    上面未指定的圖形類型(2、4、6...直到33)被保留以供將來使用。目前,一個shapefile文件被限制包含以上指定的相同類型的圖形。以後,shapefile可能允許包含不只一種圖形類型,如果混合圖形類型被實現,文件頭中的Shape Type字段將標記該文件。

    在主文件頭中,Bounding Box存儲了各個圖形的實際範圍(extent):與X軸和Y軸(以及潛在的M軸和Z軸)垂直的最小邊框矩形包含所有的圖形。如果shapefile是空的(即沒有記錄),XminYminXmaxYmax的值將未定義。未包含測量值的測量圖形類型的shapefileMminMmax可以包含「no data」值(查看上面的數值類型一節)。

3.3、記錄頭

    每一個記錄的記錄頭存儲記錄數值(類似於主碼)和記錄內容的長度。記錄頭擁有8字節(8 bytes)的固定長度值

    表2展示了記錄頭中字段的字節位置、值、類型和字節順序,在該表中,位置相對於記錄的起始。

    記錄數值從1開始。

    記錄的內容長度是基於16位(2字節)字測量的記錄內容部分的長度。因此,基於16位字的文件總長度的增加(4+內容長度),將被存儲在文件頭的Byte 24所在的File Length

四、主文件的記錄內容

    shapefile記錄內容由圖形類型和圖形的幾何數據組成,記錄內容的長度基於圖形的組成部分和頂點的數目。對於每一個圖形類型,我們首先描述形狀然後將其映射爲磁盤上的記錄內容。表3至表16,Position字段與主文件記錄內容的起始相關。

4.1、無形狀

    0形狀類型意味着無形狀,即沒有圖形沒有幾何數據。每種要素類型(點、線、多邊形等等)都支持無形狀——在shapefile中有點形狀圖形和無點形狀圖形是一樣的。通常無形狀圖形具有位置信息;它們在shapefile創建過程中使用,並在它們創建之後立即填充形狀數據。

                                                                                      表3

4.2、X、Y空間中的圖形類型

4.2.1 點(Point)

    一個點圖形由一對X,Y次序的雙精度座標組成。

                                                                               表4

4.2.2 多點(MultiPoint)

    多點相當於點的集合,如下所示:

    Bounding BoxXminYminXmaxYmax的順序存儲。

                                                                                        表5

4.2.3 折線(PolyLine)

    折線是由一個或多個頂點組成的有序集合。折線的一部分是由兩個或兩個以上點組成的連通序列。各部分之間可能連在一起,也可能不連在一起。各部分可能會相交,也可能不會相交。

    由於本規範不禁止具有相同座標的連續點,所以shapfile讀取程序必須能處理這種情況。另一方面,shapefile讀取程序可能不允許生成生零長度折線。

     PolyLine的字段細節如下:

  • Box    ——    以Xmin、Ymin、Xmax、Ymax次序存儲的邊框
  • NumParts    ——    折線組成部分的總數量
  • NumPoints    ——    折線裏點的總個數
  • Parts    ——    長度爲NumParts值的數組。存儲折線中各組成部分在Points數組中的第一個點的索引。數組索引以0起始。
  • Points    ——    長度爲NumPoints值的數組。折線中每個部分的點都是端到端存儲的,第二部分的點緊隨第一部分的點,依此類推。Parts數組保存每部分起始點的數組索引,各部分之間在Points數組沒有分隔符。

                                                                                           圖6

4.2.4 Polygon(多邊形)

    多變形由一個閉環或多個閉環組成,閉環是由4個或4個以上的點組成的連通序列,從而形成封閉的、非自交環。一個多邊形可能包含多個閉環。閉環的頂點或方向指示閉環的哪一邊是多邊形的內部,沿着閉環以頂點順序行走的觀察者的右邊的鄰域是多邊形內的鄰域。多邊形中定義孔洞內環的頂點順序是逆時針方向的,因此,一個單環多邊形的頂點順序總是順時針的。多邊形的環被稱爲多邊形的組成部分。

    由於本規範不禁止具有相同座標的連續點,shapfile閱讀程序必須處理這種情況。另一方面,shapefile閱讀程序可能不允許產生零長度或零面積的多邊形。

    多邊形的數據結構和折線的數據結構一樣,如下所示:

    多邊形的字段的詳細描述如下:

  • Box    ——    以Xmin、Ymin、Xmax、Ymax次序存儲的邊框
  • NumParts    ——    多邊形的閉環的數量
  • NumPoints    ——    所有閉環中結點的總數量
  • Parts    ——    長度爲NumParts值的數組。存儲每個閉環在Points數組中的第一個點的索引。數組索引以0起始。
  • Points    ——    長度爲NumPoints值的數組。多邊形中每個閉環的點都是端到端存儲的,第二部分的點緊隨第一部分的點,依此類推。Parts數組保存各閉環起始點的數組索引,各閉環之間在Points數組中沒有分隔符。

    圖2中的實例圖演示了多邊形的表示。該圖展示了具有1個孔洞閉環和8個頂點的多邊形。

    以下是關於多邊形圖形的重要注意事項:

  • 閉環是閉合的(閉環的第一個頂點和最後一個頂點是一樣的)
  • 在points數組中閉環的次序是不重要的
  • 存儲在shapefile文件中的多邊形必須是乾淨的。