dmpabstractgeometry.h
4.9 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
/**************************************************************************
* file: dmppoint.h
* Author: qingxiongf
* Date: 2021-08-03 13:48:43
* Email: qingxiongf@chinadci.com
* copyright: 广州城市信息研究所有限公司
***************************************************************************/
#ifndef __dmpabstractgeometry_h__
#define __dmpabstractgeometry_h__
#include <string>
#include "dmap_core.h"
#include "dmpwkbtypes.h"
#include "dmprectangle.h"
/**
*DmpAbstractGeometry对象本质上是笛卡尔/平面几何。他们没有大地测量学的概念,也没有
*DmpAbstractGeometry API(或DmpGeometry API)公开的方法或属性的测地线计算。
*相应地,像length()和area()这样的属性以及像centroid()这样的空间操作始终使用严格的笛卡尔数学计算。
*相反,QgsDistanceArea类公开几何体上的测地线计算和空间操作方法,
*当计算地球(或任何其他天体)的曲率时,应使用是必需的。
*/
class CORE_EXPORT DmpAbstractGeometry
{
public:
//! 分段公差为最大角度或近似值与圆之间的最大差值
enum SegmentationToleranceType
{
MaximumAngle = 0, // 生成半径(从弧中心到输出顶点的线)之间的最大角度
MaximumDifference // 原始曲面上任意点之间的最大距离曲线及其近似值上的最近点。
};
//! GML生成的轴顺序
enum AxisOrder
{
XY = 0, //X在Y之前(或lon在lat之前)
YX //Y在X之前(或lat在lon之前)
};
DmpAbstractGeometry() = default;
virtual ~DmpAbstractGeometry() = default;
DmpAbstractGeometry( const DmpAbstractGeometry &geom );
DmpAbstractGeometry &operator=( const DmpAbstractGeometry &geom );
virtual bool operator==( const DmpAbstractGeometry &other ) const = 0;
virtual bool operator!=( const DmpAbstractGeometry &other ) const = 0;
virtual DmpAbstractGeometry *clone() const = 0 ;
virtual void clear() = 0; // 清除几何体(将其重置为空几何体)
virtual DmpRectangle boundingBox() const = 0; //返回几何体的最小边界框
//返回几何图形的固有尺寸。例如,点几何图形为0,线串为1,多边形为2。
virtual int dimension() const = 0;
/** 返回表示几何图形类型的唯一字符串。 \see wkbType \see wktTypeStr */
virtual string geometryType() const = 0;
/** 返回几何图形的WKB类型。 \see geometryType \see wktTypeStr */
inline DmpWkbTypes::Type wkbType() { return mWkbType; }
/** 返回几何体的WKT类型字符串。 \see geometryType* \see wkbType */
string wktTypeStr() const;
/**如果几何体为三维且包含z值,则返回TRUE。 \see isMeasure*/
bool is3D()
{
return DmpWkbTypes::hasZ( mWkbType );
}
/**
* 如果几何体包含m个值,则返回TRUE。
* \see is3D
*/
bool isMeasure()
{
return DmpWkbTypes::hasM( mWkbType );
}
/**
* 返回几何体的组合边界(即几何体的拓扑边界)的闭包.
* 例如,多边形几何体的边界由多边形中每个环的线串组成.
* \returns 几何体的边界。对于某些几何图形类型,可能为nullptr.
*/
virtual DmpAbstractGeometry *boundary() const = 0;
//import
/**
* 从WKB字符串设置几何体。
* 成功读取后,wkb参数将位于读取停止的位置。
*/
virtual bool fromWkb( QgsConstWkbPtr &wkb ) = 0;
/** 从WKT字符串设置几何图形。*/
virtual bool fromWkt( const char* wkt ) = 0;
//export
/** WKB export flags.*/
enum WkbFlag
{
FlagExportTrianglesAsPolygons = 1 << 0, //!< 三角形应导出为多边形几何体
};
/**
* 返回asWkb()返回的字节的长度
*/
virtual int wkbSize( QgsAbstractGeometry::WkbFlags flags = QgsAbstractGeometry::WkbFlags() ) const = 0;
/** 返回几何图形的WKB表示形式。*/
virtual QByteArray asWkb( WkbFlags flags = QgsAbstractGeometry::WkbFlags() ) const = 0;
/**
* 返回几何体的WKT表示形式。
*/
virtual string asWkt( int precision = 17 ) const = 0;
virtual QDomElement asGml2( QDomDocument &doc, int precision = 17, const string &ns = "gml", AxisOrder axisOrder = QgsAbstractGeometry::AxisOrder::XY ) const = 0;
virtual QDomElement asGml3( QDomDocument &doc, int precision = 17, const string &ns = "gml", AxisOrder axisOrder = QgsAbstractGeometry::AxisOrder::XY ) const = 0;
string asJson( int precision = 17 );
virtual json asJsonObject( int precision = 17 ) const;
virtual string asKml( int precision = 17 ) const = 0;
protected:
DmpWkbTypes::Type mWkbType = DmpWkbTypes::Unknown;
};
#endif