00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #ifndef QGSGEOMETRY_H
00018 #define QGSGEOMETRY_H
00019
00020 #include <QString>
00021 #include <QVector>
00022
00023 #include "qgis.h"
00024
00025 #include <geos_c.h>
00026
00027 #if defined(GEOS_VERSION_MAJOR) && (GEOS_VERSION_MAJOR<3)
00028 #define GEOSGeometry struct GEOSGeom_t
00029 #define GEOSCoordSequence struct GEOSCoordSeq_t
00030 #endif
00031
00032 #include "qgspoint.h"
00033 #include "qgscoordinatetransform.h"
00034
00036 typedef QVector<QgsPoint> QgsPolyline;
00037
00039 typedef QVector<QgsPolyline> QgsPolygon;
00040
00042 typedef QVector<QgsPoint> QgsMultiPoint;
00043
00045 typedef QVector<QgsPolyline> QgsMultiPolyline;
00046
00048 typedef QVector<QgsPolygon> QgsMultiPolygon;
00049
00050 class QgsRectangle;
00051
00067 class CORE_EXPORT QgsGeometry
00068 {
00069 public:
00071 QgsGeometry();
00072
00074 QgsGeometry( QgsGeometry const & );
00075
00077 QgsGeometry & operator=( QgsGeometry const & rhs );
00078
00080 ~QgsGeometry();
00081
00083 static QgsGeometry* fromWkt( QString wkt );
00084
00086 static QgsGeometry* fromPoint( const QgsPoint& point );
00088 static QgsGeometry* fromMultiPoint( const QgsMultiPoint& multipoint );
00090 static QgsGeometry* fromPolyline( const QgsPolyline& polyline );
00092 static QgsGeometry* fromMultiPolyline( const QgsMultiPolyline& multiline );
00094 static QgsGeometry* fromPolygon( const QgsPolygon& polygon );
00096 static QgsGeometry* fromMultiPolygon( const QgsMultiPolygon& multipoly );
00098 static QgsGeometry* fromRect( const QgsRectangle& rect );
00103 void fromGeos( GEOSGeometry* geos );
00108 void fromWkb( unsigned char * wkb, size_t length );
00109
00114 unsigned char * asWkb();
00115
00119 size_t wkbSize();
00120
00123 GEOSGeometry* asGeos();
00124
00126 QGis::WkbType wkbType();
00127
00129 QGis::GeometryType type();
00130
00132 bool isMultipart();
00133
00137 bool isGeosEqual( QgsGeometry & );
00138
00142 bool isGeosValid();
00143
00147 bool isGeosEmpty();
00148
00152 double area();
00153
00157 double length();
00158
00159 double distance( QgsGeometry& geom );
00160
00165 QgsPoint closestVertex( const QgsPoint& point, int& atVertex, int& beforeVertex, int& afterVertex, double& sqrDist );
00166
00167
00180 void adjacentVertices( int atVertex, int& beforeVertex, int& afterVertex );
00181
00182
00194 bool insertVertex( double x, double y, int beforeVertex );
00195
00202 bool moveVertex( double x, double y, int atVertex );
00203
00214 bool deleteVertex( int atVertex );
00215
00221 QgsPoint vertexAt( int atVertex );
00222
00229 double sqrDistToVertexAt( QgsPoint& point, int atVertex );
00230
00237 double closestVertexWithContext( const QgsPoint& point, int& atVertex );
00238
00247 double closestSegmentWithContext( const QgsPoint& point, QgsPoint& minDistPoint, int& beforeVertex );
00248
00252 int addRing( const QList<QgsPoint>& ring );
00253
00257 int addIsland( const QList<QgsPoint>& ring );
00258
00261 int translate( double dx, double dy );
00262
00265 int transform( const QgsCoordinateTransform& ct );
00266
00274 int splitGeometry( const QList<QgsPoint>& splitLine,
00275 QList<QgsGeometry*>&newGeometries,
00276 bool topological,
00277 QList<QgsPoint> &topologyTestPoints );
00278
00282 int reshapeGeometry( const QList<QgsPoint>& reshapeWithLine );
00283
00287 int makeDifference( QgsGeometry* other );
00288
00290 QgsRectangle boundingBox();
00291
00293 bool intersects( const QgsRectangle& r );
00294
00296 bool intersects( QgsGeometry* geometry );
00297
00299 bool contains( QgsPoint* p );
00300
00303 bool contains( QgsGeometry* geometry );
00304
00307 bool disjoint( QgsGeometry* geometry );
00308
00311 bool equals( QgsGeometry* geometry );
00312
00315 bool touches( QgsGeometry* geometry );
00316
00319 bool overlaps( QgsGeometry* geometry );
00320
00323 bool within( QgsGeometry* geometry );
00324
00327 bool crosses( QgsGeometry* geometry );
00328
00331 QgsGeometry* buffer( double distance, int segments );
00332
00334 QgsGeometry* simplify( double tolerance );
00335
00339 QgsGeometry* centroid();
00340
00342 QgsGeometry* convexHull();
00343
00345 QgsGeometry* intersection( QgsGeometry* geometry );
00346
00350 QgsGeometry* combine( QgsGeometry* geometry );
00351
00353 QgsGeometry* difference( QgsGeometry* geometry );
00354
00356 QgsGeometry* symDifference( QgsGeometry* geometry );
00357
00361 QString exportToWkt();
00362
00363
00364
00367 QgsPoint asPoint();
00368
00371 QgsPolyline asPolyline();
00372
00375 QgsPolygon asPolygon();
00376
00379 QgsMultiPoint asMultiPoint();
00380
00383 QgsMultiPolyline asMultiPolyline();
00384
00387 QgsMultiPolygon asMultiPolygon();
00388
00391 QList<QgsGeometry*> asGeometryCollection();
00392
00397 bool deleteRing( int ringNum, int partNum = 0 );
00398
00402 bool deletePart( int partNum );
00403
00407 bool convertToMultiType();
00408
00416 int avoidIntersections();
00417
00418
00419 class Error
00420 {
00421 QString message;
00422 QgsPoint location;
00423 bool hasLocation;
00424 public:
00425 Error( QString m ) : message( m ), hasLocation( false ) {}
00426 Error( QString m, QgsPoint p ) : message( m ), location( p ), hasLocation( true ) {}
00427
00428 QString what() { return message; };
00429 QgsPoint where() { return location; }
00430 bool hasWhere() { return hasLocation; }
00431 };
00432
00436 void validateGeometry( QList<Error> &errors );
00437
00438 static void validatePolyline( QList<Error> &errors, int i, QgsPolyline polyline, bool ring = false );
00439 static void validatePolygon( QList<Error> &errors, int i, const QgsPolygon &polygon );
00440
00441 private:
00442
00443
00444
00445
00446
00447
00448
00452 unsigned char * mGeometry;
00453
00455 size_t mGeometrySize;
00456
00458 GEOSGeometry* mGeos;
00459
00461 bool mDirtyWkb;
00462
00464 bool mDirtyGeos;
00465
00466
00467
00468
00472 bool exportWkbToGeos();
00473
00477 bool exportGeosToWkb();
00478
00492 bool insertVertex( double x, double y,
00493 int beforeVertex,
00494 const GEOSCoordSequence* old_sequence,
00495 GEOSCoordSequence** new_sequence );
00496
00502 void translateVertex( int& wkbPosition, double dx, double dy, bool hasZValue );
00503
00508 void transformVertex( int& wkbPosition, const QgsCoordinateTransform& ct, bool hasZValue );
00509
00510
00511
00516 int splitLinearGeometry( GEOSGeometry *splitLine, QList<QgsGeometry*>& newGeometries );
00519 int splitPolygonGeometry( GEOSGeometry *splitLine, QList<QgsGeometry*>& newGeometries );
00522 int topologicalTestPointsSplit( const GEOSGeometry* splitLine, QList<QgsPoint>& testPoints ) const;
00523
00529 static GEOSGeometry* reshapeLine( const GEOSGeometry* origLine, const GEOSGeometry* reshapeLineGeos );
00530
00536 static GEOSGeometry* reshapePolygon( const GEOSGeometry* polygon, const GEOSGeometry* reshapeLineGeos );
00537
00540 static GEOSGeometry* nodeGeometries( const GEOSGeometry *splitLine, const GEOSGeometry *poly );
00541
00544 static int lineContainedInLine( const GEOSGeometry* line1, const GEOSGeometry* line2 );
00545
00550 static int pointContainedInLine( const GEOSGeometry* point, const GEOSGeometry* line );
00551
00553 static bool geomInDegrees( const GEOSGeometry* geom );
00554
00556 int numberOfGeometries( GEOSGeometry* g ) const;
00557
00558 int mergeGeometriesMultiTypeSplit( QVector<GEOSGeometry*>& splitResult );
00559
00561 QgsPoint asPoint( unsigned char*& ptr, bool hasZValue );
00562
00564 QgsPolyline asPolyline( unsigned char*& ptr, bool hasZValue );
00565
00567 QgsPolygon asPolygon( unsigned char*& ptr, bool hasZValue );
00568
00569 static void checkRingIntersections( QList<Error> &errors,
00570 int p0, int i0, const QgsPolyline &ring0,
00571 int p1, int i1, const QgsPolyline &ring1 );
00572
00573 static bool geosRelOp( char( *op )( const GEOSGeometry*, const GEOSGeometry * ),
00574 QgsGeometry *a, QgsGeometry *b );
00575
00576
00577 static int refcount;
00578 };
00579
00580 #endif