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
00323
00324 virtual OGRwkbGeometryType getGeometryType() const;
00325 virtual const char *getGeometryName() const;
00326 virtual OGRErr transform( OGRCoordinateTransformation *poCT );
00327 virtual void flattenTo2D();
00328 virtual void segmentize(double dfMaxLength);
00329
00330 virtual void swapXY();
00331 };
00332
00333
00334
00335
00336
00355 class CPL_DLL OGRLinearRing : public OGRLineString
00356 {
00357 private:
00358 friend class OGRPolygon;
00359
00360
00361 virtual int _WkbSize( int b3D ) const;
00362 virtual OGRErr _importFromWkb( OGRwkbByteOrder, int b3D,
00363 unsigned char *, int=-1 );
00364 virtual OGRErr _exportToWkb( OGRwkbByteOrder, int b3D,
00365 unsigned char * ) const;
00366
00367 public:
00368 OGRLinearRing();
00369 OGRLinearRing( OGRLinearRing * );
00370 ~OGRLinearRing();
00371
00372
00373 virtual const char *getGeometryName() const;
00374 virtual OGRGeometry *clone() const;
00375 virtual int isClockwise() const;
00376 virtual void reverseWindingOrder();
00377 virtual void closeRings();
00378 virtual double get_Area() const;
00379 OGRBoolean isPointInRing(const OGRPoint* pt, int bTestEnvelope = TRUE) const;
00380 OGRBoolean isPointOnRingBoundary(const OGRPoint* pt, int bTestEnvelope = TRUE) const;
00381
00382
00383
00384
00385 virtual int WkbSize() const;
00386 virtual OGRErr importFromWkb( unsigned char *, int=-1 );
00387 virtual OGRErr exportToWkb( OGRwkbByteOrder, unsigned char * ) const;
00388 };
00389
00390
00391
00392
00393
00398 class CPL_DLL OGRSurface : public OGRGeometry
00399 {
00400 public:
00401 virtual double get_Area() const = 0;
00402 virtual OGRErr PointOnSurface( OGRPoint * poPoint ) const = 0;
00403 };
00404
00405
00406
00407
00408
00418 class CPL_DLL OGRPolygon : public OGRSurface
00419 {
00420 int nRingCount;
00421 OGRLinearRing **papoRings;
00422
00423 public:
00424 OGRPolygon();
00425 virtual ~OGRPolygon();
00426
00427
00428 virtual const char *getGeometryName() const;
00429 virtual OGRwkbGeometryType getGeometryType() const;
00430 virtual OGRGeometry *clone() const;
00431 virtual void empty();
00432 virtual OGRErr transform( OGRCoordinateTransformation *poCT );
00433 virtual void flattenTo2D();
00434 virtual OGRBoolean IsEmpty() const;
00435 virtual void segmentize(double dfMaxLength);
00436
00437
00438 virtual double get_Area() const;
00439 virtual int PointOnSurface( OGRPoint * poPoint ) const;
00440
00441
00442 virtual int WkbSize() const;
00443 virtual OGRErr importFromWkb( unsigned char *, int = -1 );
00444 virtual OGRErr exportToWkb( OGRwkbByteOrder, unsigned char * ) const;
00445 virtual OGRErr importFromWkt( char ** );
00446 virtual OGRErr exportToWkt( char ** ppszDstText ) const;
00447
00448
00449 virtual int getDimension() const;
00450 virtual void getEnvelope( OGREnvelope * psEnvelope ) const;
00451 virtual void getEnvelope( OGREnvelope3D * psEnvelope ) const;
00452
00453
00454 virtual OGRBoolean Equals( OGRGeometry * ) const;
00455
00456
00457 virtual void setCoordinateDimension( int nDimension );
00458
00459 void addRing( OGRLinearRing * );
00460 void addRingDirectly( OGRLinearRing * );
00461
00462 OGRLinearRing *getExteriorRing();
00463 const OGRLinearRing *getExteriorRing() const;
00464 int getNumInteriorRings() const;
00465 OGRLinearRing *getInteriorRing( int );
00466 const OGRLinearRing *getInteriorRing( int ) const;
00467
00468 OGRBoolean IsPointOnSurface( const OGRPoint * ) const;
00469
00470 virtual void closeRings();
00471
00472 virtual void swapXY();
00473 };
00474
00475
00476
00477
00478
00486 class CPL_DLL OGRGeometryCollection : public OGRGeometry
00487 {
00488 int nGeomCount;
00489 OGRGeometry **papoGeoms;
00490
00491 OGRErr importFromWkbInternal( unsigned char * pabyData, int nSize, int nRecLevel );
00492 OGRErr importFromWktInternal( char **ppszInput, int nRecLevel );
00493
00494 public:
00495 OGRGeometryCollection();
00496 virtual ~OGRGeometryCollection();
00497
00498
00499 virtual const char *getGeometryName() const;
00500 virtual OGRwkbGeometryType getGeometryType() const;
00501 virtual OGRGeometry *clone() const;
00502 virtual void empty();
00503 virtual OGRErr transform( OGRCoordinateTransformation *poCT );
00504 virtual void flattenTo2D();
00505 virtual OGRBoolean IsEmpty() const;
00506 virtual void segmentize(double dfMaxLength);
00507
00508
00509 virtual int WkbSize() const;
00510 virtual OGRErr importFromWkb( unsigned char *, int = -1 );
00511 virtual OGRErr exportToWkb( OGRwkbByteOrder, unsigned char * ) const;
00512 virtual OGRErr importFromWkt( char ** );
00513 virtual OGRErr exportToWkt( char ** ppszDstText ) const;
00514
00515 virtual double get_Length() const;
00516 virtual double get_Area() const;
00517
00518
00519 virtual int getDimension() const;
00520 virtual void getEnvelope( OGREnvelope * psEnvelope ) const;
00521 virtual void getEnvelope( OGREnvelope3D * psEnvelope ) const;
00522
00523
00524 int getNumGeometries() const;
00525 OGRGeometry *getGeometryRef( int );
00526 const OGRGeometry *getGeometryRef( int ) const;
00527
00528
00529 virtual OGRBoolean Equals( OGRGeometry * ) const;
00530
00531
00532 virtual void setCoordinateDimension( int nDimension );
00533 virtual OGRErr addGeometry( const OGRGeometry * );
00534 virtual OGRErr addGeometryDirectly( OGRGeometry * );
00535 virtual OGRErr removeGeometry( int iIndex, int bDelete = TRUE );
00536
00537 void closeRings();
00538
00539 virtual void swapXY();
00540 };
00541
00542
00543
00544
00545
00553 class CPL_DLL OGRMultiPolygon : public OGRGeometryCollection
00554 {
00555 public:
00556 OGRMultiPolygon();
00557
00558 virtual const char *getGeometryName() const;
00559 virtual OGRwkbGeometryType getGeometryType() const;
00560 virtual OGRGeometry *clone() const;
00561 virtual OGRErr importFromWkt( char ** );
00562 virtual OGRErr exportToWkt( char ** ) const;
00563
00564
00565 virtual OGRErr addGeometryDirectly( OGRGeometry * );
00566
00567 virtual double get_Area() const;
00568 };
00569
00570
00571
00572
00573
00578 class CPL_DLL OGRMultiPoint : public OGRGeometryCollection
00579 {
00580 private:
00581 OGRErr importFromWkt_Bracketed( char **, int bHasM, int bHasZ );
00582
00583 public:
00584 OGRMultiPoint();
00585
00586 virtual const char *getGeometryName() const;
00587 virtual OGRwkbGeometryType getGeometryType() const;
00588 virtual OGRGeometry *clone() const;
00589 virtual OGRErr importFromWkt( char ** );
00590 virtual OGRErr exportToWkt( char ** ) const;
00591
00592
00593 virtual OGRErr addGeometryDirectly( OGRGeometry * );
00594 };
00595
00596
00597
00598
00599
00604 class CPL_DLL OGRMultiLineString : public OGRGeometryCollection
00605 {
00606 public:
00607 OGRMultiLineString();
00608 ~OGRMultiLineString();
00609
00610 virtual const char *getGeometryName() const;
00611 virtual OGRwkbGeometryType getGeometryType() const;
00612 virtual OGRGeometry *clone() const;
00613 virtual OGRErr importFromWkt( char ** );
00614 virtual OGRErr exportToWkt( char ** ) const;
00615
00616
00617 virtual OGRErr addGeometryDirectly( OGRGeometry * );
00618 };
00619
00620
00621
00622
00623
00624
00629 class CPL_DLL OGRGeometryFactory
00630 {
00631 static OGRErr createFromFgfInternal( unsigned char *pabyData,
00632 OGRSpatialReference * poSR,
00633 OGRGeometry **ppoReturn,
00634 int nBytes,
00635 int *pnBytesConsumed,
00636 int nRecLevel );
00637 public:
00638 static OGRErr createFromWkb( unsigned char *, OGRSpatialReference *,
00639 OGRGeometry **, int = -1 );
00640 static OGRErr createFromWkt( char **, OGRSpatialReference *,
00641 OGRGeometry ** );
00642 static OGRErr createFromFgf( unsigned char *, OGRSpatialReference *,
00643 OGRGeometry **, int = -1, int * = NULL );
00644 static OGRGeometry *createFromGML( const char * );
00645 static OGRGeometry *createFromGEOS( GEOSGeom );
00646
00647 static void destroyGeometry( OGRGeometry * );
00648 static OGRGeometry *createGeometry( OGRwkbGeometryType );
00649
00650 static OGRGeometry * forceToPolygon( OGRGeometry * );
00651 static OGRGeometry * forceToMultiPolygon( OGRGeometry * );
00652 static OGRGeometry * forceToMultiPoint( OGRGeometry * );
00653 static OGRGeometry * forceToMultiLineString( OGRGeometry * );
00654
00655 static OGRGeometry * organizePolygons( OGRGeometry **papoPolygons,
00656 int nPolygonCount,
00657 int *pbResultValidGeometry,
00658 const char **papszOptions = NULL);
00659
00660 static void *getGEOSGeometryFactory();
00661
00662 static int haveGEOS();
00663
00664 static OGRGeometry* transformWithOptions( const OGRGeometry* poSrcGeom,
00665 OGRCoordinateTransformation *poCT,
00666 char** papszOptions );
00667
00668 static OGRGeometry*
00669 approximateArcAngles( double dfX, double dfY, double dfZ,
00670 double dfPrimaryRadius, double dfSecondaryAxis,
00671 double dfRotation,
00672 double dfStartAngle, double dfEndAngle,
00673 double dfMaxAngleStepSizeDegrees );
00674 };
00675
00676 OGRwkbGeometryType CPL_DLL OGRFromOGCGeomType( const char *pszGeomType );
00677 const char CPL_DLL * OGRToOGCGeomType( OGRwkbGeometryType eGeomType );
00678
00679 #endif