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
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114
00115
00116
00117
00118
00119
00120
00121
00122
00123
00124
00125
00126
00127
00128
00129
00130
00131
00132
00133
00134
00135
00136
00137
00138
00139
00140
00141
00142
00143
00144
00145
00146
00147
00148
00149
00150
00151
00152
00153
00154
00155
00156
00157
00158
00159
00160
00161
00162
00163
00164
00165
00166
00167
00168
00169
00170
00171
00172
00173
00174
00175
00176
00177
00178
00179
00180
00181
00182
00183
00184
00185
00186
00187
00188 #ifndef _OGR_GEOMETRY_H_INCLUDED
00189 #define _OGR_GEOMETRY_H_INCLUDED
00190
00191 #include "ogr_core.h"
00192 #include "ogr_spatialref.h"
00193
00203 class OGRRawPoint
00204 {
00205 public:
00206 OGRRawPoint()
00207 {
00208 x = y = 0.0;
00209 }
00210 double x;
00211 double y;
00212 };
00213
00214 namespace geos {
00215 class Geometry;
00216 class GeometryFactory;
00217 };
00218
00219
00220
00221
00222
00232 class CPL_DLL OGRGeometry
00233 {
00234 private:
00235 OGRSpatialReference * poSRS;
00236
00237 public:
00238 OGRGeometry();
00239 virtual ~OGRGeometry();
00240
00241
00242 virtual int getDimension() const = 0;
00243 virtual int getCoordinateDimension() const = 0;
00244 virtual OGRBoolean IsEmpty() const { return 0; }
00245 virtual OGRBoolean IsSimple() const { return 1; }
00246 virtual void empty() = 0;
00247 virtual OGRGeometry *clone() const = 0;
00248 virtual void getEnvelope( OGREnvelope * psEnvelope ) const = 0;
00249
00250
00251 virtual int WkbSize() const = 0;
00252 virtual OGRErr importFromWkb( unsigned char *, int=-1 )=0;
00253 virtual OGRErr exportToWkb( OGRwkbByteOrder, unsigned char * ) const = 0;
00254 virtual OGRErr importFromWkt( char ** ppszInput ) = 0;
00255 virtual OGRErr exportToWkt( char ** ppszDstText ) const = 0;
00256
00257
00258 virtual OGRwkbGeometryType getGeometryType() const = 0;
00259 virtual const char *getGeometryName() const = 0;
00260 virtual void dumpReadable( FILE *, const char * = NULL );
00261 virtual void flattenTo2D() = 0;
00262 virtual char * exportToGML() const;
00263 virtual geos::Geometry *exportToGEOS() const;
00264 virtual void closeRings();
00265
00266 void assignSpatialReference( OGRSpatialReference * poSR );
00267 OGRSpatialReference *getSpatialReference( void ) const { return poSRS; }
00268
00269 virtual OGRErr transform( OGRCoordinateTransformation *poCT ) = 0;
00270 OGRErr transformTo( OGRSpatialReference *poSR );
00271
00272
00273 virtual OGRBoolean Intersect( OGRGeometry * ) const;
00274 virtual OGRBoolean Equal( OGRGeometry * ) const = 0;
00275 virtual OGRBoolean Disjoint( const OGRGeometry * ) const;
00276 virtual OGRBoolean Touches( const OGRGeometry * ) const;
00277 virtual OGRBoolean Crosses( const OGRGeometry * ) const;
00278 virtual OGRBoolean Within( const OGRGeometry * ) const;
00279 virtual OGRBoolean Contains( const OGRGeometry * ) const;
00280 virtual OGRBoolean Overlaps( const OGRGeometry * ) const;
00281
00282
00283 virtual OGRGeometry *getBoundary() const;
00284 virtual double Distance( const OGRGeometry * ) const;
00285 virtual OGRGeometry *ConvexHull() const;
00286 virtual OGRGeometry *Buffer( double dfDist, int nQuadSegs = 30 ) const;
00287 virtual OGRGeometry *Intersection( const OGRGeometry *) const;
00288 virtual OGRGeometry *Union( const OGRGeometry * ) const;
00289 virtual OGRGeometry *Difference( const OGRGeometry * ) const;
00290 virtual OGRGeometry *SymmetricDifference( const OGRGeometry * ) const;
00291
00292
00293 static int bGenerate_DB2_V72_BYTE_ORDER;
00294 };
00295
00296
00297
00298
00299
00306 class CPL_DLL OGRPoint : public OGRGeometry
00307 {
00308 double x;
00309 double y;
00310 double z;
00311
00312 public:
00313 OGRPoint();
00314 OGRPoint( double x, double y, double z = 0.0 );
00315 virtual ~OGRPoint();
00316
00317
00318 virtual int WkbSize() const;
00319 virtual OGRErr importFromWkb( unsigned char *, int=-1 );
00320 virtual OGRErr exportToWkb( OGRwkbByteOrder, unsigned char * ) const;
00321 virtual OGRErr importFromWkt( char ** );
00322 virtual OGRErr exportToWkt( char ** ppszDstText ) const;
00323
00324
00325 virtual int getDimension() const;
00326 virtual int getCoordinateDimension() const;
00327 virtual OGRGeometry *clone() const;
00328 virtual void empty();
00329 virtual void getEnvelope( OGREnvelope * psEnvelope ) const;
00330
00331
00332 double getX() const { return x; }
00333 double getY() const { return y; }
00334 double getZ() const { return z; }
00335
00336
00337 void setX( double xIn ) { x = xIn; }
00338 void setY( double yIn ) { y = yIn; }
00339 void setZ( double zIn ) { z = zIn; }
00340
00341
00342 virtual OGRBoolean Equal( OGRGeometry * ) const;
00343
00344
00345 virtual const char *getGeometryName() const;
00346 virtual OGRwkbGeometryType getGeometryType() const;
00347 virtual OGRErr transform( OGRCoordinateTransformation *poCT );
00348 virtual void flattenTo2D();
00349
00350 };
00351
00352
00353
00354
00355
00360 class CPL_DLL OGRCurve : public OGRGeometry
00361 {
00362 public:
00363 OGRCurve();
00364 virtual ~OGRCurve();
00365
00366 virtual double get_Length() const = 0;
00367 virtual void StartPoint(OGRPoint *) const = 0;
00368 virtual void EndPoint(OGRPoint *) const = 0;
00369 virtual int get_IsClosed() const;
00370 virtual void Value( double, OGRPoint * ) const = 0;
00371
00372 };
00373
00374
00375
00376
00377
00382 class CPL_DLL OGRLineString : public OGRCurve
00383 {
00384 protected:
00385 int nPointCount;
00386 OGRRawPoint *paoPoints;
00387 double *padfZ;
00388
00389 void Make3D();
00390 void Make2D();
00391
00392 public:
00393 OGRLineString();
00394 virtual ~OGRLineString();
00395
00396
00397 virtual int WkbSize() const;
00398 virtual OGRErr importFromWkb( unsigned char *, int = -1 );
00399 virtual OGRErr exportToWkb( OGRwkbByteOrder, unsigned char * ) const;
00400 virtual OGRErr importFromWkt( char ** );
00401 virtual OGRErr exportToWkt( char ** ppszDstText ) const;
00402
00403
00404 virtual int getDimension() const;
00405 virtual int getCoordinateDimension() const;
00406 virtual OGRGeometry *clone() const;
00407 virtual void empty();
00408 virtual void getEnvelope( OGREnvelope * psEnvelope ) const;
00409
00410
00411 virtual double get_Length() const;
00412 virtual void StartPoint(OGRPoint *) const;
00413 virtual void EndPoint(OGRPoint *) const;
00414 virtual void Value( double, OGRPoint * ) const;
00415
00416
00417 int getNumPoints() const { return nPointCount; }
00418 void getPoint( int, OGRPoint * ) const;
00419 double getX( int i ) const { return paoPoints[i].x; }
00420 double getY( int i ) const { return paoPoints[i].y; }
00421 double getZ( int i ) const;
00422
00423
00424 virtual OGRBoolean Equal( OGRGeometry * ) const;
00425
00426
00427 void setNumPoints( int );
00428 void setPoint( int, OGRPoint * );
00429 void setPoint( int, double, double, double = 0.0 );
00430 void setPoints( int, OGRRawPoint *, double * = NULL );
00431 void setPoints( int, double * padfX, double * padfY,
00432 double *padfZ = NULL );
00433 void addPoint( OGRPoint * );
00434 void addPoint( double, double, double = 0.0 );
00435
00436
00437 virtual OGRwkbGeometryType getGeometryType() const;
00438 virtual const char *getGeometryName() const;
00439 virtual OGRErr transform( OGRCoordinateTransformation *poCT );
00440 virtual void flattenTo2D();
00441
00442 };
00443
00444
00445
00446
00447
00448
00449
00458 class CPL_DLL OGRLinearRing : public OGRLineString
00459 {
00460 private:
00461 friend class OGRPolygon;
00462
00463
00464 virtual int _WkbSize( int b3D ) const;
00465 virtual OGRErr _importFromWkb( OGRwkbByteOrder, int b3D,
00466 unsigned char *, int=-1 );
00467 virtual OGRErr _exportToWkb( OGRwkbByteOrder, int b3D,
00468 unsigned char * ) const;
00469
00470 public:
00471 OGRLinearRing();
00472 OGRLinearRing( OGRLinearRing * );
00473 ~OGRLinearRing();
00474
00475
00476 virtual const char *getGeometryName() const;
00477 virtual OGRGeometry *clone() const;
00478 virtual int isClockwise() const;
00479 virtual void closeRings();
00480 virtual double get_Area() const;
00481
00482
00483
00484
00485 virtual int WkbSize() const;
00486 virtual OGRErr importFromWkb( unsigned char *, int=-1 );
00487 virtual OGRErr exportToWkb( OGRwkbByteOrder, unsigned char * ) const;
00488 };
00489
00490
00491
00492
00493
00498 class CPL_DLL OGRSurface : public OGRGeometry
00499 {
00500 public:
00501 virtual double get_Area() const = 0;
00502 virtual OGRErr Centroid( OGRPoint * poPoint ) const = 0;
00503 virtual OGRErr PointOnSurface( OGRPoint * poPoint ) const = 0;
00504 };
00505
00506
00507
00508
00509
00519 class CPL_DLL OGRPolygon : public OGRSurface
00520 {
00521 int nRingCount;
00522 OGRLinearRing **papoRings;
00523
00524 public:
00525 OGRPolygon();
00526 virtual ~OGRPolygon();
00527
00528
00529 virtual const char *getGeometryName() const;
00530 virtual OGRwkbGeometryType getGeometryType() const;
00531 virtual OGRGeometry *clone() const;
00532 virtual void empty();
00533 virtual OGRErr transform( OGRCoordinateTransformation *poCT );
00534 virtual void flattenTo2D();
00535
00536
00537 virtual double get_Area() const;
00538 virtual int Centroid( OGRPoint * poPoint ) const;
00539 virtual int PointOnSurface( OGRPoint * poPoint ) const;
00540
00541
00542 virtual int WkbSize() const;
00543 virtual OGRErr importFromWkb( unsigned char *, int = -1 );
00544 virtual OGRErr exportToWkb( OGRwkbByteOrder, unsigned char * ) const;
00545 virtual OGRErr importFromWkt( char ** );
00546 virtual OGRErr exportToWkt( char ** ppszDstText ) const;
00547
00548
00549 virtual int getDimension() const;
00550 virtual int getCoordinateDimension() const;
00551 virtual void getEnvelope( OGREnvelope * psEnvelope ) const;
00552
00553
00554 virtual OGRBoolean Equal( OGRGeometry * ) const;
00555
00556
00557 void addRing( OGRLinearRing * );
00558 void addRingDirectly( OGRLinearRing * );
00559
00560 OGRLinearRing *getExteriorRing();
00561 const OGRLinearRing *getExteriorRing() const;
00562 int getNumInteriorRings() const;
00563 OGRLinearRing *getInteriorRing( int );
00564 const OGRLinearRing *getInteriorRing( int ) const;
00565
00566 virtual void closeRings();
00567 };
00568
00569
00570
00571
00572
00580 class CPL_DLL OGRGeometryCollection : public OGRGeometry
00581 {
00582 int nGeomCount;
00583 OGRGeometry **papoGeoms;
00584
00585 int nCoordinateDimension;
00586
00587 public:
00588 OGRGeometryCollection();
00589 virtual ~OGRGeometryCollection();
00590
00591
00592 virtual const char *getGeometryName() const;
00593 virtual OGRwkbGeometryType getGeometryType() const;
00594 virtual OGRGeometry *clone() const;
00595 virtual void empty();
00596 virtual OGRErr transform( OGRCoordinateTransformation *poCT );
00597 virtual void flattenTo2D();
00598
00599
00600 virtual int WkbSize() const;
00601 virtual OGRErr importFromWkb( unsigned char *, int = -1 );
00602 virtual OGRErr exportToWkb( OGRwkbByteOrder, unsigned char * ) const;
00603 virtual OGRErr importFromWkt( char ** );
00604 virtual OGRErr exportToWkt( char ** ppszDstText ) const;
00605
00606
00607 virtual int getDimension() const;
00608 virtual int getCoordinateDimension() const;
00609 virtual void getEnvelope( OGREnvelope * psEnvelope ) const;
00610
00611
00612 int getNumGeometries() const;
00613 OGRGeometry *getGeometryRef( int );
00614 const OGRGeometry *getGeometryRef( int ) const;
00615
00616
00617 virtual OGRBoolean Equal( OGRGeometry * ) const;
00618
00619
00620 virtual OGRErr addGeometry( const OGRGeometry * );
00621 virtual OGRErr addGeometryDirectly( OGRGeometry * );
00622 virtual OGRErr removeGeometry( int iIndex, int bDelete = TRUE );
00623
00624 void closeRings();
00625 };
00626
00627
00628
00629
00630
00638 class CPL_DLL OGRMultiPolygon : public OGRGeometryCollection
00639 {
00640 public:
00641 OGRMultiPolygon();
00642
00643 virtual const char *getGeometryName() const;
00644 virtual OGRwkbGeometryType getGeometryType() const;
00645 virtual OGRGeometry *clone() const;
00646 virtual OGRErr importFromWkt( char ** );
00647 virtual OGRErr exportToWkt( char ** ) const;
00648
00649
00650 virtual OGRErr addGeometryDirectly( OGRGeometry * );
00651
00652 double get_Area() const;
00653 };
00654
00655
00656
00657
00658
00663 class CPL_DLL OGRMultiPoint : public OGRGeometryCollection
00664 {
00665 private:
00666 OGRErr importFromWkt_Bracketed( char ** );
00667
00668 public:
00669 OGRMultiPoint();
00670
00671 virtual const char *getGeometryName() const;
00672 virtual OGRwkbGeometryType getGeometryType() const;
00673 virtual OGRGeometry *clone() const;
00674 virtual OGRErr importFromWkt( char ** );
00675 virtual OGRErr exportToWkt( char ** ) const;
00676
00677
00678 virtual OGRErr addGeometryDirectly( OGRGeometry * );
00679 };
00680
00681
00682
00683
00684
00689 class CPL_DLL OGRMultiLineString : public OGRGeometryCollection
00690 {
00691 public:
00692 OGRMultiLineString();
00693 ~OGRMultiLineString();
00694
00695 virtual const char *getGeometryName() const;
00696 virtual OGRwkbGeometryType getGeometryType() const;
00697 virtual OGRGeometry *clone() const;
00698 virtual OGRErr importFromWkt( char ** );
00699 virtual OGRErr exportToWkt( char ** ) const;
00700
00701
00702 virtual OGRErr addGeometryDirectly( OGRGeometry * );
00703 };
00704
00705
00706
00707
00708
00709
00714 class CPL_DLL OGRGeometryFactory
00715 {
00716 public:
00717 static OGRErr createFromWkb( unsigned char *, OGRSpatialReference *,
00718 OGRGeometry **, int = -1 );
00719 static OGRErr createFromWkt( char **, OGRSpatialReference *,
00720 OGRGeometry ** );
00721 static OGRGeometry *createFromGML( const char * );
00722 static OGRGeometry *createFromGEOS( const geos::Geometry * );
00723
00724 static void destroyGeometry( OGRGeometry * );
00725 static OGRGeometry *createGeometry( OGRwkbGeometryType );
00726
00727 static OGRGeometry * forceToPolygon( OGRGeometry * );
00728 static OGRGeometry * forceToMultiPolygon( OGRGeometry * );
00729 static OGRGeometry * forceToMultiPoint( OGRGeometry * );
00730 static OGRGeometry * forceToMultiLineString( OGRGeometry * );
00731
00732 static geos::GeometryFactory *getGEOSGeometryFactory();
00733
00734 };
00735
00736 #endif