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
00189
00190
00191
00192
00193
00194
00195
00196
00197
00198
00199
00200
00201
00202
00203 #ifndef _OGR_GEOMETRY_H_INCLUDED
00204 #define _OGR_GEOMETRY_H_INCLUDED
00205
00206 #include "ogr_core.h"
00207 #include "ogr_spatialref.h"
00208
00218 class OGRRawPoint
00219 {
00220 public:
00221 OGRRawPoint()
00222 {
00223 x = y = 0.0;
00224 }
00225 double x;
00226 double y;
00227 };
00228
00229 namespace geos {
00230 class Geometry;
00231 class GeometryFactory;
00232 };
00233
00234
00235
00236
00237
00247 class CPL_DLL OGRGeometry
00248 {
00249 private:
00250 OGRSpatialReference * poSRS;
00251
00252 protected:
00253 int nCoordDimension;
00254
00255 public:
00256 OGRGeometry();
00257 virtual ~OGRGeometry();
00258
00259
00260 virtual int getDimension() const = 0;
00261 virtual int getCoordinateDimension() const;
00262 virtual OGRBoolean IsEmpty() const { return 0; }
00263 virtual OGRBoolean IsSimple() const { return 1; }
00264 virtual void empty() = 0;
00265 virtual OGRGeometry *clone() const = 0;
00266 virtual void getEnvelope( OGREnvelope * psEnvelope ) const = 0;
00267
00268
00269 virtual int WkbSize() const = 0;
00270 virtual OGRErr importFromWkb( unsigned char *, int=-1 )=0;
00271 virtual OGRErr exportToWkb( OGRwkbByteOrder, unsigned char * ) const = 0;
00272 virtual OGRErr importFromWkt( char ** ppszInput ) = 0;
00273 virtual OGRErr exportToWkt( char ** ppszDstText ) const = 0;
00274
00275
00276 virtual OGRwkbGeometryType getGeometryType() const = 0;
00277 virtual const char *getGeometryName() const = 0;
00278 virtual void dumpReadable( FILE *, const char * = NULL );
00279 virtual void flattenTo2D() = 0;
00280 virtual char * exportToGML() const;
00281 virtual geos::Geometry *exportToGEOS() const;
00282 virtual void closeRings();
00283
00284 virtual void setCoordinateDimension( int nDimension );
00285
00286 void assignSpatialReference( OGRSpatialReference * poSR );
00287 OGRSpatialReference *getSpatialReference( void ) const { return poSRS; }
00288
00289 virtual OGRErr transform( OGRCoordinateTransformation *poCT ) = 0;
00290 OGRErr transformTo( OGRSpatialReference *poSR );
00291
00292
00293 virtual OGRBoolean Intersects( OGRGeometry * ) const;
00294 virtual OGRBoolean Equals( OGRGeometry * ) const = 0;
00295 virtual OGRBoolean Disjoint( const OGRGeometry * ) const;
00296 virtual OGRBoolean Touches( const OGRGeometry * ) const;
00297 virtual OGRBoolean Crosses( const OGRGeometry * ) const;
00298 virtual OGRBoolean Within( const OGRGeometry * ) const;
00299 virtual OGRBoolean Contains( const OGRGeometry * ) const;
00300 virtual OGRBoolean Overlaps( const OGRGeometry * ) const;
00301
00302
00303 virtual OGRGeometry *getBoundary() const;
00304 virtual double Distance( const OGRGeometry * ) const;
00305 virtual OGRGeometry *ConvexHull() const;
00306 virtual OGRGeometry *Buffer( double dfDist, int nQuadSegs = 30 ) const;
00307 virtual OGRGeometry *Intersection( const OGRGeometry *) const;
00308 virtual OGRGeometry *Union( const OGRGeometry * ) const;
00309 virtual OGRGeometry *Difference( const OGRGeometry * ) const;
00310 virtual OGRGeometry *SymmetricDifference( const OGRGeometry * ) const;
00311
00312
00313 OGRBoolean Intersect( OGRGeometry * ) const;
00314 OGRBoolean Equal( OGRGeometry * ) const;
00315
00316
00317 static int bGenerate_DB2_V72_BYTE_ORDER;
00318 };
00319
00320
00321
00322
00323
00330 class CPL_DLL OGRPoint : public OGRGeometry
00331 {
00332 double x;
00333 double y;
00334 double z;
00335
00336 public:
00337 OGRPoint();
00338 OGRPoint( double x, double y );
00339 OGRPoint( double x, double y, double z );
00340 virtual ~OGRPoint();
00341
00342
00343 virtual int WkbSize() const;
00344 virtual OGRErr importFromWkb( unsigned char *, int=-1 );
00345 virtual OGRErr exportToWkb( OGRwkbByteOrder, unsigned char * ) const;
00346 virtual OGRErr importFromWkt( char ** );
00347 virtual OGRErr exportToWkt( char ** ppszDstText ) const;
00348
00349
00350 virtual int getDimension() const;
00351 virtual OGRGeometry *clone() const;
00352 virtual void empty();
00353 virtual void getEnvelope( OGREnvelope * psEnvelope ) const;
00354
00355
00356 double getX() const { return x; }
00357 double getY() const { return y; }
00358 double getZ() const { return z; }
00359
00360
00361 void setX( double xIn ) { x = xIn; }
00362 void setY( double yIn ) { y = yIn; }
00363 void setZ( double zIn ) { z = zIn; nCoordDimension=3; }
00364
00365
00366 virtual OGRBoolean Equals( OGRGeometry * ) const;
00367
00368
00369 virtual const char *getGeometryName() const;
00370 virtual OGRwkbGeometryType getGeometryType() const;
00371 virtual OGRErr transform( OGRCoordinateTransformation *poCT );
00372 virtual void flattenTo2D();
00373
00374 };
00375
00376
00377
00378
00379
00384 class CPL_DLL OGRCurve : public OGRGeometry
00385 {
00386 public:
00387 OGRCurve();
00388 virtual ~OGRCurve();
00389
00390 virtual double get_Length() const = 0;
00391 virtual void StartPoint(OGRPoint *) const = 0;
00392 virtual void EndPoint(OGRPoint *) const = 0;
00393 virtual int get_IsClosed() const;
00394 virtual void Value( double, OGRPoint * ) const = 0;
00395
00396 };
00397
00398
00399
00400
00401
00406 class CPL_DLL OGRLineString : public OGRCurve
00407 {
00408 protected:
00409 int nPointCount;
00410 OGRRawPoint *paoPoints;
00411 double *padfZ;
00412
00413 void Make3D();
00414 void Make2D();
00415
00416 public:
00417 OGRLineString();
00418 virtual ~OGRLineString();
00419
00420
00421 virtual int WkbSize() const;
00422 virtual OGRErr importFromWkb( unsigned char *, int = -1 );
00423 virtual OGRErr exportToWkb( OGRwkbByteOrder, unsigned char * ) const;
00424 virtual OGRErr importFromWkt( char ** );
00425 virtual OGRErr exportToWkt( char ** ppszDstText ) const;
00426
00427
00428 virtual int getDimension() const;
00429 virtual OGRGeometry *clone() const;
00430 virtual void empty();
00431 virtual void getEnvelope( OGREnvelope * psEnvelope ) const;
00432
00433
00434 virtual double get_Length() const;
00435 virtual void StartPoint(OGRPoint *) const;
00436 virtual void EndPoint(OGRPoint *) const;
00437 virtual void Value( double, OGRPoint * ) const;
00438
00439
00440 int getNumPoints() const { return nPointCount; }
00441 void getPoint( int, OGRPoint * ) const;
00442 double getX( int i ) const { return paoPoints[i].x; }
00443 double getY( int i ) const { return paoPoints[i].y; }
00444 double getZ( int i ) const;
00445
00446
00447 virtual OGRBoolean Equals( OGRGeometry * ) const;
00448
00449
00450 virtual void setCoordinateDimension( int nDimension );
00451 void setNumPoints( int );
00452 void setPoint( int, OGRPoint * );
00453 void setPoint( int, double, double );
00454 void setPoint( int, double, double, double );
00455 void setPoints( int, OGRRawPoint *, double * = NULL );
00456 void setPoints( int, double * padfX, double * padfY,
00457 double *padfZ = NULL );
00458 void addPoint( OGRPoint * );
00459 void addPoint( double, double );
00460 void addPoint( double, double, double );
00461
00462 void addSubLineString( const OGRLineString *,
00463 int nStartVertex = 0, int nEndVertex = -1 );
00464
00465
00466 virtual OGRwkbGeometryType getGeometryType() const;
00467 virtual const char *getGeometryName() const;
00468 virtual OGRErr transform( OGRCoordinateTransformation *poCT );
00469 virtual void flattenTo2D();
00470
00471 };
00472
00473
00474
00475
00476
00477
00478
00487 class CPL_DLL OGRLinearRing : public OGRLineString
00488 {
00489 private:
00490 friend class OGRPolygon;
00491
00492
00493 virtual int _WkbSize( int b3D ) const;
00494 virtual OGRErr _importFromWkb( OGRwkbByteOrder, int b3D,
00495 unsigned char *, int=-1 );
00496 virtual OGRErr _exportToWkb( OGRwkbByteOrder, int b3D,
00497 unsigned char * ) const;
00498
00499 public:
00500 OGRLinearRing();
00501 OGRLinearRing( OGRLinearRing * );
00502 ~OGRLinearRing();
00503
00504
00505 virtual const char *getGeometryName() const;
00506 virtual OGRGeometry *clone() const;
00507 virtual int isClockwise() const;
00508 virtual void closeRings();
00509 virtual double get_Area() const;
00510
00511
00512
00513
00514 virtual int WkbSize() const;
00515 virtual OGRErr importFromWkb( unsigned char *, int=-1 );
00516 virtual OGRErr exportToWkb( OGRwkbByteOrder, unsigned char * ) const;
00517 };
00518
00519
00520
00521
00522
00527 class CPL_DLL OGRSurface : public OGRGeometry
00528 {
00529 public:
00530 virtual double get_Area() const = 0;
00531 virtual OGRErr Centroid( OGRPoint * poPoint ) const = 0;
00532 virtual OGRErr PointOnSurface( OGRPoint * poPoint ) const = 0;
00533 };
00534
00535
00536
00537
00538
00548 class CPL_DLL OGRPolygon : public OGRSurface
00549 {
00550 int nRingCount;
00551 OGRLinearRing **papoRings;
00552
00553 public:
00554 OGRPolygon();
00555 virtual ~OGRPolygon();
00556
00557
00558 virtual const char *getGeometryName() const;
00559 virtual OGRwkbGeometryType getGeometryType() const;
00560 virtual OGRGeometry *clone() const;
00561 virtual void empty();
00562 virtual OGRErr transform( OGRCoordinateTransformation *poCT );
00563 virtual void flattenTo2D();
00564
00565
00566 virtual double get_Area() const;
00567 virtual int Centroid( OGRPoint * poPoint ) const;
00568 virtual int PointOnSurface( OGRPoint * poPoint ) const;
00569
00570
00571 virtual int WkbSize() const;
00572 virtual OGRErr importFromWkb( unsigned char *, int = -1 );
00573 virtual OGRErr exportToWkb( OGRwkbByteOrder, unsigned char * ) const;
00574 virtual OGRErr importFromWkt( char ** );
00575 virtual OGRErr exportToWkt( char ** ppszDstText ) const;
00576
00577
00578 virtual int getDimension() const;
00579 virtual void getEnvelope( OGREnvelope * psEnvelope ) const;
00580
00581
00582 virtual OGRBoolean Equals( OGRGeometry * ) const;
00583
00584
00585 virtual void setCoordinateDimension( int nDimension );
00586
00587 void addRing( OGRLinearRing * );
00588 void addRingDirectly( OGRLinearRing * );
00589
00590 OGRLinearRing *getExteriorRing();
00591 const OGRLinearRing *getExteriorRing() const;
00592 int getNumInteriorRings() const;
00593 OGRLinearRing *getInteriorRing( int );
00594 const OGRLinearRing *getInteriorRing( int ) const;
00595
00596 virtual void closeRings();
00597 };
00598
00599
00600
00601
00602
00610 class CPL_DLL OGRGeometryCollection : public OGRGeometry
00611 {
00612 int nGeomCount;
00613 OGRGeometry **papoGeoms;
00614
00615 int nCoordinateDimension;
00616
00617 public:
00618 OGRGeometryCollection();
00619 virtual ~OGRGeometryCollection();
00620
00621
00622 virtual const char *getGeometryName() const;
00623 virtual OGRwkbGeometryType getGeometryType() const;
00624 virtual OGRGeometry *clone() const;
00625 virtual void empty();
00626 virtual OGRErr transform( OGRCoordinateTransformation *poCT );
00627 virtual void flattenTo2D();
00628
00629
00630 virtual int WkbSize() const;
00631 virtual OGRErr importFromWkb( unsigned char *, int = -1 );
00632 virtual OGRErr exportToWkb( OGRwkbByteOrder, unsigned char * ) const;
00633 virtual OGRErr importFromWkt( char ** );
00634 virtual OGRErr exportToWkt( char ** ppszDstText ) const;
00635
00636
00637 virtual int getDimension() const;
00638 virtual void getEnvelope( OGREnvelope * psEnvelope ) const;
00639
00640
00641 int getNumGeometries() const;
00642 OGRGeometry *getGeometryRef( int );
00643 const OGRGeometry *getGeometryRef( int ) const;
00644
00645
00646 virtual OGRBoolean Equals( OGRGeometry * ) const;
00647
00648
00649 virtual void setCoordinateDimension( int nDimension );
00650 virtual OGRErr addGeometry( const OGRGeometry * );
00651 virtual OGRErr addGeometryDirectly( OGRGeometry * );
00652 virtual OGRErr removeGeometry( int iIndex, int bDelete = TRUE );
00653
00654 void closeRings();
00655 };
00656
00657
00658
00659
00660
00668 class CPL_DLL OGRMultiPolygon : public OGRGeometryCollection
00669 {
00670 public:
00671 OGRMultiPolygon();
00672
00673 virtual const char *getGeometryName() const;
00674 virtual OGRwkbGeometryType getGeometryType() const;
00675 virtual OGRGeometry *clone() const;
00676 virtual OGRErr importFromWkt( char ** );
00677 virtual OGRErr exportToWkt( char ** ) const;
00678
00679
00680 virtual OGRErr addGeometryDirectly( OGRGeometry * );
00681
00682 double get_Area() const;
00683 };
00684
00685
00686
00687
00688
00693 class CPL_DLL OGRMultiPoint : public OGRGeometryCollection
00694 {
00695 private:
00696 OGRErr importFromWkt_Bracketed( char ** );
00697
00698 public:
00699 OGRMultiPoint();
00700
00701 virtual const char *getGeometryName() const;
00702 virtual OGRwkbGeometryType getGeometryType() const;
00703 virtual OGRGeometry *clone() const;
00704 virtual OGRErr importFromWkt( char ** );
00705 virtual OGRErr exportToWkt( char ** ) const;
00706
00707
00708 virtual OGRErr addGeometryDirectly( OGRGeometry * );
00709 };
00710
00711
00712
00713
00714
00719 class CPL_DLL OGRMultiLineString : public OGRGeometryCollection
00720 {
00721 public:
00722 OGRMultiLineString();
00723 ~OGRMultiLineString();
00724
00725 virtual const char *getGeometryName() const;
00726 virtual OGRwkbGeometryType getGeometryType() const;
00727 virtual OGRGeometry *clone() const;
00728 virtual OGRErr importFromWkt( char ** );
00729 virtual OGRErr exportToWkt( char ** ) const;
00730
00731
00732 virtual OGRErr addGeometryDirectly( OGRGeometry * );
00733 };
00734
00735
00736
00737
00738
00739
00744 class CPL_DLL OGRGeometryFactory
00745 {
00746 public:
00747 static OGRErr createFromWkb( unsigned char *, OGRSpatialReference *,
00748 OGRGeometry **, int = -1 );
00749 static OGRErr createFromWkt( char **, OGRSpatialReference *,
00750 OGRGeometry ** );
00751 static OGRGeometry *createFromGML( const char * );
00752 static OGRGeometry *createFromGEOS( const geos::Geometry * );
00753
00754 static void destroyGeometry( OGRGeometry * );
00755 static OGRGeometry *createGeometry( OGRwkbGeometryType );
00756
00757 static OGRGeometry * forceToPolygon( OGRGeometry * );
00758 static OGRGeometry * forceToMultiPolygon( OGRGeometry * );
00759 static OGRGeometry * forceToMultiPoint( OGRGeometry * );
00760 static OGRGeometry * forceToMultiLineString( OGRGeometry * );
00761
00762 static geos::GeometryFactory *getGEOSGeometryFactory();
00763
00764 static int haveGEOS();
00765
00766 };
00767
00768 #endif