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! "));

      }

}

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(" ");

      }

      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,通用接口库,字符串操作。

原文地址:https://www.cnblogs.com/vito13/p/7760647.html