OGR 数据模型
Posted 魏桐
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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坐标系统模型
6 OGR样式模型
7 实例操作
8 OGR实用工具
8.1 字符串
cpl_string.h/cpp:Common portable library string,通用接口库,字符串操作。
以上是关于OGR 数据模型的主要内容,如果未能解决你的问题,请参考以下文章
ogr ogr2ogr 矢量数据格式转换 ogrinfo 矢量数据图层信息操作 ogr gdal的一部分 gdal 命令行 库操作