gdal - ogr简单对象模型
ogr是gdal的一部分,主要是處理gis的矢量數據。
ogr的地理數據模型符合OGC的簡單數據對象模型標準,如下圖:
最頂層是Geometry類,下面的點(Point),曲線(Curve),表面(Surface)分別繼承于它。然后geometry與投影相關的類成關聯關系。
線串(LineString)繼承于曲線(Curve),且線串(LineString)由點(Point)聚焦而成,一對連續的點決定一個線段。
線(Line)與環線(LinearRing)同時繼承于線串(LineString)。
線(Line)是只有兩個點的線串(LineString)。
環線(LinearRing)是一種特殊的線串(LineString),如下圖所示:
a,b,c,d四個LineString中,只有c是LineRing,因為只有c是簡單(即不自交)且閉合的。
?
表面(Surface)?是二維的地理對象。
多面體表面(PolyhedralSurfaces)與多邊形(Polygon)承繼與它。
多面體表面(PolyhedralSurfaces)是由多個簡單表面(Surface)構成的。如下圖所示:
多邊形(Polygon)是一個平面表面,有一個外部邊界及0或多個內部邊界,每一個內部邊界叫做多邊形的一個洞。如下圖所示:
而三角形(Triangle)繼承于多邊形(Polygon),三角形是由3個不同的,且非共同線頂點構成的,沒有內部邊界。
多曲線(MultiCurve)是有多個Curve構成的集合。如下圖所示:
MultiCurve是一個抽象類,給子類定義了很多接口。且有以下性質:
MultiCurve當且僅當所有子Curve都是簡單(無自交)才是簡單的多曲線;兩個子曲線的邊界都是他們的交點。
MultiCurve的邊界的確定采用除2原則:A Point is in the boundary of a MultiCurve if it is in the boundaries of an odd number of elements of the MultiCurve。
a的邊界是{s1,e2},b的邊界是{s1,e1},c的邊界是空。
如果MultiCurve的子Curve都是閉合的,那它也是閉合的,此時邊界總為空。MultiCurve是定義成拓撲閉合的。
?
MultiSurface是Surface的集合,但是PolyhedralSurface并不是MultiSurface。
因為它違反了MultiSurface的規則:子Polygon的邊界相交于有限有點。
---------------------------------------------------------------------------------------
具體類的說明:
Geometry (ogr_geometry.h): geometry類(OGRGeometry等) 定義了所有矢量數據類(如下圖),一些空間分析功能,wkt,wkb的轉換,以及投影的引用。
OGRGeometryFactory類用來轉換將wkb/wkt與geometry的對象互相轉換。
OGRGeometry類中有一個OGRSpatialReference類的對象,用來定義投影的相關信息。
OGRSpatialReference(ogr_spatialref.h):)支持地理坐標系統,投影坐標系統。但縱坐標系統,地心坐標系統和復合(水平+垂直)坐標系統不支持。
坐標系統間的轉換在OGRCoordinateTransformation類中調用了proj.4的東西。
??
OGRGeometry的成員文檔:http://www.gdal.org/ogr/classOGRGeometry.html
?
OGRFeature(ogr_feature.h):OGRFeature類里描述了OGRGeometry的空間信息,屬性信息,fid,以及類的標識。
OGRFeatureDefn類里描述了一個圖層的字段信息,包括字段名稱,字段類型,字段屬性。
fid是空間數據的主鍵,定義成長整型,gml內是string型,oracle里的rowid是大于4bytes的.
OGRFeatureDefn::GetGeomType()).返回空間數據的類型(OGRwkbGeometryType),wkbUnknown的話則任意類型都可以。
?
OGRLayer (ogrsf_frmts.h):表示數據源中的一層空間數據,可以認為OGRLayer是從底層數據源讀取數據的一個中繼。
OGRLayer::GetNextFeature()可以隨機或順序讀取?.
?
一個OGRLayer和一個OGRFeature是一一對應的。
?
OGRDataSource (ogrsf_frmts.h):?一個OGRDataSource對象表示一個文件或數據庫,含有多個OGRLayer對象。
?
?
?
OGRSFDriver(ogrsf_frmts.h): OGRSFDriver翻譯各種矢量數據類型,是打開各種數據對象的驅動。
所有的數據驅動在?OGRSFDriverRegistrar類中管理。
?
-----------------------------------------------------------
讀取一個shp的步驟
? 1,
????? //注冊數據驅動--ALL所有格式
OGRRegisterAll();?2,
????? //打開數據源
?
OGRDataSource *poDS = OGRSFDriverRegistrar::Open("E:\\exercise\\qt\\qmapcui-build-desktop\\debug\\ZW0817P.shp"); ? ?3,???? //獲取圖層
??? OGRLayer *poLayer = poDS->GetLayer(0);
? 4,
?? //獲取數據
?? OGRFeature *poFeature = poLayer->GetFieldAsString(0);
?
5,通過poFeature的各種函數就可以讀出數據了。
?
6,關閉數據源。
OGRDataSource::DestroyDataSource(poDS);
轉載于:https://www.cnblogs.com/zhanglibo0626/archive/2011/04/01/2002743.html
總結
以上是生活随笔為你收集整理的gdal - ogr简单对象模型的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 高性能网站建设指南
- 下一篇: 【转载】用Snort巧妙检测SQL注入和