基于GDAL的ESRI Shapefile格式文件处理

时间:2022-10-29 08:21:07

基于GDAL的ESRI Shapefile格式文件处理

摘 要: 随着遥感应用技术的不断发展,对ESRI Shapefile格式图像文件的处理需求变得日益紧迫。目前能对它进行处理的软件有很多,但是这些软件运行时占用大量系统资源,而直接将商业软件嵌入到自主开发的软件中也是不可取的。因此,能够在自主开发的遥感图像处理软件中实现对ESRI Shapefile格式文件的操作已经变得非常重要。通过对ESRI Shapefile格式的影像数据结构特征分析,提出基于gdal实现esri shapefile格式文件到png文件格式的转换和处理方法,包括地理信息获取、坐标系统转换和文件格式转换。通过试验验证了该方法的可行性。

关键词: GDAL; ESRI Shapefile格式; 地理信息获取; 坐标系统转换; 文件格式转换

中图分类号:TP399 文献标志码:A 文章编号:1006-8228(2014)08-43-03

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 引言

地理信息系统是近年来新兴的一个集地理学、计算机技术、遥感技术和地图学于一体的综合系统,已广泛应用在城市、资源、环境、交通、人口、土地、灾害和规划管理等领域[1]。ESRI公司的Shapefile是用于存储非拓扑结构空间要素的一种数据格式,已成为GIS数据交换的一种标准格式[2]。ESRI Shapefile作为矢量文件的通用格式之一,很多商业化软件都具备对Shapefile文件的操作功能。地理信息系统软件ArcGIS作为中国地理信息界用户群体最大、应用最广的GIS技术平台之一[3],对Shapefile文件提供了很好的支持。然而在实际项目开发中,把功能庞大的ArcGIS嵌入到项目中是不现实的,此外,项目开发也需要摆脱对商业软件的依赖。因此灵活准确地处理ESRI Shapefile格式图像,就变得越来越重要。本文基于GDAL库实现了一种满足以上需求的方案。通过分析ESRI Shapefile文件格式,寻找获取图像信息、地理信息的方法;通过注册环境变量,调用GDAL的OGR库,就能够完成ESRI Shapefile文件的读取;通过了解更多的OGR库的知识,分析不同坐标系之间转换的可行性,最终不仅灵活实现了ESRI Shapefile格式图像的信息的获取,也实现了ESRI Shapefile文件格式向png格式的转换以及坐标系的转换。这些成果在实际项目开发中都有着重要的现实意义。

1 读取文件

ESRI Shapefile属于一种矢量图形格式,它能够保存几何图形的位置及相关属性。ESRI Shapefile文件格式采用编码效率较高的二进制格式,点的坐标采用双精度保存[4]。ESRI Shapefile文件系统由多个文件组成,每个完整的Shapefile文件至少由三个文件组成:SHP文件、SHX文件和DBF文件。SHP文件用于保存元素的几何实体;SHX文件保存几何置索引,记录每一个几何体在SHP文件之中的位置;dBASE(DBF文件)表包含了实体的属性数据。图形数据和属性数据通过索引号建立一一对应的关系[5]。有些ESRI Shapefile文件还包括PRJ文件,PRJ是投影文件, 包含着相关图幅的投影信息[6]。

GDAL(Geospatial Data Abstraction Library)是一个基于X/MIT许可协议的开源栅格空间数据转换库。它利用抽象数据模型来表达所支持的各种文件格式,并拥有一系列命令行工具用于数据转换和处理。OGR是GDAL库的一部分,它提供对矢量数据的支持。OGR提供了对多种矢量数据格式的读写支持[7],包括ESRI Shapefile文件。在OGR中,不同的数据格式对应不同的驱动(Driver),OGR统一管理所有支持的驱动,使用驱动完成地理数据格式的读取与保存。由于ESRI Shapefile文件格式具有一定的复杂度,我们无法直接提取其属性信息,而利用GDAL库就可以很轻松地完成这一功能。

我们可以用以下代码获取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 坐标系统的转换

ESRI Shapefile文件保存的是地理空间资料,不可避免地涉及到地理坐标系统。坐标系统的定义基于地球椭球体,下面我们列举一些常用的坐标系统及其采用的地球椭球体。克拉索夫斯基椭球(1940Krassovsky):北京54坐标系采用的椭球。1975年I. U.G. G推荐椭球( 国际大地测量协会1975):西安80坐标系采用的椭球。WGS-84椭球(GPS全球定位系统椭球、17届国际大地测量协会):WGS-84坐标系椭球[8]。由于不同坐标系采用不同的球面坐标和投影算法,同一地理位置,在不同的坐标系统下,所显示出来的坐标值也不同。在应用程序中,我们需要将使用不同坐标系统的ESRI Shapefile文件,以统一的坐标系统,将坐标值显示出来。OGR库中的OGRSpatialReference和OGRCoordinateTransformation类提供了用来描绘坐标系统(投影和基准面)以及坐标系统相互之间转换的服务。OGRSpatialReference类用来创建一个坐标系统[9],CoordinateTransformation类用来在不同坐标系统间转换坐标。新的转换对象由OGRCoordinateTransformation()方法创建。创建后可用TransformPoint()方法来转换不同坐标系的点。以下代码完成不同坐标系下的坐标转换。

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 文件格式转换

3.1 格式转换

ESRI Shapefile文件是一种特殊的影像格式,无法用常用的看图工具正常打开,因此不方便使用和查看,但将ESRI Shapefile文件转换为png格式后就可以很方便地进行处理。在ESRI Shapefile文件格式简介中我们了解到,ESRI Shapefile文件将地理空间资料以坐标点串的形式存储起来,根据这些点串,我们可以利用C#语言中的Graphics类轻松地将该地理形状描绘出来。根据这一原理,可完成ESRI Shapefile影像格式向png格式的转换。利用ESRI Shapefile文件读取,获取ESRI Shapefile地理坐标点串。然而这里还有一个问题需要解决:如何将地理经纬度坐标转换为画布坐标。针对这一问题,本了以下操作:首先计算该ESRI Shapefile文件的边界盒大小,求出边界盒的宽度与高度,然后与画布的对应宽度与高度做比值运算,确定放大倍数,再计算ESRI Shapefile文件每个地理坐标点与边界盒左上角的偏移距离,由此确定该点在画布中的确切位置。转化算法如下:

PIONT-TRANSFORM(xmax,xmin,ymax,ymin,Point)

1 //计算边界盒宽度

2 width=Math.Abs(xmax-xmin);

3 //计算边界盒高度

4 height=Math.Abs(ymax-ymin)

5 //边界盒的宽高比

6 aspectRatio=width/height;

7 //画布的宽高比

8 canvasRatio=Width/Height;

9 //计算比例,使得shp几何图形可以保持原有比例在画布上最大化显示

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 //注意画布y坐标轴与实际y坐标轴方向相反

17 newPoint.Y=(ymax-Point.Y )*scaleFactor;

18 return newPiont;

用此方法将ESRI Shapefile文件地理坐标点串全部转换为画布坐标后,只需用Graphics类的DrawCurve()方法画出图形,利用Bitmap的Save方法将其保存为png格式。

3.2 转化效果

对同一个北京县域的ESRI Shapefile文件,图2是在arcGis下看到的形状,图3是利用上述方法得到png图像。

对比图2与图3可以清晰地看出,对于同一个ESRI Shapefile文件,通过程序转换后的png图与arcgis下查看的到图像形状完全一样,图像没有失真。另外,可以通过该方法,将ESRI Shapefile文件图像形状以Image对象的形式显示在应用程序相应的控件中。

4 结束语

本文提出基于GDAL开源函数库对ESRI Shapefiles文件格式的处理,实现提取ESRI Shapefiles文件的详细属性信息,以及不同坐标系统之间的转换,将ESRI Shapefiles格式转换为易于查看的png格式,通过实验验证,获取到的ESRI Shapefiles文件属性信息详细、准确,转换后的png图像效果良好。通过这一成果,可以有效地摆脱应用程序对商业软件的依赖,将其应用在实际项目开发中有重要的现实意义。在坐标系统转换过程中,由于掌握的地理坐标系统的资料及个人能力有限,目前仅完成几种常用的坐标系统间的转换。今后我们将进一步研究地理坐标系统,提供更多坐标系统间的转换,提高坐标转换的精度及效率。

参考文献:

[1] 柳佳佳,栾晓岩.ShapeFile格式文件写入方法研究[J].测绘通报,

2012.9:90-92

[2] 佘远见,郭旭东,何挺.用于操作Shapefile的COM组件开发与应用[J].

测绘科学,2009.34(4):230-231

[3] 李秀梅,吴凡,徐殿成等.基于ArcGIS的校园图书馆三维建模研究[J].

计算机科学,2012.39(Z6):563-565

[4] 刘峰,张继贤,李海涛.SHP文件格式的研究与应用[J].测绘科学,

2006.31(6):116-117

[5] 刘伟,张海荣.基于GML从DXF文件到SHP文件格式转换的研究与

开发[J].测绘科学,2007.32(4):177-178

[6] 蒋红燕,杨哲海.地理信息从SHP格式向SVG格式转换[J].测绘通报,

2011.2:73-76

[7] 徐杨,孙群,冯克忠等.基于OGR的交换格式数据驱动的设计与实现[J].

测绘通报,2011.6:54-56

[8] 梁世文,王春光,伊志永.ArcGIS坐标系统探讨[J].地理空间信息,

2010.8(4)152-154

[9] 付卫平,郭建文,刘鹏.基于Google Map API的矢量化Web平台[J].遥

感技术与应用,2011.26(6):863-867

上一篇:浅谈如何评价幼儿的绘画作品 下一篇:高等学校会计核算面临的问题及对策