其中有部分內容是重複的,不過不影響,非常好的資料
主要轉自http://blog.csdn.net/liminlu0314?viewmode=contents
一、簡介
1.GDAL
簡單地說,GDAL是一個操作各種柵格地理數據格式的庫。包括讀取、寫入、轉換、處理各種柵格數據格式(有些特定的格式對一些操作如寫入等不支持)。它使用了一個單一的抽象數據模型就支持了大多數的柵格數據(GIS對柵格,矢量,3D數據模型的抽象能力實在令人歎服)。當然除了柵格操作,這個庫還同時包括了操作矢量數據的另一個有名的庫ogr(ogr這個庫另外介紹),這樣這個庫就同時具備了操作柵格和矢量數據的能力。
最重要的是這個庫是跨平臺的,開源的!如今這個庫對各種數據格式的支持相當強大,幾乎所有的GIS、RS所要處理的數據格式類型都包括在內。它的主頁最後那些使用了它作爲底層數據處理的軟件列表中,不僅有GRASS、Quantum 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來讀取矢量數據。
- #include "ogrsf_frmts.h"
- int main()
- {
- //註冊所有的文件格式驅動
- OGRRegisterAll();
- //打開point.shp文件
- OGRDataSource *poDS = OGRSFDriverRegistrar::Open( "point.shp", FALSE );
- //獲取點層
- OGRLayer *poLayer = poDS->GetLayerByName( "point" );
- OGRFeature *poFeature;
- //重置該層,確保從層的開始讀取數據
- poLayer->ResetReading();
- while ( (poFeature = poLayer->GetNextFeature()) != NULL )
- {
- //獲取該層的屬性信息
- OGRFeatureDefn *poFDefn = poLayer->GetLayerDefn();
- int iField;
- for ( iField = 0; iField < poFDefn->GetFieldCount(); iField++ )
- {
- //獲取某一個字段的信息
- OGRFieldDefn *poFieldDefn = poFDefn->GetFieldDefn( iField ); if( poFieldDefn->GetType() == OFTInteger )
- printf( "%d,", poFeature->GetFieldAsInteger( iField ) );
- }
- OGRGeometry *poGeometry;
- //獲取feature
- poGeometry = poFeature->GetGeometryRef();
- //用wkbFlatten宏把wkbPoint25D類型轉換爲wkbPoint類型
- if( poGeometry != NULL && wkbFlatten(poGeometry->getGeometryType()) == wkbPoint )
- {
- OGRPoint *poPoint = (OGRPoint *) poGeometry;
- printf( "%.3f,%3.f\n", poPoint->getX(), poPoint->getY() );
- }
- else
- printf( "no point geometry\n" );
- //銷燬feature
- OGRFeature::DestroyFeature( poFeature );
- }
- //銷燬數據源,以便關閉矢量文件
- OGRDataSource::DestroyDataSource( poDS );
- }