GDAL綜合整理--1:簡介

在網上看到這篇文章寫得非常全面,而且是中文的,就轉過來了,學習一下
其中有部分內容是重複的,不過不影響,非常好的資料

主要轉自http://blog.csdn.net/liminlu0314?viewmode=contents

一、簡介

1.GDAL

簡單地說,GDAL是一個操作各種柵格地理數據格式的庫。包括讀取、寫入、轉換、處理各種柵格數據格式(有些特定的格式對一些操作如寫入等不支持)。它使用了一個單一的抽象數據模型就支持了大多數的柵格數據(GIS對柵格,矢量,3D數據模型的抽象能力實在令人歎服)。當然除了柵格操作,這個庫還同時包括了操作矢量數據的另一個有名的庫ogr(ogr這個庫另外介紹),這樣這個庫就同時具備了操作柵格和矢量數據的能力。

最重要的是這個庫是跨平臺的,開源的!如今這個庫對各種數據格式的支持相當強大,幾乎所有的GIS、RS所要處理的數據格式類型都包括在內。它的主頁最後那些使用了它作爲底層數據處理的軟件列表中,不僅有GRASSQuantum GIS (QGIS),更有Google Earth

學習這個庫是十分有必要的。該庫在C/C++/python/ruby/VB/java/C#(這個暫時不完全支持)下都能用,而且都一樣用。

 

GDAL(Geospatial Data Abstraction Library)是一個在X/MIT許可協議下的開源柵格空間數據轉換庫。它利用抽象數據模型來表達所支持的各種文件格式。它還有一系列命令行工具來進行數據轉換和處理。

 

2.Ogr

OGR是GDAL項目的一個分支,功能與GDAL類似,只不過它提供對矢量數據的支持。   有很多著名的GIS類產品都使用了GDAL/OGR庫,包括ESRI的ArgGIS 9.2,Google Earth和跨平臺的GRASS GIS系統。  

OGR提供對矢量數據格式的讀寫支持,它所支持的文件格式包括:ESRI Shapefiles, S-57, SDTS, PostGIS,Oracle Spatial, Mapinfo mid/mif , Mapinfo TAB。

1)OGR體系結構

OGR包括如下幾部分:

Geometry:類Geometry (包括OGRGeometry等類)封裝了OpenGIS的矢量數據模型,並提供了一些幾何操作,WKB(Well Knows Binary)和WKT(Well Known Text)格式之間的相互轉換,以及空間參考系統(投影)。

Spatial Reference:類OGRSpatialReference封裝了投影和基準面的定義。

Feature:類OGRFeature封裝了一個完整feature的定義,一個完整的feature包括一個geometry和geometry的一系列屬性。

Feature Definition:類OGRFeatureDefn裏面封裝了feature的屬性,類型、名稱及其默認的空間參考系統等。一個OGRFeatureDefn對象通常與一個層(layer)對應。

Layer:類OGRLayer是一個抽象基類,表示數據源類OGRDataSource裏面的一層要素(feature)。

Data Source:類OGRDataSource是一個抽象基類,表示含有OGRLayer對象的一個文件或一個數據庫。

Drivers:類OGRSFDriver對應於每一個所支持的矢量文件格式。類OGRSFDriver由類OGRSFDriverRegistrar來註冊和管理。

 

2) OGR的Geometry模型

 

OGR的Geometry模型是建立在OpenGIS的簡單要素數據模型之上的。如下圖所示:

 

 

圖-OGR的Geometry模型關係圖

 

OpenGIS的簡單要素數據模型,其關係圖如下所示:

 

圖-OpenGIS的簡單要素數據模型

 

由上面兩圖的對比,可以清楚的看到,OGR的Geometry模型是嚴格遵循OpenGIS的簡單要素數據規範的。OGR的Geometry模型不僅在繼承體系上與OpenGIS的簡單要素數據模型一致,在函數接口上也向其靠攏,從基本的獲取Geometry對象信息的方法如Dimension( )、GeometryType ( )、SRID ( )、Envelope( )、AsText( )、Boundary( )等到判定空間未知關係的方法如Equals(anotherGeometry:Geometry)、Disjoint(anotherGeometry:Geometry)、Intersects(anotherGeometry:Geometry)、Touches(anotherGeometry:Geometry)等都是符合其標準的。

3)OGR的API使用範例

以下C++示例代碼展示了使用OGR的API來讀取矢量數據。

 
  1. #include "ogrsf_frmts.h"  
  2. int main()  
  3. {      
  4. //註冊所有的文件格式驅動      
  5. OGRRegisterAll();      
  6. //打開point.shp文件      
  7. OGRDataSource *poDS = OGRSFDriverRegistrar::Open( "point.shp", FALSE );      
  8. //獲取點層      
  9. OGRLayer *poLayer = poDS->GetLayerByName( "point" );      
  10. OGRFeature *poFeature;      
  11. //重置該層,確保從層的開始讀取數據      
  12. poLayer->ResetReading();      
  13. while ( (poFeature = poLayer->GetNextFeature()) != NULL )      
  14. {          
  15. //獲取該層的屬性信息          
  16. OGRFeatureDefn *poFDefn = poLayer->GetLayerDefn();          
  17. int iField;          
  18. for ( iField = 0; iField < poFDefn->GetFieldCount(); iField++ )   
  19. {       
  20. //獲取某一個字段的信息              
  21. OGRFieldDefn *poFieldDefn = poFDefn->GetFieldDefn( iField );            if( poFieldDefn->GetType() == OFTInteger )                  
  22. printf( "%d,", poFeature->GetFieldAsInteger( iField ) );          
  23. }          
  24. OGRGeometry *poGeometry;          
  25. //獲取feature          
  26. poGeometry = poFeature->GetGeometryRef();   
  27. //用wkbFlatten宏把wkbPoint25D類型轉換爲wkbPoint類型          
  28. if( poGeometry != NULL             && wkbFlatten(poGeometry->getGeometryType()) == wkbPoint )     
  29. {              
  30. OGRPoint *poPoint = (OGRPoint *) poGeometry;              
  31. printf( "%.3f,%3.f\n", poPoint->getX(), poPoint->getY() );          
  32. }          
  33. else              
  34. printf( "no point geometry\n" );          
  35. //銷燬feature          
  36. OGRFeature::DestroyFeature( poFeature );      
  37. }      
  38. //銷燬數據源,以便關閉矢量文件      
  39. OGRDataSource::DestroyDataSource( poDS );  
  40. }  


利用GDAL/OGR庫,可以提供對矢量和柵格文件數據的支持。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章