OGR 數據模型
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 數據模型