1. 程式人生 > >OGR 數據模型

OGR 數據模型

3.1.1 ttr index tro z值 模型 特定 destory cti

2013年10月10日

2015年3月30日修正坐標參考模型

1 OGR幾何對象模型OGRGeometry

1.1 Geometry

幾何圖形,最基本的地圖圖形。註意:包含空間參考。

其它所有的地圖圖形都是由本類派生出來的。

包含了通用的屬性和方法。

註意:空間操作的部分需要GEOS支持,如果沒有GEOS,則返回FALSE。

1.1.1 幾何屬性

getGeometryType():獲取幾何類型。

getGeometryName():獲取幾何對象的名稱。

1.1.2 維度操作

getDimension():獲取圖形維度。

getCoordinateDimension():獲取坐標系統維度。

setCoordinateDimension():設置坐標系統維度。

flattenTo2D():將3D圖形轉換為2D(Z值全部設置為0)。

1.1.3 整體形狀操作

isEmpty():判斷空形狀。

isSimple():判斷簡單形狀。

isValid():判斷有效性。

isRing():判斷是否為環。如果沒有點,返回TRUE;否則返回FALSE。

empty():置空圖形。

clone():復制圖形。

getEnvelop():獲取外接矩形。

getBoundary():

closeRings():強制封閉環。

segmentize():線段分化,將長線段分為短線段。

swapXY():交換XY。

1.1.4 導入導出

wkbSize():計算WKB格式所需要的字節數。

importFromWkb():導入WKB。

exportToWkb():導出為WKB。

importFromWkt():導入WKT。

exportToWkt():導出為WKT。

dumpReadable():將WKT格式寫入指定文件。

exportToGML():導出為GML。

exportToKML():導出為KML。

exportToJson():導出為JSON。

exportToGEOS():導出為GEOS格式。

1.1.5 空間參考

assignSpatialReference():設置空間參考。

getSpatialReference():獲取空間參考。

transform():轉換空間參考,指定轉換參數。

transformTo():轉換空間參考,轉換為新的空間參考,需要原有空間參考。

1.1.6 空間分析

1.1.6.1 判斷空間關系

Intersects():判斷相交。

Intersect():與Intersects()相同。

Equals():判斷相同。

Equal():與Equals()相同。

Disjoint():判斷不相交。

Touchs():判斷邊界相交。

Crosses():判斷通過性。

Within():判斷是否在內部。與Contains相反。

Contains():判斷包含。與Within相反。

Overlaps():判斷疊叠性,不能相同。

1.1.6.2 計算空間關系

Boundary():計算外部形狀。

getBoundary():由Boundary()代替,不推薦使用。

Distance():計算距離。

ConvexHull():計算最小凸外多邊形。

Buffer():計算緩沖區。

Intersection():計算相交部分。

Union():計算相並部分。

UnionCascade():串聯計算相並部分。

Difference():計算相差部分。

SymDifference():計算交集的補集。

SymmetricDifference():由SymDifference()代替,不推薦使用。

Centroid():計算重心。

Simplify():簡化圖形。

SimplifyPreserveTopology():簡化圖形的同時保留拓撲特性。

Polygonize():多邊形化。

1.1.7 示例

voidCidentifyView::OnGeosSelect()

{

// TODO: 在此添加命令處理程序代碼

char *filePath = "D:\\Test\\SMO\\data\\SHP";

OGRRegisterAll();

OGRDataSource *pODS =OGRSFDriverRegistrar::Open(filePath,TRUE);

OGRLayer *pLayerCity =pODS->GetLayerByName("City_RR");

OGRFeature *pFeature = pLayerCity->GetFeature(0);

OGRGeometry *pGeometry = pFeature->GetGeometryRef();

OGRPoint pt;

pt.setX(87);

pt.setY(29);

OGRBoolean bInterset = pGeometry->Intersects(&pt);

if(bInterset == TRUE)

{

OGRGeometry *pIntersetion =pGeometry->Intersection(&pt);

OGRPoint *pPtIntersection = (OGRPoint *)pIntersetion;

int a = 0;

}

}

1.2 點

1.2.1 OGRPoint

點類型,2D或3D。

由於2D和3D是相對應的,使用wkbFlatten()可以將3D轉化為2D(z值置空)。

GetX()/SetX()

GetY()/SetY()

GetZ()/SetZ()

1.3 線

1.3.1 OGRCurve

線類型的抽象基類型。

isClosed():判斷封閉性。

get_Length():獲取長度。

StartPoint():獲取起始點。

EndPoint():獲取終止點。

Value():獲取指定距離的點。

1.3.2 OGRLineString

折線,由Vertex(節點)組成。

addPoint():添加節點。

getPoint():獲取節點。

setPoints():設置所有節點。

getPoints():獲取所有節點。

setNumPoints():設置節點數目。

addSubLineString():添加子線段。

1.3.2.1 示例

voidCidentifyView::OnGeometryLinestring()

{

// TODO: 在此添加命令處理程序代碼

char *filePath = "D:\\Test\\SMO\\data\\SHP";

OGRRegisterAll();

OGRDataSource *pODS =OGRSFDriverRegistrar::Open(filePath,TRUE);

OGRLayer *pLayerCity =pODS->GetLayerByName("City_RR");

OGRFeature *pFeature = pLayerCity->GetFeature(0);

OGRGeometry *pGeometry = pFeature->GetGeometryRef();

//linestring

OGRLineString lineString;

lineString.addPoint(84,27);

lineString.addPoint(88,31);

OGRBoolean bTouch =pGeometry->Touches(&lineString);//false

OGRBoolean bCross =pGeometry->Crosses(&lineString);//true

short nNum = lineString.getNumPoints();

OGRLineString subLineString;

subLineString.addPoint(90,31);

subLineString.addPoint(91,31);

lineString.addSubLineString(&subLineString);

OGRPoint pt;

lineString.getPoint(3,&pt);//(91,31)

}

1.3.3 OGRLinearRing

環-封閉的折線。

isClockwise():判斷順時針。

CloseRings():強制封閉環。

get_Area():獲取環的面積。

isPointInRing():判斷點是否在環的內部。

1.3.3.1 示例

voidCidentifyView::OnGeometryLinearRing()

{

// TODO: 在此添加命令處理程序代碼

char *filePath = "D:\\Test\\SMO\\data\\SHP";

OGRRegisterAll();

OGRDataSource *pODS = OGRSFDriverRegistrar::Open(filePath,TRUE);

OGRLayer *pLayerCity =pODS->GetLayerByName("City_RR");

OGRFeature *pFeature = pLayerCity->GetFeature(0);

OGRGeometry *pGeometry = pFeature->GetGeometryRef();

//linering

OGRLinearRing linearRing;

linearRing.addPoint(84,27);

linearRing.addPoint(88,31);

linearRing.addPoint(88,27);

linearRing.closeRings();//num = 4

double dArea = linearRing.get_Area();//8.0

OGRBoolean bClockwise = linearRing.isClockwise();

OGRPoint pt(87,28);

OGRBoolean bWithin =linearRing.isPointInRing(&pt,TRUE);//true

}

1.4 面

1.4.1 OGRSurface

面抽象基類。

get_Area():返回面積。

PointOnSurface():返回表面的一個點(確保在面上)。

1.4.2 OGRPolygon

多邊形。由環組成。可以是復雜的多邊形(包含島)。

addRing():添加環,如果多邊形為空,則為外環,如果不為空,則為內環(島)。將傳入的環復制一個環,加入多邊形中。

addRingDirectly():添加環。功能同addRing(),直接使用傳入的環,不再構建。

closeRings():強制封閉環。

getExteriorRing():獲取外環。

getInteriorRing():獲取某個內環。

getNumInteriorRing():獲取內環數目。

1.4.2.1 示例

voidCidentifyView::OnGeometryPolygon()

{

// TODO: 在此添加命令處理程序代碼

char *filePath = "D:\\Test\\SMO\\data\\SHP";

OGRRegisterAll();

OGRDataSource *pODS =OGRSFDriverRegistrar::Open(filePath,TRUE);

OGRLayer *pLayerCity =pODS->GetLayerByName("City_RR");

OGRFeature *pFeature = pLayerCity->GetFeature(0);

OGRGeometry *pGeometry = pFeature->GetGeometryRef();

//polygon

OGRLinearRing ringOut;

ringOut.addPoint(80,30);

ringOut.addPoint(80,40);

ringOut.addPoint(90,40);

ringOut.addPoint(90,30);

ringOut.closeRings();

OGRLinearRing ringIn0;

ringIn0.addPoint(82,32);

ringIn0.addPoint(82,38);

ringIn0.addPoint(88,38);

ringIn0.addPoint(88,32);

ringIn0.closeRings();

OGRPolygon polygon;

polygon.addRing(&ringOut);

polygon.addRing(&ringIn0);

polygon.addRingDirectly(&ringIn0);

int nNum = polygon.getNumInteriorRings();

const OGRLinearRing *ringIn = polygon.getInteriorRing(0);

OGRLinearRing *prIn0 = (OGRLinearRing *)ringIn->clone();

OGRPoint pt0;

prIn0->getPoint(0,&pt0);

OGRLinearRing ringOut0 = polygon.getExteriorRing();

polygon.closeRings();

//change,addRing()與addRingDirectly()區別

ringIn0.addPoint(108,78);

ringIn0.getPoint(5,&pt0);//(108,78)

ringIn->getPoint(5,&pt0);//隨機值

const OGRLinearRing *ringIn1 = polygon.getInteriorRing(1);

ringIn1->getPoint(5,&pt0);//(108,78)

}

1.5 幾何對象集合

1.5.1 OGRGeometryCollection

幾何對象集合。

addGeometry():添加幾何對象(特定派生類只能添加特定的幾何對象)。復制。

addGeometryDirectly():直接添加幾何對象。不再復制。

removeGeometry():移除幾何對象。

getNumGeometries():獲取集合中對象的數目。

getGeometryRef():獲取幾何對象。是集合中的某一個對象。

1.5.2 OGRMultiPoint

1.5.3 OGRMultiLineString

1.5.4 OGRMultiPolygon

1.5.5 示例

voidCidentifyView::OnGeometryCollection()

{

// TODO: 在此添加命令處理程序代碼

char *filePath = "D:\\Test\\SMO\\data\\SHP";

OGRRegisterAll();

OGRDataSource *pODS =OGRSFDriverRegistrar::Open(filePath,TRUE);

OGRLayer *pLayerCity =pODS->GetLayerByName("City_RR");

OGRFeature *pFeature = pLayerCity->GetFeature(0);

OGRGeometry *pGeometry = pFeature->GetGeometryRef();

OGRGeometryCollection colGeometry;

colGeometry.addGeometry(pGeometry);

colGeometry.addGeometry(pGeometry);

int iNum = colGeometry.getNumGeometries();

OGRPolygon *pGeo = (OGRPolygon *)colGeometry.getGeometryRef(0);

OGRPolygon *pGeo1 = (OGRPolygon*)colGeometry.getGeometryRef(1);

colGeometry.removeGeometry(1,FALSE);//如果這裏使用默認的TRUE刪除,則pGeo1所占用的內存會被釋放,再次調用會出錯。

OGREnvelope env;

pGeo->getEnvelope(&env);

pGeo1->getEnvelope(&env);//如果刪除時釋放,則此句會報錯。

OGRPoint pt0;

pGeo1->getExteriorRing()->getPoint(0,&pt0);

OGRMultiPolygon colPoly;

colPoly.addGeometry(pGeometry);

OGRErr errAdd = colPoly.addGeometry(&pt0);//類型不一致,無法添加

errAdd = colPoly.addGeometry(&colGeometry);//類型不一致,無法添加

errAdd = colGeometry.addGeometry(&colPoly);//可以添加

OGRMultiPoint colPt;

colPt.addGeometry(&pt0);

colPt.addGeometry(&pt0);

errAdd = colGeometry.addGeometry(&colPt);//可以添加

errAdd = colGeometry.addGeometry(&pt0);//可以添加

OGRMultiPoint colPt2;

colPt2.addGeometry(&pt0);

colPt2.addGeometry(&pt0);

errAdd = colPt.addGeometry(&colPt2);//類型不一致,無法添加

if(errAdd != OGRERR_NONE)

{

TRACE(_T("OGRERR!\n"));

}

}

2 OGR空間參考模型:OGRSpatialReference、OGRCoordinateTransformation

目的:設置投影和大地參考(DATUM)。

方法:

2.1 坐標系統:OGRSpatialReference

2.1.1 地理坐標系統:用於描地球的球面模型。包含DATUM。

1) 設置地理坐標系統:SetGeogCS()。註意要使用標準的DATUM名稱,其它參數用於設置為用戶可以識別的名稱。一般情況下,不需要自己定義坐標系統,而是使用一些已經定義好的坐標系統。OGR可以使用部分內置的坐標系統。

2) 設置命名或編號坐標系統:SetWellknownGeogsCS()。

3) WKT格式交換:exportToWKT()/importFromWKT()。返回值要以CPLFree()或OGRFree()釋放。

4) 示例:設置坐標系統,如果無指定值,則使用WGS84

QByteArray baCrs("WGS84");

if(!strTargetCRS.isEmpty ()){

baCrs = strTargetCRS.toLocal8Bit ();

}

OGRSpatialReference oSRS;

oSRS.SetWellKnownGeogCS(baCrs);

char *pszDstWKT = NULL;

oSRS.exportToWkt( &pszDstWKT );

CPLErr err = pDstDst->SetProjection(pszDstWKT);

CPLFree(pszDstWKT);

if(CE_None!=err){

qDebug()<<"destinationdataset crs set failed."<<baCrs;

}

2.1.2 投影坐標系統:將球面坐標投影到平面上,以平面的形式描述地球。

依賴地理坐標系統。因此需要設置地理坐標系統。

註意:順序設置投影系統。1.創建投影。2.設置相關地理坐標。3.設置投影。

1) 設置命名或編號坐標系統:importFromEPSG(),importFromProj4()等。

2) 設置常用投影坐標系統:SetUTM()/SetTM()/SetLC()。

3) 自定義投影系統名稱(僅命名):SetProjCS()。

2.1.3 坐標參數查詢與設置

2.1.3.1 坐標系統類型

isProected():判斷是否為投影坐標系統。

isGeographic():判斷是否為地理坐標系統。

2.1.3.2 地球橢球體模型參數

GetSemiMajor():長半軸。

GetSemiMinor():短半軸。

GetInvFlattening():扁率的倒數。

2.1.3.3 具體參數值

GetAttrValue():參數值。

GetProjParm():投影參數值,可以使用預定義的宏進行獲取。

GetLinearUnits():類型,與M的轉換單位。

2.1.4 示例

voidCidentifyView::OnSrsGeogcs()

{

// TODO: 在此添加命令處理程序代碼

OGRSpatialReference srs;

srs.SetGeogCS("mySrs","WGS_1984","myEllipsoid",SRS_WGS84_SEMIMAJOR,SRS_WGS84_INVFLATTENING,"Greenwich",0.0,"degree",atof(SRS_UA_DEGREE_CONV));

char *pszWKT = NULL;

srs.exportToWkt(&pszWKT);

srs.SetWellKnownGeogCS("EPSG:4326");

srs.exportToWkt(&pszWKT);

OGRSpatialReference srsProj;

srsProj.SetProjCS("myProject");

srsProj.SetWellKnownGeogCS("EPSG:4326");

srsProj.SetUTM(17,TRUE);

char *pszPROJ = NULL;

srsProj.exportToWkt(&pszPROJ);

int iPrj = srsProj.IsProjected();

int iGeo = srsProj.IsGeographic();

double dMajor = srsProj.GetSemiMajor();

double dMinor = srsProj.GetSemiMinor();

double dInvF = srsProj.GetInvFlattening();

double dUnits = srsProj.GetLinearUnits();

const char *pName =srsProj.GetAttrValue("PROJECTION");

double dMeridian = srsProj.GetProjParm(SRS_PP_CENTRAL_MERIDIAN);

CPLFree(pszWKT);

CPLFree(pszPROJ);

}

2.2 坐標系統轉換:OGRCoordinateTransformation

目標:將點進行坐標系統轉換。

方法:

創建坐標轉換對象:OGRCreateCoordinateTransformation()。

轉換坐標系統:OGRCoordinateTransformation::Transform()。

註意:如果使用了系統未定義的DATUM,有可能導致錯誤,使用時註意檢查。

參考:http://www.gdal.org/osr_tutorial.html

2.2.1 示例

voidCidentifyView::OnSrsTransform()

{

// TODO: 在此添加命令處理程序代碼

//target

OGRSpatialReference srsProj;

srsProj.SetProjCS("BJUTM");

srsProj.SetWellKnownGeogCS("EPSG:4326");

srsProj.SetUTM(50,TRUE);

char *pszPROJ = NULL;

srsProj.exportToWkt(&pszPROJ);

//source

OGRSpatialReference srsGeog;

srsGeog.SetWellKnownGeogCS("EPSG:4326");

//transfrom

OGRCoordinateTransformation *pCT =OGRCreateCoordinateTransformation(&srsGeog,&srsProj);

double x = 88,y=30;

pCT->Transform(1,&x,&y);//x=-2356049.0001576482,y=3701005.1820355225

}

3 OGR地圖要素模型OGRFeature

要素,包含屬性和地圖幾何圖元。一般用於操作空間和屬性的聯動。

主要由屬性OGRField、OGRFeatureDefn和幾何圖元OGRGeometry組成。由nFID唯一標識。

3.1 OGRFeatureDefn

屬性表定義類。

用於存取屬性表的結構,以及幾何圖形的元數據。

GetName():獲取屬性表結構名稱,默認是圖層名稱。

GetFieldCount():獲取列數目。

GetFieldDefn():獲取列定義。

GetFieldIndex():獲取列索引。

AddFieldDefn():添加列定義。

DeleteFiledDefn():刪除列定義。

RecorderFieldDefn():保存屬性表定義。只有無相關OGRFeature存在時才可使用,如果有,則使用OGR_L_RecorderFields()。

GetGeomType():獲取幾何圖形類型。

SetGeomType():設置幾何圖形類型。

Clone():復制。

Release():釋放。

IsGeometryIgnored():判斷是否可以忽略幾何圖形。

SetGeometryIgnored():設置是否可以忽略幾何圖形。

IsStyleIgnored():判斷是否可以忽略樣式。

SetStyleIgnored():設置是否可以忽略樣式。

IsSame():判斷相同。

3.2 OGRFieldDef

用於定義字段的屬性。包含精度、類型、名稱等。

SetName():設置名稱。

GetNameRef():獲取名稱。

GetType():讀取類型。

SetType():設置類型。

GetJustify():讀取對齊方式。

SetJustify():設置對齊方式。

GetWidth()/SetWidth():存取寬度。

GetPricision()/SetPricision():存取精度。

Set():一次性設置。

SetDefault():設置默認值。

GetDefault():讀取默認值。

IsIgnored():判斷是否可忽略。

SetIgnored():設置是否可忽略。

IsSame():判斷相同。

3.3 OGRField

元素。是一個集合。用於標識要素內部某一個元素的值。

3.4 OGRStyleTable等樣式類

主要用於管理樣式。

OGRSytleTable:樣式表類,樣式中的所有具體內容。

OGRStyleMgr:樣式管理器,使用時要先用樣式表生成此類。

OGRStyleTool:由樣式管理器進行管理,用於操作具體的樣式。

OGRStylePen:具體畫筆樣式。(OGRStyleTool派生)

OGRStyleBrush:具體的畫刷樣式。(OGRStyleTool派生)

OGRStyleLabel:具體的標簽樣式。(OGRStyleTool派生)

OGRStyleSymbol:具體的符號樣式。(OGRStyleTool派生)

3.4.1 參考

http://blog.csdn.net/zhouschina/article/details/8668667

3.5 OGRFeature

3.5.1 屬性操作

3.5.1.1 表結構操作

GetDefnRef():獲取元素的表結構定義OGRFeatureDefn。

DumpReadable():導出為TXT文件。

setFrom():從另一個Feature導入屬性和幾何元素。

setFieldsFrom():從另一個Feature導入屬性數據。

RemapFields():重新排列屬性。

3.5.1.2 值操作

GetFieldCount():數目。

GetFieldIndex():索引號。

isFiledSet():判斷是否已經設置。

UnsetField():置空。

GetRawFiled():獲取OGRField類型的值。

GetFiled*():按照不同的類型獲取值。

SetFiled():設置屬性值。

GetFID()/SetFID():FID存取。

3.5.2 幾何操作

SetGeometry():設置幾何圖形。

SetGeometryDirectly():直接添加。與StealGeometry()相反。

StealGeometry():與SetGeometryDirectly()相反,直接取出。

GetGeometryRef():

3.5.3 元素操作

Clone():復制。

Equal():判斷相同。

CreateFeature():創建,static。

DestroyFeature():銷毀,static。在GetNextFeature()等 函數中會返回一個復制對象,供調用者使用,使用完成之後應釋放。但是由於Windows的DLL機制,DLL與主程序之間使用不同的堆,使用主程序釋放DLL堆內容會報錯,所有會才此函數來保證兼容性。

3.5.4 樣式操作

GetStyleString():讀取樣式字符串。

SetStyleString():設置樣式字符串。

SetStyleStringDirectly():直接設置。

GetStyleTable():讀取樣式表。

SetStyleTable():設置樣式表。

SetStyleTableDirectly():直接設置樣式表。

3.5.5 中文漢字亂碼的問題解決

3.5.5.1 原因

GDAL/OGR默認使用UTF-8進行編碼,Shape默認使用ANSI(可以設置為UTF-8,但不能識別UNICODE)。讀入Shape時,只能以ANSI方式讀入。如果Shape是以UTF-8類型編碼的話,會造成亂碼。

3.5.5.2 解決方式

1) 設置新圖層為UTF-8編碼方式

這一步很重要,因為默認會以ANSI方式編碼。設置之後,會將ANSI類型的編碼,轉換為UTF-8格式的編碼。所以,如果原始數據是UTF-8類型的編碼,要先轉換為ANSI格式編碼,再保存。

CPLSetConfigOption("SHAPE_ENCODING","");

2) 以ANSI讀入原始數據(只能讀入為ANSI,但編碼方式取決於原始數據)。

3) 轉換為Unicode

如果原圖層為UTF-8編碼的話,必須使用UTF-8編碼格式讀入並轉換為Unicode,如果原圖層為ANSI編碼格式,則以ANSI編碼格式轉換為Unicode。

這一步,將原始數據進行還原。

4) 將UNICODE轉換為ANSI編碼格式,存入元素之中。

這一步,將數據轉換為OGR能夠正確設置的編碼格式(只能識別ANSI)。

3.5.5.3 參考

http://blog.csdn.net/liminlu0314/article/details/7330036

3.5.5.4 示例

//設置圖層的編碼格式

CPLSetConfigOption("SHAPE_ENCODING","");

OGRLayer *pOGRLayerDes =pDSDes->CopyLayer(pOGRLayerSrc,pDesLayerName);

//設置元素的編碼格式

voidCFeature::translateAttributeToUTF8()

{

OGRFeatureDefn *pFeatureDefn = m_pFeature->GetDefnRef();

int nFieldCount = pFeatureDefn->GetFieldCount();

for(int i=0;i<nFieldCount;i++)

{

OGRFieldDefn *pFieldDefn = NULL;

pFieldDefn = pFeatureDefn->GetFieldDefn(i);

OGRFieldType eFieldType = pFieldDefn->GetType();

//漢字處理

if(eFieldType == OFTString)

{

IConvertCString *pConvertCString = NULL;

getConvertCString(&pConvertCString);

//讀取元素

const char *csFieldValue = m_pFeature->GetFieldAsString(i);

//以UTF8格式轉化為寬字符

CString strFieldValue;

pConvertCString->fromUTF8(csFieldValue,strFieldValue);

//轉化為ANSI

char *pStrANSI;

pConvertCString->toChar(strFieldValue,pStrANSI);

m_pFeature->SetField(i,pStrANSI);

//release

delete pStrANSI;

pStrANSI = NULL;

delete pConvertCString;

pConvertCString = NULL;

}

else//直接Copy

{

OGRField *pValue = m_pFeature->GetRawFieldRef(i);

m_pFeature->SetField(i,pValue);

}

}

}

3.6 示例

voidCidentifyView::OnFeatureField()

{

// TODO: 在此添加命令處理程序代碼

char *filePath = "D:\\Test\\SMO\\data\\SHP";

OGRRegisterAll();

OGRDataSource *pODS =OGRSFDriverRegistrar::Open(filePath,TRUE);

OGRLayer *pLayerCity =pODS->GetLayerByName("City_RR");

OGRFeature *pFeature = pLayerCity->GetFeature(0);

//feature def

OGRFeatureDefn *pDef = pFeature->GetDefnRef();

const char * pDefName = pDef->GetName();

int iFieldCount = pDef->GetFieldCount();

int iDefIndex = pDef->GetFieldIndex("NAME");

OGRwkbGeometryType tType = pDef->GetGeomType();

//field def

OGRFieldDefn *pFieldDef = pDef->GetFieldDefn(iDefIndex);

int iWidth = pFieldDef->GetWidth();

int iPresion = pFieldDef->GetPrecision();

const OGRField *pFieldDefault = pFieldDef->GetDefaultRef();

OGRFieldType fieldType = pFieldDef->GetType();

const char *pFieldNam = pFieldDef->GetNameRef();

OGRJustification jstf = pFieldDef->GetJustify();

int iFieldIndex = pFeature->GetFieldIndex("NAME");

OGRField *pField = pFeature->GetRawFieldRef(iFieldIndex);

int iSet = pFeature->IsFieldSet(iFieldIndex);

pFeature->UnsetField(iFieldIndex);

int iCount = pFeature->GetFieldCount();

pFeature->SetField(iFieldIndex,"MyString");

const char *pFieldString =pFeature->GetFieldAsString(iFieldIndex);

pFeature->SetFID(8877L);

long lFID = pFeature->GetFID();

//style

const char *pStyle = pFeature->GetStyleString();

OGRStyleTable *pStyleTable = new OGRStyleTable;

OGRStyleMgr *pMgr = new OGRStyleMgr(pStyleTable);

pMgr->AddPart("PEN(w:10)");

//GBool bAdd =pMgr->AddStyle("BRUSH","(w:10)");

OGRStylePen *pPenStyle =(OGRStylePen *)pMgr->GetPart(0);

GBool bAdd =pMgr->AddStyle("PEN","(w:10)");

OGRStyleLabel styleLabel;

styleLabel.SetAngle(10);

pMgr->AddPart(&styleLabel);

int iStyleCount = pMgr->GetPartCount();

OGRStyleTool *pTool = pMgr->GetPart(0);

OGRStyleTool *pTool1 = pMgr->GetPart(1);

const char * pStrBrush =pMgr->GetStyleByName("Pen");

OGRStyleTable *pTableNow = pMgr->GetDataSetStyleTable();

OGRFeature *pFeatureNew = OGRFeature::CreateFeature(pDef);

OGRPoint pt(88,30);

pFeatureNew->SetGeometry(&pt);

pFeatureNew->SetField(0,"963");

}

4 OGR地圖組織模型OGRLayer/OGRDataSource/OGRDriver

4.1 OGRLayer

相同元素的集合。

註意,在編譯元素的時候,一定要在Open時,將bUpdate開關設置為TRUE。

4.1.1 過濾查詢

GetSpatialFilter()/SetSpatialFilter():讀取/設置空間過濾幾何對象。再下次查詢時會進行空間過濾。

SetSpatialFilterRect():設置空間過濾為指定的矩形。當年版本的OGR有BUG,只能使用過濾圖形的外接矩形與圖層中圖形的外接矩形進行分析。使用OGRGeometry的Intersects()函數,在GEOS庫下可以進行具體操作。

SetAttributeFilter():設置屬性過濾條件。格式為SQL Where:NAME = ‘dd’。

註意:OGR使用SQLITE進行查詢,SQLITE使用UTF8格式,所以查詢的時候應該轉化為UTF8格式,雖然看上去是亂碼,但是SQLITE可以識別。查詢結果是正確的。

4.1.2 元素讀取

ResetReading():重置讀取。

GetNextFeature():獲取下個元素。

SetNextByIndex():獲取指定的元素。

GetFeature():按FID讀取元素。註意,讀取元素後,生成元素副本(使用完成後一定要釋放),並不是當前圖層要元素,如果要進行修改,則應該將修改後的內容使用SetFeature()設置原有元素(無法生成新元素,只能修改原有元素,使用CreateFeature()生成新元素)。

SetFeature():設置元素。

CreateFeature():生成元素,如果要生成新的元素,請使用此函數。

DeleteFeature():刪除元素。

GetFeatureCount():獲取元素數量。

GetFeaturesRead():

4.1.3 圖層屬性

GetName():圖層名稱。

GetGeomType():幾何類型。

GetLayerDefn():屬性表定義。

GetSpatialRef():空間參考。註意,這裏返回的空間參考OGRSpatialReference*是原圖層的中的指針,只讀,不可釋放。

GetExtent():外接多邊形。可以使用TRUE強制計算圖層的MBR(minimum bounding rectangle),如果使用FALSE,則在浪費較多資源的情況下,會返回失敗,並不進行計算。如果不存在有效的圖形,則返回OGRERR_FAILURE。不同的驅動對空間過濾條件的影響也不同,所以應該不使用空間過濾。有的驅動會改變圖層的當前元素位置。返回OGREnvelop對象(包含Merge()函數,可以獲取合並後的MBR)。

TestCapability():測試功能。

GetInfo():點位函數。用於返回元數據。暫時無功能,等待完善。

CreateField():生成列。

DeleteField():刪除列。

RecorderFields():重新排列內部列的順序。???

RecorderField():不推薦使用,由RecordsFields()代替。

AlterFieldDefn():修改列定義。

SyncToDisk():寫入硬盤。

GetFIDColumn():獲取FID列名。

GetGeometryColumn():獲取幾何列名。

SetIgnoredFields():設置忽略列。

AttributeFilterEvaluationNeedsGeometry():?

InitializeIndexSupport():?

GetIndex():?

4.1.4 樣式

GetStyleTable():樣式表。返回值為只讀,不可修改,不可釋放。

SetStyleTable():設置樣式表。

SetStyleTableDirectly():直接設置樣式表。

4.1.5 事務

StartTransaction():開始。

CommitTransaction():提交。

RollbackTransaction():回滾。

4.1.6 圖層空間分析Overlay

Intersection():交(圖層合並)。

Union():並。

SymDifference():和-交。

Identify():交的補。

Update():並-》合並。

Clip():交(僅輸入圖層)。

Erase():刪除。

圖層疊叠操作會使用兩個圖層進行進行疊叠分析,將相關連的圖形按照不同的操作方法生成一個結果圖層。

註意:坐標系統很重要!

1) 進行疊叠分析時,要註意操作的兩個圖層要有相同的空間參考。這裏有個要註意的地方就是常用的WGS84坐標系。因為ESPG4326和WGS84其它是一個坐標系統,但是如果不明確指定ESPG4326的話DATUM有稍許的不同(DATUM的單位精確度不同),所有雖然都是WGS84,但是操作時卻被認為是不同的空間參考(ARCGIS具有同樣的操作問題)。所有在使用前應該將坐標系統一(使用PROJECT可以進行轉換)。

2) 如果操作時坐標系統相同,僅是名稱不同,在操作時會給出警告(ARCGIS會提示,OGR不會提示),但不會出錯,仍然可以得到正確的結果。

示例

#include<ogrsf_frmts.h>

voidCidentifyView::OnGeosIdentify()

{

// TODO: 在此添加命令處理程序代碼

char *filePath = "D:\\Test\\SMO\\data\\SHP";

char *layerName1 = "result";//ESPG4326

char *layerName2 = "city_RR_new";//Custom

OGRLayer *pLayer1 = NULL;

OGRLayer *pLayer2 = NULL;

OGRDataSource *pODS = NULL;

OGRRegisterAll();

pODS = OGRSFDriverRegistrar::Open(filePath,TRUE);

//讀取取要進行Union的兩個圖層

pLayer1 = pODS->GetLayerByName(layerName1);

pLayer2 = pODS->GetLayerByName(layerName2);

//OGRLayer *pLayer3 =pODS->CreateLayer("city_RR_new",pLayer2->GetSpatialRef(),wkbPolygon,NULL);

//pLayer3->CreateFeature(pLayer2->GetFeature(0));

//pLayer3->SyncToDisk();

//創建結果圖層

OGRLayer *pResultLayer = NULL;

OGRSpatialReference sr4326;

sr4326.SetWellKnownGeogCS("WGS84");

pResultLayer =pODS->CreateLayer("resultDiffName",&sr4326,wkbPolygon,NULL);

//配置Union函數中的第三個參數

char **p = new char *[4];

p[0] = "SKIP_FAILURES=YES";

p[1] = "PROMOTE_TO_MULTI=YES";

p[2] = "INPUT_PREFIX=1";

p[3] = "METHOD_PREFIX=2";

OGRErr errResult =pLayer1->Erase(pLayer2,pResultLayer,p,NULL,NULL);

//將對pResultLayer的編輯寫入文件,如果不加這句,result文件中將沒有記錄

pResultLayer->SyncToDisk();

OGRDataSource::DestroyDataSource(pODS);

}

4.1.7 示例

voidCidentifyView::OnLayerLayer()

{

// TODO: 在此添加命令處理程序代碼

char *filePath = "D:\\Test\\SMO\\data\\SHP";

OGRRegisterAll();

OGRDataSource *pODS =OGRSFDriverRegistrar::Open(filePath,TRUE);

OGRLayer *pLayerCity =pODS->GetLayerByName("City_RR");

int iFCount = pLayerCity->GetFeatureCount();

const char *pLayerInfo =pLayerCity->GetInfo("NAME");

pLayerCity->SetSpatialFilterRect(80,25,100,40);

pLayerCity->SetAttributeFilter("NAME = ‘張掖市‘");

pLayerCity->ResetReading();

OGRFeature *pFeature = NULL;

while( pFeature = pLayerCity->GetNextFeature())

{

const char *pStrName =pFeature->GetFieldAsString("NAME");

TRACE(pStrName);

TRACE("\n");

}

GIntBig biNum = pLayerCity->GetFeaturesRead();

OGRGeometry *pGeo = pLayerCity->GetSpatialFilter();

}

4.2 OGRDataSource

數據源。圖層的容器。當數據源銷毀時,其相關的圖層也會釋放。

4.2.1 數據源

GetName():數據源名稱。

TestCapability():測試功能。

ExecuteSQL():Sqlite數據SQL數據功能。

ReleaseResultSet():釋放SQL查詢結果。

SyncToDisk():寫入硬盤。

DestoryDataSource():釋放對象。將會銷毀所有依賴的圖層。

4.2.2 Layer

GetLayerCount():數目。

GetLayer():圖層。

GetLayerByName():圖層。

DeleteLayer():刪除圖層。

CreateLayer():創建圖層。

CopyLayer():復制圖層。

4.2.3 Style

GetStyleTable():樣式表。

SetStyleTable():設置。

SetStyleTableDirectly():直接設置。

4.2.4 Driver

GetDriver():獲取。

SetDriver():調協。

4.3 文件格式驅動OGRSFDriver

用於支持對不同類型的文件的操作。

使用OGRSFDriver操作文件,在操作之前要使用OGRSFDriverRegister進行註冊。

4.3.1 OGRSFDriverRegistrar

管理OGR對文件格式的支持。只有註冊過的文件格式才能使用驅動操作。單例。不要使用此類進行派生。

為了使用所有可以支持的數據格式(即使有些用不到,OGR還是會在內部維護支持的數據格式列表),通常使用OGRRegisterAll():註冊所有支持的類型。

OGR支持的文件格式類型參見4.3.3。

4.3.1.1 Driver

OpenShared():按名稱打開數據源的驅動。

RegisterDriver():註冊驅動。

DeregisterDriver():反註冊驅動。

GetDriverCount():獲取驅動數目。

GetDriver():獲取驅動。

GetDriverByName():獲取驅動。

AutoLoadDrivers():自動搜索庫文件,加載驅動。

GetRegistrar():返回本類實例。如果沒有,則新建。Static。

4.3.1.2 DataSource

GetOpenDSCount():打開的數據源數目。??????

GetOpenDS():獲取數據源。

ReleaseDataSource():釋放數據源。

Open():打開數據源,Static。通常用來快速打開數據源(不關心驅動的情況下)。如果bUpdate設置為TRUE,可以進行編輯,如果為FALSE,則只讀。

4.3.2 OGRSFDriver

驅動類。支持對特定文件格式的操作。

GetName():名稱。

Open():打開數據源。

TestCapability():測試功能。

CreateDataSource():創建數據源。

DeleteDataSource():刪除數據源。

CopyDataSource():復制數據源。

4.3.3 OGR Vector Formats

http://www.gdal.org/ogr/ogr_formats.html

4.4 示例

voidCidentifyView::OnLayerDatasource()

{

// TODO: 在此添加命令處理程序代碼

char *filePath = "D:\\Test\\SMO\\data\\SHP";

OGRRegisterAll();

OGRSFDriverRegistrar *pRegistrar =OGRSFDriverRegistrar::GetRegistrar();

int iCount = pRegistrar->GetDriverCount();

OGRSFDriver *pDriver0 = pRegistrar->GetDriver(0);

const char *pName0 = pDriver0->GetName();

OGRSFDriver *pDriverShp =pRegistrar->GetDriverByName("ESRI Shapefile");

const char *pNameShp = pDriverShp->GetName();

char *cityPath ="D:\\Test\\SMO\\data\\SHP\\City_RR.shp";

OGRDataSource *pDSCity = pDriverShp->Open(cityPath,FALSE);

OGRDataSource *pODS =OGRSFDriverRegistrar::Open(filePath,TRUE);

int iOpenDS = pRegistrar->GetOpenDSCount();//無效?

OGRDataSource *pDS = pRegistrar->GetOpenDS(0);

const char* pName = pODS->GetName();

OGRSFDriver *pDriver = pODS->GetDriver();

}

5 OGR坐標系統模型

見坐標詳解與PROJ.4與OGR坐標操作使用說明.docx

6 OGR樣式模型

見OGR樣式模型.docx。

7 實例操作

見GDAL_OGR實例操作.docx。

8 OGR實用工具

8.1 字符串

cpl_string.h/cpp:Common portable library string,通用接口庫,字符串操作。

OGR 數據模型