Geometry(几何体)结构与计算
2023-01-03 11:20:16
111次阅读
0个评论
最后修改时间:2023-01-03 11:21:15
Geometry(几何体)结构与计算

几何对象是空间要素的基本组成部分,也是进行增删改操作、空间查询和分析的基本单位。EV-Globe SDK提供了十余种几何对象,除常见的点、线、面、几何对象之外,还提供了复杂的几何对象如多点类型、曲线环、圆弧、椭圆弧、圆面、三角面、矩形面、贝赛尔曲线、贝赛尔曲面等几何对象。

类结构图


说明:

1.绿色框最最常用的类型,也是最终写入到数据集的类型(包括CMultiPoint

2.蓝色框的对象也较为常用,尤其是CLineString

3.CLineString为构建线面的基础对象,也可直接使用用来存储、空间计算、变换等。,可从CLineString中获取坐标系串,其他曲线对象可通过toLineString转为坐标串组成的线对象

4.CCurvePath为构建线面的中间对象,表示首位相连的线的集合

5.CCurveRing为构建面的中间对象,表示环

构建流程

CPointCMultiPoint (略)

CPolyline

构建CLineString,通过add方法加点

构建CCurvePath,通过add方法加入构建好的CLineString

构建CPolyline,通过add方法传入构建好的CCurvePath

CPolygon

构建CLineString,通过add方法加点

构建CCurveRing,通过add方法加入构建好的CLineString

构建CPolygon,通过addExteriorRingaddInteriorRing添加内外环,类型为CCurveRing

分析计算

除了获取长度与面积的基本计算(方法在对应线面的基类中),IGeometry还封装了投影转换与空间计算相关的方法如下:


/// 判断该几何体对象是否包含指定几何体对象。

virtual ev_bool isContains(const IGeometry* geom, EVDimensionType dimension) const;

                   

/// 判断该几何体对象是否与指定几何体对象形状相同。

virtual ev_bool isEquals(const IGeometry* geom,ev_real64 tolerance, EVDimensionType dimension) const;


/// 判断该几何体对象是否相离指定几何体对象。

virtual ev_bool isDisjoin(const IGeometry* geom,EVDimensionType dimension) const;


/// 判断该几何体对象是否相交指定几何体对象。

virtual ev_bool isIntersects(const IGeometry* geom,EVDimensionType dimension) const;


/// 判断该几何体对象是否被包含在指定几何体对象。

virtual ev_bool isWithin(const IGeometry* geom,EVDimensionType dimension) const;


/// 判断该几何体对象是否与指定几何体对象相接。

virtual ev_bool isTouches(const IGeometry* geom,EVDimensionType dimension) const;


/// 判断该几何体对象是否跨越指定几何体对象。

virtual ev_bool isCrosses(const IGeometry* geom,EVDimensionType dimension) const;


/// 判断该几何体对象是否与指定几何体对象有空间关系。

virtual ev_bool isRelates(const IGeometry* geom,EVString relateMatrix,EVDimensionType dimension) const;


/// 创建一个Buffer几何体。

/// 1:CAP_ROUND - (default) a semi-circle

/// 2:CAP_BUTT  - a straight line perpendicular to the end segment

/// 3:CAP_SQUARE - a half-square

virtual IGeometry* buffer(ev_real64 tolerance,EVDimensionType dimension) const;

virtual IGeometry* buffer(ev_real64 tolerance, int flag, EVDimensionType dimension) const;


/// 获取凸多边形。

virtual IGeometry* convexHull(EVDimensionType dimension) const;


/// 获取几何体对象与指定几何体对象之间的不同部分,该不同部分只包含该几何体对象,不包含指定几何体对象

virtual IGeometry* difference(const IGeometry* geom,EVDimensionType dimension)const;


/// 获取几何体对象与指定几何体对象之间最小距离。

virtual ev_real64 distance(const IGeometry* geom,EVDimensionType dimension) const;


/// 获取几何体对象与指定几何体对象之间的相交部分。

virtual IGeometry* intersects(const IGeometry* geom,EVDimensionType dimension) const;


/// 获取几何体对象与指定几何体对象之间的相叠加。

virtual IGeometry* overlaps(const IGeometry* geom,EVDimensionType dimension) const;


/// 获取几何体对象与指定几何体对象之间的不同部分,该部分包括该几何体对象也包括指定几何体对象

virtual IGeometry* symDifference(const IGeometry* geom,EVDimensionType dimension) const;


/// 获取几何体对象与指定几何体对象合并后的新几何体对象

virtual IGeometry* unions(const IGeometry* geom,EVDimensionType dimension) const;


/// 转换导目标坐标系,若自身坐标系或者目标坐标系为空则不做任何处理,默认采取布尔莎算法。七参数不足7个,按默认为0处理,7参数没有可传NULL。

virtual ev_void projects(const ISpatialReference * sr,ev_real64 * sevenParam,ev_uint32 count);

常见问题

1.addPointTo加不进点

addPointTo方法判断如果目标点在内部某段的线上才会在这两点之间插入,并不是用来构建几何体的方法

2.getLength getArea获取值不对

Geomety只是平面坐标,虽然提供了坐标参考转换方法,但是面积与长度计算也是基于平面单位。若想获得地理长度与面积,可将Geometry投影到投影类型的坐标系,可获得在当前投影下的度量值。也可使用CGeodesicMeasure对象计算椭球面上的度量值(测量工具在地理坐标系下的默认计算方式)。

3.构建的圆不对

构建圆(CCircle)传入中心点与半径,需要谨记Geometry只在平面表示图形,所以中心点和半径度量单位需要一致,如经纬度中心点和米单位的半径组合就会与预期不一致。这时需要转成同一单位,或者使用CSphereGeometryFactory基于椭球面创建圆和椭圆(支持输入经纬度中心点和米半径),返回CLineString

收藏 0 0

登录 后评论。没有帐号? 注册 一个。

周峰

研发
  • 0 回答
  • 0 粉丝
  • 0 关注