李云尚, 余向東
(湖北省地質(zhì)局 地球物理勘探大隊(duì),湖北 武漢 430056)
ArcGIS 是目前廣泛使用的一種地理信息系統(tǒng)軟件,主要用來制圖、數(shù)據(jù)分析、各種專業(yè)地理信息系統(tǒng)的二次開發(fā)等。Shapefile文件是ArcGIS的基礎(chǔ)文件類型,它主要用來存儲點(diǎn)、線、多邊形等幾何對象的坐標(biāo)信息和屬性信息。目前很多城市的規(guī)劃管理部門的地理地圖都是采用Shapefile文件格式儲存,而勘察部門基本都是使用CAD的dwg文件格式,因此,需要將Shapefile格式文件轉(zhuǎn)換成為dwg格式文件。
ArcGIS的一個(gè)Shapefile文件實(shí)際上是一個(gè)文件夾,它里面主要包含一個(gè)主文件(xxx.shp),一個(gè)索引文件(xxx.shx),一個(gè)dbase格式的屬性文件(xxx.dbf)。這三個(gè)文件中的數(shù)據(jù)既相互聯(lián)系有各有區(qū)別,主文件(xxx.shp)是儲存坐標(biāo)信息(空間位置),由固定長度的文件頭和變長度空間數(shù)據(jù)記錄組成;索引文件(xxx.shx)是對主文件的索引,主要包含坐標(biāo)文件的索引信息;屬性文件(xxx.dbf)記錄屬性信息(地名,單位名,長度,高程,子圖名,編碼等),它是一個(gè)標(biāo)準(zhǔn)的DBF文件,是由頭文件和實(shí)體信息兩部分構(gòu)成。
xxx.shp文件由文件頭和文件記錄構(gòu)成,而每個(gè)記錄是由固定長度的記錄頭和變長度的記錄內(nèi)容組成。
1.1.1 主文件頭的組織結(jié)構(gòu)
主文件頭是100個(gè)字節(jié)的固定長度,以下是它的部分結(jié)構(gòu)(表1)。
表1 主文件頭結(jié)構(gòu)表Table 1 Structure table of main file header
注:位置是指開始字節(jié)到文件頭第一字節(jié)的偏移量,長度從0~99,剛好100個(gè)字節(jié)。
1.1.2 主文件記錄的組織結(jié)構(gòu)
每條記錄由記錄頭和記錄內(nèi)容兩部分組成,記錄頭結(jié)構(gòu)見表2。
表2 記錄頭結(jié)構(gòu)表Table 2 Structure table of record header
記錄內(nèi)容對于不同的Shapefile文件類型而不一樣,長度也不一樣,以二維點(diǎn)(point)類型的文件記錄內(nèi)容來說明(表3)。
所以二維點(diǎn)文件的記錄內(nèi)容長度是4+8+8=20
表3 二維點(diǎn)文件記錄內(nèi)容說明表Table 3 Explanatory table of 2d document content
個(gè)字節(jié),每條記錄的長度是4+4+20=28個(gè)字節(jié),也就是14個(gè)字,是個(gè)固定長度(0是指到記錄內(nèi)容的開始字節(jié)的偏移量)。
DBF文件是dbase格式的數(shù)據(jù)文件,它記錄.shp文件的屬性數(shù)據(jù),它在.shp文件中有特殊規(guī)定:
(1) 文件名前綴必須與xxx.shp和xxx.shx一樣。
(2) 每一個(gè)圖形特征必須在一個(gè)記錄內(nèi)。
(3) 記錄順序必須與xxx.shp文件的記錄順序一樣。
圖1 二維點(diǎn)文件轉(zhuǎn)換為CAD文件流程圖Fig.1 Flow chart of conversion of two dimensional point files into CAD file
利用二進(jìn)制方式打開.shp文件,利用數(shù)據(jù)對象連接和打開.dbf文件,以下是程序片段:
Open FileName For Binary As #2 //打開.shp文件
ReDim myx(3)As Byte
Get #2,25,myx //從第25字節(jié)處開始讀入4個(gè)字節(jié)
P=Val(b_l_h(myx))* 2 //計(jì)算文件總字節(jié)長度
Close #2 //關(guān)閉.shp文件
Set mywks=DBEngine.Workspaces(0) //創(chuàng)建工作空間
Set mydb=mywks.OpenDatabase(pathstr,True,True,“dbase 5.0”) //打開指定的數(shù)據(jù)庫
Set myrs=mydb.OpenRecordset(filedbf,dbOpenSnapshot) //打開指定的表,創(chuàng)建記錄集對象
Set mytab=mydb.TableDefs(filedbf) //創(chuàng)建表定義對象
........
k=(p-100)/28 //計(jì)算.shp文件的記錄個(gè)數(shù)
........
Open FileName For Binary As #4 //二進(jìn)制打開.shp文件
For i=1 To k
mystr=myrs.Fields(findval).Value //讀取.dbf 文件第i行記錄的指定字段的值
Set cad3dpoint=New clsmypoint //創(chuàng)建自定義對象實(shí)例
cad3dpoints.Add cad3dpoint //自定義對象添加到集合中
Set cad3dpoint=Nothing //對象清空
myrs.MoveNext //將記錄對象的記錄指針移到下一個(gè)記錄
Next i
Close #4 //關(guān)閉.shp文件
myrs.Close //關(guān)閉記錄對象
mydb.Close //關(guān)閉數(shù)據(jù)庫對象
程序片段如下:
Set myx1.acadapp=GetObject(,“autocad.Application”) //引用cad應(yīng)用程序?qū)ο?/p>
Set myx2.acaddoc=myx1.acadapp.ActiveDocument //引用一個(gè)cad活動(dòng)文檔對象
.........
geshu=cad3dpoints.Count //返回集合中對象的個(gè)數(shù)
For i=1 To geshu
Set cad3dpoint=New clsmypoint //創(chuàng)建自定義對象的實(shí)例
Set cad3dpoint=cad3dpoints.Item(i) //集合中的對象賦值給自定義對象
cad3dpoint.mylayer=layerming //給自定義對象的圖層屬性賦值
cad3dpoint.zhandian //調(diào)用自定義對象方法創(chuàng)建cad點(diǎn)對象
cad3dpoint.zhantext //調(diào)用自定義對象方法創(chuàng)建cad文本對象
Set cad3dpoint=Nothing //對象清空
Next i
通過上述文件的分析和代碼演示,向大家展示了怎樣用VB程序?qū)hapefile文件轉(zhuǎn)換成cad文件的一般過程。通過工程實(shí)際運(yùn)用,證實(shí)此方法確實(shí)可行,既方便又靈活,可以滿足很多個(gè)性化的需求。
[1] 張國寶.AutoCAD 2000 VBA開發(fā)技術(shù)[M].北京:清華大學(xué)出版社,2000.
[2] 楊冬.Shapefile圖形文件的數(shù)據(jù)存儲格式及讀寫[J].首都師范大學(xué)學(xué)報(bào)(自然科學(xué)版),2010,31(2):4-8.