博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C# Gdal 读取SHP文件
阅读量:5248 次
发布时间:2019-06-14

本文共 7190 字,大约阅读时间需要 23 分钟。

一直用C++来做,现在也用C#来试一下。

1.主要是C# 版本下载,尽量最新吧!

在这里  http://www.gisinternals.com/sdk/   下了 适合自己的版本。我下载的是\release-1600-gdal-1-10-mapserver-6-2版本,

把所需要的C#的的dll库,\release-1600-gdal-1-10-mapserver-6-2\bin\gdal\csharp在这里找到。 

主要的DLL有8个DLL文件gdal_csharp,gdal_wrap,gdalconst_csharp,gdalconst_wrap,ogr_csharp,ogr_warp,osr_csharp,osr_wrap  拷贝到VS项目的程序文件夹bin中。

当然\release-1600-gdal-1-10-mapserver-6-2\bin 下面的那么多DLL也做好拷贝到你的工程的bin下,因为里面的依赖关系我也分不清。

2.  写了个简单的读取类,名称为GdalRead.cs。当然,要在工程里引用四个含有*-csharp的DLL。

来个截图:

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Windows.Forms;//using System.IO;using OSGeo.GDAL;using OSGeo.OGR;using OSGeo.OSR;using System.Collections;namespace GdalReadSHP{    ///     /// 定义SHP解析类    ///     public class ShpRead    {        /// 保存SHP属性字段        public OSGeo.OGR.Driver oDerive;        public List
m_FeildList; private Layer oLayer; public string sCoordiantes; public ShpRead() { m_FeildList = new List
(); oLayer = null; sCoordiantes = null; } ///
/// 初始化Gdal /// public void InitinalGdal() { // 为了支持中文路径 Gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8", "YES"); // 为了使属性表字段支持中文 Gdal.SetConfigOption("SHAPE_ENCODING", ""); Gdal.AllRegister(); Ogr.RegisterAll(); oDerive = Ogr.GetDriverByName("ESRI Shapefile"); if (oDerive == null) { MessageBox.Show("文件不能打开,请检查"); } } ///
/// 获取SHP文件的层 /// ///
///
///
public bool GetShpLayer(string sfilename) { if (null == sfilename || sfilename.Length <= 3) { oLayer = null; return false; } if (oDerive == null) { MessageBox.Show("文件不能打开,请检查"); } DataSource ds = oDerive.Open(sfilename, 1); if (null == ds) { oLayer = null; return false; } int iPosition = sfilename.LastIndexOf("\\"); string sTempName = sfilename.Substring(iPosition + 1, sfilename.Length - iPosition - 4 - 1); oLayer = ds.GetLayerByName(sTempName); if (oLayer == null) { ds.Dispose(); return false; } return true; } ///
/// 获取所有的属性字段 /// ///
public bool GetFeilds() { if (null == oLayer) { return false; } m_FeildList.Clear(); wkbGeometryType oTempGeometryType = oLayer.GetGeomType(); List
TempstringList = new List
(); // FeatureDefn oDefn = oLayer.GetLayerDefn(); int iFieldCount = oDefn.GetFieldCount(); for (int iAttr = 0; iAttr < iFieldCount; iAttr++) { FieldDefn oField = oDefn.GetFieldDefn(iAttr); if (null != oField) { m_FeildList.Add(oField.GetNameRef()); } } return true; } ///
/// 获取某条数据的字段内容 /// ///
///
///
public bool GetFeildContent(int iIndex, out List
FeildStringList) { FeildStringList = new List
(); Feature oFeature = null; if ((oFeature = oLayer.GetFeature(iIndex)) != null) { FeatureDefn oDefn = oLayer.GetLayerDefn(); int iFieldCount = oDefn.GetFieldCount(); // 查找字段属性 for (int iAttr = 0; iAttr < iFieldCount; iAttr++) { FieldDefn oField = oDefn.GetFieldDefn(iAttr); string sFeildName = oField.GetNameRef(); #region 获取属性字段 FieldType Ftype = oFeature.GetFieldType(sFeildName); switch (Ftype) { case FieldType.OFTString: string sFValue = oFeature.GetFieldAsString(sFeildName); string sTempType = "string"; FeildStringList.Add(sFValue); break; case FieldType.OFTReal: double dFValue = oFeature.GetFieldAsDouble(sFeildName); sTempType = "float"; FeildStringList.Add(dFValue.ToString()); break; case FieldType.OFTInteger: int iFValue = oFeature.GetFieldAsInteger(sFeildName); sTempType = "int"; FeildStringList.Add(iFValue.ToString()); break; default: //sFValue = oFeature.GetFieldAsString(ChosenFeildIndex[iFeildIndex]); sTempType = "string"; break; } #endregion } } return true; } ///
/// 获取数据 /// ///
public bool GetGeometry(int iIndex) { if (null == oLayer) { return false; } int iFeatureCout = oLayer.GetFeatureCount(0); Feature oFeature = null; oFeature = oLayer.GetFeature(iIndex); // Geometry Geometry oGeometry = oFeature.GetGeometryRef(); wkbGeometryType oGeometryType = oGeometry.GetGeometryType(); switch (oGeometryType) { case wkbGeometryType.wkbPoint: oGeometry.ExportToWkt(out sCoordiantes); sCoordiantes = sCoordiantes.ToUpper().Replace("POINT (", "").Replace(")", ""); break; case wkbGeometryType.wkbLineString: case wkbGeometryType.wkbLinearRing: oGeometry.ExportToWkt(out sCoordiantes); sCoordiantes = sCoordiantes.ToUpper().Replace("LINESTRING (", "").Replace(")", ""); break; default: break; } return false; } }//END class}
3. 在program.cs中调用。

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.IO;using System.Windows.Forms;using OSGeo.GDAL;using OSGeo.OGR;using OSGeo.OSR;using System.Collections;namespace GdalReadSHP{    class Program    {        static void Main(string[] args)        {               string sShpFileName = @"D:\VRMap6_Data\line92\RainMainPipe.shp";            ShpRead m_Shp = new ShpRead();            // 初始化GDAL和OGR            m_Shp.InitinalGdal();            //             m_Shp.GetShpLayer(sShpFileName);            // 获取所有属性字段名称,存放在m_FeildList中            m_Shp.GetFeilds();                        List
FeildStringList = null; m_Shp.GetFeildContent(0, out FeildStringList); // 获取某条FID的数据 m_Shp.GetGeometry(0); MessageBox.Show(m_Shp.sCoordiantes); } }}

一开始自己疏忽了,总是报错。最后才发现,自己没初始化GDAL和OGR,我类个去!!

///         /// 初始化Gdal        ///         public void InitinalGdal()        {            // 为了支持中文路径            Gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8", "NO");            // 为了使属性表字段支持中文            Gdal.SetConfigOption("SHAPE_ENCODING", "");            Gdal.AllRegister();            Ogr.RegisterAll();                        oDerive = Ogr.GetDriverByName("ESRI Shapefile");            if (oDerive == null)            {                MessageBox.Show("文件不能打开,请检查");            }        }
至于对SHP用C#写,目前咩有用到。

说明:

网上好多Gdal支持中文路径说需要:

Gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8", "NO");
我试了一下,貌似用YES才行。

// 为了支持中文路径            Gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8", "YES");

若中文名称的SHP文件,用GetLayerByName(stirng sName); 我测试是不行的。

需要改为Layer oLayer = ds.GetLayerByIndex(0);

不足之处,多多指点!

源码地址:http://download.csdn.net/detail/cartzhang/5590957 

免分下载! 

转载于:https://www.cnblogs.com/qitian1/archive/2013/06/16/6461994.html

你可能感兴趣的文章
Linux SPI总线和设备驱动架构之四:SPI数据传输的队列化
查看>>
SIGPIPE并产生一个信号处理
查看>>
CentOS
查看>>
Linux pipe函数
查看>>
java equals 小记
查看>>
爬虫-通用代码框架
查看>>
2019春 软件工程实践 助教总结
查看>>
YUV 格式的视频呈现
查看>>
Android弹出框的学习
查看>>
现代程序设计 作业1
查看>>
在android开发中添加外挂字体
查看>>
Zerver是一个C#开发的Nginx+PHP+Mysql+memcached+redis绿色集成开发环境
查看>>
多线程实现资源共享的问题学习与总结
查看>>
Learning-Python【26】:反射及内置方法
查看>>
torch教程[1]用numpy实现三层全连接神经网络
查看>>
java实现哈弗曼树
查看>>
转:Web 测试的创作与调试技术
查看>>
python学习笔记3-列表
查看>>
程序的静态链接,动态链接和装载 (补充)
查看>>
关于本博客说明
查看>>