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;
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
00184
00185 double getX() const { return x; }
00186 double getY() const { return y; }
00187 double getZ() const { return z; }
00188
00189
00190 virtual void setCoordinateDimension( int nDimension );
00191 void setX( double xIn ) { x = xIn; }
00192 void setY( double yIn ) { y = yIn; }
00193 void setZ( double zIn ) { z = zIn; nCoordDimension=3; }
00194
00195
00196 virtual OGRBoolean Equals( OGRGeometry * ) const;
00197
00198
00199 virtual const char *getGeometryName() const;
00200 virtual OGRwkbGeometryType getGeometryType() const;
00201 virtual OGRErr transform( OGRCoordinateTransformation *poCT );
00202 virtual void flattenTo2D();
00203
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
00263
00264 virtual double get_Length() const;
00265 virtual void StartPoint(OGRPoint *) const;
00266 virtual void EndPoint(OGRPoint *) const;
00267 virtual void Value( double, OGRPoint * ) const;
00268
00269
00270 int getNumPoints() const { return nPointCount; }
00271 void getPoint( int, OGRPoint * ) const;
00272 double getX( int i ) const { return paoPoints[i].x; }
00273 double getY( int i ) const { return paoPoints[i].y; }
00274 double getZ( int i ) const;
00275
00276
00277 virtual OGRBoolean Equals( OGRGeometry * ) const;
00278
00279
00280 virtual void setCoordinateDimension( int nDimension );
00281 void setNumPoints( int );
00282 void setPoint( int, OGRPoint * );
00283 void setPoint( int, double, double );
00284 void setPoint( int, double, double, double );
00285 void setPoints( int, OGRRawPoint *, double * = NULL );
00286 void setPoints( int, double * padfX, double * padfY,
00287 double *padfZ = NULL );
00288 void addPoint( OGRPoint * );
00289 void addPoint( double, double );
00290 void addPoint( double, double, double );
00291
00292 void getPoints( OGRRawPoint *, double * = NULL ) const;
00293
00294 void addSubLineString( const OGRLineString *,
00295 int nStartVertex = 0, int nEndVertex = -1 );
00296
00297
00298 virtual OGRwkbGeometryType getGeometryType() const;
00299 virtual const char *getGeometryName() const;
00300 virtual OGRErr transform( OGRCoordinateTransformation *poCT );
00301 virtual void flattenTo2D();
00302
00303 };
00304
00305
00306
00307
00308
00327 class CPL_DLL OGRLinearRing : public OGRLineString
00328 {
00329 private:
00330 friend class OGRPolygon;
00331
00332
00333 virtual int _WkbSize( int b3D ) const;
00334 virtual OGRErr _importFromWkb( OGRwkbByteOrder, int b3D,
00335 unsigned char *, int=-1 );
00336 virtual OGRErr _exportToWkb( OGRwkbByteOrder, int b3D,
00337 unsigned char * ) const;
00338
00339 public:
00340 OGRLinearRing();
00341 OGRLinearRing( OGRLinearRing * );
00342 ~OGRLinearRing();
00343
00344
00345 virtual const char *getGeometryName() const;
00346 virtual OGRGeometry *clone() const;
00347 virtual int isClockwise() const;
00348 virtual void reverseWindingOrder();
00349 virtual void closeRings();
00350 virtual double get_Area() const;
00351 OGRBoolean isPointInRing(const OGRPoint* pt) const;
00352
00353
00354
00355
00356 virtual int WkbSize() const;
00357 virtual OGRErr importFromWkb( unsigned char *, int=-1 );
00358 virtual OGRErr exportToWkb( OGRwkbByteOrder, unsigned char * ) const;
00359 };
00360
00361
00362
00363
00364
00369 class CPL_DLL OGRSurface : public OGRGeometry
00370 {
00371 public:
00372 virtual double get_Area() const = 0;
00373 virtual OGRErr Centroid( OGRPoint * poPoint ) const = 0;
00374 virtual OGRErr PointOnSurface( OGRPoint * poPoint ) const = 0;
00375 };
00376
00377
00378
00379
00380
00390 class CPL_DLL OGRPolygon : public OGRSurface
00391 {
00392 int nRingCount;
00393 OGRLinearRing **papoRings;
00394
00395 public:
00396 OGRPolygon();
00397 virtual ~OGRPolygon();
00398
00399
00400 virtual const char *getGeometryName() const;
00401 virtual OGRwkbGeometryType getGeometryType() const;
00402 virtual OGRGeometry *clone() const;
00403 virtual void empty();
00404 virtual OGRErr transform( OGRCoordinateTransformation *poCT );
00405 virtual void flattenTo2D();
00406
00407
00408 virtual double get_Area() const;
00409 virtual int Centroid( OGRPoint * poPoint ) const;
00410 virtual int PointOnSurface( OGRPoint * poPoint ) const;
00411
00412
00413 virtual int WkbSize() const;
00414 virtual OGRErr importFromWkb( unsigned char *, int = -1 );
00415 virtual OGRErr exportToWkb( OGRwkbByteOrder, unsigned char * ) const;
00416 virtual OGRErr importFromWkt( char ** );
00417 virtual OGRErr exportToWkt( char ** ppszDstText ) const;
00418
00419
00420 virtual int getDimension() const;
00421 virtual void getEnvelope( OGREnvelope * psEnvelope ) const;
00422
00423
00424 virtual OGRBoolean Equals( OGRGeometry * ) const;
00425
00426
00427 virtual void setCoordinateDimension( int nDimension );
00428
00429 void addRing( OGRLinearRing * );
00430 void addRingDirectly( OGRLinearRing * );
00431
00432 OGRLinearRing *getExteriorRing();
00433 const OGRLinearRing *getExteriorRing() const;
00434 int getNumInteriorRings() const;
00435 OGRLinearRing *getInteriorRing( int );
00436 const OGRLinearRing *getInteriorRing( int ) const;
00437
00438 OGRBoolean IsPointOnSurface( const OGRPoint * ) const;
00439
00440 virtual void closeRings();
00441 };
00442
00443
00444
00445
00446
00454 class CPL_DLL OGRGeometryCollection : public OGRGeometry
00455 {
00456 int nGeomCount;
00457 OGRGeometry **papoGeoms;
00458
00459
00460 int nCoordinateDimension;
00461
00462 public:
00463 OGRGeometryCollection();
00464 virtual ~OGRGeometryCollection();
00465
00466
00467 virtual const char *getGeometryName() const;
00468 virtual OGRwkbGeometryType getGeometryType() const;
00469 virtual OGRGeometry *clone() const;
00470 virtual void empty();
00471 virtual OGRErr transform( OGRCoordinateTransformation *poCT );
00472 virtual void flattenTo2D();
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 OGRGeometry *createFromGML( const char * );
00599 static OGRGeometry *createFromGEOS( GEOSGeom );
00600
00601 static void destroyGeometry( OGRGeometry * );
00602 static OGRGeometry *createGeometry( OGRwkbGeometryType );
00603
00604 static OGRGeometry * forceToPolygon( OGRGeometry * );
00605 static OGRGeometry * forceToMultiPolygon( OGRGeometry * );
00606 static OGRGeometry * forceToMultiPoint( OGRGeometry * );
00607 static OGRGeometry * forceToMultiLineString( OGRGeometry * );
00608
00609 static OGRGeometry * organizePolygons( OGRGeometry **papoPolygons,
00610 int nPolygonCount,
00611 int *pbResultValidGeometry );
00612
00613 static void *getGEOSGeometryFactory();
00614
00615 static int haveGEOS();
00616
00617 };
00618
00619 #endif