几何对象是空间要素的基本组成部分,也是进行增删改操作、空间查询和分析的基本单位。EV-Globe SDK提供了十余种几何对象,除常见的点、线、面、几何对象之外,还提供了复杂的几何对象如多点类型、曲线环、圆弧、椭圆弧、圆面、三角面、矩形面、贝赛尔曲线、贝赛尔曲面等几何对象。
类结构图
说明:
1.绿色框最最常用的类型,也是最终写入到数据集的类型(包括CMultiPoint)
2.蓝色框的对象也较为常用,尤其是CLineString
3.CLineString为构建线面的基础对象,也可直接使用用来存储、空间计算、变换等。,可从CLineString中获取坐标系串,其他曲线对象可通过toLineString转为坐标串组成的线对象
4.CCurvePath为构建线面的中间对象,表示首位相连的线的集合
5.CCurveRing为构建面的中间对象,表示环
构建流程
CPoint,CMultiPoint (略)
CPolyline
构建CLineString,通过add方法加点
构建CCurvePath,通过add方法加入构建好的CLineString
构建CPolyline,通过add方法传入构建好的CCurvePath
CPolygon
构建CLineString,通过add方法加点
构建CCurveRing,通过add方法加入构建好的CLineString
构建CPolygon,通过addExteriorRing和addInteriorRing添加内外环,类型为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