在开发中使用GDAL读取空间数据的使用心得一

今天不知道怎么的,有点不想写代码,可能是这几天写多,写伤着了吧.既然这样那就写写最近的一些心得吧 

最近在我做空间数据共享这方面的,所以要读取一些空间数据,比如shapefile ,mif 之类的.这些空间数据的存储格式不是很复杂,但是完全读取还是有一点麻烦,特别是要

将几何数据与属性数据整合到一块,更有点难.从网上了解到使用GDAL类库读取空间数据很方便,所以就研究了一下,下面就与大家一起分享一下.

 要用GDAL类库必须有这些相应的动态链接库(如下图),网上有一些资料,但是纯文字的的,今天我得搞图文形式,这样才更生动

必须把这上面的十个.dll文件放到项目文件的Debug 或者Release 路径下,另外还得将上面的画了红色圆圈的五个dll 通过”引用” 添加到工程文件中

这些dll 比较难下 ,我待会我挂出来让大家下载           

这些环境配好之后,开始进入代码阶段

首先要添加如下三个命名空间

using OSGeo.OGR;
using OSGeo.GDAL;
using OSGeo.OSR;

初始化类库GDAL ,进行注册

                string pszDriverName = “ESRI Shapefile”;
                OSGeo.OGR.Ogr.RegisterAll();
                //调用对shape文件读写的Driver接口
                OSGeo.OGR.Driver poDriver = OSGeo.OGR.Ogr.GetDriverByName(pszDriverName);
                if (poDriver == null)
                    MessageBox.Show(“Driver Error”);

ESRI Shapefile 代表的是shapefile 的格式   而MapInfo File 则代表的是mif 格式的 

接下来,就正式开始读取里面的内容

               OSGeo.OGR.DataSource poDS;
                poDS = poDriver.Open(@”C:\Documents and Settings\Administrator\桌面\mif文件\bou1_4_line.mif”, 0);
                if (poDS == null)
                {
                    MessageBox.Show(“open failed”);
                }
                int layerCount = poDS.GetLayerCount(); //表示有多少个图层  一般的只有一个 (一个图层包括很多特征物)
                OSGeo.OGR.Layer layer = poDS.GetLayerByIndex(0);

               string layerName = layer.GetName(); //得到图层名称

下面的就比较重要了,开始读取图层里的每个特征物的信息了

             OSGeo.OGR.Feature feature;
                int iField;

      while ((feature = layer.GetNextFeature()) != null)//不断地循环遍历每个特征点
                {

                OSGeo.OGR.FeatureDefn posDefn = layer.GetLayerDefn();
                    //不断循环遍历每个特征点对应的每条数据,一条数据里面又有很多项,一条数据对应一个特征点
                    for (iField = 0; iField < posDefn.GetFieldCount(); iField++)
                    {
                        OSGeo.OGR.FieldDefn oField = posDefn.GetFieldDefn(iField);
                        text = text + oField.GetName() + “:” + feature.GetFieldAsString(iField) + ” ,”;                       
                    }
                    //提取出每个特征点所对应的几何数据
                    OSGeo.OGR.Geometry geometry = feature.GetGeometryRef();
                    OSGeo.OGR.wkbGeometryType goetype = geometry.GetGeometryType();
                    // MessageBox.Show(goetype.ToString());

                  if (geometry!= null &&goetype == wkbGeometryType.wkbPoint)
                    {
                        OSGeo.OGR.Geometry pt = new Geometry(OSGeo.OGR.wkbGeometryType.wkbPoint);
                        pt = poGeometry;
                        text = text + “x=” + pt.GetX(0) + ” ” + “y=” + pt.GetY(0) + “%”;
                    }
                    ///如果是线
                    if (goetype == OSGeo.OGR.wkbGeometryType.wkbLineString)
                    {
                        // MessageBox.Show(“size:”+geometry.WkbSize().ToString());
                        for (int k = 0; k < geometry.GetPointCount(); k++)
                        {
                            double x = geometry.GetX(k);
                            double y = geometry.GetY(k);
                            text = text + k.ToString() + “->” + x.ToString() + “//” + y.ToString() + ” “;
                        }
                    }
                    //如果是面
                    if (goetype == OSGeo.OGR.wkbGeometryType.wkbPolygon)
                    {
                        Geometry ring1 = geometry.GetGeometryRef(0);
                        //MessageBox.Show(ring1.GetPointCount().ToString());
                        for (int k1 = 0; k1 < ring1.GetPointCount(); k1++)
                        {
                            double x = ring1.GetX(k1);
                            double y = ring1.GetY(k1);
                            text = text + k1.ToString() + “->” + x.ToString() + “//” + y.ToString() + ” “;
                        }
                    }
                    text = text + Environment.NewLine;
                }
                this.richTextBox1.Text = text;

上面的每一样都测试成功过,属性信息与几何信息都可以解析出来.

下面是源代码与相应的动态链接库下载地址   http://download.csdn.net/detail/guoyilongedu/4143084

转载自:https://blog.csdn.net/guoyilongedu/article/details/7356167

You may also like...