生活随笔
收集整理的這篇文章主要介紹了
C#环境下GDAL / OGR环境配置与入门
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
C#環境下GDAL.OGR環境配置與入門
- 0.概述
- 1.環境配置
- 2.類庫介紹
- 3.代碼實踐
- 4. 總結
0.概述
由于需要進行一些Shapefile文件的讀取和管理,但是ArcGIS的二次開發工具又看起來過于臃腫,所以嘗試學習GDAL完成上面的工作,由于剛剛接觸,目前對這個庫的了解還少之又少,先貼出官網,便于以后直接查看。GDAL-Java包官方文檔。
至于為什么是Java包,因為官網根本沒有C#的相關文檔啊,如下圖,因為Java跟C#確實很像,所以基本可以套用,但是有部分函數不同,用到的時候再看吧
本教程中介紹了GDAL的環境配置,OGR一些類的作用,以及用基礎理論實現的一個小程序,程序功能還不完善,但是對于學習很有幫助,界面如下(中文亂碼問題還未解決)。
1.環境配置
使用的開發軟件是Visual Studio 2015,高版本肯定也是可以的。
- 網上的描述來看安裝GDAL的方法主要有幾種,一種下載官網編譯好的DLL文件,一種自己編譯源碼,還有就是我用的最簡單的在VS的NuGet中安裝。
- 官網提供的方法如下(我用的就是第三種):
因為另外兩種比較復雜,容易出錯,所以就用最簡單的方法進行下面的教程吧。
新建一個窗體程序或控制臺程序。
找到NuGet工具,準備下載GDAL
下載GDAL和GDALNative
稍等片刻,GDAL就安裝好了,之后程序里面會多出來這么幾個東西,如下:
#安裝之后并不能直接用,需要進行注冊工作。實際上很簡單,就是在使用前加幾行代碼,代碼是這樣的,如果是控制臺程序,這段代碼放在Main函數里面,如果是窗體程序放在構造函數里面就可以了:
GdalConfiguration
.ConfigureGdal();GdalConfiguration
.ConfigureOgr();OSGeo
.GDAL
.Gdal
.AllRegister();OSGeo
.OGR
.Ogr
.RegisterAll();
另外使用之前可以可以引用這三個命名空間,用不著可以不加,
using OSGeo.OGR;
using OSGeo.OSR;
using OSGeo.GDAL;
至于上面三個命名空間的含義,相信看了下面JavaAPI的介紹就會有所了解
完成上面的步驟,就可以愉快的使用GDAL和OGR了
2.類庫介紹
由于剛剛開始學,也只做了矢量數據的處理,因此下面的介紹只針對OGR,也就是矢量數據處理。
先看Java官方的介紹,標紅的幾個是我目前接觸的:
用一個圖介紹他們的含義,相信看了這個圖,大多數人都會知道它的結構,實際上Layer跟C#的DataTable有點像,但是它多了幾何對象Geometry。
還有一個Driver沒有介紹,它是一個用來處理數據的工具,有很多種類,大概下面這些吧,目前我只接觸了標黃的兩個,好像都是數據格式。:
第一列第二列第三列
| ESRI Shapefile | GMT | GPSBabel |
| MapInfo File | SQLite | SUA |
| UK .NTF | ODBC | OpenAir |
| SDTS | PGeo | PDS |
| TIGER | MSSQLSpatial | WFS |
| S57 | PostgreSQL | HTF |
| DGN | MySQL | AeronavFAA |
| VRT | PCIDSK | Geomedia |
| REC | XPlane | EDIGEO |
| Memory | AVCBin | GFT |
| BNA | AVCE00 | SVG |
| CSV | DXF | CouchDB |
| NAS | Geoconcept | Idrisi |
| GML | GeoRSS | ARCGEN |
| GPX | GPSTrackMaker | SEGUKOOA |
| KML | VFK | SEGY |
| GeoJSON | PGDump | |
3.代碼實踐
下面搭建一個簡單的窗體程序,讀取一下shpfile文件的屬性表
在剛才搭建好的環境中使用工具箱搭建下面的界面,然后下面介紹各個函數,拼起來就是整個程序
2.文件目錄讀取,比較簡單不再過多介紹,主要是為了獲取一個路徑pFullPath
try{OpenFileDialog pOpenFileDialog
= new OpenFileDialog();pOpenFileDialog
.CheckFileExists
= true;pOpenFileDialog
.Title
= "打開Shape文件";pOpenFileDialog
.Filter
= "Shape文件(*.shp)|*.shp";pOpenFileDialog
.ShowDialog();pFullPath
= pOpenFileDialog
.FileName
;}catch { MessageBox
.Show("文件打開失敗!");return; }
數據加載,
private void loadShapfile(string filename
){DataSource ds
= Ogr
.Open(filename
, 1);textBox1
.Text
+= "圖層個數:" + ds
.GetLayerCount().ToString() + "\n";for (int i
= 0; i
< Ogr
.GetDriverCount(); i
++){}for (int i
= 0; i
< ds
.GetLayerCount(); i
++){layer
= ds
.GetLayerByIndex(i
);textBox1
.Text
+= "圖層:" + (i
+ 1).ToString() + "\n";textBox1
.Text
+= "圖層名稱:" + layer
.GetName() + "\n";textBox1
.Text
+= "圖斑個數:" + layer
.GetFeatureCount(1).ToString() + "\n";FeatureDefn pFeatureDefn
= layer
.GetLayerDefn();DataTable pFeatDT
= new DataTable(); DataRow pDataRow
= null; DataColumn pDataCol
= null; for (int j
= 0; j
< pFeatureDefn
.GetFieldCount(); j
++){pDataCol
= new DataColumn();FieldDefn fie
= pFeatureDefn
.GetFieldDefn(j
);pDataCol
.ColumnName
= chageCode(fie
.GetName());pDataCol
.DataType
= Type
.GetType("System.Object");pFeatDT
.Columns
.Add(pDataCol
);}for (int j
= 0; j
< layer
.GetFeatureCount(1); j
++){pDataRow
= pFeatDT
.NewRow();Feature feature
= layer
.GetFeature(j
);for (int k
= 0; k
< pFeatDT
.Columns
.Count
; k
++){pDataRow
[k
] = chageCode(feature
.GetFieldAsString(k
));}pFeatDT
.Rows
.Add(pDataRow
);}dataGridView1
.DataSource
= pFeatDT
;}}
數據修改
public void operate(string type
){if (type
.Equals("update", StringComparison
.InvariantCultureIgnoreCase
)){Feature feature
= layer
.GetFeature(int.Parse(numericUpDown3
.Value
.ToString()));if (feature
!= null){feature
.SetField(int.Parse(numericUpDown5
.Value
.ToString()), textBox2
.Text
);layer
.SetFeature(feature
);}elseConsole
.WriteLine("feature not found");}else if (type
.Equals("copy", StringComparison
.InvariantCultureIgnoreCase
)){Feature feature
= layer
.GetFeature(int.Parse(numericUpDown3
.Value
.ToString()));if (feature
!= null){feature
.SetFID(int.Parse(numericUpDown5
.Value
.ToString()));layer
.SetFeature(feature
);}elseConsole
.WriteLine("feature not found");}else if (type
.Equals("delete", StringComparison
.InvariantCultureIgnoreCase
)){if (layer
.TestCapability("DeleteFeature")){layer
.DeleteFeature(int.Parse(numericUpDown3
.Value
.ToString()));}elseConsole
.WriteLine("DeleteFeature not supported");}elseConsole
.WriteLine("invalid command ");}
4. 總結
本程序在C#環境下使用GDAL類庫完成了Shapefile的讀取和屬性更新的操作,這只是對于GDAL很簡單的一個嘗試,GDAL的功能十分強大,有待于繼續學習。
本程序還存在一些問題有待完善
沒有圖形界面加載漢字亂碼問題有待解決
總結
以上是生活随笔為你收集整理的C#环境下GDAL / OGR环境配置与入门的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。