核心期刊論文發(fā)表推薦《電子科技》創(chuàng)刊于1987年,月刊,每月15日出版。主要刊登高等院校、科研院所、電子行業(yè)企事業(yè)單位等科研機(jī)構(gòu)在電子技術(shù)應(yīng)用、通信工程、計(jì)算機(jī)科學(xué)技術(shù)與應(yīng)用、網(wǎng)絡(luò)安全及信息、光電子材料等領(lǐng)域最新的學(xué)術(shù)、技術(shù)論文、工程技術(shù)應(yīng)用研究、教學(xué)實(shí)踐總結(jié)、行業(yè)綜述等稿件。
摘 要: 隨著遙感應(yīng)用技術(shù)的不斷發(fā)展,對(duì)ESRI Shapefile格式圖像文件的處理需求變得日益緊迫。目前能對(duì)它進(jìn)行處理的軟件有很多,但是這些軟件運(yùn)行時(shí)占用大量系統(tǒng)資源,而直接將商業(yè)軟件嵌入到自主開(kāi)發(fā)的軟件中也是不可取的。因此,能夠在自主開(kāi)發(fā)的遙感圖像處理軟件中實(shí)現(xiàn)對(duì)ESRI Shapefile格式文件的操作已經(jīng)變得非常重要。通過(guò)對(duì)ESRI Shapefile格式的影像數(shù)據(jù)結(jié)構(gòu)特征分析,提出基于GDAL實(shí)現(xiàn)ESRI Shapefile格式文件到png文件格式的轉(zhuǎn)換和處理方法,包括地理信息獲取、坐標(biāo)系統(tǒng)轉(zhuǎn)換和文件格式轉(zhuǎn)換。通過(guò)試驗(yàn)驗(yàn)證了該方法的可行性。
關(guān)鍵詞: GDAL,ESRI Shapefile格式,地理信息獲取,坐標(biāo)系統(tǒng)轉(zhuǎn)換,文件格式轉(zhuǎn)換
ESRI Shapefile file handling based on GDAL
Kong Shuaike1, Qiao Baojun1,2, Fu Zhengye1
(1. Department of Computer Science and Technology, Henan University, Kaifeng, Henan 475000, China; 2. Software Academy, Henan University)
Abstract: With the incessant development of remote sensing application technology, the demand for analyzing the image files of ESRI Shapefile becomes more and more. There are a lot of software available currently. However, these software take up redundant resources at runtime. It is inadvisable to directly embed the commercial software into the self-developed software. Therefore, it is become important to handle ESRI Shapefile format file with self-developed remote sensing image processing software. Through analysis on the image date and structure features of the ESRI Shapefile format, the conversion method of ESRI Shapefile files to png format based on GDAL is proposed, including acquiring geographic info, coordinate transformation and format conversion. The practice shows the feasibility of the method.
Key words: GDAL; ESRI Shapefile format; geographic information acquisition; coordinate transformation; format conversion
0 引言
地理信息系統(tǒng)是近年來(lái)新興的一個(gè)集地理學(xué)、計(jì)算機(jī)技術(shù)、遙感技術(shù)和地圖學(xué)于一體的綜合系統(tǒng),已廣泛應(yīng)用在城市、資源、環(huán)境、交通、人口、土地、災(zāi)害和規(guī)劃管理等領(lǐng)域[1]。ESRI公司的Shapefile是用于存儲(chǔ)非拓?fù)浣Y(jié)構(gòu)空間要素的一種數(shù)據(jù)格式,已成為GIS數(shù)據(jù)交換的一種標(biāo)準(zhǔn)格式[2]。 ESRI Shapefile作為矢量文件的通用格式之一,很多商業(yè)化軟件都具備對(duì)Shapefile文件的操作功能。地理信息系統(tǒng)軟件ArcGIS作為中國(guó)地理信息界用戶群體最大、應(yīng)用最廣的GIS技術(shù)平臺(tái)之一[3],對(duì)Shapefile文件提供了很好的支持。然而在實(shí)際項(xiàng)目開(kāi)發(fā)中,把功能龐大的ArcGIS嵌入到項(xiàng)目中是不現(xiàn)實(shí)的,此外,項(xiàng)目開(kāi)發(fā)也需要擺脫對(duì)商業(yè)軟件的依賴。因此靈活準(zhǔn)確地處理ESRI Shapefile格式圖像,就變得越來(lái)越重要。本文基于GDAL庫(kù)實(shí)現(xiàn)了一種滿足以上需求的方案。通過(guò)分析ESRI Shapefile文件格式,尋找獲取圖像信息、地理信息的方法;通過(guò)注冊(cè)環(huán)境變量,調(diào)用GDAL的OGR庫(kù),就能夠完成ESRI Shapefile文件的讀取;通過(guò)了解更多的OGR庫(kù)的知識(shí),分析不同坐標(biāo)系之間轉(zhuǎn)換的可行性,最終不僅靈活實(shí)現(xiàn)了ESRI Shapefile格式圖像的信息的獲取,也實(shí)現(xiàn)了ESRI Shapefile文件格式向png格式的轉(zhuǎn)換以及坐標(biāo)系的轉(zhuǎn)換。這些成果在實(shí)際項(xiàng)目開(kāi)發(fā)中都有著重要的現(xiàn)實(shí)意義。
1 讀取文件
ESRI Shapefile屬于一種矢量圖形格式,它能夠保存幾何圖形的位置及相關(guān)屬性。ESRI Shapefile文件格式采用編碼效率較高的二進(jìn)制格式,點(diǎn)的坐標(biāo)采用雙精度保存[4]。ESRI Shapefile文件系統(tǒng)由多個(gè)文件組成,每個(gè)完整的Shapefile文件至少由三個(gè)文件組成:SHP文件、SHX文件和DBF文件。SHP文件用于保存元素的幾何實(shí)體;SHX文件保存幾何體位置索引,記錄每一個(gè)幾何體在SHP文件之中的位置;dBASE(DBF文件)表包含了實(shí)體的屬性數(shù)據(jù)。圖形數(shù)據(jù)和屬性數(shù)據(jù)通過(guò)索引號(hào)建立一一對(duì)應(yīng)的關(guān)系[5]。有些ESRI Shapefile文件還包括PRJ文件,PRJ是投影文件, 包含著相關(guān)圖幅的投影信息[6]。 GDAL(Geospatial Data Abstraction Library)是一個(gè)基于X/MIT許可協(xié)議的開(kāi)源柵格空間數(shù)據(jù)轉(zhuǎn)換庫(kù)。它利用抽象數(shù)據(jù)模型來(lái)表達(dá)所支持的各種文件格式,并擁有一系列命令行工具用于數(shù)據(jù)轉(zhuǎn)換和處理。OGR是GDAL庫(kù)的一部分,它提供對(duì)矢量數(shù)據(jù)的支持。OGR提供了對(duì)多種矢量數(shù)據(jù)格式的讀寫(xiě)支持[7],包括ESRI Shapefile文件。在OGR中,不同的數(shù)據(jù)格式對(duì)應(yīng)不同的驅(qū)動(dòng)(Driver),OGR統(tǒng)一管理所有支持的驅(qū)動(dòng),使用驅(qū)動(dòng)完成地理數(shù)據(jù)格式的讀取與保存。由于ESRI Shapefile文件格式具有一定的復(fù)雜度,我們無(wú)法直接提取其屬性信息,而利用GDAL庫(kù)就可以很輕松地完成這一功能。
我們可以用以下代碼獲取ESRI Shapefile屬性信息:
1 OSGeo.OGR.Ogr.RegisterAll();
2 Driver dr=Ogr.GetDriverByName("ESRI Shapefile");
3 DataSource orgDs=dr.Open(ShpFilePath, 0);
4 if (orgDs==null)
5 return;
6 Layer orgLayer=orgDs.GetLayerByIndex(0);
7 Envelope ex=new Envelope();
8 orgLayer.GetExtent(ex, 0);
9 string strShapeType=orgLayer.GetLayerDefn()
.GetGeomType().ToString();
10 Feature orgFr=orgLayer.GetFeature(0);
11 Geometry ogrGeo=orgFr.GetGeometryRef();
12 FieldType strType=orgFr.GetFieldType(0);
13 FeatureDefn pofeature=orgLayer.GetLayerDefn();
14 FieldDefn pofield=pofeature.GetFieldDefn(0);
15 OSGeo.OSR.SpatialReference Spatial1=ogrGeo
.GetSpatialReference();
16 Spatial1.ExportToWkt(out strReference);
17 ogrGeo.ExportToWkt(out strPoints);
為方便查看ESRI Shapefile文件的屬性信息,將獲取到的信息以xml文件的形式保存。圖1是北京縣域的Shapefile文件信息的部分截圖。
2 坐標(biāo)系統(tǒng)的轉(zhuǎn)換
ESRI Shapefile文件保存的是地理空間資料,不可避免地涉及到地理坐標(biāo)系統(tǒng)。坐標(biāo)系統(tǒng)的定義基于地球橢球體,下面我們列舉一些常用的坐標(biāo)系統(tǒng)及其采用的地球橢球體?死鞣蛩够鶛E球(1940Krassovsky):北京54坐標(biāo)系采用的橢球。1975年I. U.G. G推薦橢球( 國(guó)際大地測(cè)量協(xié)會(huì)1975):西安80坐標(biāo)系采用的橢球。WGS-84橢球(GPS全球定位系統(tǒng)橢球、17屆國(guó)際大地測(cè)量協(xié)會(huì)):WGS-84坐標(biāo)系橢球 [8]。由于不同坐標(biāo)系采用不同的球面坐標(biāo)和投影算法,同一地理位置,在不同的坐標(biāo)系統(tǒng)下,所顯示出來(lái)的坐標(biāo)值也不同。在應(yīng)用程序中,我們需要將使用不同坐標(biāo)系統(tǒng)的ESRI Shapefile文件,以統(tǒng)一的坐標(biāo)系統(tǒng),將坐標(biāo)值顯示出來(lái)。OGR庫(kù)中的OGRSpatialReference和 OGRCoordinateTransformation類(lèi)提供了用來(lái)描繪坐標(biāo)系統(tǒng)(投影和基準(zhǔn)面)以及坐標(biāo)系統(tǒng)相互之間轉(zhuǎn)換的服務(wù)。 OGRSpatialReference類(lèi)用來(lái)創(chuàng)建一個(gè)坐標(biāo)系統(tǒng)[9],CoordinateTransformation類(lèi)用來(lái)在不同坐標(biāo)系統(tǒng)間轉(zhuǎn)換坐標(biāo)。新的轉(zhuǎn)換對(duì)象由OGRCoordinateTransformation()方法創(chuàng)建。創(chuàng)建后可用TransformPoint()方法來(lái)轉(zhuǎn)換不同坐標(biāo)系的點(diǎn)。以下代碼完成不同坐標(biāo)系下的坐標(biāo)轉(zhuǎn)換。
1 OSGeo.OGR.Ogr.RegisterAll();
2 Driver dr=Ogr.GetDriverByName("ESRI Shapefile");
3 DataSource orgDs=dr.Open(ShpFilePath, 0);
4 if (orgDs==null)
5 return;
6 Layer orgLayer=orgDs.GetLayerByIndex(0);
7 Feature orgFr=orgLayer.GetFeature(i);
8 Geometry ogrGeo=orgFr.GetGeometryRef();
9 OSGeo.OSR.SpatialReference sourceSpatial=ogrGeo
.GetSpatialReference();
10 OSGeo.OSR.SpatialReference targetSpatial=new
OSGeo.OSR.SpatialReference("");
11 Spatial.ImportFromProj4("+proj=longlat+ellps=WGS84
+no_defs"); 12 OSGeo.OSR.CoordinateTransformation tran=new OSGeo
.OSR.CoordinateTransformation(sourceSpatial,targetSpatial);
13 double[] da=new double[3];
14 tran.TransformPoint(da,x,y,z);
3 文件格式轉(zhuǎn)換
3.1 格式轉(zhuǎn)換
ESRI Shapefile文件是一種特殊的影像格式,無(wú)法用常用的看圖工具正常打開(kāi),因此不方便使用和查看,但將ESRI Shapefile文件轉(zhuǎn)換為png格式后就可以很方便地進(jìn)行處理。在ESRI Shapefile文件格式簡(jiǎn)介中我們了解到,ESRI Shapefile文件將地理空間資料以坐標(biāo)點(diǎn)串的形式存儲(chǔ)起來(lái),根據(jù)這些點(diǎn)串,我們可以利用C#語(yǔ)言中的Graphics類(lèi)輕松地將該地理形狀描繪出來(lái)。根據(jù)這一原理,可完成ESRI Shapefile影像格式向png格式的轉(zhuǎn)換。利用ESRI Shapefile文件讀取,獲取ESRI Shapefile地理坐標(biāo)點(diǎn)串。然而這里還有一個(gè)問(wèn)題需要解決:如何將地理經(jīng)緯度坐標(biāo)轉(zhuǎn)換為畫(huà)布坐標(biāo)。針對(duì)這一問(wèn)題,本文做了以下操作:首先計(jì)算該 ESRI Shapefile文件的邊界盒大小,求出邊界盒的寬度與高度,然后與畫(huà)布的對(duì)應(yīng)寬度與高度做比值運(yùn)算,確定放大倍數(shù),再計(jì)算ESRI Shapefile文件每個(gè)地理坐標(biāo)點(diǎn)與邊界盒左上角的偏移距離,由此確定該點(diǎn)在畫(huà)布中的確切位置。轉(zhuǎn)化算法如下:
PIONT-TRANSFORM(xmax,xmin,ymax,ymin,Point)
1 //計(jì)算邊界盒寬度
2 width=Math.Abs(xmax-xmin);
3 //計(jì)算邊界盒高度
4 height=Math.Abs(ymax-ymin)
5 //邊界盒的寬高比
6 aspectRatio=width/height;
7 //畫(huà)布的寬高比
8 canvasRatio=Width/Height;
9 //計(jì)算比例,使得shp幾何圖形可以保持原有比例在畫(huà)布上最大化顯示
10 scaleFactor=1.0;
11 if aspectRatio 12 then scaleFactor=Height/height;
13 else
14 then scaleFactor=Width/width;
15 newPoint.X=(Point.X-xmin)*scaleFactor;
16 //注意畫(huà)布y坐標(biāo)軸與實(shí)際y坐標(biāo)軸方向相反
17 newPoint.Y=(ymax-Point.Y )*scaleFactor;
18 return newPiont;
用此方法將ESRI Shapefile文件地理坐標(biāo)點(diǎn)串全部轉(zhuǎn)換為畫(huà)布坐標(biāo)后,只需用Graphics類(lèi)的DrawCurve()方法畫(huà)出圖形,利用Bitmap的Save方法將其保存為png格式。
3.2 轉(zhuǎn)化效果
對(duì)同一個(gè)北京縣域的ESRI Shapefile文件,圖2是在arcGis下看到的形狀,圖3是利用上述方法得到png圖像。
對(duì)比圖2與圖3可以清晰地看出,對(duì)于同一個(gè)ESRI Shapefile文件,通過(guò)程序轉(zhuǎn)換后的png圖與arcgis下查看的到圖像形狀完全一樣,圖像沒(méi)有失真。另外,可以通過(guò)該方法,將ESRI Shapefile文件圖像形狀以Image對(duì)象的形式顯示在應(yīng)用程序相應(yīng)的控件中。
4 結(jié)束語(yǔ)
本文提出基于GDAL開(kāi)源函數(shù)庫(kù)對(duì)ESRI Shapefiles文件格式的處理,實(shí)現(xiàn)提取ESRI Shapefiles文件的詳細(xì)屬性信息,以及不同坐標(biāo)系統(tǒng)之間的轉(zhuǎn)換,將ESRI Shapefiles格式轉(zhuǎn)換為易于查看的png格式,通過(guò)實(shí)驗(yàn)驗(yàn)證,獲取到的ESRI Shapefiles文件屬性信息詳細(xì)、準(zhǔn)確,轉(zhuǎn)換后的png圖像效果良好。通過(guò)這一成果,可以有效地?cái)[脫應(yīng)用程序?qū)ι虡I(yè)軟件的依賴,將其應(yīng)用在實(shí)際項(xiàng)目開(kāi)發(fā)中有重要的現(xiàn)實(shí)意義。在坐標(biāo)系統(tǒng)轉(zhuǎn)換過(guò)程中,由于掌握的地理坐標(biāo)系統(tǒng)的資料及個(gè)人能力有限,目前僅完成幾種常用的坐標(biāo)系統(tǒng)間的轉(zhuǎn)換。今后我們將進(jìn)一步研究地理坐標(biāo)系統(tǒng),提供更多坐標(biāo)系統(tǒng)間的轉(zhuǎn)換,提高坐標(biāo)轉(zhuǎn)換的精度及效率。
參考文獻(xiàn):
[1] 柳佳佳,欒曉巖.ShapeFile格式文件寫(xiě)入方法研究[J].測(cè)繪通報(bào),
2012.9:90-92
[2] 佘遠(yuǎn)見(jiàn),郭旭東,何挺.用于操作Shapefile的COM組件開(kāi)發(fā)與應(yīng)用[J].
測(cè)繪科學(xué),2009.34(4):230-231
[3] 李秀梅,吳凡,徐殿成等.基于ArcGIS的校園圖書(shū)館三維建模研究[J].
計(jì)算機(jī)科學(xué),2012.39(Z6):563-565
[4] 劉峰,張繼賢,李海濤.SHP文件格式的研究與應(yīng)用[J].測(cè)繪科學(xué),
2006.31(6):116-117
[5] 劉偉,張海榮.基于GML從DXF文件到SHP文件格式轉(zhuǎn)換的研究與
開(kāi)發(fā)[J].測(cè)繪科學(xué),2007.32(4):177-178
[6] 蔣紅燕,楊哲海.地理信息從SHP格式向SVG格式轉(zhuǎn)換[J].測(cè)繪通報(bào),
2011.2:73-76
轉(zhuǎn)載請(qǐng)注明來(lái)自:http://www.jinnzone.com/jisuanjiyingyonglw/44689.html