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);

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章