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, char** papszOptions = 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 virtual void segmentize(double dfMaxLength);
00122
00123
00124 virtual OGRBoolean Intersects( OGRGeometry * ) const;
00125 virtual OGRBoolean Equals( OGRGeometry * ) const = 0;
00126 virtual OGRBoolean Disjoint( const OGRGeometry * ) const;
00127 virtual OGRBoolean Touches( const OGRGeometry * ) const;
00128 virtual OGRBoolean Crosses( const OGRGeometry * ) const;
00129 virtual OGRBoolean Within( const OGRGeometry * ) const;
00130 virtual OGRBoolean Contains( const OGRGeometry * ) const;
00131 virtual OGRBoolean Overlaps( const OGRGeometry * ) const;
00132
00133
00134 virtual OGRGeometry *getBoundary() const;
00135 virtual double Distance( const OGRGeometry * ) const;
00136 virtual OGRGeometry *ConvexHull() const;
00137 virtual OGRGeometry *Buffer( double dfDist, int nQuadSegs = 30 ) const;
00138 virtual OGRGeometry *Intersection( const OGRGeometry *) const;
00139 virtual OGRGeometry *Union( const OGRGeometry * ) const;
00140 virtual OGRGeometry *Difference( const OGRGeometry * ) const;
00141 virtual OGRGeometry *SymmetricDifference( const OGRGeometry * ) const;
00142
00143
00144 OGRBoolean Intersect( OGRGeometry * ) const;
00145 OGRBoolean Equal( OGRGeometry * ) const;
00146
00147
00148 static int bGenerate_DB2_V72_BYTE_ORDER;
00149 };
00150
00151
00152
00153
00154
00161 class CPL_DLL OGRPoint : public OGRGeometry
00162 {
00163 double x;
00164 double y;
00165 double z;
00166
00167 public:
00168 OGRPoint();
00169 OGRPoint( double x, double y );
00170 OGRPoint( double x, double y, double z );
00171 virtual ~OGRPoint();
00172
00173
00174 virtual int WkbSize() const;
00175 virtual OGRErr importFromWkb( unsigned char *, int=-1 );
00176 virtual OGRErr exportToWkb( OGRwkbByteOrder, unsigned char * ) const;
00177 virtual OGRErr importFromWkt( char ** );
00178 virtual OGRErr exportToWkt( char ** ppszDstText ) const;
00179
00180
00181 virtual int getDimension() const;
00182 virtual OGRGeometry *clone() const;
00183 virtual void empty();
00184 virtual void getEnvelope( OGREnvelope * psEnvelope ) const;
00185 virtual OGRBoolean IsEmpty() const;
00186
00187
00188 double getX() const { return x; }
00189 double getY() const { return y; }
00190 double getZ() const { return z; }
00191
00192
00193 virtual void setCoordinateDimension( int nDimension );
00194 void setX( double xIn ) { x = xIn; if (nCoordDimension == 0) nCoordDimension = 2; }
00195 void setY( double yIn ) { y = yIn; if (nCoordDimension == 0) nCoordDimension = 2; }
00196 void setZ( double zIn ) { z = zIn; nCoordDimension=3; }
00197
00198
00199 virtual OGRBoolean Equals( OGRGeometry * ) const;
00200
00201
00202 virtual const char *getGeometryName() const;
00203 virtual OGRwkbGeometryType getGeometryType() const;
00204 virtual OGRErr transform( OGRCoordinateTransformation *poCT );
00205 virtual void flattenTo2D();
00206 };
00207
00208
00209
00210
00211
00216 class CPL_DLL OGRCurve : public OGRGeometry
00217 {
00218 public:
00219 OGRCurve();
00220 virtual ~OGRCurve();
00221
00222 virtual double get_Length() const = 0;
00223 virtual void StartPoint(OGRPoint *) const = 0;
00224 virtual void EndPoint(OGRPoint *) const = 0;
00225 virtual int get_IsClosed() const;
00226 virtual void Value( double, OGRPoint * ) const = 0;
00227
00228 };
00229
00230
00231
00232
00233
00238 class CPL_DLL OGRLineString : public OGRCurve
00239 {
00240 protected:
00241 int nPointCount;
00242 OGRRawPoint *paoPoints;
00243 double *padfZ;
00244
00245 void Make3D();
00246 void Make2D();
00247
00248 public:
00249 OGRLineString();
00250 virtual ~OGRLineString();
00251
00252
00253 virtual int WkbSize() const;
00254 virtual OGRErr importFromWkb( unsigned char *, int = -1 );
00255 virtual OGRErr exportToWkb( OGRwkbByteOrder, unsigned char * ) const;
00256 virtual OGRErr importFromWkt( char ** );
00257 virtual OGRErr exportToWkt( char ** ppszDstText ) const;
00258
00259
00260 virtual int getDimension() const;
00261 virtual OGRGeometry *clone() const;
00262 virtual void empty();
00263 virtual void getEnvelope( OGREnvelope * psEnvelope ) const;
00264 virtual OGRBoolean IsEmpty() const;
00265
00266
00267 virtual double get_Length() const;
00268 virtual void StartPoint(OGRPoint *) const;
00269 virtual void EndPoint(OGRPoint *) const;
00270 virtual void Value( double, OGRPoint * ) const;
00271
00272
00273 int getNumPoints() const { return nPointCount; }
00274 void getPoint( int, OGRPoint * ) const;
00275 double getX( int i ) const { return paoPoints[i].x; }
00276 double getY( int i ) const { return paoPoints[i].y; }
00277 double getZ( int i ) const;
00278
00279
00280 virtual OGRBoolean Equals( OGRGeometry * ) const;
00281
00282
00283 virtual void setCoordinateDimension( int nDimension );
00284 void setNumPoints( int );
00285 void setPoint( int, OGRPoint * );
00286 void setPoint( int, double, double );
00287 void setPoint( int, double, double, double );
00288 void setPoints( int, OGRRawPoint *, double * = NULL );
00289 void setPoints( int, double * padfX, double * padfY,
00290 double *padfZ = NULL );
00291 void addPoint( OGRPoint * );
00292 void addPoint( double, double );
00293 void addPoint( double, double, double );
00294
00295 void getPoints( OGRRawPoint *, double * = NULL ) const;
00296
00297 void addSubLineString( const OGRLineString *,
00298 int nStartVertex = 0, int nEndVertex = -1 );
00299
00300
00301 virtual OGRwkbGeometryType getGeometryType() const;
00302 virtual const char *getGeometryName() const;
00303 virtual OGRErr transform( OGRCoordinateTransformation *poCT );
00304 virtual void flattenTo2D();
00305 virtual void segmentize(double dfMaxLength);
00306 };
00307
00308
00309
00310
00311
00330 class CPL_DLL OGRLinearRing : public OGRLineString
00331 {
00332 private:
00333 friend class OGRPolygon;
00334
00335
00336 virtual int _WkbSize( int b3D ) const;
00337 virtual OGRErr _importFromWkb( OGRwkbByteOrder, int b3D,
00338 unsigned char *, int=-1 );
00339 virtual OGRErr _exportToWkb( OGRwkbByteOrder, int b3D,
00340 unsigned char * ) const;
00341
00342 public:
00343 OGRLinearRing();
00344 OGRLinearRing( OGRLinearRing * );
00345 ~OGRLinearRing();
00346
00347
00348 virtual const char *getGeometryName() const;
00349 virtual OGRGeometry *clone() const;
00350 virtual int isClockwise() const;
00351 virtual void reverseWindingOrder();
00352 virtual void closeRings();
00353 virtual double get_Area() const;
00354 OGRBoolean isPointInRing(const OGRPoint* pt, int bTestEnvelope = TRUE) const;
00355 OGRBoolean isPointOnRingBoundary(const OGRPoint* pt, int bTestEnvelope = TRUE) const;
00356
00357
00358
00359
00360 virtual int WkbSize() const;
00361 virtual OGRErr importFromWkb( unsigned char *, int=-1 );
00362 virtual OGRErr exportToWkb( OGRwkbByteOrder, unsigned char * ) const;
00363 };
00364
00365
00366
00367
00368
00373 class CPL_DLL OGRSurface : public OGRGeometry
00374 {
00375 public:
00376 virtual double get_Area() const = 0;
00377 virtual OGRErr Centroid( OGRPoint * poPoint ) const = 0;
00378 virtual OGRErr PointOnSurface( OGRPoint * poPoint ) const = 0;
00379 };
00380
00381
00382
00383
00384
00394 class CPL_DLL OGRPolygon : public OGRSurface
00395 {
00396 int nRingCount;
00397 OGRLinearRing **papoRings;
00398
00399 public:
00400 OGRPolygon();
00401 virtual ~OGRPolygon();
00402
00403
00404 virtual const char *getGeometryName() const;
00405 virtual OGRwkbGeometryType getGeometryType() const;
00406 virtual OGRGeometry *clone() const;
00407 virtual void empty();
00408 virtual OGRErr transform( OGRCoordinateTransformation *poCT );
00409 virtual void flattenTo2D();
00410 virtual OGRBoolean IsEmpty() const;
00411 virtual void segmentize(double dfMaxLength);
00412
00413
00414 virtual double get_Area() const;
00415 virtual int Centroid( OGRPoint * poPoint ) const;
00416 virtual int PointOnSurface( OGRPoint * poPoint ) const;
00417
00418
00419 virtual int WkbSize() const;
00420 virtual OGRErr importFromWkb( unsigned char *, int = -1 );
00421 virtual OGRErr exportToWkb( OGRwkbByteOrder, unsigned char * ) const;
00422 virtual OGRErr importFromWkt( char ** );
00423 virtual OGRErr exportToWkt( char ** ppszDstText ) const;
00424
00425
00426 virtual int getDimension() const;
00427 virtual void getEnvelope( OGREnvelope * psEnvelope ) const;
00428
00429
00430 virtual OGRBoolean Equals( OGRGeometry * ) const;
00431
00432
00433 virtual void setCoordinateDimension( int nDimension );
00434
00435 void addRing( OGRLinearRing * );
00436 void addRingDirectly( OGRLinearRing * );
00437
00438 OGRLinearRing *getExteriorRing();
00439 const OGRLinearRing *getExteriorRing() const;
00440 int getNumInteriorRings() const;
00441 OGRLinearRing *getInteriorRing( int );
00442 const OGRLinearRing *getInteriorRing( int ) const;
00443
00444 OGRBoolean IsPointOnSurface( const OGRPoint * ) const;
00445
00446 virtual void closeRings();
00447 };
00448
00449
00450
00451
00452
00460 class CPL_DLL OGRGeometryCollection : public OGRGeometry
00461 {
00462 int nGeomCount;
00463 OGRGeometry **papoGeoms;
00464
00465 public:
00466 OGRGeometryCollection();
00467 virtual ~OGRGeometryCollection();
00468
00469
00470 virtual const char *getGeometryName() const;
00471 virtual OGRwkbGeometryType getGeometryType() const;
00472 virtual OGRGeometry *clone() const;
00473 virtual void empty();
00474 virtual OGRErr transform( OGRCoordinateTransformation *poCT );
00475 virtual void flattenTo2D();
00476 virtual OGRBoolean IsEmpty() const;
00477 virtual void segmentize(double dfMaxLength);
00478
00479
00480 virtual int WkbSize() const;
00481 virtual OGRErr importFromWkb( unsigned char *, int = -1 );
00482 virtual OGRErr exportToWkb( OGRwkbByteOrder, unsigned char * ) const;
00483 virtual OGRErr importFromWkt( char ** );
00484 virtual OGRErr exportToWkt( char ** ppszDstText ) const;
00485
00486 virtual double get_Area() const;
00487
00488
00489 virtual int getDimension() const;
00490 virtual void getEnvelope( OGREnvelope * psEnvelope ) const;
00491
00492
00493 int getNumGeometries() const;
00494 OGRGeometry *getGeometryRef( int );
00495 const OGRGeometry *getGeometryRef( int ) const;
00496
00497
00498 virtual OGRBoolean Equals( OGRGeometry * ) const;
00499
00500
00501 virtual void setCoordinateDimension( int nDimension );
00502 virtual OGRErr addGeometry( const OGRGeometry * );
00503 virtual OGRErr addGeometryDirectly( OGRGeometry * );
00504 virtual OGRErr removeGeometry( int iIndex, int bDelete = TRUE );
00505
00506 void closeRings();
00507 };
00508
00509
00510
00511
00512
00520 class CPL_DLL OGRMultiPolygon : public OGRGeometryCollection
00521 {
00522 public:
00523 OGRMultiPolygon();
00524
00525 virtual const char *getGeometryName() const;
00526 virtual OGRwkbGeometryType getGeometryType() const;
00527 virtual OGRGeometry *clone() const;
00528 virtual OGRErr importFromWkt( char ** );
00529 virtual OGRErr exportToWkt( char ** ) const;
00530
00531
00532 virtual OGRErr addGeometryDirectly( OGRGeometry * );
00533
00534 virtual double get_Area() const;
00535 };
00536
00537
00538
00539
00540
00545 class CPL_DLL OGRMultiPoint : public OGRGeometryCollection
00546 {
00547 private:
00548 OGRErr importFromWkt_Bracketed( char ** );
00549
00550 public:
00551 OGRMultiPoint();
00552
00553 virtual const char *getGeometryName() const;
00554 virtual OGRwkbGeometryType getGeometryType() const;
00555 virtual OGRGeometry *clone() const;
00556 virtual OGRErr importFromWkt( char ** );
00557 virtual OGRErr exportToWkt( char ** ) const;
00558
00559
00560 virtual OGRErr addGeometryDirectly( OGRGeometry * );
00561 };
00562
00563
00564
00565
00566
00571 class CPL_DLL OGRMultiLineString : public OGRGeometryCollection
00572 {
00573 public:
00574 OGRMultiLineString();
00575 ~OGRMultiLineString();
00576
00577 virtual const char *getGeometryName() const;
00578 virtual OGRwkbGeometryType getGeometryType() const;
00579 virtual OGRGeometry *clone() const;
00580 virtual OGRErr importFromWkt( char ** );
00581 virtual OGRErr exportToWkt( char ** ) const;
00582
00583
00584 virtual OGRErr addGeometryDirectly( OGRGeometry * );
00585 };
00586
00587
00588
00589
00590
00591
00596 class CPL_DLL OGRGeometryFactory
00597 {
00598 public:
00599 static OGRErr createFromWkb( unsigned char *, OGRSpatialReference *,
00600 OGRGeometry **, int = -1 );
00601 static OGRErr createFromWkt( char **, OGRSpatialReference *,
00602 OGRGeometry ** );
00603 static OGRErr createFromFgf( unsigned char *, OGRSpatialReference *,
00604 OGRGeometry **, int = -1, int * = NULL );
00605 static OGRGeometry *createFromGML( const char * );
00606 static OGRGeometry *createFromGEOS( GEOSGeom );
00607
00608 static void destroyGeometry( OGRGeometry * );
00609 static OGRGeometry *createGeometry( OGRwkbGeometryType );
00610
00611 static OGRGeometry * forceToPolygon( OGRGeometry * );
00612 static OGRGeometry * forceToMultiPolygon( OGRGeometry * );
00613 static OGRGeometry * forceToMultiPoint( OGRGeometry * );
00614 static OGRGeometry * forceToMultiLineString( OGRGeometry * );
00615
00616 static OGRGeometry * organizePolygons( OGRGeometry **papoPolygons,
00617 int nPolygonCount,
00618 int *pbResultValidGeometry,
00619 const char **papszOptions = NULL);
00620
00621 static void *getGEOSGeometryFactory();
00622
00623 static int haveGEOS();
00624
00625 };
00626
00627 #endif