基于开源数据库GDAL的ESRI Shapefile格式文件处理

2016-10-27 作者: 黄馨宁 浏览: 167 次

摘要: 文件的读取 ESRI Shapefile是矢量图形的一种格式,它能够保存几何图形的位置及相关属性。ESRI Shapefile文件格式采用编码效率较高的二进制格式,点的坐标采用双精度保存。ESRIShapefile文件系统由多个文件组成,每个完整的Shapef....

文件的读取

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

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

<pre class="brush:py"> OSGeo.OGR.Ogr.RegisterAll(); Driver dr=Ogr.GetDriverByName("ESRI Shapefile"); DataSource orgDs=dr.Open(ShpFilePath, 0); if (orgDs==null) return; Layer orgLayer=orgDs.GetLayerByIndex(0); Envelope ex=new Envelope(); orgLayer.GetExtent(ex, 0); string strShapeType=orgLayer.GetLayerDefn() .GetGeomType().ToString(); Feature orgFr=orgLayer.GetFeature(0); Geometry ogrGeo=orgFr.GetGeometryRef(); FieldType strType=orgFr.GetFieldType(0); FeatureDefn pofeature=orgLayer.GetLayerDefn(); FieldDefn pofield=pofeature.GetFieldDefn(0); OSGeo.OSR.SpatialReference Spatial1=ogrGeo .GetSpatialReference(); Spatial1.ExportToWkt(out strReference); ogrGeo.ExportToWkt(out strPoints); </pre> 为方便查看ESRI Shapefile文件的属性信息,将获取到的信息以xml文件的形式保存。

坐标系统的转换

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

<pre class="brush:py">

OSGeo.OGR.Ogr.RegisterAll(); Driver dr=Ogr.GetDriverByName("ESRI Shapefile"); DataSource orgDs=dr.Open(ShpFilePath, 0); if (orgDs==null) return; Layer orgLayer=orgDs.GetLayerByIndex(0); Feature orgFr=orgLayer.GetFeature(i); Geometry ogrGeo=orgFr.GetGeometryRef(); OSGeo.OSR.SpatialReference sourceSpatial=ogrGeo .GetSpatialReference(); OSGeo.OSR.SpatialReference targetSpatial=new OSGeo.OSR.SpatialReference(""); Spatial.ImportFromProj4("+proj=longlat+ellps=WGS84 +no_defs"); OSGeo.OSR.CoordinateTransformation tran=new OSGeo .OSR.CoordinateTransformation(sourceSpatial,targetSpatial); double[] da=new double[3]; tran.TransformPoint(da,x,y,z);

</pre>

文件格式转换

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

<pre class="brush:py">

PIONT-TRANSFORM(xmax,xmin,ymax,ymin,Point) //计算边界盒宽度 width=Math.Abs(xmax-xmin); //计算边界盒高度 height=Math.Abs(ymax-ymin) //边界盒的宽高比 aspectRatio=width/height; //画布的宽高比 canvasRatio=Width/Height; //计算比例,使得shp几何图形可以保持原有比例在画布上最大化显示 scaleFactor=1.0; if aspectRatio<canvasRatio then scaleFactor=Height/height; else then scaleFactor=Width/width; newPoint.X=(Point.X-xmin)scaleFactor; //注意画布 y 坐标轴与实际 y 坐标轴方向相反 newPoint.Y=(ymax-Point.Y )scaleFactor; return newPiont;

</pre> 此方法将ESRI Shapefile文件地理坐标点串全部转换为画布坐标后,只需用Graphics类的DrawCurve()方法画出图形,利用Bitmap的Save方法将其保存为png格式。通过程序转换后的png图与arcgis下查看的到图像形状完全一样,图像没有失真。另外,可以通过该方法,将ESRI Shapefile文件图像形状以Image对象的形式显示在应用程序相应的控件中。通过这一成果,可以有效地摆脱应用程序对商业软件的依赖,将其应用在实际项目开发中有重要的现实意义。

随机推荐

Copyright © 2014-2017 OSGeo中国中心 吉ICP备05002032号

Powered by TorCMS