C#中Gdal读取SHP文件

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。

来个截图:




[csharp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Linq;  
  4. using System.Text;  
  5. using System.Windows.Forms;  
  6. //  
  7. using System.IO;  
  8. using OSGeo.GDAL;  
  9. using OSGeo.OGR;  
  10. using OSGeo.OSR;  
  11. using System.Collections;  
  12.   
  13. namespace GdalReadSHP  
  14. {  
  15.     /// <summary>  
  16.     /// 定义SHP解析类  
  17.     /// </summary>  
  18.     public class ShpRead  
  19.     {  
  20.         /// 保存SHP属性字段  
  21.         public OSGeo.OGR.Driver oDerive;  
  22.         public List<string> m_FeildList;  
  23.         private Layer oLayer;  
  24.         public string sCoordiantes;  
  25.         public ShpRead()  
  26.         {  
  27.             m_FeildList = new List<string>();  
  28.             oLayer = null;  
  29.             sCoordiantes = null;  
  30.         }  
  31.   
  32.         /// <summary>  
  33.         /// 初始化Gdal  
  34.         /// </summary>  
  35.         public void InitinalGdal()  
  36.         {  
  37.             // 为了支持中文路径  
  38.             Gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8""YES");  
  39.             // 为了使属性表字段支持中文  
  40.             Gdal.SetConfigOption("SHAPE_ENCODING""");  
  41.             Gdal.AllRegister();  
  42.             Ogr.RegisterAll();  
  43.               
  44.             oDerive = Ogr.GetDriverByName("ESRI Shapefile");  
  45.             if (oDerive == null)  
  46.             {  
  47.                 MessageBox.Show("文件不能打开,请检查");  
  48.             }  
  49.         }  
  50.   
  51.         /// <summary>  
  52.         /// 获取SHP文件的层  
  53.         /// </summary>  
  54.         /// <param name="sfilename"></param>  
  55.         /// <param name="oLayer"></param>  
  56.         /// <returns></returns>  
  57.         public bool GetShpLayer(string sfilename)  
  58.         {  
  59.             if (null == sfilename || sfilename.Length <= 3)  
  60.             {  
  61.                 oLayer = null;  
  62.                 return false;  
  63.             }  
  64.             if (oDerive == null)  
  65.             {  
  66.                 MessageBox.Show("文件不能打开,请检查");  
  67.             }  
  68.             DataSource ds = oDerive.Open(sfilename, 1);  
  69.             if (null == ds)  
  70.             {  
  71.                 oLayer = null;  
  72.                 return false;  
  73.             }  
  74.             int iPosition = sfilename.LastIndexOf("\\");  
  75.             string sTempName = sfilename.Substring(iPosition + 1, sfilename.Length - iPosition - 4 - 1);  
  76.             oLayer = ds.GetLayerByName(sTempName);  
  77.             if (oLayer == null)  
  78.             {  
  79.                 ds.Dispose();  
  80.                 return false;  
  81.             }  
  82.             return true;  
  83.         }  
  84.         /// <summary>  
  85.         /// 获取所有的属性字段  
  86.         /// </summary>  
  87.         /// <returns></returns>  
  88.         public bool GetFeilds()  
  89.         {  
  90.             if (null == oLayer)  
  91.             {  
  92.                 return false;  
  93.             }  
  94.             m_FeildList.Clear();  
  95.             wkbGeometryType oTempGeometryType = oLayer.GetGeomType();  
  96.             List<string> TempstringList = new List<string>();  
  97.   
  98.             //  
  99.             FeatureDefn oDefn = oLayer.GetLayerDefn();  
  100.             int iFieldCount = oDefn.GetFieldCount();  
  101.             for (int iAttr = 0; iAttr < iFieldCount; iAttr++)  
  102.             {  
  103.                 FieldDefn oField = oDefn.GetFieldDefn(iAttr);  
  104.                 if (null != oField)  
  105.                 {  
  106.                     m_FeildList.Add(oField.GetNameRef());  
  107.                 }  
  108.             }  
  109.             return true;  
  110.         }  
  111.         /// <summary>  
  112.         ///  获取某条数据的字段内容  
  113.         /// </summary>  
  114.         /// <param name="iIndex"></param>  
  115.         /// <param name="FeildStringList"></param>  
  116.         /// <returns></returns>  
  117.         public bool GetFeildContent(int iIndex, out List<string> FeildStringList)  
  118.         {  
  119.             FeildStringList = new List<string>();  
  120.             Feature oFeature = null;  
  121.             if ((oFeature = oLayer.GetFeature(iIndex)) != null)  
  122.             {  
  123.                   
  124.                 FeatureDefn oDefn = oLayer.GetLayerDefn();  
  125.                 int iFieldCount = oDefn.GetFieldCount();  
  126.                 // 查找字段属性  
  127.                 for (int iAttr = 0; iAttr < iFieldCount; iAttr++)  
  128.                 {  
  129.                     FieldDefn oField = oDefn.GetFieldDefn(iAttr);  
  130.                     string sFeildName = oField.GetNameRef();  
  131.  
  132.                     #region 获取属性字段  
  133.                     FieldType Ftype = oFeature.GetFieldType(sFeildName);  
  134.                     switch (Ftype)  
  135.                     {  
  136.                         case FieldType.OFTString:  
  137.                             string sFValue = oFeature.GetFieldAsString(sFeildName);  
  138.                             string sTempType = "string";  
  139.                             FeildStringList.Add(sFValue);  
  140.                             break;  
  141.                         case FieldType.OFTReal:  
  142.                             double dFValue = oFeature.GetFieldAsDouble(sFeildName);  
  143.                             sTempType = "float";  
  144.                             FeildStringList.Add(dFValue.ToString());  
  145.                             break;  
  146.                         case FieldType.OFTInteger:  
  147.                             int iFValue = oFeature.GetFieldAsInteger(sFeildName);  
  148.                             sTempType = "int";  
  149.                             FeildStringList.Add(iFValue.ToString());  
  150.                             break;  
  151.                         default:  
  152.                             //sFValue = oFeature.GetFieldAsString(ChosenFeildIndex[iFeildIndex]);  
  153.                             sTempType = "string";  
  154.                             break;  
  155.                     }  
  156.                     #endregion  
  157.                 }  
  158.             }  
  159.             return true;  
  160.         }  
  161.         /// <summary>  
  162.         /// 获取数据  
  163.         /// </summary>  
  164.         /// <returns></returns>  
  165.         public bool GetGeometry(int iIndex)  
  166.         {  
  167.             if (null == oLayer)  
  168.             {  
  169.                 return false;  
  170.             }  
  171.             int iFeatureCout = oLayer.GetFeatureCount(0);  
  172.             Feature oFeature = null;  
  173.             oFeature = oLayer.GetFeature(iIndex);  
  174.             //  Geometry  
  175.             Geometry oGeometry = oFeature.GetGeometryRef();  
  176.             wkbGeometryType oGeometryType = oGeometry.GetGeometryType();  
  177.             switch (oGeometryType)  
  178.             {  
  179.                 case wkbGeometryType.wkbPoint:  
  180.                     oGeometry.ExportToWkt(out sCoordiantes);  
  181.                     sCoordiantes = sCoordiantes.ToUpper().Replace("POINT (""").Replace(")""");  
  182.                     break;  
  183.                 case wkbGeometryType.wkbLineString:  
  184.                 case wkbGeometryType.wkbLinearRing:  
  185.                     oGeometry.ExportToWkt(out sCoordiantes);  
  186.                     sCoordiantes = sCoordiantes.ToUpper().Replace("LINESTRING (""").Replace(")""");  
  187.                     break;  
  188.                 default:  
  189.                     break;  
  190.             }  
  191.             return false;  
  192.         }  
  193.   
  194.     }//END class  
  195. }  

3. 在program.cs中调用。

[csharp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Linq;  
  4. using System.Text;  
  5. using System.IO;  
  6.   
  7. using System.Windows.Forms;  
  8.   
  9. using OSGeo.GDAL;  
  10. using OSGeo.OGR;  
  11. using OSGeo.OSR;  
  12. using System.Collections;  
  13.   
  14. namespace GdalReadSHP  
  15. {  
  16.     class Program  
  17.     {  
  18.         static void Main(string[] args)  
  19.         {     
  20.             string sShpFileName = @"D:\VRMap6_Data\line92\RainMainPipe.shp";  
  21.             ShpRead m_Shp = new ShpRead();  
  22.             // 初始化GDAL和OGR  
  23.             m_Shp.InitinalGdal();  
  24.             //   
  25.             m_Shp.GetShpLayer(sShpFileName);  
  26.             // 获取所有属性字段名称,存放在m_FeildList中  
  27.             m_Shp.GetFeilds();  
  28.               
  29.             List<string> FeildStringList = null;  
  30.             m_Shp.GetFeildContent(0, out FeildStringList);  
  31.   
  32.             // 获取某条FID的数据  
  33.             m_Shp.GetGeometry(0);  
  34.             MessageBox.Show(m_Shp.sCoordiantes);  
  35.         }  
  36.     }  
  37. }  


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


[csharp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. /// <summary>  
  2.         /// 初始化Gdal  
  3.         /// </summary>  
  4.         public void InitinalGdal()  
  5.         {  
  6.             // 为了支持中文路径  
  7.             Gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8""NO");  
  8.             // 为了使属性表字段支持中文  
  9.             Gdal.SetConfigOption("SHAPE_ENCODING""");  
  10.             Gdal.AllRegister();  
  11.             Ogr.RegisterAll();  
  12.               
  13.             oDerive = Ogr.GetDriverByName("ESRI Shapefile");  
  14.             if (oDerive == null)  
  15.             {  
  16.                 MessageBox.Show("文件不能打开,请检查");  
  17.             }  
  18.         }  

至于对SHP用C#写,目前咩有用到。

说明:

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

[csharp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. Gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8""NO");  
[csharp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. 我试了一下,貌似用YES才行。  

[csharp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. // 为了支持中文路径  
  2. Gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8""YES");  

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

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

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值