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) const;
00355
00356
00357
00358
00359 virtual int WkbSize() const;
00360 virtual OGRErr importFromWkb( unsigned char *, int=-1 );
00361 virtual OGRErr exportToWkb( OGRwkbByteOrder, unsigned char * ) const;
00362 };
00363
00364
00365
00366
00367
00372 class CPL_DLL OGRSurface : public OGRGeometry
00373 {
00374 public:
00375 virtual double get_Area() const = 0;
00376 virtual OGRErr Centroid( OGRPoint * poPoint ) const = 0;
00377 virtual OGRErr PointOnSurface( OGRPoint * poPoint ) const = 0;
00378 };
00379
00380
00381
00382
00383
00393 class CPL_DLL OGRPolygon : public OGRSurface
00394 {
00395 int nRingCount;
00396 OGRLinearRing **papoRings;
00397
00398 public:
00399 OGRPolygon();
00400 virtual ~OGRPolygon();
00401
00402
00403 virtual const char *getGeometryName() const;
00404 virtual OGRwkbGeometryType getGeometryType() const;
00405 virtual OGRGeometry *clone() const;
00406 virtual void empty();
00407 virtual OGRErr transform( OGRCoordinateTransformation *poCT );
00408 virtual void flattenTo2D();
00409 virtual OGRBoolean IsEmpty() const;
00410 virtual void segmentize(double dfMaxLength);
00411
00412
00413 virtual double get_Area() const;
00414 virtual int Centroid( OGRPoint * poPoint ) const;
00415 virtual int PointOnSurface( OGRPoint * poPoint ) const;
00416
00417
00418 virtual int WkbSize() const;
00419 virtual OGRErr importFromWkb( unsigned char *, int = -1 );
00420 virtual OGRErr exportToWkb( OGRwkbByteOrder, unsigned char * ) const;
00421 virtual OGRErr importFromWkt( char ** );
00422 virtual OGRErr exportToWkt( char ** ppszDstText ) const;
00423
00424
00425 virtual int getDimension() const;
00426 virtual void getEnvelope( OGREnvelope * psEnvelope ) const;
00427
00428
00429 virtual OGRBoolean Equals( OGRGeometry * ) const;
00430
00431
00432 virtual void setCoordinateDimension( int nDimension );
00433
00434 void addRing( OGRLinearRing * );
00435 void addRingDirectly( OGRLinearRing * );
00436
00437 OGRLinearRing *getExteriorRing();
00438 const OGRLinearRing *getExteriorRing() const;
00439 int getNumInteriorRings() const;
00440 OGRLinearRing *getInteriorRing( int );
00441 const OGRLinearRing *getInteriorRing( int ) const;
00442
00443 OGRBoolean IsPointOnSurface( const OGRPoint * ) const;
00444
00445 virtual void closeRings();
00446 };
00447
00448
00449
00450
00451
00459 class CPL_DLL OGRGeometryCollection : public OGRGeometry
00460 {
00461 int nGeomCount;
00462 OGRGeometry **papoGeoms;
00463
00464 public:
00465 OGRGeometryCollection();
00466 virtual ~OGRGeometryCollection();
00467
00468
00469 virtual const char *getGeometryName() const;
00470 virtual OGRwkbGeometryType getGeometryType() const;
00471 virtual OGRGeometry *clone() const;
00472 virtual void empty();
00473 virtual OGRErr transform( OGRCoordinateTransformation *poCT );
00474 virtual void flattenTo2D();
00475 virtual OGRBoolean IsEmpty() const;
00476 virtual void segmentize(double dfMaxLength);
00477
00478
00479 virtual int WkbSize() const;
00480 virtual OGRErr importFromWkb( unsigned char *, int = -1 );
00481 virtual OGRErr exportToWkb( OGRwkbByteOrder, unsigned char * ) const;
00482 virtual OGRErr importFromWkt( char ** );
00483 virtual OGRErr exportToWkt( char ** ppszDstText ) const;
00484
00485 virtual double get_Area() const;
00486
00487
00488 virtual int getDimension() const;
00489 virtual void getEnvelope( OGREnvelope * psEnvelope ) const;
00490
00491
00492 int getNumGeometries() const;
00493 OGRGeometry *getGeometryRef( int );
00494 const OGRGeometry *getGeometryRef( int ) const;
00495
00496
00497 virtual OGRBoolean Equals( OGRGeometry * ) const;
00498
00499
00500 virtual void setCoordinateDimension( int nDimension );
00501 virtual OGRErr addGeometry( const OGRGeometry * );
00502 virtual OGRErr addGeometryDirectly( OGRGeometry * );
00503 virtual OGRErr removeGeometry( int iIndex, int bDelete = TRUE );
00504
00505 void closeRings();
00506 };
00507
00508
00509
00510
00511
00519 class CPL_DLL OGRMultiPolygon : public OGRGeometryCollection
00520 {
00521 public:
00522 OGRMultiPolygon();
00523
00524 virtual const char *getGeometryName() const;
00525 virtual OGRwkbGeometryType getGeometryType() const;
00526 virtual OGRGeometry *clone() const;
00527 virtual OGRErr importFromWkt( char ** );
00528 virtual OGRErr exportToWkt( char ** ) const;
00529
00530
00531 virtual OGRErr addGeometryDirectly( OGRGeometry * );
00532
00533 virtual double get_Area() const;
00534 };
00535
00536
00537
00538
00539
00544 class CPL_DLL OGRMultiPoint : public OGRGeometryCollection
00545 {
00546 private:
00547 OGRErr importFromWkt_Bracketed( char ** );
00548
00549 public:
00550 OGRMultiPoint();
00551
00552 virtual const char *getGeometryName() const;
00553 virtual OGRwkbGeometryType getGeometryType() const;
00554 virtual OGRGeometry *clone() const;
00555 virtual OGRErr importFromWkt( char ** );
00556 virtual OGRErr exportToWkt( char ** ) const;
00557
00558
00559 virtual OGRErr addGeometryDirectly( OGRGeometry * );
00560 };
00561
00562
00563
00564
00565
00570 class CPL_DLL OGRMultiLineString : public OGRGeometryCollection
00571 {
00572 public:
00573 OGRMultiLineString();
00574 ~OGRMultiLineString();
00575
00576 virtual const char *getGeometryName() const;
00577 virtual OGRwkbGeometryType getGeometryType() const;
00578 virtual OGRGeometry *clone() const;
00579 virtual OGRErr importFromWkt( char ** );
00580 virtual OGRErr exportToWkt( char ** ) const;
00581
00582
00583 virtual OGRErr addGeometryDirectly( OGRGeometry * );
00584 };
00585
00586
00587
00588
00589
00590
00595 class CPL_DLL OGRGeometryFactory
00596 {
00597 public:
00598 static OGRErr createFromWkb( unsigned char *, OGRSpatialReference *,
00599 OGRGeometry **, int = -1 );
00600 static OGRErr createFromWkt( char **, OGRSpatialReference *,
00601 OGRGeometry ** );
00602 static OGRErr createFromFgf( unsigned char *, OGRSpatialReference *,
00603 OGRGeometry **, int = -1, int * = NULL );
00604 static OGRGeometry *createFromGML( const char * );
00605 static OGRGeometry *createFromGEOS( GEOSGeom );
00606
00607 static void destroyGeometry( OGRGeometry * );
00608 static OGRGeometry *createGeometry( OGRwkbGeometryType );
00609
00610 static OGRGeometry * forceToPolygon( OGRGeometry * );
00611 static OGRGeometry * forceToMultiPolygon( OGRGeometry * );
00612 static OGRGeometry * forceToMultiPoint( OGRGeometry * );
00613 static OGRGeometry * forceToMultiLineString( OGRGeometry * );
00614
00615 static OGRGeometry * organizePolygons( OGRGeometry **papoPolygons,
00616 int nPolygonCount,
00617 int *pbResultValidGeometry );
00618
00619 static void *getGEOSGeometryFactory();
00620
00621 static int haveGEOS();
00622
00623 };
00624
00625 #endif