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 { return 0; }
00088 virtual OGRBoolean IsSimple() const { return 1; }
00089 virtual void empty() = 0;
00090 virtual OGRGeometry *clone() const = 0;
00091 virtual void getEnvelope( OGREnvelope * psEnvelope ) const = 0;
00092
00093
00094 virtual int WkbSize() const = 0;
00095 virtual OGRErr importFromWkb( unsigned char *, int=-1 )=0;
00096 virtual OGRErr exportToWkb( OGRwkbByteOrder, unsigned char * ) const = 0;
00097 virtual OGRErr importFromWkt( char ** ppszInput ) = 0;
00098 virtual OGRErr exportToWkt( char ** ppszDstText ) const = 0;
00099
00100
00101 virtual OGRwkbGeometryType getGeometryType() const = 0;
00102 virtual const char *getGeometryName() const = 0;
00103 virtual void dumpReadable( FILE *, const char * = NULL ) const;
00104 virtual void flattenTo2D() = 0;
00105 virtual char * exportToGML() const;
00106 virtual GEOSGeom exportToGEOS() const;
00107 virtual void closeRings();
00108
00109 virtual void setCoordinateDimension( int nDimension );
00110
00111 void assignSpatialReference( OGRSpatialReference * poSR );
00112 OGRSpatialReference *getSpatialReference( void ) const { return poSRS; }
00113
00114 virtual OGRErr transform( OGRCoordinateTransformation *poCT ) = 0;
00115 OGRErr transformTo( OGRSpatialReference *poSR );
00116
00117
00118 virtual OGRBoolean Intersects( OGRGeometry * ) const;
00119 virtual OGRBoolean Equals( OGRGeometry * ) const = 0;
00120 virtual OGRBoolean Disjoint( const OGRGeometry * ) const;
00121 virtual OGRBoolean Touches( const OGRGeometry * ) const;
00122 virtual OGRBoolean Crosses( const OGRGeometry * ) const;
00123 virtual OGRBoolean Within( const OGRGeometry * ) const;
00124 virtual OGRBoolean Contains( const OGRGeometry * ) const;
00125 virtual OGRBoolean Overlaps( const OGRGeometry * ) const;
00126
00127
00128 virtual OGRGeometry *getBoundary() const;
00129 virtual double Distance( const OGRGeometry * ) const;
00130 virtual OGRGeometry *ConvexHull() const;
00131 virtual OGRGeometry *Buffer( double dfDist, int nQuadSegs = 30 ) const;
00132 virtual OGRGeometry *Intersection( const OGRGeometry *) const;
00133 virtual OGRGeometry *Union( const OGRGeometry * ) const;
00134 virtual OGRGeometry *Difference( const OGRGeometry * ) const;
00135 virtual OGRGeometry *SymmetricDifference( const OGRGeometry * ) const;
00136
00137
00138 OGRBoolean Intersect( OGRGeometry * ) const;
00139 OGRBoolean Equal( OGRGeometry * ) const;
00140
00141
00142 static int bGenerate_DB2_V72_BYTE_ORDER;
00143 };
00144
00145
00146
00147
00148
00155 class CPL_DLL OGRPoint : public OGRGeometry
00156 {
00157 double x;
00158 double y;
00159 double z;
00160
00161 public:
00162 OGRPoint();
00163 OGRPoint( double x, double y );
00164 OGRPoint( double x, double y, double z );
00165 virtual ~OGRPoint();
00166
00167
00168 virtual int WkbSize() const;
00169 virtual OGRErr importFromWkb( unsigned char *, int=-1 );
00170 virtual OGRErr exportToWkb( OGRwkbByteOrder, unsigned char * ) const;
00171 virtual OGRErr importFromWkt( char ** );
00172 virtual OGRErr exportToWkt( char ** ppszDstText ) const;
00173
00174
00175 virtual int getDimension() const;
00176 virtual OGRGeometry *clone() const;
00177 virtual void empty();
00178 virtual void getEnvelope( OGREnvelope * psEnvelope ) const;
00179
00180
00181 double getX() const { return x; }
00182 double getY() const { return y; }
00183 double getZ() const { return z; }
00184
00185
00186 virtual void setCoordinateDimension( int nDimension );
00187 void setX( double xIn ) { x = xIn; }
00188 void setY( double yIn ) { y = yIn; }
00189 void setZ( double zIn ) { z = zIn; nCoordDimension=3; }
00190
00191
00192 virtual OGRBoolean Equals( OGRGeometry * ) const;
00193
00194
00195 virtual const char *getGeometryName() const;
00196 virtual OGRwkbGeometryType getGeometryType() const;
00197 virtual OGRErr transform( OGRCoordinateTransformation *poCT );
00198 virtual void flattenTo2D();
00199
00200 };
00201
00202
00203
00204
00205
00210 class CPL_DLL OGRCurve : public OGRGeometry
00211 {
00212 public:
00213 OGRCurve();
00214 virtual ~OGRCurve();
00215
00216 virtual double get_Length() const = 0;
00217 virtual void StartPoint(OGRPoint *) const = 0;
00218 virtual void EndPoint(OGRPoint *) const = 0;
00219 virtual int get_IsClosed() const;
00220 virtual void Value( double, OGRPoint * ) const = 0;
00221
00222 };
00223
00224
00225
00226
00227
00232 class CPL_DLL OGRLineString : public OGRCurve
00233 {
00234 protected:
00235 int nPointCount;
00236 OGRRawPoint *paoPoints;
00237 double *padfZ;
00238
00239 void Make3D();
00240 void Make2D();
00241
00242 public:
00243 OGRLineString();
00244 virtual ~OGRLineString();
00245
00246
00247 virtual int WkbSize() const;
00248 virtual OGRErr importFromWkb( unsigned char *, int = -1 );
00249 virtual OGRErr exportToWkb( OGRwkbByteOrder, unsigned char * ) const;
00250 virtual OGRErr importFromWkt( char ** );
00251 virtual OGRErr exportToWkt( char ** ppszDstText ) const;
00252
00253
00254 virtual int getDimension() const;
00255 virtual OGRGeometry *clone() const;
00256 virtual void empty();
00257 virtual void getEnvelope( OGREnvelope * psEnvelope ) const;
00258
00259
00260 virtual double get_Length() const;
00261 virtual void StartPoint(OGRPoint *) const;
00262 virtual void EndPoint(OGRPoint *) const;
00263 virtual void Value( double, OGRPoint * ) const;
00264
00265
00266 int getNumPoints() const { return nPointCount; }
00267 void getPoint( int, OGRPoint * ) const;
00268 double getX( int i ) const { return paoPoints[i].x; }
00269 double getY( int i ) const { return paoPoints[i].y; }
00270 double getZ( int i ) const;
00271
00272
00273 virtual OGRBoolean Equals( OGRGeometry * ) const;
00274
00275
00276 virtual void setCoordinateDimension( int nDimension );
00277 void setNumPoints( int );
00278 void setPoint( int, OGRPoint * );
00279 void setPoint( int, double, double );
00280 void setPoint( int, double, double, double );
00281 void setPoints( int, OGRRawPoint *, double * = NULL );
00282 void setPoints( int, double * padfX, double * padfY,
00283 double *padfZ = NULL );
00284 void addPoint( OGRPoint * );
00285 void addPoint( double, double );
00286 void addPoint( double, double, double );
00287
00288 void getPoints( OGRRawPoint *, double * = NULL ) const;
00289
00290 void addSubLineString( const OGRLineString *,
00291 int nStartVertex = 0, int nEndVertex = -1 );
00292
00293
00294 virtual OGRwkbGeometryType getGeometryType() const;
00295 virtual const char *getGeometryName() const;
00296 virtual OGRErr transform( OGRCoordinateTransformation *poCT );
00297 virtual void flattenTo2D();
00298
00299 };
00300
00301
00302
00303
00304
00305
00306
00315 class CPL_DLL OGRLinearRing : public OGRLineString
00316 {
00317 private:
00318 friend class OGRPolygon;
00319
00320
00321 virtual int _WkbSize( int b3D ) const;
00322 virtual OGRErr _importFromWkb( OGRwkbByteOrder, int b3D,
00323 unsigned char *, int=-1 );
00324 virtual OGRErr _exportToWkb( OGRwkbByteOrder, int b3D,
00325 unsigned char * ) const;
00326
00327 public:
00328 OGRLinearRing();
00329 OGRLinearRing( OGRLinearRing * );
00330 ~OGRLinearRing();
00331
00332
00333 virtual const char *getGeometryName() const;
00334 virtual OGRGeometry *clone() const;
00335 virtual int isClockwise() const;
00336 virtual void reverseWindingOrder();
00337 virtual void closeRings();
00338 virtual double get_Area() const;
00339 OGRBoolean isPointInRing(const OGRPoint* pt) const;
00340
00341
00342
00343
00344 virtual int WkbSize() const;
00345 virtual OGRErr importFromWkb( unsigned char *, int=-1 );
00346 virtual OGRErr exportToWkb( OGRwkbByteOrder, unsigned char * ) const;
00347 };
00348
00349
00350
00351
00352
00357 class CPL_DLL OGRSurface : public OGRGeometry
00358 {
00359 public:
00360 virtual double get_Area() const = 0;
00361 virtual OGRErr Centroid( OGRPoint * poPoint ) const = 0;
00362 virtual OGRErr PointOnSurface( OGRPoint * poPoint ) const = 0;
00363 };
00364
00365
00366
00367
00368
00378 class CPL_DLL OGRPolygon : public OGRSurface
00379 {
00380 int nRingCount;
00381 OGRLinearRing **papoRings;
00382
00383 public:
00384 OGRPolygon();
00385 virtual ~OGRPolygon();
00386
00387
00388 virtual const char *getGeometryName() const;
00389 virtual OGRwkbGeometryType getGeometryType() const;
00390 virtual OGRGeometry *clone() const;
00391 virtual void empty();
00392 virtual OGRErr transform( OGRCoordinateTransformation *poCT );
00393 virtual void flattenTo2D();
00394
00395
00396 virtual double get_Area() const;
00397 virtual int Centroid( OGRPoint * poPoint ) const;
00398 virtual int PointOnSurface( OGRPoint * poPoint ) const;
00399
00400
00401 virtual int WkbSize() const;
00402 virtual OGRErr importFromWkb( unsigned char *, int = -1 );
00403 virtual OGRErr exportToWkb( OGRwkbByteOrder, unsigned char * ) const;
00404 virtual OGRErr importFromWkt( char ** );
00405 virtual OGRErr exportToWkt( char ** ppszDstText ) const;
00406
00407
00408 virtual int getDimension() const;
00409 virtual void getEnvelope( OGREnvelope * psEnvelope ) const;
00410
00411
00412 virtual OGRBoolean Equals( OGRGeometry * ) const;
00413
00414
00415 virtual void setCoordinateDimension( int nDimension );
00416
00417 void addRing( OGRLinearRing * );
00418 void addRingDirectly( OGRLinearRing * );
00419
00420 OGRLinearRing *getExteriorRing();
00421 const OGRLinearRing *getExteriorRing() const;
00422 int getNumInteriorRings() const;
00423 OGRLinearRing *getInteriorRing( int );
00424 const OGRLinearRing *getInteriorRing( int ) const;
00425
00426 OGRBoolean IsPointOnSurface( const OGRPoint * ) const;
00427
00428 virtual void closeRings();
00429 };
00430
00431
00432
00433
00434
00442 class CPL_DLL OGRGeometryCollection : public OGRGeometry
00443 {
00444 int nGeomCount;
00445 OGRGeometry **papoGeoms;
00446
00447 int nCoordinateDimension;
00448
00449 public:
00450 OGRGeometryCollection();
00451 virtual ~OGRGeometryCollection();
00452
00453
00454 virtual const char *getGeometryName() const;
00455 virtual OGRwkbGeometryType getGeometryType() const;
00456 virtual OGRGeometry *clone() const;
00457 virtual void empty();
00458 virtual OGRErr transform( OGRCoordinateTransformation *poCT );
00459 virtual void flattenTo2D();
00460
00461
00462 virtual int WkbSize() const;
00463 virtual OGRErr importFromWkb( unsigned char *, int = -1 );
00464 virtual OGRErr exportToWkb( OGRwkbByteOrder, unsigned char * ) const;
00465 virtual OGRErr importFromWkt( char ** );
00466 virtual OGRErr exportToWkt( char ** ppszDstText ) const;
00467
00468
00469 virtual int getDimension() const;
00470 virtual void getEnvelope( OGREnvelope * psEnvelope ) const;
00471
00472
00473 int getNumGeometries() const;
00474 OGRGeometry *getGeometryRef( int );
00475 const OGRGeometry *getGeometryRef( int ) const;
00476
00477
00478 virtual OGRBoolean Equals( OGRGeometry * ) const;
00479
00480
00481 virtual void setCoordinateDimension( int nDimension );
00482 virtual OGRErr addGeometry( const OGRGeometry * );
00483 virtual OGRErr addGeometryDirectly( OGRGeometry * );
00484 virtual OGRErr removeGeometry( int iIndex, int bDelete = TRUE );
00485
00486 void closeRings();
00487 };
00488
00489
00490
00491
00492
00500 class CPL_DLL OGRMultiPolygon : public OGRGeometryCollection
00501 {
00502 public:
00503 OGRMultiPolygon();
00504
00505 virtual const char *getGeometryName() const;
00506 virtual OGRwkbGeometryType getGeometryType() const;
00507 virtual OGRGeometry *clone() const;
00508 virtual OGRErr importFromWkt( char ** );
00509 virtual OGRErr exportToWkt( char ** ) const;
00510
00511
00512 virtual OGRErr addGeometryDirectly( OGRGeometry * );
00513
00514 double get_Area() const;
00515 };
00516
00517
00518
00519
00520
00525 class CPL_DLL OGRMultiPoint : public OGRGeometryCollection
00526 {
00527 private:
00528 OGRErr importFromWkt_Bracketed( char ** );
00529
00530 public:
00531 OGRMultiPoint();
00532
00533 virtual const char *getGeometryName() const;
00534 virtual OGRwkbGeometryType getGeometryType() const;
00535 virtual OGRGeometry *clone() const;
00536 virtual OGRErr importFromWkt( char ** );
00537 virtual OGRErr exportToWkt( char ** ) const;
00538
00539
00540 virtual OGRErr addGeometryDirectly( OGRGeometry * );
00541 };
00542
00543
00544
00545
00546
00551 class CPL_DLL OGRMultiLineString : public OGRGeometryCollection
00552 {
00553 public:
00554 OGRMultiLineString();
00555 ~OGRMultiLineString();
00556
00557 virtual const char *getGeometryName() const;
00558 virtual OGRwkbGeometryType getGeometryType() const;
00559 virtual OGRGeometry *clone() const;
00560 virtual OGRErr importFromWkt( char ** );
00561 virtual OGRErr exportToWkt( char ** ) const;
00562
00563
00564 virtual OGRErr addGeometryDirectly( OGRGeometry * );
00565 };
00566
00567
00568
00569
00570
00571
00576 class CPL_DLL OGRGeometryFactory
00577 {
00578 public:
00579 static OGRErr createFromWkb( unsigned char *, OGRSpatialReference *,
00580 OGRGeometry **, int = -1 );
00581 static OGRErr createFromWkt( char **, OGRSpatialReference *,
00582 OGRGeometry ** );
00583 static OGRGeometry *createFromGML( const char * );
00584 static OGRGeometry *createFromGEOS( GEOSGeom );
00585
00586 static void destroyGeometry( OGRGeometry * );
00587 static OGRGeometry *createGeometry( OGRwkbGeometryType );
00588
00589 static OGRGeometry * forceToPolygon( OGRGeometry * );
00590 static OGRGeometry * forceToMultiPolygon( OGRGeometry * );
00591 static OGRGeometry * forceToMultiPoint( OGRGeometry * );
00592 static OGRGeometry * forceToMultiLineString( OGRGeometry * );
00593
00594 static void *getGEOSGeometryFactory();
00595
00596 static int haveGEOS();
00597
00598 };
00599
00600 #endif