OGR数据模型

本文详细介绍了OGR数据模型,包括OGRGeometry的各种几何属性和操作,如点、线、面及其空间分析方法。此外,还涵盖了OGRSpatialReference和OGRCoordinateTransformation的空间参考模型,以及OGRFeature的属性和几何操作。最后,讨论了OGRLayer、OGRDataSource和OGRDriver在地图组织模型中的角色和使用示例。
摘要由CSDN通过智能技术生成

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

弗里曼的小伙伴

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值