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
00063 class OGRPoint;
00064
00077 class CPL_DLL OGRGeometry
00078 {
00079 private:
00080 OGRSpatialReference * poSRS;
00081
00082 protected:
00083 int nCoordDimension;
00084
00085 public:
00086 OGRGeometry();
00087 virtual ~OGRGeometry();
00088
00089
00090 virtual int getDimension() const = 0;
00091 virtual int getCoordinateDimension() const;
00092 virtual OGRBoolean IsEmpty() const = 0;
00093 virtual OGRBoolean IsValid() const;
00094 virtual OGRBoolean IsSimple() const;
00095 virtual OGRBoolean IsRing() const;
00096 virtual void empty() = 0;
00097 virtual OGRGeometry *clone() const = 0;
00098 virtual void getEnvelope( OGREnvelope * psEnvelope ) const = 0;
00099 virtual void getEnvelope( OGREnvelope3D * psEnvelope ) const = 0;
00100
00101
00102 virtual int WkbSize() const = 0;
00103 virtual OGRErr importFromWkb( unsigned char *, int=-1 )=0;
00104 virtual OGRErr exportToWkb( OGRwkbByteOrder, unsigned char * ) const = 0;
00105 virtual OGRErr importFromWkt( char ** ppszInput ) = 0;
00106 virtual OGRErr exportToWkt( char ** ppszDstText ) const = 0;
00107
00108
00109 virtual OGRwkbGeometryType getGeometryType() const = 0;
00110 virtual const char *getGeometryName() const = 0;
00111 virtual void dumpReadable( FILE *, const char * = NULL, char** papszOptions = NULL ) const;
00112 virtual void flattenTo2D() = 0;
00113 virtual char * exportToGML( const char* const * papszOptions = NULL ) const;
00114 virtual char * exportToKML() const;
00115 virtual char * exportToJson() const;
00116 virtual GEOSGeom exportToGEOS() const;
00117 virtual void closeRings();
00118
00119 virtual void setCoordinateDimension( int nDimension );
00120
00121 void assignSpatialReference( OGRSpatialReference * poSR );
00122 OGRSpatialReference *getSpatialReference( void ) const { return poSRS; }
00123
00124 virtual OGRErr transform( OGRCoordinateTransformation *poCT ) = 0;
00125 OGRErr transformTo( OGRSpatialReference *poSR );
00126
00127 virtual void segmentize(double dfMaxLength);
00128
00129
00130 virtual OGRBoolean Intersects( OGRGeometry * ) const;
00131 virtual OGRBoolean Equals( OGRGeometry * ) const = 0;
00132 virtual OGRBoolean Disjoint( const OGRGeometry * ) const;
00133 virtual OGRBoolean Touches( const OGRGeometry * ) const;
00134 virtual OGRBoolean Crosses( const OGRGeometry * ) const;
00135 virtual OGRBoolean Within( const OGRGeometry * ) const;
00136 virtual OGRBoolean Contains( const OGRGeometry * ) const;
00137 virtual OGRBoolean Overlaps( const OGRGeometry * ) const;
00138
00139
00140 virtual OGRGeometry *Boundary() const;
00141 virtual double Distance( const OGRGeometry * ) const;
00142 virtual OGRGeometry *ConvexHull() const;
00143 virtual OGRGeometry *Buffer( double dfDist, int nQuadSegs = 30 ) const;
00144 virtual OGRGeometry *Intersection( const OGRGeometry *) const;
00145 virtual OGRGeometry *Union( const OGRGeometry * ) const;
00146 virtual OGRGeometry *UnionCascaded() const;
00147 virtual OGRGeometry *Difference( const OGRGeometry * ) const;
00148 virtual OGRGeometry *SymDifference( const OGRGeometry * ) const;
00149 virtual OGRErr Centroid( OGRPoint * poPoint ) const;
00150 virtual OGRGeometry *Simplify(double dTolerance) const;
00151 OGRGeometry *SimplifyPreserveTopology(double dTolerance) const;
00152
00153 virtual OGRGeometry *Polygonize() const;
00154
00155
00156 OGRBoolean Intersect( OGRGeometry * ) const;
00157 OGRBoolean Equal( OGRGeometry * ) const;
00158 virtual OGRGeometry *SymmetricDifference( const OGRGeometry * ) const;
00159 virtual OGRGeometry *getBoundary() const;
00160
00161
00162 static int bGenerate_DB2_V72_BYTE_ORDER;
00163
00164 virtual void swapXY();
00165 };
00166
00167
00168
00169
00170
00177 class CPL_DLL OGRPoint : public OGRGeometry
00178 {
00179 double x;
00180 double y;
00181 double z;
00182
00183 public:
00184 OGRPoint();
00185 OGRPoint( double x, double y );
00186 OGRPoint( double x, double y, double z );
00187 virtual ~OGRPoint();
00188
00189
00190 virtual int WkbSize() const;
00191 virtual OGRErr importFromWkb( unsigned char *, int=-1 );
00192 virtual OGRErr exportToWkb( OGRwkbByteOrder, unsigned char * ) const;
00193 virtual OGRErr importFromWkt( char ** );
00194 virtual OGRErr exportToWkt( char ** ppszDstText ) const;
00195
00196
00197 virtual int getDimension() const;
00198 virtual OGRGeometry *clone() const;
00199 virtual void empty();
00200 virtual void getEnvelope( OGREnvelope * psEnvelope ) const;
00201 virtual void getEnvelope( OGREnvelope3D * psEnvelope ) const;
00202 virtual OGRBoolean IsEmpty() const;
00203
00204
00205 double getX() const { return x; }
00206 double getY() const { return y; }
00207 double getZ() const { return z; }
00208
00209
00210 virtual void setCoordinateDimension( int nDimension );
00211 void setX( double xIn ) { x = xIn; if (nCoordDimension == 0) nCoordDimension = 2; }
00212 void setY( double yIn ) { y = yIn; if (nCoordDimension == 0) nCoordDimension = 2; }
00213 void setZ( double zIn ) { z = zIn; nCoordDimension=3; }
00214
00215
00216 virtual OGRBoolean Equals( OGRGeometry * ) const;
00217
00218
00219 virtual const char *getGeometryName() const;
00220 virtual OGRwkbGeometryType getGeometryType() const;
00221 virtual OGRErr transform( OGRCoordinateTransformation *poCT );
00222 virtual void flattenTo2D();
00223
00224 virtual void swapXY();
00225 };
00226
00227
00228
00229
00230
00235 class CPL_DLL OGRCurve : public OGRGeometry
00236 {
00237 public:
00238 OGRCurve();
00239 virtual ~OGRCurve();
00240
00241 virtual double get_Length() const = 0;
00242 virtual void StartPoint(OGRPoint *) const = 0;
00243 virtual void EndPoint(OGRPoint *) const = 0;
00244 virtual int get_IsClosed() const;
00245 virtual void Value( double, OGRPoint * ) const = 0;
00246
00247 };
00248
00249
00250
00251
00252
00257 class CPL_DLL OGRLineString : public OGRCurve
00258 {
00259 protected:
00260 int nPointCount;
00261 OGRRawPoint *paoPoints;
00262 double *padfZ;
00263
00264 void Make3D();
00265 void Make2D();
00266
00267 public:
00268 OGRLineString();
00269 virtual ~OGRLineString();
00270
00271
00272 virtual int WkbSize() const;
00273 virtual OGRErr importFromWkb( unsigned char *, int = -1 );
00274 virtual OGRErr exportToWkb( OGRwkbByteOrder, unsigned char * ) const;
00275 virtual OGRErr importFromWkt( char ** );
00276 virtual OGRErr exportToWkt( char ** ppszDstText ) const;
00277
00278
00279 virtual int getDimension() const;
00280 virtual OGRGeometry *clone() const;
00281 virtual void empty();
00282 virtual void getEnvelope( OGREnvelope * psEnvelope ) const;
00283 virtual void getEnvelope( OGREnvelope3D * psEnvelope ) const;
00284 virtual OGRBoolean IsEmpty() const;
00285
00286
00287 virtual double get_Length() const;
00288 virtual void StartPoint(OGRPoint *) const;
00289 virtual void EndPoint(OGRPoint *) const;
00290 virtual void Value( double, OGRPoint * ) const;
00291
00292
00293 int getNumPoints() const { return nPointCount; }
00294 void getPoint( int, OGRPoint * ) const;
00295 double getX( int i ) const { return paoPoints[i].x; }
00296 double getY( int i ) const { return paoPoints[i].y; }
00297 double getZ( int i ) const;
00298
00299
00300 virtual OGRBoolean Equals( OGRGeometry * ) const;
00301
00302
00303 virtual void setCoordinateDimension( int nDimension );
00304 void setNumPoints( int );
00305 void setPoint( int, OGRPoint * );
00306 void setPoint( int, double, double );
00307 void setPoint( int, double, double, double );
00308 void setPoints( int, OGRRawPoint *, double * = NULL );
00309 void setPoints( int, double * padfX, double * padfY,
00310 double *padfZ = NULL );
00311 void addPoint( OGRPoint * );
00312 void addPoint( double, double );
00313 void addPoint( double, double, double );
00314
00315 void getPoints( OGRRawPoint *, double * = NULL ) const;
00316 void getPoints( void* pabyX, int nXStride,
00317 void* pabyY, int nYStride,
00318 void* pabyZ = NULL, int nZStride = 0 ) const;
00319
00320 void addSubLineString( const OGRLineString *,
00321 int nStartVertex = 0, int nEndVertex = -1 );
00322 void reversePoints( void );
00323
00324
00325 virtual OGRwkbGeometryType getGeometryType() const;
00326 virtual const char *getGeometryName() const;
00327 virtual OGRErr transform( OGRCoordinateTransformation *poCT );
00328 virtual void flattenTo2D();
00329 virtual void segmentize(double dfMaxLength);
00330
00331 virtual void swapXY();
00332 };
00333
00334
00335
00336
00337
00356 class CPL_DLL OGRLinearRing : public OGRLineString
00357 {
00358 private:
00359 friend class OGRPolygon;
00360
00361
00362 virtual int _WkbSize( int b3D ) const;
00363 virtual OGRErr _importFromWkb( OGRwkbByteOrder, int b3D,
00364 unsigned char *, int=-1 );
00365 virtual OGRErr _exportToWkb( OGRwkbByteOrder, int b3D,
00366 unsigned char * ) const;
00367
00368 public:
00369 OGRLinearRing();
00370 OGRLinearRing( OGRLinearRing * );
00371 ~OGRLinearRing();
00372
00373
00374 virtual const char *getGeometryName() const;
00375 virtual OGRGeometry *clone() const;
00376 virtual int isClockwise() const;
00377 virtual void reverseWindingOrder();
00378 virtual void closeRings();
00379 virtual double get_Area() const;
00380 OGRBoolean isPointInRing(const OGRPoint* pt, int bTestEnvelope = TRUE) const;
00381 OGRBoolean isPointOnRingBoundary(const OGRPoint* pt, int bTestEnvelope = TRUE) const;
00382
00383
00384
00385
00386 virtual int WkbSize() const;
00387 virtual OGRErr importFromWkb( unsigned char *, int=-1 );
00388 virtual OGRErr exportToWkb( OGRwkbByteOrder, unsigned char * ) const;
00389 };
00390
00391
00392
00393
00394
00399 class CPL_DLL OGRSurface : public OGRGeometry
00400 {
00401 public:
00402 virtual double get_Area() const = 0;
00403 virtual OGRErr PointOnSurface( OGRPoint * poPoint ) const = 0;
00404 };
00405
00406
00407
00408
00409
00419 class CPL_DLL OGRPolygon : public OGRSurface
00420 {
00421 int nRingCount;
00422 OGRLinearRing **papoRings;
00423
00424 public:
00425 OGRPolygon();
00426 virtual ~OGRPolygon();
00427
00428
00429 virtual const char *getGeometryName() const;
00430 virtual OGRwkbGeometryType getGeometryType() const;
00431 virtual OGRGeometry *clone() const;
00432 virtual void empty();
00433 virtual OGRErr transform( OGRCoordinateTransformation *poCT );
00434 virtual void flattenTo2D();
00435 virtual OGRBoolean IsEmpty() const;
00436 virtual void segmentize(double dfMaxLength);
00437
00438
00439 virtual double get_Area() const;
00440 virtual int PointOnSurface( OGRPoint * poPoint ) const;
00441
00442
00443 virtual int WkbSize() const;
00444 virtual OGRErr importFromWkb( unsigned char *, int = -1 );
00445 virtual OGRErr exportToWkb( OGRwkbByteOrder, unsigned char * ) const;
00446 virtual OGRErr importFromWkt( char ** );
00447 virtual OGRErr exportToWkt( char ** ppszDstText ) const;
00448
00449
00450 virtual int getDimension() const;
00451 virtual void getEnvelope( OGREnvelope * psEnvelope ) const;
00452 virtual void getEnvelope( OGREnvelope3D * psEnvelope ) const;
00453
00454
00455 virtual OGRBoolean Equals( OGRGeometry * ) const;
00456
00457
00458 virtual void setCoordinateDimension( int nDimension );
00459
00460 void addRing( OGRLinearRing * );
00461 void addRingDirectly( OGRLinearRing * );
00462
00463 OGRLinearRing *getExteriorRing();
00464 const OGRLinearRing *getExteriorRing() const;
00465 int getNumInteriorRings() const;
00466 OGRLinearRing *getInteriorRing( int );
00467 const OGRLinearRing *getInteriorRing( int ) const;
00468
00469 OGRBoolean IsPointOnSurface( const OGRPoint * ) const;
00470
00471 virtual void closeRings();
00472
00473 virtual void swapXY();
00474 };
00475
00476
00477
00478
00479
00487 class CPL_DLL OGRGeometryCollection : public OGRGeometry
00488 {
00489 int nGeomCount;
00490 OGRGeometry **papoGeoms;
00491
00492 OGRErr importFromWkbInternal( unsigned char * pabyData, int nSize, int nRecLevel );
00493 OGRErr importFromWktInternal( char **ppszInput, int nRecLevel );
00494
00495 public:
00496 OGRGeometryCollection();
00497 virtual ~OGRGeometryCollection();
00498
00499
00500 virtual const char *getGeometryName() const;
00501 virtual OGRwkbGeometryType getGeometryType() const;
00502 virtual OGRGeometry *clone() const;
00503 virtual void empty();
00504 virtual OGRErr transform( OGRCoordinateTransformation *poCT );
00505 virtual void flattenTo2D();
00506 virtual OGRBoolean IsEmpty() const;
00507 virtual void segmentize(double dfMaxLength);
00508
00509
00510 virtual int WkbSize() const;
00511 virtual OGRErr importFromWkb( unsigned char *, int = -1 );
00512 virtual OGRErr exportToWkb( OGRwkbByteOrder, unsigned char * ) const;
00513 virtual OGRErr importFromWkt( char ** );
00514 virtual OGRErr exportToWkt( char ** ppszDstText ) const;
00515
00516 virtual double get_Length() const;
00517 virtual double get_Area() const;
00518
00519
00520 virtual int getDimension() const;
00521 virtual void getEnvelope( OGREnvelope * psEnvelope ) const;
00522 virtual void getEnvelope( OGREnvelope3D * psEnvelope ) const;
00523
00524
00525 int getNumGeometries() const;
00526 OGRGeometry *getGeometryRef( int );
00527 const OGRGeometry *getGeometryRef( int ) const;
00528
00529
00530 virtual OGRBoolean Equals( OGRGeometry * ) const;
00531
00532
00533 virtual void setCoordinateDimension( int nDimension );
00534 virtual OGRErr addGeometry( const OGRGeometry * );
00535 virtual OGRErr addGeometryDirectly( OGRGeometry * );
00536 virtual OGRErr removeGeometry( int iIndex, int bDelete = TRUE );
00537
00538 void closeRings();
00539
00540 virtual void swapXY();
00541 };
00542
00543
00544
00545
00546
00554 class CPL_DLL OGRMultiPolygon : public OGRGeometryCollection
00555 {
00556 public:
00557 OGRMultiPolygon();
00558
00559 virtual const char *getGeometryName() const;
00560 virtual OGRwkbGeometryType getGeometryType() const;
00561 virtual OGRGeometry *clone() const;
00562 virtual OGRErr importFromWkt( char ** );
00563 virtual OGRErr exportToWkt( char ** ) const;
00564
00565
00566 virtual OGRErr addGeometryDirectly( OGRGeometry * );
00567
00568 virtual double get_Area() const;
00569 };
00570
00571
00572
00573
00574
00579 class CPL_DLL OGRMultiPoint : public OGRGeometryCollection
00580 {
00581 private:
00582 OGRErr importFromWkt_Bracketed( char **, int bHasM, int bHasZ );
00583
00584 public:
00585 OGRMultiPoint();
00586
00587 virtual const char *getGeometryName() const;
00588 virtual OGRwkbGeometryType getGeometryType() const;
00589 virtual OGRGeometry *clone() const;
00590 virtual OGRErr importFromWkt( char ** );
00591 virtual OGRErr exportToWkt( char ** ) const;
00592
00593
00594 virtual OGRErr addGeometryDirectly( OGRGeometry * );
00595 };
00596
00597
00598
00599
00600
00605 class CPL_DLL OGRMultiLineString : public OGRGeometryCollection
00606 {
00607 public:
00608 OGRMultiLineString();
00609 ~OGRMultiLineString();
00610
00611 virtual const char *getGeometryName() const;
00612 virtual OGRwkbGeometryType getGeometryType() const;
00613 virtual OGRGeometry *clone() const;
00614 virtual OGRErr importFromWkt( char ** );
00615 virtual OGRErr exportToWkt( char ** ) const;
00616
00617
00618 virtual OGRErr addGeometryDirectly( OGRGeometry * );
00619 };
00620
00621
00622
00623
00624
00625
00630 class CPL_DLL OGRGeometryFactory
00631 {
00632 static OGRErr createFromFgfInternal( unsigned char *pabyData,
00633 OGRSpatialReference * poSR,
00634 OGRGeometry **ppoReturn,
00635 int nBytes,
00636 int *pnBytesConsumed,
00637 int nRecLevel );
00638 public:
00639 static OGRErr createFromWkb( unsigned char *, OGRSpatialReference *,
00640 OGRGeometry **, int = -1 );
00641 static OGRErr createFromWkt( char **, OGRSpatialReference *,
00642 OGRGeometry ** );
00643 static OGRErr createFromFgf( unsigned char *, OGRSpatialReference *,
00644 OGRGeometry **, int = -1, int * = NULL );
00645 static OGRGeometry *createFromGML( const char * );
00646 static OGRGeometry *createFromGEOS( GEOSGeom );
00647
00648 static void destroyGeometry( OGRGeometry * );
00649 static OGRGeometry *createGeometry( OGRwkbGeometryType );
00650
00651 static OGRGeometry * forceToPolygon( OGRGeometry * );
00652 static OGRGeometry * forceToMultiPolygon( OGRGeometry * );
00653 static OGRGeometry * forceToMultiPoint( OGRGeometry * );
00654 static OGRGeometry * forceToMultiLineString( OGRGeometry * );
00655
00656 static OGRGeometry * organizePolygons( OGRGeometry **papoPolygons,
00657 int nPolygonCount,
00658 int *pbResultValidGeometry,
00659 const char **papszOptions = NULL);
00660
00661 static void *getGEOSGeometryFactory();
00662
00663 static int haveGEOS();
00664
00665 static OGRGeometry* transformWithOptions( const OGRGeometry* poSrcGeom,
00666 OGRCoordinateTransformation *poCT,
00667 char** papszOptions );
00668
00669 static OGRGeometry*
00670 approximateArcAngles( double dfX, double dfY, double dfZ,
00671 double dfPrimaryRadius, double dfSecondaryAxis,
00672 double dfRotation,
00673 double dfStartAngle, double dfEndAngle,
00674 double dfMaxAngleStepSizeDegrees );
00675 };
00676
00677 OGRwkbGeometryType CPL_DLL OGRFromOGCGeomType( const char *pszGeomType );
00678 const char CPL_DLL * OGRToOGCGeomType( OGRwkbGeometryType eGeomType );
00679
00680 #endif