柳佳佳,欒曉巖
(1.信息工程大學地理空間信息學院,河南鄭州450052;2.96669部隊,北京100000)
ShapeFile格式文件寫入方法研究
柳佳佳1,欒曉巖2
(1.信息工程大學地理空間信息學院,河南鄭州450052;2.96669部隊,北京100000)
針對寫ShapeFile文件所涉及的數據類型、賦值方法較少的現狀,詳細分析坐標文件、屬性文件及索引文件中所包含的內容,并在VC6.0中實現上述3種文件的寫入。
ShapeFile;數據結構;地理信息系統
地理信息系統是近20年來新興的一門集地理學、計算機技術、遙感技術和地圖學于一體的交叉學科,已廣泛應用在城市、資源、環境、交通、人口、土地、災害和規劃管理等領域。國外地理信息系統研究時間較長,已經形成了許多成熟的GIS軟件,其中以ArcGIS最為典型,它是Esri公司集40余年GIS咨詢和開發經驗而研發出的一套完整的GIS平臺產品,其具有強大的地圖制作、空間數據管理、空間分析等功能,這些功能都是在數據的基礎上進行的。而矢量數據是一種重要的數據格式,ShapeFile格式是Esri公司開發的用來描述空間數據的幾何特征和屬性特征的非拓撲實體矢量數據格式,是工業標準的矢量數據文件。目前,ArcGIS軟件在我國得到了廣泛的應用,但是不同的行業有不同的矢量數據格式,只有充分研究ShapeFile格式,才能將不同的矢量格式轉換成ArcGIS能夠接受的數據格式。ShapeFile文件主要包括坐標文件(SHP)、索引文件(SHX)和屬性文件(DBF)。3個基本文件的數據說明很多文獻中已經作了詳細的敘述,讀取方法也有詳細介紹,雖然讀寫是一個相反的過程,但是在寫入文件時,數據結構中的內容計算方法還比較模糊,本文主要針對格式中數據類型及需要計算的記錄項進行詳細的分析。
1.坐標文件(SHP)結構
坐標文件是ShapeFile文件中的主文件,用于記錄空間坐標信息,是一個直接存取、變長記錄的文件。其中,每個記錄描述一個實體,它由頭文件和實體信息兩部分構成。
文件頭由100字節的說明信息組成,包括9個int型和7個double型數據。
實體信息負責記錄坐標信息,其記錄結構基本相似,每條記錄都由記錄頭和記錄內容(空間坐標對)兩部分組成。記錄頭的內容包括記錄號(Record Number)和坐標記錄長度(Content Length)兩個記錄項。需要注意的是,它們的位置都是big。對于big數據寫入的時候須注意,因為通常數據的位序都是little,需要將little型轉換成lig型才能進行寫入操作。記錄號和坐標記錄長度都是int型,并且記錄號都是從1開始;坐標記錄長度則用16位字來衡量。記錄內容包括目標的幾何類型(ShapeType)和具體的坐標記錄(X、Y),記錄內容因要素幾何類型的不同其具體的內容及格式都有所不同。地物類型可以分為點(Point)、線(PolyLine)和面(Polygon)3種類型。點狀地物在ShapeFile中存儲的是一組坐標(X、Y),坐標值為double型。線狀地物在ShapeFile中存儲的是一系列的點坐標串(X1,Y1,X2,Y2),一個線目標可能包括多個子線段,子線段之間可以是相離的,也可以相交。ShapeFile允許出現多個坐標完全相同的連續點,但是不允許出現某個退化的、長度為0的子線段。線數據結構主要包括:線目標的坐標范圍(Double[4]型),通過比較每個坐標點的大小,分別求出X、Y坐標的最大值和最小值,從而得到范圍;線目標所包含的子線段的個數(int型);線目標所包含的頂點個數(int型);每個子線段的第1個坐標點在Points的位置(int[頂點數]型);記錄所有坐標點的數組(Point[頂點數]型)。面狀地物在ShapeFile中存儲的是一系列封閉的坐標串(X1,Y1,X2,Y2,…,X1,Y1),這些封閉的坐標串至少由4個頂點構成,并且是封閉的,無自相交現象。由于多邊形經常會出現包含關系,則對于含有島的多邊形,構成它的環有內外環之分,可通過每個環的頂點的排列順序或者方向來區分這個環到底是內環還是外環:內環的頂點按照逆時針順序排列,而外環的頂點排列順序是順時針方向。如果一個多邊形只由一個環構成,那么它的頂點排列順序為順時針方向,每條多邊形記錄的數據結構與線目標的數據結構完全相同。
2.屬性文件(DBF)結構
屬性文件用于記錄屬性信息,是一個標準的DBF文件,由頭文件和實體信息兩部分構成。文件頭部分的長度是不定長的,其主要是對DBF文件作一些總體說明。其中,最主要的是對該BDF文件記錄項的信息進行詳細的描述,包括每個記錄項的名稱、數據類型、長度等信息。屬性文件實體信息部分是一條條屬性記錄,每條記錄都是由若干個記錄項構成。因此,只要依次循環寫入每條記錄即可。
3.索引文件(SHX)結構
索引文件主要包含坐標文件的索引信息,文件中每個記錄包含對應的坐標文件記錄距離坐標文件文件頭的偏移量。通過索引文件可以很方便地在坐標文件中定位到指定目標的坐標信息。
索引文件也是由頭文件和實體信息兩部分構成,其中文件頭部分是一個長度固定為100字節的記錄段,其內容與坐標文件的文件頭基本一致;實體信息部分以記錄為基本單位,每一條記錄包括偏移量(offset)和記錄段長度(Content Length)兩個記錄項,兩個記錄項數據類型是int型,位序為big。
根據數據結構在VC6.0中實現了寫入3種文件,對其中的數據類型以及需要計算的內容進行了分析和實現。
1.數值位序轉換
將little型轉換成big型,實現方法如下:


2.FileLength的計算方法
文件長度值是用16位字表示的文件總長度,包括文件頭100字節,即50個16位字。由于實體信息的長度隨著要素類型的不同而不同,計算方法如下:
1)點要素 FileLength=14*記錄數+50。其中,14為實體信息的16位字數,包含8字節的記錄頭和20字節的記錄內容。
2)線要素的FileLength與點要素的區別主要在于實體信息中所包含的記錄內容不同,線要素每條記錄的contentlength=(4+32+4+4+4*子段數+16 *每條記錄中的點數)/2。那么線要素的FileLength就是每條記錄的contentlength與記錄頭的和的總和。
3)面要素的FileLength與線的相似,在計算contentlength時子段數為面的子環數。
3.屬性文件變化的記錄項及計算方法
1)文件頭中的字節數。HeaderByteNum=32*屬性子段數+32。
2)一條記錄中的字節長度。RecordBytenum= 19* 屬性中double型字段數+9* 屬性中int型子段數+char型的子段長度和。從上述計算中可以看出,double型在ShapeFile文件中對應的字符數為19,int型為9,char型可根據實際需要動態設定。
4.索引文件偏移量的計算方法
在索引文件中,每個記錄包含對應主文件記錄距離主文件頭起始位置的偏移量。
1)點要素位移量Offset=50+14* 序號。
2)面要素位移量隨著坐標文件中的對應記錄長度contentlength的變化而變化。部分實現代碼如下:

本文首先介紹了地理信息最基本的矢量數據內容寫入ShapeFile文件所涉及的3個基本文件的數據結構;然后介紹了實現過程中需要計算的內容的方法。按照上述方法既能完成地理信息中點、線、面要素的寫入,同時也為其他格式轉換為Shape-File格式奠定了基礎。
[1] 肖強,趙國成.ShapeFile與軍用交換格式數據轉換的研究與實現[J].海洋測繪,2010,30(5):59-61.
[2] http:∥blog.163.com/adslxk@126/blog/static/1006106 7120105250560946.
[3] 陳文玲.空間數據轉換研究與探討[D].合肥:合肥工業大學,2009.
[4] 馬英杰.基于3GS的核勘查數據采集及處理系統研究[D].成都:成都理工大學,2010.
[5] 鄭翠玲.空間數據的格式轉換研究與實現[J].現代計算機:下半月版,2010(9):171-174.
[6] 郝燕玲,唐文靜,趙玉新,等.Shapefile格式電子海圖數據集成存儲研究[J].微計算機信息,2008,24(21):26-28.
[7] 涂圣文.CAD、GIS及VR集成技術在工程領域的應用研究[D].武漢:華中科技大學,2005.
Research of the Method to Write a ShapeFile-format File
LIU Jiajia,LUAN Xiaoyan
0494-0911(2012)09-0090-03
P208
B
2012-08-13
國家863計劃(2009AA12Z228)
柳佳佳( 1981—) ,女,遼寧丹東人,博士生,主要研究方向為空間認知。