/usr/include/qgis/qgsabstractgeometryv2.h is in libqgis-dev 2.18.17+dfsg-1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
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 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 | /***************************************************************************
qgsabstractgeometryv2.h
-------------------------------------------------------------------
Date : 04 Sept 2014
Copyright : (C) 2014 by Marco Hugentobler
email : marco.hugentobler at sourcepole dot com
***************************************************************************
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
***************************************************************************/
#ifndef QGSABSTRACTGEOMETRYV2
#define QGSABSTRACTGEOMETRYV2
#include "qgscoordinatetransform.h"
#include "qgsrectangle.h"
#include "qgswkbtypes.h"
#include "qgswkbptr.h"
#include <QString>
class QgsMapToPixel;
class QgsCurveV2;
class QgsMultiCurveV2;
class QgsMultiPointV2;
class QgsPointV2;
struct QgsVertexId;
class QPainter;
typedef QList< QgsPointV2 > QgsPointSequenceV2;
typedef QList< QgsPointSequenceV2 > QgsRingSequenceV2;
typedef QList< QgsRingSequenceV2 > QgsCoordinateSequenceV2;
/** \ingroup core
* \class QgsAbstractGeometryV2
* \brief Abstract base class for all geometries
* \note added in QGIS 2.10
*/
class CORE_EXPORT QgsAbstractGeometryV2
{
public:
/** Segmentation tolerance as maximum angle or maximum difference between approximation and circle*/
enum SegmentationToleranceType
{
MaximumAngle = 0,
MaximumDifference
};
QgsAbstractGeometryV2();
virtual ~QgsAbstractGeometryV2();
QgsAbstractGeometryV2( const QgsAbstractGeometryV2& geom );
virtual QgsAbstractGeometryV2& operator=( const QgsAbstractGeometryV2& geom );
/** Clones the geometry by performing a deep copy
*/
virtual QgsAbstractGeometryV2* clone() const = 0;
/** Clears the geometry, ie reset it to a null geometry
*/
virtual void clear() = 0;
/** Returns the minimal bounding box for the geometry
*/
virtual QgsRectangle boundingBox() const = 0;
//mm-sql interface
/** Returns the inherent dimension of the geometry. For example, this is 0 for a point geometry,
* 1 for a linestring and 2 for a polygon.
*/
virtual int dimension() const = 0;
//virtual int coordDim() const { return mCoordDimension; }
/** Returns a unique string representing the geometry type.
* @see wkbType
* @see wktTypeStr
*/
virtual QString geometryType() const = 0;
/** Returns the WKB type of the geometry.
* @see geometryType
* @see wktTypeStr
*/
QgsWKBTypes::Type wkbType() const { return mWkbType; }
/** Returns the WKT type string of the geometry.
* @see geometryType
* @see wkbType
*/
QString wktTypeStr() const;
/** Returns true if the geometry is 3D and contains a z-value.
* @see isMeasure
*/
bool is3D() const;
/** Returns true if the geometry contains m values.
* @see is3D
*/
bool isMeasure() const;
#if 0
virtual bool transform( const QgsCoordinateTransform& ct ) = 0;
virtual bool isEmpty() const = 0;
virtual bool isSimple() const = 0;
virtual bool isValid() const = 0;
virtual QgsMultiPointV2* locateAlong() const = 0;
virtual QgsMultiCurveV2* locateBetween() const = 0;
virtual QgsRectangle envelope() const = 0;
#endif
/** Returns the closure of the combinatorial boundary of the geometry (ie the topological boundary of the geometry).
* For instance, a polygon geometry will have a boundary consisting of the linestrings for each ring in the polygon.
* @returns boundary for geometry. May be null for some geometry types.
* @note added in QGIS 2.18
*/
virtual QgsAbstractGeometryV2* boundary() const = 0;
//import
/** Sets the geometry from a WKB string.
* @see fromWkt
*/
virtual bool fromWkb( QgsConstWkbPtr wkb ) = 0;
/** Sets the geometry from a WKT string.
* @see fromWkb
*/
virtual bool fromWkt( const QString& wkt ) = 0;
//export
/** Returns the size of the WKB representation of the geometry.
* @see asWkb
*/
virtual int wkbSize() const = 0;
/** Returns a WKB representation of the geometry.
* @param binarySize will be set to the size of the returned WKB string
* @see wkbSize
* @see asWkt
* @see asGML2
* @see asGML3
* @see asJSON
*/
virtual unsigned char* asWkb( int& binarySize ) const = 0;
/** Returns a WKT representation of the geometry.
* @param precision number of decimal places for coordinates
* @see asWkb
* @see asGML2
* @see asGML3
* @see asJSON
*/
virtual QString asWkt( int precision = 17 ) const = 0;
/** Returns a GML2 representation of the geometry.
* @param doc DOM document
* @param precision number of decimal places for coordinates
* @param ns XML namespace
* @see asWkb
* @see asWkt
* @see asGML3
* @see asJSON
*/
virtual QDomElement asGML2( QDomDocument& doc, int precision = 17, const QString& ns = "gml" ) const = 0;
/** Returns a GML3 representation of the geometry.
* @param doc DOM document
* @param precision number of decimal places for coordinates
* @param ns XML namespace
* @see asWkb
* @see asWkt
* @see asGML2
* @see asJSON
*/
virtual QDomElement asGML3( QDomDocument& doc, int precision = 17, const QString& ns = "gml" ) const = 0;
/** Returns a GeoJSON representation of the geometry.
* @param precision number of decimal places for coordinates
* @see asWkb
* @see asWkt
* @see asGML2
* @see asGML3
*/
virtual QString asJSON( int precision = 17 ) const = 0;
//render pipeline
/** Transforms the geometry using a coordinate transform
* @param ct coordinate transform
* @param d transformation direction
* @param transformZ set to true to also transform z coordinates. This requires that
* the z coordinates in the geometry represent height relative to the vertical datum
* of the source CRS (generally ellipsoidal heights) and are expressed in its vertical
* units (generally meters). If false, then z coordinates will not be changed by the
* transform.
*/
virtual void transform( const QgsCoordinateTransform& ct, QgsCoordinateTransform::TransformDirection d = QgsCoordinateTransform::ForwardTransform,
bool transformZ = false ) = 0;
/** Transforms the geometry using a QTransform object
* @param t QTransform transformation
*/
virtual void transform( const QTransform& t ) = 0;
#if 0
virtual void clip( const QgsRectangle& rect ); //todo
#endif
/** Draws the geometry using the specified QPainter.
* @param p destination QPainter
*/
virtual void draw( QPainter& p ) const = 0;
/** Returns next vertex id and coordinates
* @param id initial value should be the starting vertex id. The next vertex id will be stored
* in this variable if found.
* @param vertex container for found node
* @return false if at end
*/
virtual bool nextVertex( QgsVertexId& id, QgsPointV2& vertex ) const = 0;
/** Retrieves the sequence of geometries, rings and nodes.
* @return coordinate sequence
*/
virtual QgsCoordinateSequenceV2 coordinateSequence() const = 0;
/** Returns the number of nodes contained in the geometry
*/
virtual int nCoordinates() const;
/** Returns the point corresponding to a specified vertex id
*/
virtual QgsPointV2 vertexAt( QgsVertexId id ) const = 0;
/** Searches for the closest segment of the geometry to a given point.
* @param pt specifies the point to find closest segment to
* @param segmentPt storage for the closest point within the geometry
* @param vertexAfter storage for the ID of the vertex at the end of the closest segment
* @param leftOf returns whether the point lies on the left side of the nearest segment (true if point is to left of segment,
* false if point is to right of segment)
* @param epsilon epsilon for segment snapping
* @returns squared distance to closest segment or negative value on error
*/
virtual double closestSegment( const QgsPointV2& pt, QgsPointV2& segmentPt, QgsVertexId& vertexAfter, bool* leftOf, double epsilon ) const = 0;
//low-level editing
/** Inserts a vertex into the geometry
* @param position vertex id for position of inserted vertex
* @param vertex vertex to insert
* @returns true if insert was successful
* @see moveVertex
* @see deleteVertex
*/
virtual bool insertVertex( QgsVertexId position, const QgsPointV2& vertex ) = 0;
/** Moves a vertex within the geometry
* @param position vertex id for vertex to move
* @param newPos new position of vertex
* @returns true if move was successful
* @see insertVertex
* @see deleteVertex
*/
virtual bool moveVertex( QgsVertexId position, const QgsPointV2& newPos ) = 0;
/** Deletes a vertex within the geometry
* @param position vertex id for vertex to delete
* @returns true if delete was successful
* @see insertVertex
* @see moveVertex
*/
virtual bool deleteVertex( QgsVertexId position ) = 0;
/** Returns the length of the geometry.
* @see area()
* @see perimeter()
*/
virtual double length() const { return 0.0; }
/** Returns the perimeter of the geometry.
* @see area()
* @see length()
*/
virtual double perimeter() const { return 0.0; }
/** Returns the area of the geometry.
* @see length()
* @see perimeter()
*/
virtual double area() const { return 0.0; }
/** Returns the centroid of the geometry */
virtual QgsPointV2 centroid() const;
/** Returns true if the geometry is empty
*/
bool isEmpty() const;
/** Returns true if the geometry contains curved segments
*/
virtual bool hasCurvedSegments() const { return false; }
/** Returns a version of the geometry without curves. Caller takes ownership of
* the returned geometry.
* @param tolerance segmentation tolerance
* @param toleranceType maximum segmentation angle or maximum difference between approximation and curve
*/
virtual QgsAbstractGeometryV2* segmentize( double tolerance = M_PI / 180., SegmentationToleranceType toleranceType = MaximumAngle ) const;
/** Returns the geometry converted to the more generic curve type.
E.g. QgsLineStringV2 -> QgsCompoundCurveV2, QgsPolygonV2 -> QgsCurvePolygonV2,
QgsMultiLineStringV2 -> QgsMultiCurveV2, QgsMultiPolygonV2 -> QgsMultiSurfaceV2
@return the converted geometry. Caller takes ownership*/
virtual QgsAbstractGeometryV2* toCurveType() const { return 0; }
/** Returns approximate angle at a vertex. This is usually the average angle between adjacent
* segments, and can be pictured as the orientation of a line following the curvature of the
* geometry at the specified vertex.
* @param vertex the vertex id
* @return rotation in radians, clockwise from north
*/
virtual double vertexAngle( QgsVertexId vertex ) const = 0;
virtual int vertexCount( int part = 0, int ring = 0 ) const = 0;
virtual int ringCount( int part = 0 ) const = 0;
/** Returns count of parts contained in the geometry.
* @see vertexCount
* @see ringCount
*/
virtual int partCount() const = 0;
/** Adds a z-dimension to the geometry, initialized to a preset value.
* @param zValue initial z-value for all nodes
* @returns true on success
* @note added in QGIS 2.12
* @see dropZValue()
* @see addMValue()
*/
virtual bool addZValue( double zValue = 0 ) = 0;
/** Adds a measure to the geometry, initialized to a preset value.
* @param mValue initial m-value for all nodes
* @returns true on success
* @note added in QGIS 2.12
* @see dropMValue()
* @see addZValue()
*/
virtual bool addMValue( double mValue = 0 ) = 0;
/** Drops any z-dimensions which exist in the geometry.
* @returns true if Z values were present and have been removed
* @see addZValue()
* @see dropMValue()
* @note added in QGIS 2.14
*/
virtual bool dropZValue() = 0;
/** Drops any measure values which exist in the geometry.
* @returns true if m-values were present and have been removed
* @see addMValue()
* @see dropZValue()
* @note added in QGIS 2.14
*/
virtual bool dropMValue() = 0;
/** Converts the geometry to a specified type.
* @returns true if conversion was successful
* @note added in QGIS 2.14
*/
virtual bool convertTo( QgsWKBTypes::Type type );
protected:
QgsWKBTypes::Type mWkbType;
/** Updates the geometry type based on whether sub geometries contain z or m values.
*/
void setZMTypeFromSubGeometry( const QgsAbstractGeometryV2* subggeom, QgsWKBTypes::Type baseGeomType );
/** Default calculator for the minimal bounding box for the geometry. Derived classes should override this method
* if a more efficient bounding box calculation is available.
*/
virtual QgsRectangle calculateBoundingBox() const;
/** Clears any cached parameters associated with the geometry, eg bounding boxes
*/
virtual void clearCache() const {}
};
/** \ingroup core
* \class QgsVertexId
* \brief Utility class for identifying a unique vertex within a geometry.
* \note added in QGIS 2.10
*/
struct CORE_EXPORT QgsVertexId
{
enum VertexType
{
SegmentVertex = 1, //start / endpoint of a segment
CurveVertex
};
QgsVertexId( int _part = -1, int _ring = -1, int _vertex = -1, VertexType _type = SegmentVertex )
: part( _part )
, ring( _ring )
, vertex( _vertex )
, type( _type )
{}
/** Returns true if the vertex id is valid
*/
bool isValid() const { return part >= 0 && ring >= 0 && vertex >= 0; }
bool operator==( QgsVertexId other ) const
{
return part == other.part && ring == other.ring && vertex == other.vertex;
}
bool operator!=( QgsVertexId other ) const
{
return part != other.part || ring != other.ring || vertex != other.vertex;
}
bool partEqual( QgsVertexId o ) const
{
return part >= 0 && o.part == part;
}
bool ringEqual( QgsVertexId o ) const
{
return partEqual( o ) && ( ring >= 0 && o.ring == ring );
}
bool vertexEqual( QgsVertexId o ) const
{
return ringEqual( o ) && ( vertex >= 0 && o.ring == ring );
}
bool isValid( const QgsAbstractGeometryV2* geom ) const
{
return ( part >= 0 && part < geom->partCount() ) &&
( ring < geom->ringCount( part ) ) &&
( vertex < 0 || vertex < geom->vertexCount( part, ring ) );
}
int part;
int ring;
int vertex;
VertexType type;
};
#endif //QGSABSTRACTGEOMETRYV2
|