在开发中使用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