dmpabstractgeometry.h 4.9 KB
/**************************************************************************
* 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