00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031 #ifndef _OGR_GEOMETRY_H_INCLUDED
00032 #define _OGR_GEOMETRY_H_INCLUDED
00033
00034 #include "ogr_core.h"
00035 #include "ogr_spatialref.h"
00036
00046 class OGRRawPoint
00047 {
00048 public:
00049 OGRRawPoint()
00050 {
00051 x = y = 0.0;
00052 }
00053 double x;
00054 double y;
00055 };
00056
00057 typedef struct GEOSGeom_t *GEOSGeom;
00058
00059
00060
00061
00062
00063 class OGRPoint;
00064
00077 class CPL_DLL OGRGeometry
00078 {
00079 private:
00080 OGRSpatialReference * poSRS;
00081
00082 protected:
00083 int nCoordDimension;
00084
00085 public:
00086 OGRGeometry();
00087 virtual ~OGRGeometry();
00088
00089
00090 virtual int getDimension() const = 0;
00091 virtual int getCoordinateDimension() const;
00092 virtual OGRBoolean IsEmpty() const = 0;
00093 virtual OGRBoolean IsValid() const;
00094 virtual OGRBoolean IsSimple() const;
00095 virtual OGRBoolean IsRing() const;
00096 virtual void empty() = 0;
00097 virtual OGRGeometry *clone() const = 0;
00098 virtual void getEnvelope( OGREnvelope * psEnvelope ) const = 0;
00099
00100
00101 virtual int WkbSize() const = 0;
00102 virtual OGRErr importFromWkb( unsigned char *, int=-1 )=0;
00103 virtual OGRErr exportToWkb( OGRwkbByteOrder, unsigned char * ) const = 0;
00104 virtual OGRErr importFromWkt( char ** ppszInput ) = 0;
00105 virtual OGRErr exportToWkt( char ** ppszDstText ) const = 0;
00106
00107
00108 virtual OGRwkbGeometryType getGeometryType() const = 0;
00109 virtual const char *getGeometryName() const = 0;
00110 virtual void dumpReadable( FILE *, const char * = NULL, char** papszOptions = NULL ) const;
00111 virtual void flattenTo2D() = 0;
00112 virtual char * exportToGML( const char* const * papszOptions = NULL ) const;
00113 virtual char * exportToKML() const;
00114 virtual char * exportToJson() const;
00115 virtual GEOSGeom exportToGEOS() const;
00116 virtual void closeRings();
00117
00118 virtual void setCoordinateDimension( int nDimension );
00119
00120 void assignSpatialReference( OGRSpatialReference * poSR );
00121 OGRSpatialReference *getSpatialReference( void ) const { return poSRS; }
00122
00123 virtual OGRErr transform( OGRCoordinateTransformation *poCT ) = 0;
00124 OGRErr transformTo( OGRSpatialReference *poSR );
00125
00126 virtual void segmentize(double dfMaxLength);
00127
00128
00129 virtual OGRBoolean Intersects( OGRGeometry * ) const;
00130 virtual OGRBoolean Equals( OGRGeometry * ) const = 0;
00131 virtual OGRBoolean Disjoint( const OGRGeometry * ) const;
00132 virtual OGRBoolean Touches( const OGRGeometry * ) const;
00133 virtual OGRBoolean Crosses( const OGRGeometry * ) const;
00134 virtual OGRBoolean Within( const OGRGeometry * ) const;
00135 virtual OGRBoolean Contains( const OGRGeometry * ) const;
00136 virtual OGRBoolean Overlaps( const OGRGeometry * ) const;
00137
00138
00139 virtual OGRGeometry *Boundary() const;
00140 virtual double Distance( const OGRGeometry * ) const;
00141 virtual OGRGeometry *ConvexHull() const;
00142 virtual OGRGeometry *Buffer( double dfDist, int nQuadSegs = 30 ) const;
00143 virtual OGRGeometry *Intersection( const OGRGeometry *) const;
00144 virtual OGRGeometry *Union( const OGRGeometry * ) const;
00145 virtual OGRGeometry *UnionCascaded() const;
00146 virtual OGRGeometry *Difference( const OGRGeometry * ) const;
00147 virtual OGRGeometry *SymDifference( const OGRGeometry * ) const;
00148 virtual OGRErr Centroid( OGRPoint * poPoint ) const;
00149 virtual OGRGeometry *Simplify(double dTolerance) const;
00150
00151
00152 OGRBoolean Intersect( OGRGeometry * ) const;
00153 OGRBoolean Equal( OGRGeometry * ) const;
00154 virtual OGRGeometry *SymmetricDifference( const OGRGeometry * ) const;
00155 virtual OGRGeometry *getBoundary() const;
00156
00157
00158 static int bGenerate_DB2_V72_BYTE_ORDER;
00159
00160 virtual void swapXY();
00161 };
00162
00163
00164
00165
00166
00173 class CPL_DLL OGRPoint : public OGRGeometry
00174 {
00175 double x;
00176 double y;
00177 double z;
00178
00179 public:
00180 OGRPoint();
00181 OGRPoint( double x, double y );
00182 OGRPoint( double x, double y, double z );
00183 virtual ~OGRPoint();
00184
00185
00186 virtual int WkbSize() const;
00187 virtual OGRErr importFromWkb( unsigned char *, int=-1 );
00188 virtual OGRErr exportToWkb( OGRwkbByteOrder, unsigned char * ) const;
00189 virtual OGRErr importFromWkt( char ** );
00190 virtual OGRErr exportToWkt( char ** ppszDstText ) const;
00191
00192
00193 virtual int getDimension() const;
00194 virtual OGRGeometry *clone() const;
00195 virtual void empty();
00196 virtual void getEnvelope( OGREnvelope * psEnvelope ) const;
00197 virtual OGRBoolean IsEmpty() const;
00198
00199
00200 double getX() const { return x; }
00201 double getY() const { return y; }
00202 double getZ() const { return z; }
00203
00204
00205 virtual void setCoordinateDimension( int nDimension );
00206 void setX( double xIn ) { x = xIn; if (nCoordDimension == 0) nCoordDimension = 2; }
00207 void setY( double yIn ) { y = yIn; if (nCoordDimension == 0) nCoordDimension = 2; }
00208 void setZ( double zIn ) { z = zIn; nCoordDimension=3; }
00209
00210
00211 virtual OGRBoolean Equals( OGRGeometry * ) const;
00212
00213
00214 virtual const char *getGeometryName() const;
00215 virtual OGRwkbGeometryType getGeometryType() const;
00216 virtual OGRErr transform( OGRCoordinateTransformation *poCT );
00217 virtual void flattenTo2D();
00218
00219 virtual void swapXY();
00220 };
00221
00222
00223
00224
00225
00230 class CPL_DLL OGRCurve : public OGRGeometry
00231 {
00232 public:
00233 OGRCurve();
00234 virtual ~OGRCurve();
00235
00236 virtual double get_Length() const = 0;
00237 virtual void StartPoint(OGRPoint *) const = 0;
00238 virtual void EndPoint(OGRPoint *) const = 0;
00239 virtual int get_IsClosed() const;
00240 virtual void Value( double, OGRPoint * ) const = 0;
00241
00242 };
00243
00244
00245
00246
00247
00252 class CPL_DLL OGRLineString : public OGRCurve
00253 {
00254 protected:
00255 int nPointCount;
00256 OGRRawPoint *paoPoints;
00257 double *padfZ;
00258
00259 void Make3D();
00260 void Make2D();
00261
00262 public:
00263 OGRLineString();
00264 virtual ~OGRLineString();
00265
00266
00267 virtual int WkbSize() const;
00268 virtual OGRErr importFromWkb( unsigned char *, int = -1 );
00269 virtual OGRErr exportToWkb( OGRwkbByteOrder, unsigned char * ) const;
00270 virtual OGRErr importFromWkt( char ** );
00271 virtual OGRErr exportToWkt( char ** ppszDstText ) const;
00272
00273
00274 virtual int getDimension() const;
00275 virtual OGRGeometry *clone() const;
00276 virtual void empty();
00277 virtual void getEnvelope( OGREnvelope * psEnvelope ) const;
00278 virtual OGRBoolean IsEmpty() const;
00279
00280
00281 virtual double get_Length() const;
00282 virtual void StartPoint(OGRPoint *) const;
00283 virtual void EndPoint(OGRPoint *) const;
00284 virtual void Value( double, OGRPoint * ) const;
00285
00286
00287 int getNumPoints() const { return nPointCount; }
00288 void getPoint( int, OGRPoint * ) const;
00289 double getX( int i ) const { return paoPoints[i].x; }
00290 double getY( int i ) const { return paoPoints[i].y; }
00291 double getZ( int i ) const;
00292
00293
00294 virtual OGRBoolean Equals( OGRGeometry * ) const;
00295
00296
00297 virtual void setCoordinateDimension( int nDimension );
00298 void setNumPoints( int );
00299 void setPoint( int, OGRPoint * );
00300 void setPoint( int, double, double );
00301 void setPoint( int, double, double, double );
00302 void setPoints( int, OGRRawPoint *, double * = NULL );
00303 void setPoints( int, double * padfX, double * padfY,
00304 double *padfZ = NULL );
00305 void addPoint( OGRPoint * );
00306 void addPoint( double, double );
00307 void addPoint( double, double, double );
00308
00309 void getPoints( OGRRawPoint *, double * = NULL ) const;
00310
00311 void addSubLineString( const OGRLineString *,
00312 int nStartVertex = 0, int nEndVertex = -1 );
00313
00314
00315 virtual OGRwkbGeometryType getGeometryType() const;
00316 virtual const char *getGeometryName() const;
00317 virtual OGRErr transform( OGRCoordinateTransformation *poCT );
00318 virtual void flattenTo2D();
00319 virtual void segmentize(double dfMaxLength);
00320
00321 virtual void swapXY();
00322 };
00323
00324
00325
00326
00327
00346 class CPL_DLL OGRLinearRing : public OGRLineString
00347 {
00348 private:
00349 friend class OGRPolygon;
00350
00351
00352 virtual int _WkbSize( int b3D ) const;
00353 virtual OGRErr _importFromWkb( OGRwkbByteOrder, int b3D,
00354 unsigned char *, int=-1 );
00355 virtual OGRErr _exportToWkb( OGRwkbByteOrder, int b3D,
00356 unsigned char * ) const;
00357
00358 public:
00359 OGRLinearRing();
00360 OGRLinearRing( OGRLinearRing * );
00361 ~OGRLinearRing();
00362
00363
00364 virtual const char *getGeometryName() const;
00365 virtual OGRGeometry *clone() const;
00366 virtual int isClockwise() const;
00367 virtual void reverseWindingOrder();
00368 virtual void closeRings();
00369 virtual double get_Area() const;
00370 OGRBoolean isPointInRing(const OGRPoint* pt, int bTestEnvelope = TRUE) const;
00371 OGRBoolean isPointOnRingBoundary(const OGRPoint* pt, int bTestEnvelope = TRUE) const;
00372
00373
00374
00375
00376 virtual int WkbSize() const;
00377 virtual OGRErr importFromWkb( unsigned char *, int=-1 );
00378 virtual OGRErr exportToWkb( OGRwkbByteOrder, unsigned char * ) const;
00379 };
00380
00381
00382
00383
00384
00389 class CPL_DLL OGRSurface : public OGRGeometry
00390 {
00391 public:
00392 virtual double get_Area() const = 0;
00393 virtual OGRErr PointOnSurface( OGRPoint * poPoint ) const = 0;
00394 };
00395
00396
00397
00398
00399
00409 class CPL_DLL OGRPolygon : public OGRSurface
00410 {
00411 int nRingCount;
00412 OGRLinearRing **papoRings;
00413
00414 public:
00415 OGRPolygon();
00416 virtual ~OGRPolygon();
00417
00418
00419 virtual const char *getGeometryName() const;
00420 virtual OGRwkbGeometryType getGeometryType() const;
00421 virtual OGRGeometry *clone() const;
00422 virtual void empty();
00423 virtual OGRErr transform( OGRCoordinateTransformation *poCT );
00424 virtual void flattenTo2D();
00425 virtual OGRBoolean IsEmpty() const;
00426 virtual void segmentize(double dfMaxLength);
00427
00428
00429 virtual double get_Area() const;
00430 virtual int PointOnSurface( OGRPoint * poPoint ) const;
00431
00432
00433 virtual int WkbSize() const;
00434 virtual OGRErr importFromWkb( unsigned char *, int = -1 );
00435 virtual OGRErr exportToWkb( OGRwkbByteOrder, unsigned char * ) const;
00436 virtual OGRErr importFromWkt( char ** );
00437 virtual OGRErr exportToWkt( char ** ppszDstText ) const;
00438
00439
00440 virtual int getDimension() const;
00441 virtual void getEnvelope( OGREnvelope * psEnvelope ) const;
00442
00443
00444 virtual OGRBoolean Equals( OGRGeometry * ) const;
00445
00446
00447 virtual void setCoordinateDimension( int nDimension );
00448
00449 void addRing( OGRLinearRing * );
00450 void addRingDirectly( OGRLinearRing * );
00451
00452 OGRLinearRing *getExteriorRing();
00453 const OGRLinearRing *getExteriorRing() const;
00454 int getNumInteriorRings() const;
00455 OGRLinearRing *getInteriorRing( int );
00456 const OGRLinearRing *getInteriorRing( int ) const;
00457
00458 OGRBoolean IsPointOnSurface( const OGRPoint * ) const;
00459
00460 virtual void closeRings();
00461
00462 virtual void swapXY();
00463 };
00464
00465
00466
00467
00468
00476 class CPL_DLL OGRGeometryCollection : public OGRGeometry
00477 {
00478 int nGeomCount;
00479 OGRGeometry **papoGeoms;
00480
00481 public:
00482 OGRGeometryCollection();
00483 virtual ~OGRGeometryCollection();
00484
00485
00486 virtual const char *getGeometryName() const;
00487 virtual OGRwkbGeometryType getGeometryType() const;
00488 virtual OGRGeometry *clone() const;
00489 virtual void empty();
00490 virtual OGRErr transform( OGRCoordinateTransformation *poCT );
00491 virtual void flattenTo2D();
00492 virtual OGRBoolean IsEmpty() const;
00493 virtual void segmentize(double dfMaxLength);
00494
00495
00496 virtual int WkbSize() const;
00497 virtual OGRErr importFromWkb( unsigned char *, int = -1 );
00498 virtual OGRErr exportToWkb( OGRwkbByteOrder, unsigned char * ) const;
00499 virtual OGRErr importFromWkt( char ** );
00500 virtual OGRErr exportToWkt( char ** ppszDstText ) const;
00501
00502 virtual double get_Length() const;
00503 virtual double get_Area() const;
00504
00505
00506 virtual int getDimension() const;
00507 virtual void getEnvelope( OGREnvelope * psEnvelope ) const;
00508
00509
00510 int getNumGeometries() const;
00511 OGRGeometry *getGeometryRef( int );
00512 const OGRGeometry *getGeometryRef( int ) const;
00513
00514
00515 virtual OGRBoolean Equals( OGRGeometry * ) const;
00516
00517
00518 virtual void setCoordinateDimension( int nDimension );
00519 virtual OGRErr addGeometry( const OGRGeometry * );
00520 virtual OGRErr addGeometryDirectly( OGRGeometry * );
00521 virtual OGRErr removeGeometry( int iIndex, int bDelete = TRUE );
00522
00523 void closeRings();
00524
00525 virtual void swapXY();
00526 };
00527
00528
00529
00530
00531
00539 class CPL_DLL OGRMultiPolygon : public OGRGeometryCollection
00540 {
00541 public:
00542 OGRMultiPolygon();
00543
00544 virtual const char *getGeometryName() const;
00545 virtual OGRwkbGeometryType getGeometryType() const;
00546 virtual OGRGeometry *clone() const;
00547 virtual OGRErr importFromWkt( char ** );
00548 virtual OGRErr exportToWkt( char ** ) const;
00549
00550
00551 virtual OGRErr addGeometryDirectly( OGRGeometry * );
00552
00553 virtual double get_Area() const;
00554 };
00555
00556
00557
00558
00559
00564 class CPL_DLL OGRMultiPoint : public OGRGeometryCollection
00565 {
00566 private:
00567 OGRErr importFromWkt_Bracketed( char **, int bHasM, int bHasZ );
00568
00569 public:
00570 OGRMultiPoint();
00571
00572 virtual const char *getGeometryName() const;
00573 virtual OGRwkbGeometryType getGeometryType() const;
00574 virtual OGRGeometry *clone() const;
00575 virtual OGRErr importFromWkt( char ** );
00576 virtual OGRErr exportToWkt( char ** ) const;
00577
00578
00579 virtual OGRErr addGeometryDirectly( OGRGeometry * );
00580 };
00581
00582
00583
00584
00585
00590 class CPL_DLL OGRMultiLineString : public OGRGeometryCollection
00591 {
00592 public:
00593 OGRMultiLineString();
00594 ~OGRMultiLineString();
00595
00596 virtual const char *getGeometryName() const;
00597 virtual OGRwkbGeometryType getGeometryType() const;
00598 virtual OGRGeometry *clone() const;
00599 virtual OGRErr importFromWkt( char ** );
00600 virtual OGRErr exportToWkt( char ** ) const;
00601
00602
00603 virtual OGRErr addGeometryDirectly( OGRGeometry * );
00604 };
00605
00606
00607
00608
00609
00610
00615 class CPL_DLL OGRGeometryFactory
00616 {
00617 public:
00618 static OGRErr createFromWkb( unsigned char *, OGRSpatialReference *,
00619 OGRGeometry **, int = -1 );
00620 static OGRErr createFromWkt( char **, OGRSpatialReference *,
00621 OGRGeometry ** );
00622 static OGRErr createFromFgf( unsigned char *, OGRSpatialReference *,
00623 OGRGeometry **, int = -1, int * = NULL );
00624 static OGRGeometry *createFromGML( const char * );
00625 static OGRGeometry *createFromGEOS( GEOSGeom );
00626
00627 static void destroyGeometry( OGRGeometry * );
00628 static OGRGeometry *createGeometry( OGRwkbGeometryType );
00629
00630 static OGRGeometry * forceToPolygon( OGRGeometry * );
00631 static OGRGeometry * forceToMultiPolygon( OGRGeometry * );
00632 static OGRGeometry * forceToMultiPoint( OGRGeometry * );
00633 static OGRGeometry * forceToMultiLineString( OGRGeometry * );
00634
00635 static OGRGeometry * organizePolygons( OGRGeometry **papoPolygons,
00636 int nPolygonCount,
00637 int *pbResultValidGeometry,
00638 const char **papszOptions = NULL);
00639
00640 static void *getGEOSGeometryFactory();
00641
00642 static int haveGEOS();
00643
00644 static OGRGeometry* transformWithOptions( const OGRGeometry* poSrcGeom,
00645 OGRCoordinateTransformation *poCT,
00646 char** papszOptions );
00647
00648 static OGRGeometry*
00649 approximateArcAngles( double dfX, double dfY, double dfZ,
00650 double dfPrimaryRadius, double dfSecondaryAxis,
00651 double dfRotation,
00652 double dfStartAngle, double dfEndAngle,
00653 double dfMaxAngleStepSizeDegrees );
00654 };
00655
00656 OGRwkbGeometryType CPL_DLL OGRFromOGCGeomType( const char *pszGeomType );
00657 const char CPL_DLL * OGRToOGCGeomType( OGRwkbGeometryType eGeomType );
00658
00659 #endif