ogr 缓冲区_OGR 数据模型
2013年10月10日
2015年3月30日修正坐標(biāo)參考模型
1 ?OGR幾何對(duì)象模型OGRGeometry
1.1 Geometry
幾何圖形,最基本的地圖圖形。注意:包含空間參考。
其它所有的地圖圖形都是由本類派生出來(lái)的。
包含了通用的屬性和方法。
注意:空間操作的部分需要GEOS支持,如果沒(méi)有GEOS,則返回FALSE。
1.1.1 幾何屬性
getGeometryType():獲取幾何類型。
getGeometryName():獲取幾何對(duì)象的名稱。
1.1.2 維度操作
getDimension():獲取圖形維度。
getCoordinateDimension():獲取坐標(biāo)系統(tǒng)維度。
setCoordinateDimension():設(shè)置坐標(biāo)系統(tǒng)維度。
flattenTo2D():將3D圖形轉(zhuǎn)換為2D(Z值全部設(shè)置為0)。
1.1.3 整體形狀操作
isEmpty():判斷空形狀。
isSimple():判斷簡(jiǎn)單形狀。
isValid():判斷有效性。
isRing():判斷是否為環(huán)。如果沒(méi)有點(diǎn),返回TRUE;否則返回FALSE。
empty():置空?qǐng)D形。
clone():復(fù)制圖形。
getEnvelop():獲取外接矩形。
getBoundary():
closeRings():強(qiáng)制封閉環(huán)。
segmentize():線段分化,將長(zhǎng)線段分為短線段。
swapXY():交換XY。
1.1.4 導(dǎo)入導(dǎo)出
wkbSize():計(jì)算WKB格式所需要的字節(jié)數(shù)。
importFromWkb():導(dǎo)入WKB。
exportToWkb():導(dǎo)出為WKB。
importFromWkt():導(dǎo)入WKT。
exportToWkt():導(dǎo)出為WKT。
dumpReadable():將WKT格式寫入指定文件。
exportToGML():導(dǎo)出為GML。
exportToKML():導(dǎo)出為KML。
exportToJson():導(dǎo)出為JSON。
exportToGEOS():導(dǎo)出為GEOS格式。
1.1.5 空間參考
assignSpatialReference():設(shè)置空間參考。
getSpatialReference():獲取空間參考。
transform():轉(zhuǎn)換空間參考,指定轉(zhuǎn)換參數(shù)。
transformTo():轉(zhuǎn)換空間參考,轉(zhuǎn)換為新的空間參考,需要原有空間參考。
1.1.6 空間分析
1.1.6.1? 判斷空間關(guān)系
Intersects():判斷相交。
Intersect():與Intersects()相同。
Equals():判斷相同。
Equal():與Equals()相同。
Disjoint():判斷不相交。
Touchs():判斷邊界相交。
Crosses():判斷通過(guò)性。
Within():判斷是否在內(nèi)部。與Contains相反。
Contains():判斷包含。與Within相反。
Overlaps():判斷疊迭性,不能相同。
1.1.6.2? 計(jì)算空間關(guān)系
Boundary():計(jì)算外部形狀。
getBoundary():由Boundary()代替,不推薦使用。
Distance():計(jì)算距離。
ConvexHull():計(jì)算最小凸外多邊形。
Buffer():計(jì)算緩沖區(qū)。
Intersection():計(jì)算相交部分。
Union():計(jì)算相并部分。
UnionCascade():串聯(lián)計(jì)算相并部分。
Difference():計(jì)算相差部分。
SymDifference():計(jì)算交集的補(bǔ)集。
SymmetricDifference():由SymDifference()代替,不推薦使用。
Centroid():計(jì)算重心。
Simplify():簡(jiǎn)化圖形。
SimplifyPreserveTopology():簡(jiǎn)化圖形的同時(shí)保留拓?fù)涮匦浴?/p>
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 點(diǎn)
1.2.1 OGRPoint
點(diǎn)類型,2D或3D。
由于2D和3D是相對(duì)應(yīng)的,使用wkbFlatten()可以將3D轉(zhuǎn)化為2D(z值置空)。
GetX()/SetX()
GetY()/SetY()
GetZ()/SetZ()
1.3 線
1.3.1 OGRCurve
線類型的抽象基類型。
isClosed():判斷封閉性。
get_Length():獲取長(zhǎng)度。
StartPoint():獲取起始點(diǎn)。
EndPoint():獲取終止點(diǎn)。
Value():獲取指定距離的點(diǎn)。
1.3.2 OGRLineString
折線,由Vertex(節(jié)點(diǎn))組成。
addPoint():添加節(jié)點(diǎn)。
getPoint():獲取節(jié)點(diǎn)。
setPoints():設(shè)置所有節(jié)點(diǎn)。
getPoints():獲取所有節(jié)點(diǎn)。
setNumPoints():設(shè)置節(jié)點(diǎn)數(shù)目。
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
環(huán)-封閉的折線。
isClockwise():判斷順時(shí)針。
CloseRings():強(qiáng)制封閉環(huán)。
get_Area():獲取環(huán)的面積。
isPointInRing():判斷點(diǎn)是否在環(huán)的內(nèi)部。
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():返回表面的一個(gè)點(diǎn)(確保在面上)。
1.4.2 OGRPolygon
多邊形。由環(huán)組成。可以是復(fù)雜的多邊形(包含島)。
addRing():添加環(huán),如果多邊形為空,則為外環(huán),如果不為空,則為內(nèi)環(huán)(島)。將傳入的環(huán)復(fù)制一個(gè)環(huán),加入多邊形中。
addRingDirectly():添加環(huán)。功能同addRing(),直接使用傳入的環(huán),不再構(gòu)建。
closeRings():強(qiáng)制封閉環(huán)。
getExteriorRing():獲取外環(huán)。
getInteriorRing():獲取某個(gè)內(nèi)環(huán)。
getNumInteriorRing():獲取內(nèi)環(huán)數(shù)目。
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()區(qū)別
ringIn0.addPoint(108,78);
ringIn0.getPoint(5,&pt0);//(108,78)
ringIn->getPoint(5,&pt0);//隨機(jī)值
const OGRLinearRing *ringIn1 = polygon.getInteriorRing(1);
ringIn1->getPoint(5,&pt0);//(108,78)
}
1.5 幾何對(duì)象集合
1.5.1 OGRGeometryCollection
幾何對(duì)象集合。
addGeometry():添加幾何對(duì)象(特定派生類只能添加特定的幾何對(duì)象)。復(fù)制。
addGeometryDirectly():直接添加幾何對(duì)象。不再?gòu)?fù)制。
removeGeometry():移除幾何對(duì)象。
getNumGeometries():獲取集合中對(duì)象的數(shù)目。
getGeometryRef():獲取幾何對(duì)象。是集合中的某一個(gè)對(duì)象。
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);//如果這里使用默認(rèn)的TRUE刪除,則pGeo1所占用的內(nèi)存會(huì)被釋放,再次調(diào)用會(huì)出錯(cuò)。
OGREnvelope env;
pGeo->getEnvelope(&env);
pGeo1->getEnvelope(&env);//如果刪除時(shí)釋放,則此句會(huì)報(bào)錯(cuò)。
OGRPoint pt0;
pGeo1->getExteriorRing()->getPoint(0,&pt0);
OGRMultiPolygon colPoly;
colPoly.addGeometry(pGeometry);
OGRErr errAdd = colPoly.addGeometry(&pt0);//類型不一致,無(wú)法添加
errAdd = colPoly.addGeometry(&colGeometry);//類型不一致,無(wú)法添加
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);//類型不一致,無(wú)法添加
if(errAdd != OGRERR_NONE)
{
TRACE(_T("OGRERR!\n"));
}
}
2 OGR空間參考模型:OGRSpatialReference、OGRCoordinateTransformation
目的:設(shè)置投影和大地參考(DATUM)。
方法:
2.1 坐標(biāo)系統(tǒng):OGRSpatialReference
2.1.1 地理坐標(biāo)系統(tǒng):用于描地球的球面模型。包含DATUM。
1)?? 設(shè)置地理坐標(biāo)系統(tǒng):SetGeogCS()。注意要使用標(biāo)準(zhǔn)的DATUM名稱,其它參數(shù)用于設(shè)置為用戶可以識(shí)別的名稱。一般情況下,不需要自己定義坐標(biāo)系統(tǒng),而是使用一些已經(jīng)定義好的坐標(biāo)系統(tǒng)。OGR可以使用部分內(nèi)置的坐標(biāo)系統(tǒng)。
2)?? 設(shè)置命名或編號(hào)坐標(biāo)系統(tǒng):SetWellknownGeogsCS()。
3)?? WKT格式交換:exportToWKT()/importFromWKT()。返回值要以CPLFree()或OGRFree()釋放。
4)?? 示例:設(shè)置坐標(biāo)系統(tǒng),如果無(wú)指定值,則使用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()<
}
2.1.2 投影坐標(biāo)系統(tǒng):將球面坐標(biāo)投影到平面上,以平面的形式描述地球。
依賴地理坐標(biāo)系統(tǒng)。因此需要設(shè)置地理坐標(biāo)系統(tǒng)。
注意:順序設(shè)置投影系統(tǒng)。1.創(chuàng)建投影。2.設(shè)置相關(guān)地理坐標(biāo)。3.設(shè)置投影。
1)?? 設(shè)置命名或編號(hào)坐標(biāo)系統(tǒng):importFromEPSG(),importFromProj4()等。
2)?? 設(shè)置常用投影坐標(biāo)系統(tǒng):SetUTM()/SetTM()/SetLC()。
3)?? 自定義投影系統(tǒng)名稱(僅命名):SetProjCS()。
2.1.3 坐標(biāo)參數(shù)查詢與設(shè)置
2.1.3.1? 坐標(biāo)系統(tǒng)類型
isProected():判斷是否為投影坐標(biāo)系統(tǒng)。
isGeographic():判斷是否為地理坐標(biāo)系統(tǒng)。
2.1.3.2? 地球橢球體模型參數(shù)
GetSemiMajor():長(zhǎng)半軸。
GetSemiMinor():短半軸。
GetInvFlattening():扁率的倒數(shù)。
2.1.3.3? 具體參數(shù)值
GetAttrValue():參數(shù)值。
GetProjParm():投影參數(shù)值,可以使用預(yù)定義的宏進(jìn)行獲取。
GetLinearUnits():類型,與M的轉(zhuǎn)換單位。
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 坐標(biāo)系統(tǒng)轉(zhuǎn)換:OGRCoordinateTransformation
目標(biāo):將點(diǎn)進(jìn)行坐標(biāo)系統(tǒng)轉(zhuǎn)換。
方法:
創(chuàng)建坐標(biāo)轉(zhuǎn)換對(duì)象:OGRCreateCoordinateTransformation()。
轉(zhuǎn)換坐標(biāo)系統(tǒng):OGRCoordinateTransformation::Transform()。
注意:如果使用了系統(tǒng)未定義的DATUM,有可能導(dǎo)致錯(cuò)誤,使用時(shí)注意檢查。
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
要素,包含屬性和地圖幾何圖元。一般用于操作空間和屬性的聯(lián)動(dòng)。
主要由屬性O(shè)GRField、OGRFeatureDefn和幾何圖元OGRGeometry組成。由nFID唯一標(biāo)識(shí)。
3.1 OGRFeatureDefn
屬性表定義類。
用于存取屬性表的結(jié)構(gòu),以及幾何圖形的元數(shù)據(jù)。
GetName():獲取屬性表結(jié)構(gòu)名稱,默認(rèn)是圖層名稱。
GetFieldCount():獲取列數(shù)目。
GetFieldDefn():獲取列定義。
GetFieldIndex():獲取列索引。
AddFieldDefn():添加列定義。
DeleteFiledDefn():刪除列定義。
RecorderFieldDefn():保存屬性表定義。只有無(wú)相關(guān)OGRFeature存在時(shí)才可使用,如果有,則使用OGR_L_RecorderFields()。
GetGeomType():獲取幾何圖形類型。
SetGeomType():設(shè)置幾何圖形類型。
Clone():復(fù)制。
Release():釋放。
IsGeometryIgnored():判斷是否可以忽略幾何圖形。
SetGeometryIgnored():設(shè)置是否可以忽略幾何圖形。
IsStyleIgnored():判斷是否可以忽略樣式。
SetStyleIgnored():設(shè)置是否可以忽略樣式。
IsSame():判斷相同。
3.2 OGRFieldDef
用于定義字段的屬性。包含精度、類型、名稱等。
SetName():設(shè)置名稱。
GetNameRef():獲取名稱。
GetType():讀取類型。
SetType():設(shè)置類型。
GetJustify():讀取對(duì)齊方式。
SetJustify():設(shè)置對(duì)齊方式。
GetWidth()/SetWidth():存取寬度。
GetPricision()/SetPricision():存取精度。
Set():一次性設(shè)置。
SetDefault():設(shè)置默認(rèn)值。
GetDefault():讀取默認(rèn)值。
IsIgnored():判斷是否可忽略。
SetIgnored():設(shè)置是否可忽略。
IsSame():判斷相同。
3.3 OGRField
元素。是一個(gè)集合。用于標(biāo)識(shí)要素內(nèi)部某一個(gè)元素的值。
3.4 OGRStyleTable等樣式類
主要用于管理樣式。
OGRSytleTable:樣式表類,樣式中的所有具體內(nèi)容。
OGRStyleMgr:樣式管理器,使用時(shí)要先用樣式表生成此類。
OGRStyleTool:由樣式管理器進(jìn)行管理,用于操作具體的樣式。
OGRStylePen:具體畫筆樣式。(OGRStyleTool派生)
OGRStyleBrush:具體的畫刷樣式。(OGRStyleTool派生)
OGRStyleLabel:具體的標(biāo)簽樣式。(OGRStyleTool派生)
OGRStyleSymbol:具體的符號(hào)樣式。(OGRStyleTool派生)
3.4.1 參考
3.5 OGRFeature
3.5.1 屬性操作
3.5.1.1? 表結(jié)構(gòu)操作
GetDefnRef():獲取元素的表結(jié)構(gòu)定義OGRFeatureDefn。
DumpReadable():導(dǎo)出為TXT文件。
setFrom():從另一個(gè)Feature導(dǎo)入屬性和幾何元素。
setFieldsFrom():從另一個(gè)Feature導(dǎo)入屬性數(shù)據(jù)。
RemapFields():重新排列屬性。
3.5.1.2? 值操作
GetFieldCount():數(shù)目。
GetFieldIndex():索引號(hào)。
isFiledSet():判斷是否已經(jīng)設(shè)置。
UnsetField():置空。
GetRawFiled():獲取OGRField類型的值。
GetFiled*():按照不同的類型獲取值。
SetFiled():設(shè)置屬性值。
GetFID()/SetFID():FID存取。
3.5.2 幾何操作
SetGeometry():設(shè)置幾何圖形。
SetGeometryDirectly():直接添加。與StealGeometry()相反。
StealGeometry():與SetGeometryDirectly()相反,直接取出。
GetGeometryRef():
3.5.3 元素操作
Clone():復(fù)制。
Equal():判斷相同。
CreateFeature():創(chuàng)建,static。
DestroyFeature():銷毀,static。在GetNextFeature()等 函數(shù)中會(huì)返回一個(gè)復(fù)制對(duì)象,供調(diào)用者使用,使用完成之后應(yīng)釋放。但是由于Windows的DLL機(jī)制,DLL與主程序之間使用不同的堆,使用主程序釋放DLL堆內(nèi)容會(huì)報(bào)錯(cuò),所有會(huì)才此函數(shù)來(lái)保證兼容性。
3.5.4 樣式操作
GetStyleString():讀取樣式字符串。
SetStyleString():設(shè)置樣式字符串。
SetStyleStringDirectly():直接設(shè)置。
GetStyleTable():讀取樣式表。
SetStyleTable():設(shè)置樣式表。
SetStyleTableDirectly():直接設(shè)置樣式表。
3.5.5 中文漢字亂碼的問(wèn)題解決
3.5.5.1? 原因
GDAL/OGR默認(rèn)使用UTF-8進(jìn)行編碼,Shape默認(rèn)使用ANSI(可以設(shè)置為UTF-8,但不能識(shí)別UNICODE)。讀入Shape時(shí),只能以ANSI方式讀入。如果Shape是以UTF-8類型編碼的話,會(huì)造成亂碼。
3.5.5.2? 解決方式
1)?? 設(shè)置新圖層為UTF-8編碼方式
這一步很重要,因?yàn)槟J(rèn)會(huì)以ANSI方式編碼。設(shè)置之后,會(huì)將ANSI類型的編碼,轉(zhuǎn)換為UTF-8格式的編碼。所以,如果原始數(shù)據(jù)是UTF-8類型的編碼,要先轉(zhuǎn)換為ANSI格式編碼,再保存。
CPLSetConfigOption("SHAPE_ENCODING","");
2)?? 以ANSI讀入原始數(shù)據(jù)(只能讀入為ANSI,但編碼方式取決于原始數(shù)據(jù))。
3)?? 轉(zhuǎn)換為Unicode
如果原圖層為UTF-8編碼的話,必須使用UTF-8編碼格式讀入并轉(zhuǎn)換為Unicode,如果原圖層為ANSI編碼格式,則以ANSI編碼格式轉(zhuǎn)換為Unicode。
這一步,將原始數(shù)據(jù)進(jìn)行還原。
4)?? 將UNICODE轉(zhuǎn)換為ANSI編碼格式,存入元素之中。
這一步,將數(shù)據(jù)轉(zhuǎn)換為OGR能夠正確設(shè)置的編碼格式(只能識(shí)別ANSI)。
3.5.5.3? 參考
3.5.5.4? 示例
//設(shè)置圖層的編碼格式
CPLSetConfigOption("SHAPE_ENCODING","");
OGRLayer *pOGRLayerDes =pDSDes->CopyLayer(pOGRLayerSrc,pDesLayerName);
//設(shè)置元素的編碼格式
voidCFeature::translateAttributeToUTF8()
{
OGRFeatureDefn *pFeatureDefn = m_pFeature->GetDefnRef();
int nFieldCount = pFeatureDefn->GetFieldCount();
for(int i=0;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格式轉(zhuǎn)化為寬字符
CString strFieldValue;
pConvertCString->fromUTF8(csFieldValue,strFieldValue);
//轉(zhuǎn)化為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
相同元素的集合。
注意,在編譯元素的時(shí)候,一定要在Open時(shí),將bUpdate開關(guān)設(shè)置為TRUE。
4.1.1 過(guò)濾查詢
GetSpatialFilter()/SetSpatialFilter():讀取/設(shè)置空間過(guò)濾幾何對(duì)象。再下次查詢時(shí)會(huì)進(jìn)行空間過(guò)濾。
SetSpatialFilterRect():設(shè)置空間過(guò)濾為指定的矩形。當(dāng)年版本的OGR有BUG,只能使用過(guò)濾圖形的外接矩形與圖層中圖形的外接矩形進(jìn)行分析。使用OGRGeometry的Intersects()函數(shù),在GEOS庫(kù)下可以進(jìn)行具體操作。
SetAttributeFilter():設(shè)置屬性過(guò)濾條件。格式為SQL Where:NAME = ‘dd’。
注意:OGR使用SQLITE進(jìn)行查詢,SQLITE使用UTF8格式,所以查詢的時(shí)候應(yīng)該轉(zhuǎn)化為UTF8格式,雖然看上去是亂碼,但是SQLITE可以識(shí)別。查詢結(jié)果是正確的。
4.1.2 元素讀取
ResetReading():重置讀取。
GetNextFeature():獲取下個(gè)元素。
SetNextByIndex():獲取指定的元素。
GetFeature():按FID讀取元素。注意,讀取元素后,生成元素副本(使用完成后一定要釋放),并不是當(dāng)前圖層要元素,如果要進(jìn)行修改,則應(yīng)該將修改后的內(nèi)容使用SetFeature()設(shè)置原有元素(無(wú)法生成新元素,只能修改原有元素,使用CreateFeature()生成新元素)。
SetFeature():設(shè)置元素。
CreateFeature():生成元素,如果要生成新的元素,請(qǐng)使用此函數(shù)。
DeleteFeature():刪除元素。
GetFeatureCount():獲取元素?cái)?shù)量。
GetFeaturesRead():
4.1.3 圖層屬性
GetName():圖層名稱。
GetGeomType():幾何類型。
GetLayerDefn():屬性表定義。
GetSpatialRef():空間參考。注意,這里返回的空間參考OGRSpatialReference*是原圖層的中的指針,只讀,不可釋放。
GetExtent():外接多邊形。可以使用TRUE強(qiáng)制計(jì)算圖層的MBR(minimum bounding rectangle),如果使用FALSE,則在浪費(fèi)較多資源的情況下,會(huì)返回失敗,并不進(jìn)行計(jì)算。如果不存在有效的圖形,則返回OGRERR_FAILURE。不同的驅(qū)動(dòng)對(duì)空間過(guò)濾條件的影響也不同,所以應(yīng)該不使用空間過(guò)濾。有的驅(qū)動(dòng)會(huì)改變圖層的當(dāng)前元素位置。返回OGREnvelop對(duì)象(包含Merge()函數(shù),可以獲取合并后的MBR)。
TestCapability():測(cè)試功能。
GetInfo():點(diǎn)位函數(shù)。用于返回元數(shù)據(jù)。暫時(shí)無(wú)功能,等待完善。
CreateField():生成列。
DeleteField():刪除列。
RecorderFields():重新排列內(nèi)部列的順序。???
RecorderField():不推薦使用,由RecordsFields()代替。
AlterFieldDefn():修改列定義。
SyncToDisk():寫入硬盤。
GetFIDColumn():獲取FID列名。
GetGeometryColumn():獲取幾何列名。
SetIgnoredFields():設(shè)置忽略列。
AttributeFilterEvaluationNeedsGeometry():?
InitializeIndexSupport():?
GetIndex():?
4.1.4 樣式
GetStyleTable():樣式表。返回值為只讀,不可修改,不可釋放。
SetStyleTable():設(shè)置樣式表。
SetStyleTableDirectly():直接設(shè)置樣式表。
4.1.5 事務(wù)
StartTransaction():開始。
CommitTransaction():提交。
RollbackTransaction():回滾。
4.1.6 圖層空間分析Overlay
Intersection():交(圖層合并)。
Union():并。
SymDifference():和-交。
Identify():交的補(bǔ)。
Update():并-》合并。
Clip():交(僅輸入圖層)。
Erase():刪除。
圖層疊迭操作會(huì)使用兩個(gè)圖層進(jìn)行進(jìn)行疊迭分析,將相關(guān)連的圖形按照不同的操作方法生成一個(gè)結(jié)果圖層。
注意:坐標(biāo)系統(tǒng)很重要!
1)?? 進(jìn)行疊迭分析時(shí),要注意操作的兩個(gè)圖層要有相同的空間參考。這里有個(gè)要注意的地方就是常用的WGS84坐標(biāo)系。因?yàn)镋SPG4326和WGS84其它是一個(gè)坐標(biāo)系統(tǒng),但是如果不明確指定ESPG4326的話DATUM有稍許的不同(DATUM的單位精確度不同),所有雖然都是WGS84,但是操作時(shí)卻被認(rèn)為是不同的空間參考(ARCGIS具有同樣的操作問(wèn)題)。所有在使用前應(yīng)該將坐標(biāo)系統(tǒng)一(使用PROJECT可以進(jìn)行轉(zhuǎn)換)。
2)?? 如果操作時(shí)坐標(biāo)系統(tǒng)相同,僅是名稱不同,在操作時(shí)會(huì)給出警告(ARCGIS會(huì)提示,OGR不會(huì)提示),但不會(huì)出錯(cuò),仍然可以得到正確的結(jié)果。
示例
#include
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);
//讀取取要進(jìn)行Union的兩個(gè)圖層
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();
//創(chuàng)建結(jié)果圖層
OGRLayer *pResultLayer = NULL;
OGRSpatialReference sr4326;
sr4326.SetWellKnownGeogCS("WGS84");
pResultLayer =pODS->CreateLayer("resultDiffName",&sr4326,wkbPolygon,NULL);
//配置Union函數(shù)中的第三個(gè)參數(shù)
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);
//將對(duì)pResultLayer的編輯寫入文件,如果不加這句,result文件中將沒(méi)有記錄
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
數(shù)據(jù)源。圖層的容器。當(dāng)數(shù)據(jù)源銷毀時(shí),其相關(guān)的圖層也會(huì)釋放。
4.2.1 數(shù)據(jù)源
GetName():數(shù)據(jù)源名稱。
TestCapability():測(cè)試功能。
ExecuteSQL():Sqlite數(shù)據(jù)SQL數(shù)據(jù)功能。
ReleaseResultSet():釋放SQL查詢結(jié)果。
SyncToDisk():寫入硬盤。
DestoryDataSource():釋放對(duì)象。將會(huì)銷毀所有依賴的圖層。
4.2.2 Layer
GetLayerCount():數(shù)目。
GetLayer():圖層。
GetLayerByName():圖層。
DeleteLayer():刪除圖層。
CreateLayer():創(chuàng)建圖層。
CopyLayer():復(fù)制圖層。
4.2.3 Style
GetStyleTable():樣式表。
SetStyleTable():設(shè)置。
SetStyleTableDirectly():直接設(shè)置。
4.2.4 Driver
GetDriver():獲取。
SetDriver():調(diào)協(xié)。
4.3 文件格式驅(qū)動(dòng)OGRSFDriver
用于支持對(duì)不同類型的文件的操作。
使用OGRSFDriver操作文件,在操作之前要使用OGRSFDriverRegister進(jìn)行注冊(cè)。
4.3.1 OGRSFDriverRegistrar
管理OGR對(duì)文件格式的支持。只有注冊(cè)過(guò)的文件格式才能使用驅(qū)動(dòng)操作。單例。不要使用此類進(jìn)行派生。
為了使用所有可以支持的數(shù)據(jù)格式(即使有些用不到,OGR還是會(huì)在內(nèi)部維護(hù)支持的數(shù)據(jù)格式列表),通常使用OGRRegisterAll():注冊(cè)所有支持的類型。
OGR支持的文件格式類型參見4.3.3。
4.3.1.1? Driver
OpenShared():按名稱打開數(shù)據(jù)源的驅(qū)動(dòng)。
RegisterDriver():注冊(cè)驅(qū)動(dòng)。
DeregisterDriver():反注冊(cè)驅(qū)動(dòng)。
GetDriverCount():獲取驅(qū)動(dòng)數(shù)目。
GetDriver():獲取驅(qū)動(dòng)。
GetDriverByName():獲取驅(qū)動(dòng)。
AutoLoadDrivers():自動(dòng)搜索庫(kù)文件,加載驅(qū)動(dòng)。
GetRegistrar():返回本類實(shí)例。如果沒(méi)有,則新建。Static。
4.3.1.2? DataSource
GetOpenDSCount():打開的數(shù)據(jù)源數(shù)目。??????
GetOpenDS():獲取數(shù)據(jù)源。
ReleaseDataSource():釋放數(shù)據(jù)源。
Open():打開數(shù)據(jù)源,Static。通常用來(lái)快速打開數(shù)據(jù)源(不關(guān)心驅(qū)動(dòng)的情況下)。如果bUpdate設(shè)置為TRUE,可以進(jìn)行編輯,如果為FALSE,則只讀。
4.3.2 OGRSFDriver
驅(qū)動(dòng)類。支持對(duì)特定文件格式的操作。
GetName():名稱。
Open():打開數(shù)據(jù)源。
TestCapability():測(cè)試功能。
CreateDataSource():創(chuàng)建數(shù)據(jù)源。
DeleteDataSource():刪除數(shù)據(jù)源。
CopyDataSource():復(fù)制數(shù)據(jù)源。
4.3.3 OGR Vector Formats
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();//無(wú)效?
OGRDataSource *pDS = pRegistrar->GetOpenDS(0);
const char* pName = pODS->GetName();
OGRSFDriver *pDriver = pODS->GetDriver();
}
5 ?OGR坐標(biāo)系統(tǒng)模型
6 ?OGR樣式模型
7 ?實(shí)例操作
8 ?OGR實(shí)用工具
8.1 字符串
cpl_string.h/cpp:Common portable library string,通用接口庫(kù),字符串操作。
總結(jié)
以上是生活随笔為你收集整理的ogr 缓冲区_OGR 数据模型的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Edxposed学习研究(四)Magis
- 下一篇: Mybatis Maven依赖