QGIS二次开发中 Type转GeometryType

问题

在QGIS二次开发中,QgsWkbTypes这一类下,有Type和GeometryType这两类,其中Typey这类使用 wkbType() 来调出,GeometryType这一类用geometryType()来调出。
我们打开<qgsvectorlayer.h>可以看到 两者是分开的
在这里插入图片描述

  • 如果想使用wkbType()可以使用语句:
  vectorLayer->wkbType() ;
  • 如果想使用geometryType()可以使用语句:
  vectorLayer->geometryType() ;

差异性

那么两者差在哪里呢? 为什么非得把两者分开表述? 我们可以进一步看源代码。
我们打开<qgswkbtypes.h>,可以看到对Type类型的枚举,里面大大小小有几十种类型。同样是点,有pointmultiPointPoint25D 等等。
(关于什么是multiPoint可以看这篇文章

class CORE_EXPORT QgsWkbTypes
{
    Q_GADGET
  public:

    /**
     * The WKB type describes the number of dimensions a geometry has
     *
     * - Point
     * - LineString
     * - Polygon
     *
     * as well as the number of dimensions for each individual vertex
     *
     * - X (always)
     * - Y (always)
     * - Z (optional)
     * - M (measurement value, optional)
     *
     * it also has values for multi types, collections, unknown geometry,
     * null geometry, no geometry and curve support.
     *
     * These classes of geometry are often used for data sources to
     * communicate what kind of geometry should be expected for a given
     * geometry field. It is also used for tools or algorithms to decide
     * if they should be available for a given geometry type or act in
     * a different mode.
     */
    enum Type
    {
      Unknown = 0,
      Point = 1,
      LineString = 2,
      Polygon = 3,
      Triangle = 17,
      MultiPoint = 4,
      MultiLineString = 5,
      MultiPolygon = 6,
      GeometryCollection = 7,
      CircularString = 8,
      CompoundCurve = 9,
      CurvePolygon = 10, //13, //should be 10. Seems to be correct in newer PostGIS versions
      MultiCurve = 11,
      MultiSurface = 12,
      NoGeometry = 100, //attributes only
      PointZ = 1001,
      LineStringZ = 1002,
      PolygonZ = 1003,
      TriangleZ = 1017,
      MultiPointZ = 1004,
      MultiLineStringZ = 1005,
      MultiPolygonZ = 1006,
      GeometryCollectionZ = 1007,
      CircularStringZ = 1008,
      CompoundCurveZ = 1009,
      CurvePolygonZ = 1010,
      MultiCurveZ = 1011,
      MultiSurfaceZ = 1012,
      PointM = 2001,
      LineStringM = 2002,
      PolygonM = 2003,
      TriangleM = 2017,
      MultiPointM = 2004,
      MultiLineStringM = 2005,
      MultiPolygonM = 2006,
      GeometryCollectionM = 2007,
      CircularStringM = 2008,
      CompoundCurveM = 2009,
      CurvePolygonM = 2010,
      MultiCurveM = 2011,
      MultiSurfaceM = 2012,
      PointZM = 3001,
      LineStringZM = 3002,
      PolygonZM = 3003,
      MultiPointZM = 3004,
      MultiLineStringZM = 3005,
      MultiPolygonZM = 3006,
      GeometryCollectionZM = 3007,
      CircularStringZM = 3008,
      CompoundCurveZM = 3009,
      CurvePolygonZM = 3010,
      MultiCurveZM = 3011,
      MultiSurfaceZM = 3012,
      TriangleZM = 3017,
      Point25D = 0x80000001,
      LineString25D,
      Polygon25D,
      MultiPoint25D,
      MultiLineString25D,
      MultiPolygon25D
    };

那有没有办法,将同样是点要素的,归为一类呢?有,这就是geometryType。可以看到它的枚举类型就精简多了!

/**
     * The geometry types are used to group QgsWkbTypes::Type in a
     * coarse way.
     *
     * \see geometryType( QgsWkbTypes::Type )
     */
    enum GeometryType
    {
      PointGeometry,
      LineGeometry,
      PolygonGeometry,
      UnknownGeometry,
      NullGeometry
    };
    Q_ENUM( GeometryType )

它自己也说了geometryType是“Type in a coarse(粗糙) way.”

转换

转换的代码当然是直接if 判断了,但是后来发现更加严格的type分类确实有它的道理,所以这个代码就作废了。记录在这里以备不时之需。

//wkbType转GeometryType
QgsWkbTypes::GeometryType LayerMergeWin::wkbTypeToGeometryType(QgsVectorLayer * layer)
{
	if (layer->wkbType() == QgsWkbTypes::Point || layer->wkbType() == QgsWkbTypes::Point25D || layer->wkbType() == QgsWkbTypes::MultiPoint || layer->wkbType() == QgsWkbTypes::MultiPoint25D)
		return QgsWkbTypes::PointGeometry;

	else if (layer->wkbType() == QgsWkbTypes::LineString || layer->wkbType() == QgsWkbTypes::LineString25D || layer->wkbType() == QgsWkbTypes::MultiLineString || layer->wkbType() == QgsWkbTypes::MultiLineString25D)
		return QgsWkbTypes::LineGeometry;

	else if (layer->wkbType() == QgsWkbTypes::Polygon || layer->wkbType() == QgsWkbTypes::Polygon25D || layer->wkbType() == QgsWkbTypes::MultiPolygon || layer->wkbType() == QgsWkbTypes::MultiPolygon25D)
		return QgsWkbTypes::PolygonGeometry;

else return  QgsWkbTypes::UnknownGeometry;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值