OGR数据模型

目录

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

Format Name

Code

Creation

Georeferencing

Compiled by default

Aeronav FAA files

AeronavFAA

No

Yes

Yes

ESRI ArcObjects

ArcObjects

No

Yes

No, needs ESRI ArcObjects

Arc/Info Binary Coverage

AVCBin

No

Yes

Yes

Arc/Info .E00 (ASCII) Coverage

AVCE00

No

Yes

Yes

Arc/Info Generate

ARCGEN

No

No

Yes

Atlas BNA

BNA

Yes

No

Yes

AutoCAD DWG

DWG

No

No

No

AutoCAD DXF

DXF

Yes

No

Yes

CartoDB

CartoDB

Yes

Yes

No, needs libcurl

Comma Separated Value (.csv)

CSV

Yes

No

Yes

CouchDB / GeoCouch

CouchDB

Yes

Yes

No, needs libcurl

DODS/OPeNDAP

DODS

No

Yes

No, needs libdap

EDIGEO

EDIGEO

No

Yes

Yes

ElasticSearch

ElasticSearch

Yes (write-only)

No, needs libcurl

ESRI FileGDB

FileGDB

Yes

Yes

No, needs FileGDB API library

ESRI Personal GeoDatabase

PGeo

No

Yes

No, needs ODBC library

ESRI ArcSDE

SDE

No

Yes

No, needs ESRI SDE

ESRI Shapefile

ESRI Shapefile

Yes

Yes

Yes

FMEObjects Gateway

FMEObjects Gateway

No

Yes

No, needs FME

GeoJSON

GeoJSON

Yes

Yes

Yes

Géoconcept Export

Geoconcept

Yes

Yes

Yes

Geomedia .mdb

Geomedia

No

No

No, needs ODBC library

GeoRSS

GeoRSS

Yes

Yes

Yes (read support needs libexpat)

Google Fusion Tables

GFT

Yes

Yes

No, needs libcurl

GML

GML

Yes

Yes

Yes (read support needs Xerces or libexpat)

GMT

GMT

Yes

Yes

Yes

GPSBabel

GPSBabel

Yes

Yes

Yes (needs GPSBabel and GPX driver)

GPX

GPX

Yes

Yes

Yes (read support needs libexpat)

GRASS Vector Format

GRASS

No

Yes

No, needs libgrass

GPSTrackMaker (.gtm, .gtz)

GPSTrackMaker

Yes

Yes

Yes

Hydrographic Transfer Format

HTF

No

Yes

Yes

Idrisi Vector (.VCT)

Idrisi

No

Yes

Yes

Informix DataBlade

IDB

Yes

Yes

No, needs Informix DataBlade

INTERLIS

“Interlis 1” and “Interlis 2”

Yes

Yes

No, needs Xerces (INTERLIS model reading needs ili2c.jar)

INGRES

INGRES

Yes

No

No, needs INGRESS

KML

KML

Yes

Yes

Yes (read support needs libexpat)

LIBKML

LIBKML

Yes

Yes

No, needs libkml

Mapinfo File

MapInfo File

Yes

Yes

Yes

Microstation DGN

DGN

Yes

No

Yes

Access MDB (PGeo and Geomedia capable)

MDB

No

Yes

No, needs JDK/JRE

Memory

Memory

Yes

Yes

Yes

MySQL

MySQL

No

Yes

No, needs MySQL library

NAS – ALKIS

NAS

No

Yes

No, needs Xerces

Oracle Spatial

OCI

Yes

Yes

No, needs OCI library

ODBC

ODBC

No

Yes

No, needs ODBC library

MS SQL Spatial

MSSQLSpatial

Yes

Yes

No, needs ODBC library

Open Document Spreadsheet

ODS

Yes

No

No, needs libexpat

OGDI Vectors (VPF, VMAP, DCW)

OGDI

No

Yes

No, needs OGDI library

OpenAir

OpenAir

No

Yes

Yes

OpenStreetMap XML and PBF

OSM

No

Yes

No, needs libsqlite3 (and libexpat for OSM XML)

PCI Geomatics Database File

PCIDSK

No

No

Yes, using internal PCIDSK SDK (from GDAL 1.7.0)

Geospatial PDF

PDF

Yes

Yes

Yes (read supports need libpoppler or libpodofo support)

PDS

PDS

No

Yes

Yes

PostgreSQL SQL dump

PGDump

Yes

Yes

Yes

PostgreSQL/PostGIS

PostgreSQL/PostGIS

Yes

Yes

No, needs PostgreSQL client library (libpq)

EPIInfo .REC

REC

No

No

Yes

S-57 (ENC)

S57

No

Yes

Yes

SDTS

SDTS

No

Yes

Yes

SEG-P1 / UKOOA P1/90

SEGUKOOA

No

Yes

Yes

SEG-Y

SEGY

No

No

Yes

Norwegian SOSI Standard

SOSI

No

Yes

No, needs FYBA library

SQLite/SpatiaLite

SQLite

Yes

Yes

No, needs libsqlite3 or libspatialite

SUA

SUA

No

Yes

Yes

SVG

SVG

No

Yes

No, needs libexpat

UK .NTF

UK. NTF

No

Yes

Yes

U.S. Census TIGER/Line

TIGER

No

Yes

Yes

VFK data

VFK

No

Yes

Yes

VRT – Virtual Datasource

VRT

No

Yes

Yes

OGC WFS (Web Feature Service)

WFS

Yes

Yes

No, needs libcurl

MS Excel format

XLS

No

No

No, needs libfreexl

MS Office Open XML spreadsheet

XLSX

Yes

No

No, needs libexpat

X-Plane/Flightgear aeronautical data

XPLANE

No

Yes

Yes

Walk

Walk

No

Yes

No, needs ODBC library

 

 

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

9 参考

1)       OGR帮助文档。

2)       OGR入门,陈泰生,2008.08。

转载自:https://blog.csdn.net/sf2gis2/article/details/50686766

You may also like...

退出移动版