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 OGRBoolean isPointOnRingBoundary(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
00408
00409 virtual double get_Area() const;
00410 virtual int Centroid( OGRPoint * poPoint ) const;
00411 virtual int PointOnSurface( OGRPoint * poPoint ) const;
00412
00413
00414 virtual int WkbSize() const;
00415 virtual OGRErr importFromWkb( unsigned char *, int = -1 );
00416 virtual OGRErr exportToWkb( OGRwkbByteOrder, unsigned char * ) const;
00417 virtual OGRErr importFromWkt( char ** );
00418 virtual OGRErr exportToWkt( char ** ppszDstText ) const;
00419
00420
00421 virtual int getDimension() const;
00422 virtual void getEnvelope( OGREnvelope * psEnvelope ) const;
00423
00424
00425 virtual OGRBoolean Equals( OGRGeometry * ) const;
00426
00427
00428 virtual void setCoordinateDimension( int nDimension );
00429
00430 void addRing( OGRLinearRing * );
00431 void addRingDirectly( OGRLinearRing * );
00432
00433 OGRLinearRing *getExteriorRing();
00434 const OGRLinearRing *getExteriorRing() const;
00435 int getNumInteriorRings() const;
00436 OGRLinearRing *getInteriorRing( int );
00437 const OGRLinearRing *getInteriorRing( int ) const;
00438
00439 OGRBoolean IsPointOnSurface( const OGRPoint * ) const;
00440
00441 virtual void closeRings();
00442 };
00443
00444
00445
00446
00447
00455 class CPL_DLL OGRGeometryCollection : public OGRGeometry
00456 {
00457 int nGeomCount;
00458 OGRGeometry **papoGeoms;
00459
00460
00461 int nCoordinateDimension;
00462
00463 public:
00464 OGRGeometryCollection();
00465 virtual ~OGRGeometryCollection();
00466
00467
00468 virtual const char *getGeometryName() const;
00469 virtual OGRwkbGeometryType getGeometryType() const;
00470 virtual OGRGeometry *clone() const;
00471 virtual void empty();
00472 virtual OGRErr transform( OGRCoordinateTransformation *poCT );
00473 virtual void flattenTo2D();
00474
00475
00476 virtual int WkbSize() const;
00477 virtual OGRErr importFromWkb( unsigned char *, int = -1 );
00478 virtual OGRErr exportToWkb( OGRwkbByteOrder, unsigned char * ) const;
00479 virtual OGRErr importFromWkt( char ** );
00480 virtual OGRErr exportToWkt( char ** ppszDstText ) const;
00481
00482 virtual double get_Area() const;
00483
00484
00485 virtual int getDimension() const;
00486 virtual void getEnvelope( OGREnvelope * psEnvelope ) const;
00487
00488
00489 int getNumGeometries() const;
00490 OGRGeometry *getGeometryRef( int );
00491 const OGRGeometry *getGeometryRef( int ) const;
00492
00493
00494 virtual OGRBoolean Equals( OGRGeometry * ) const;
00495
00496
00497 virtual void setCoordinateDimension( int nDimension );
00498 virtual OGRErr addGeometry( const OGRGeometry * );
00499 virtual OGRErr addGeometryDirectly( OGRGeometry * );
00500 virtual OGRErr removeGeometry( int iIndex, int bDelete = TRUE );
00501
00502 void closeRings();
00503 };
00504
00505
00506
00507
00508
00516 class CPL_DLL OGRMultiPolygon : public OGRGeometryCollection
00517 {
00518 public:
00519 OGRMultiPolygon();
00520
00521 virtual const char *getGeometryName() const;
00522 virtual OGRwkbGeometryType getGeometryType() const;
00523 virtual OGRGeometry *clone() const;
00524 virtual OGRErr importFromWkt( char ** );
00525 virtual OGRErr exportToWkt( char ** ) const;
00526
00527
00528 virtual OGRErr addGeometryDirectly( OGRGeometry * );
00529
00530 virtual double get_Area() const;
00531 };
00532
00533
00534
00535
00536
00541 class CPL_DLL OGRMultiPoint : public OGRGeometryCollection
00542 {
00543 private:
00544 OGRErr importFromWkt_Bracketed( char ** );
00545
00546 public:
00547 OGRMultiPoint();
00548
00549 virtual const char *getGeometryName() const;
00550 virtual OGRwkbGeometryType getGeometryType() const;
00551 virtual OGRGeometry *clone() const;
00552 virtual OGRErr importFromWkt( char ** );
00553 virtual OGRErr exportToWkt( char ** ) const;
00554
00555
00556 virtual OGRErr addGeometryDirectly( OGRGeometry * );
00557 };
00558
00559
00560
00561
00562
00567 class CPL_DLL OGRMultiLineString : public OGRGeometryCollection
00568 {
00569 public:
00570 OGRMultiLineString();
00571 ~OGRMultiLineString();
00572
00573 virtual const char *getGeometryName() const;
00574 virtual OGRwkbGeometryType getGeometryType() const;
00575 virtual OGRGeometry *clone() const;
00576 virtual OGRErr importFromWkt( char ** );
00577 virtual OGRErr exportToWkt( char ** ) const;
00578
00579
00580 virtual OGRErr addGeometryDirectly( OGRGeometry * );
00581 };
00582
00583
00584
00585
00586
00587
00592 class CPL_DLL OGRGeometryFactory
00593 {
00594 public:
00595 static OGRErr createFromWkb( unsigned char *, OGRSpatialReference *,
00596 OGRGeometry **, int = -1 );
00597 static OGRErr createFromWkt( char **, OGRSpatialReference *,
00598 OGRGeometry ** );
00599 static OGRGeometry *createFromGML( const char * );
00600 static OGRGeometry *createFromGEOS( GEOSGeom );
00601
00602 static void destroyGeometry( OGRGeometry * );
00603 static OGRGeometry *createGeometry( OGRwkbGeometryType );
00604
00605 static OGRGeometry * forceToPolygon( OGRGeometry * );
00606 static OGRGeometry * forceToMultiPolygon( OGRGeometry * );
00607 static OGRGeometry * forceToMultiPoint( OGRGeometry * );
00608 static OGRGeometry * forceToMultiLineString( OGRGeometry * );
00609
00610 static OGRGeometry * organizePolygons( OGRGeometry **papoPolygons,
00611 int nPolygonCount,
00612 int *pbResultValidGeometry );
00613
00614 static OGRGeometry * organizePolygons( OGRGeometry **papoPolygons,
00615 int nPolygonCount,
00616 int *pbResultValidGeometry,
00617 const char **papszOptions);
00618
00619 static void *getGEOSGeometryFactory();
00620
00621 static int haveGEOS();
00622
00623 };
00624
00625 #endif