问题
在QGIS二次开发中,QgsWkbTypes这一类下,有Type和GeometryType这两类,其中Typey这类使用 wkbType() 来调出,GeometryType这一类用geometryType()来调出。
我们打开<qgsvectorlayer.h>可以看到 两者是分开的:
- 如果想使用wkbType()可以使用语句:
vectorLayer->wkbType() ;
- 如果想使用geometryType()可以使用语句:
vectorLayer->geometryType() ;
差异性
那么两者差在哪里呢? 为什么非得把两者分开表述? 我们可以进一步看源代码。
我们打开<qgswkbtypes.h>,可以看到对Type类型的枚举,里面大大小小有几十种类型。同样是点,有point,multiPoint, Point25D 等等。
(关于什么是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;
}