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
00072 class CPL_DLL OGRGeometry
00073 {
00074 private:
00075 OGRSpatialReference * poSRS;
00076
00077 protected:
00078 int nCoordDimension;
00079
00080 public:
00081 OGRGeometry();
00082 virtual ~OGRGeometry();
00083
00084
00085 virtual int getDimension() const = 0;
00086 virtual int getCoordinateDimension() const;
00087 virtual OGRBoolean IsEmpty() const = 0;
00088 virtual OGRBoolean IsValid() const;
00089 virtual OGRBoolean IsSimple() const;
00090 virtual OGRBoolean IsRing() const;
00091 virtual void empty() = 0;
00092 virtual OGRGeometry *clone() const = 0;
00093 virtual void getEnvelope( OGREnvelope * psEnvelope ) const = 0;
00094
00095
00096 virtual int WkbSize() const = 0;
00097 virtual OGRErr importFromWkb( unsigned char *, int=-1 )=0;
00098 virtual OGRErr exportToWkb( OGRwkbByteOrder, unsigned char * ) const = 0;
00099 virtual OGRErr importFromWkt( char ** ppszInput ) = 0;
00100 virtual OGRErr exportToWkt( char ** ppszDstText ) const = 0;
00101
00102
00103 virtual OGRwkbGeometryType getGeometryType() const = 0;
00104 virtual const char *getGeometryName() const = 0;
00105 virtual void dumpReadable( FILE *, const char * = NULL ) const;
00106 virtual void flattenTo2D() = 0;
00107 virtual char * exportToGML() const;
00108 virtual char * exportToKML() const;
00109 virtual char * exportToJson() const;
00110 virtual GEOSGeom exportToGEOS() const;
00111 virtual void closeRings();
00112
00113 virtual void setCoordinateDimension( int nDimension );
00114
00115 void assignSpatialReference( OGRSpatialReference * poSR );
00116 OGRSpatialReference *getSpatialReference( void ) const { return poSRS; }
00117
00118 virtual OGRErr transform( OGRCoordinateTransformation *poCT ) = 0;
00119 OGRErr transformTo( OGRSpatialReference *poSR );
00120
00121
00122 virtual OGRBoolean Intersects( OGRGeometry * ) const;
00123 virtual OGRBoolean Equals( OGRGeometry * ) const = 0;
00124 virtual OGRBoolean Disjoint( const OGRGeometry * ) const;
00125 virtual OGRBoolean Touches( const OGRGeometry * ) const;
00126 virtual OGRBoolean Crosses( const OGRGeometry * ) const;
00127 virtual OGRBoolean Within( const OGRGeometry * ) const;
00128 virtual OGRBoolean Contains( const OGRGeometry * ) const;
00129 virtual OGRBoolean Overlaps( const OGRGeometry * ) const;
00130
00131
00132 virtual OGRGeometry *getBoundary() const;
00133 virtual double Distance( const OGRGeometry * ) const;
00134 virtual OGRGeometry *ConvexHull() const;
00135 virtual OGRGeometry *Buffer( double dfDist, int nQuadSegs = 30 ) const;
00136 virtual OGRGeometry *Intersection( const OGRGeometry *) const;
00137 virtual OGRGeometry *Union( const OGRGeometry * ) const;
00138 virtual OGRGeometry *Difference( const OGRGeometry * ) const;
00139 virtual OGRGeometry *SymmetricDifference( const OGRGeometry * ) const;
00140
00141
00142 OGRBoolean Intersect( OGRGeometry * ) const;
00143 OGRBoolean Equal( OGRGeometry * ) const;
00144
00145
00146 static int bGenerate_DB2_V72_BYTE_ORDER;
00147 };
00148
00149
00150
00151
00152
00159 class CPL_DLL OGRPoint : public OGRGeometry
00160 {
00161 double x;
00162 double y;
00163 double z;
00164
00165 public:
00166 OGRPoint();
00167 OGRPoint( double x, double y );
00168 OGRPoint( double x, double y, double z );
00169 virtual ~OGRPoint();
00170
00171
00172 virtual int WkbSize() const;
00173 virtual OGRErr importFromWkb( unsigned char *, int=-1 );
00174 virtual OGRErr exportToWkb( OGRwkbByteOrder, unsigned char * ) const;
00175 virtual OGRErr importFromWkt( char ** );
00176 virtual OGRErr exportToWkt( char ** ppszDstText ) const;
00177
00178
00179 virtual int getDimension() const;
00180 virtual OGRGeometry *clone() const;
00181 virtual void empty();
00182 virtual void getEnvelope( OGREnvelope * psEnvelope ) const;
00183 virtual OGRBoolean IsEmpty() const;
00184
00185
00186 double getX() const { return x; }
00187 double getY() const { return y; }
00188 double getZ() const { return z; }
00189
00190
00191 virtual void setCoordinateDimension( int nDimension );
00192 void setX( double xIn ) { x = xIn; if (nCoordDimension == 0) nCoordDimension = 2; }
00193 void setY( double yIn ) { y = yIn; if (nCoordDimension == 0) nCoordDimension = 2; }
00194 void setZ( double zIn ) { z = zIn; nCoordDimension=3; }
00195
00196
00197 virtual OGRBoolean Equals( OGRGeometry * ) const;
00198
00199
00200 virtual const char *getGeometryName() const;
00201 virtual OGRwkbGeometryType getGeometryType() const;
00202 virtual OGRErr transform( OGRCoordinateTransformation *poCT );
00203 virtual void flattenTo2D();
00204 };
00205
00206
00207
00208
00209
00214 class CPL_DLL OGRCurve : public OGRGeometry
00215 {
00216 public:
00217 OGRCurve();
00218 virtual ~OGRCurve();
00219
00220 virtual double get_Length() const = 0;
00221 virtual void StartPoint(OGRPoint *) const = 0;
00222 virtual void EndPoint(OGRPoint *) const = 0;
00223 virtual int get_IsClosed() const;
00224 virtual void Value( double, OGRPoint * ) const = 0;
00225
00226 };
00227
00228
00229
00230
00231
00236 class CPL_DLL OGRLineString : public OGRCurve
00237 {
00238 protected:
00239 int nPointCount;
00240 OGRRawPoint *paoPoints;
00241 double *padfZ;
00242
00243 void Make3D();
00244 void Make2D();
00245
00246 public:
00247 OGRLineString();
00248 virtual ~OGRLineString();
00249
00250
00251 virtual int WkbSize() const;
00252 virtual OGRErr importFromWkb( unsigned char *, int = -1 );
00253 virtual OGRErr exportToWkb( OGRwkbByteOrder, unsigned char * ) const;
00254 virtual OGRErr importFromWkt( char ** );
00255 virtual OGRErr exportToWkt( char ** ppszDstText ) const;
00256
00257
00258 virtual int getDimension() const;
00259 virtual OGRGeometry *clone() const;
00260 virtual void empty();
00261 virtual void getEnvelope( OGREnvelope * psEnvelope ) const;
00262 virtual OGRBoolean IsEmpty() const;
00263
00264
00265 virtual double get_Length() const;
00266 virtual void StartPoint(OGRPoint *) const;
00267 virtual void EndPoint(OGRPoint *) const;
00268 virtual void Value( double, OGRPoint * ) const;
00269
00270
00271 int getNumPoints() const { return nPointCount; }
00272 void getPoint( int, OGRPoint * ) const;
00273 double getX( int i ) const { return paoPoints[i].x; }
00274 double getY( int i ) const { return paoPoints[i].y; }
00275 double getZ( int i ) const;
00276
00277
00278 virtual OGRBoolean Equals( OGRGeometry * ) const;
00279
00280
00281 virtual void setCoordinateDimension( int nDimension );
00282 void setNumPoints( int );
00283 void setPoint( int, OGRPoint * );
00284 void setPoint( int, double, double );
00285 void setPoint( int, double, double, double );
00286 void setPoints( int, OGRRawPoint *, double * = NULL );
00287 void setPoints( int, double * padfX, double * padfY,
00288 double *padfZ = NULL );
00289 void addPoint( OGRPoint * );
00290 void addPoint( double, double );
00291 void addPoint( double, double, double );
00292
00293 void getPoints( OGRRawPoint *, double * = NULL ) const;
00294
00295 void addSubLineString( const OGRLineString *,
00296 int nStartVertex = 0, int nEndVertex = -1 );
00297
00298
00299 virtual OGRwkbGeometryType getGeometryType() const;
00300 virtual const char *getGeometryName() const;
00301 virtual OGRErr transform( OGRCoordinateTransformation *poCT );
00302 virtual void flattenTo2D();
00303
00304 };
00305
00306
00307
00308
00309
00328 class CPL_DLL OGRLinearRing : public OGRLineString
00329 {
00330 private:
00331 friend class OGRPolygon;
00332
00333
00334 virtual int _WkbSize( int b3D ) const;
00335 virtual OGRErr _importFromWkb( OGRwkbByteOrder, int b3D,
00336 unsigned char *, int=-1 );
00337 virtual OGRErr _exportToWkb( OGRwkbByteOrder, int b3D,
00338 unsigned char * ) const;
00339
00340 public:
00341 OGRLinearRing();
00342 OGRLinearRing( OGRLinearRing * );
00343 ~OGRLinearRing();
00344
00345
00346 virtual const char *getGeometryName() const;
00347 virtual OGRGeometry *clone() const;
00348 virtual int isClockwise() const;
00349 virtual void reverseWindingOrder();
00350 virtual void closeRings();
00351 virtual double get_Area() const;
00352 OGRBoolean isPointInRing(const OGRPoint* pt) const;
00353
00354
00355
00356
00357 virtual int WkbSize() const;
00358 virtual OGRErr importFromWkb( unsigned char *, int=-1 );
00359 virtual OGRErr exportToWkb( OGRwkbByteOrder, unsigned char * ) const;
00360 };
00361
00362
00363
00364
00365
00370 class CPL_DLL OGRSurface : public OGRGeometry
00371 {
00372 public:
00373 virtual double get_Area() const = 0;
00374 virtual OGRErr Centroid( OGRPoint * poPoint ) const = 0;
00375 virtual OGRErr PointOnSurface( OGRPoint * poPoint ) const = 0;
00376 };
00377
00378
00379
00380
00381
00391 class CPL_DLL OGRPolygon : public OGRSurface
00392 {
00393 int nRingCount;
00394 OGRLinearRing **papoRings;
00395
00396 public:
00397 OGRPolygon();
00398 virtual ~OGRPolygon();
00399
00400
00401 virtual const char *getGeometryName() const;
00402 virtual OGRwkbGeometryType getGeometryType() const;
00403 virtual OGRGeometry *clone() const;
00404 virtual void empty();
00405 virtual OGRErr transform( OGRCoordinateTransformation *poCT );
00406 virtual void flattenTo2D();
00407 virtual OGRBoolean IsEmpty() const;
00408
00409
00410 virtual double get_Area() const;
00411 virtual int Centroid( OGRPoint * poPoint ) const;
00412 virtual int PointOnSurface( OGRPoint * poPoint ) const;
00413
00414
00415 virtual int WkbSize() const;
00416 virtual OGRErr importFromWkb( unsigned char *, int = -1 );
00417 virtual OGRErr exportToWkb( OGRwkbByteOrder, unsigned char * ) const;
00418 virtual OGRErr importFromWkt( char ** );
00419 virtual OGRErr exportToWkt( char ** ppszDstText ) const;
00420
00421
00422 virtual int getDimension() const;
00423 virtual void getEnvelope( OGREnvelope * psEnvelope ) const;
00424
00425
00426 virtual OGRBoolean Equals( OGRGeometry * ) const;
00427
00428
00429 virtual void setCoordinateDimension( int nDimension );
00430
00431 void addRing( OGRLinearRing * );
00432 void addRingDirectly( OGRLinearRing * );
00433
00434 OGRLinearRing *getExteriorRing();
00435 const OGRLinearRing *getExteriorRing() const;
00436 int getNumInteriorRings() const;
00437 OGRLinearRing *getInteriorRing( int );
00438 const OGRLinearRing *getInteriorRing( int ) const;
00439
00440 OGRBoolean IsPointOnSurface( const OGRPoint * ) const;
00441
00442 virtual void closeRings();
00443 };
00444
00445
00446
00447
00448
00456 class CPL_DLL OGRGeometryCollection : public OGRGeometry
00457 {
00458 int nGeomCount;
00459 OGRGeometry **papoGeoms;
00460
00461 public:
00462 OGRGeometryCollection();
00463 virtual ~OGRGeometryCollection();
00464
00465
00466 virtual const char *getGeometryName() const;
00467 virtual OGRwkbGeometryType getGeometryType() const;
00468 virtual OGRGeometry *clone() const;
00469 virtual void empty();
00470 virtual OGRErr transform( OGRCoordinateTransformation *poCT );
00471 virtual void flattenTo2D();
00472 virtual OGRBoolean IsEmpty() const;
00473
00474
00475 virtual int WkbSize() const;
00476 virtual OGRErr importFromWkb( unsigned char *, int = -1 );
00477 virtual OGRErr exportToWkb( OGRwkbByteOrder, unsigned char * ) const;
00478 virtual OGRErr importFromWkt( char ** );
00479 virtual OGRErr exportToWkt( char ** ppszDstText ) const;
00480
00481 virtual double get_Area() const;
00482
00483
00484 virtual int getDimension() const;
00485 virtual void getEnvelope( OGREnvelope * psEnvelope ) const;
00486
00487
00488 int getNumGeometries() const;
00489 OGRGeometry *getGeometryRef( int );
00490 const OGRGeometry *getGeometryRef( int ) const;
00491
00492
00493 virtual OGRBoolean Equals( OGRGeometry * ) const;
00494
00495
00496 virtual void setCoordinateDimension( int nDimension );
00497 virtual OGRErr addGeometry( const OGRGeometry * );
00498 virtual OGRErr addGeometryDirectly( OGRGeometry * );
00499 virtual OGRErr removeGeometry( int iIndex, int bDelete = TRUE );
00500
00501 void closeRings();
00502 };
00503
00504
00505
00506
00507
00515 class CPL_DLL OGRMultiPolygon : public OGRGeometryCollection
00516 {
00517 public:
00518 OGRMultiPolygon();
00519
00520 virtual const char *getGeometryName() const;
00521 virtual OGRwkbGeometryType getGeometryType() const;
00522 virtual OGRGeometry *clone() const;
00523 virtual OGRErr importFromWkt( char ** );
00524 virtual OGRErr exportToWkt( char ** ) const;
00525
00526
00527 virtual OGRErr addGeometryDirectly( OGRGeometry * );
00528
00529 virtual double get_Area() const;
00530 };
00531
00532
00533
00534
00535
00540 class CPL_DLL OGRMultiPoint : public OGRGeometryCollection
00541 {
00542 private:
00543 OGRErr importFromWkt_Bracketed( char ** );
00544
00545 public:
00546 OGRMultiPoint();
00547
00548 virtual const char *getGeometryName() const;
00549 virtual OGRwkbGeometryType getGeometryType() const;
00550 virtual OGRGeometry *clone() const;
00551 virtual OGRErr importFromWkt( char ** );
00552 virtual OGRErr exportToWkt( char ** ) const;
00553
00554
00555 virtual OGRErr addGeometryDirectly( OGRGeometry * );
00556 };
00557
00558
00559
00560
00561
00566 class CPL_DLL OGRMultiLineString : public OGRGeometryCollection
00567 {
00568 public:
00569 OGRMultiLineString();
00570 ~OGRMultiLineString();
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
00586
00591 class CPL_DLL OGRGeometryFactory
00592 {
00593 public:
00594 static OGRErr createFromWkb( unsigned char *, OGRSpatialReference *,
00595 OGRGeometry **, int = -1 );
00596 static OGRErr createFromWkt( char **, OGRSpatialReference *,
00597 OGRGeometry ** );
00598 static OGRErr createFromFgf( unsigned char *, OGRSpatialReference *,
00599 OGRGeometry **, int = -1, int * = NULL );
00600 static OGRGeometry *createFromGML( const char * );
00601 static OGRGeometry *createFromGEOS( GEOSGeom );
00602
00603 static void destroyGeometry( OGRGeometry * );
00604 static OGRGeometry *createGeometry( OGRwkbGeometryType );
00605
00606 static OGRGeometry * forceToPolygon( OGRGeometry * );
00607 static OGRGeometry * forceToMultiPolygon( OGRGeometry * );
00608 static OGRGeometry * forceToMultiPoint( OGRGeometry * );
00609 static OGRGeometry * forceToMultiLineString( OGRGeometry * );
00610
00611 static OGRGeometry * organizePolygons( OGRGeometry **papoPolygons,
00612 int nPolygonCount,
00613 int *pbResultValidGeometry );
00614
00615 static void *getGEOSGeometryFactory();
00616
00617 static int haveGEOS();
00618
00619 };
00620
00621 #endif