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
00204
00205
00206
00207
00208
00209
00210
00211
00212
00213
00214
00215
00216
00217
00218
00219
00220
00221
00222
00223
00224
00225
00226
00227
00228
00229
00230 #ifndef _OGR_GEOMETRY_H_INCLUDED
00231 #define _OGR_GEOMETRY_H_INCLUDED
00232
00233 #include "ogr_core.h"
00234 #include "ogr_spatialref.h"
00235
00245 class OGRRawPoint
00246 {
00247 public:
00248 OGRRawPoint()
00249 {
00250 x = y = 0.0;
00251 }
00252 double x;
00253 double y;
00254 };
00255
00256 typedef struct GEOSGeom_t *GEOSGeom;
00257
00258
00259
00260
00261
00271 class CPL_DLL OGRGeometry
00272 {
00273 private:
00274 OGRSpatialReference * poSRS;
00275
00276 protected:
00277 int nCoordDimension;
00278
00279 public:
00280 OGRGeometry();
00281 virtual ~OGRGeometry();
00282
00283
00284 virtual int getDimension() const = 0;
00285 virtual int getCoordinateDimension() const;
00286 virtual OGRBoolean IsEmpty() const { return 0; }
00287 virtual OGRBoolean IsSimple() const { return 1; }
00288 virtual void empty() = 0;
00289 virtual OGRGeometry *clone() const = 0;
00290 virtual void getEnvelope( OGREnvelope * psEnvelope ) const = 0;
00291
00292
00293 virtual int WkbSize() const = 0;
00294 virtual OGRErr importFromWkb( unsigned char *, int=-1 )=0;
00295 virtual OGRErr exportToWkb( OGRwkbByteOrder, unsigned char * ) const = 0;
00296 virtual OGRErr importFromWkt( char ** ppszInput ) = 0;
00297 virtual OGRErr exportToWkt( char ** ppszDstText ) const = 0;
00298
00299
00300 virtual OGRwkbGeometryType getGeometryType() const = 0;
00301 virtual const char *getGeometryName() const = 0;
00302 virtual void dumpReadable( FILE *, const char * = NULL ) const;
00303 virtual void flattenTo2D() = 0;
00304 virtual char * exportToGML() const;
00305 virtual GEOSGeom exportToGEOS() const;
00306 virtual void closeRings();
00307
00308 virtual void setCoordinateDimension( int nDimension );
00309
00310 void assignSpatialReference( OGRSpatialReference * poSR );
00311 OGRSpatialReference *getSpatialReference( void ) const { return poSRS; }
00312
00313 virtual OGRErr transform( OGRCoordinateTransformation *poCT ) = 0;
00314 OGRErr transformTo( OGRSpatialReference *poSR );
00315
00316
00317 virtual OGRBoolean Intersects( OGRGeometry * ) const;
00318 virtual OGRBoolean Equals( OGRGeometry * ) const = 0;
00319 virtual OGRBoolean Disjoint( const OGRGeometry * ) const;
00320 virtual OGRBoolean Touches( const OGRGeometry * ) const;
00321 virtual OGRBoolean Crosses( const OGRGeometry * ) const;
00322 virtual OGRBoolean Within( const OGRGeometry * ) const;
00323 virtual OGRBoolean Contains( const OGRGeometry * ) const;
00324 virtual OGRBoolean Overlaps( const OGRGeometry * ) const;
00325
00326
00327 virtual OGRGeometry *getBoundary() const;
00328 virtual double Distance( const OGRGeometry * ) const;
00329 virtual OGRGeometry *ConvexHull() const;
00330 virtual OGRGeometry *Buffer( double dfDist, int nQuadSegs = 30 ) const;
00331 virtual OGRGeometry *Intersection( const OGRGeometry *) const;
00332 virtual OGRGeometry *Union( const OGRGeometry * ) const;
00333 virtual OGRGeometry *Difference( const OGRGeometry * ) const;
00334 virtual OGRGeometry *SymmetricDifference( const OGRGeometry * ) const;
00335
00336
00337 OGRBoolean Intersect( OGRGeometry * ) const;
00338 OGRBoolean Equal( OGRGeometry * ) const;
00339
00340
00341 static int bGenerate_DB2_V72_BYTE_ORDER;
00342 };
00343
00344
00345
00346
00347
00354 class CPL_DLL OGRPoint : public OGRGeometry
00355 {
00356 double x;
00357 double y;
00358 double z;
00359
00360 public:
00361 OGRPoint();
00362 OGRPoint( double x, double y );
00363 OGRPoint( double x, double y, double z );
00364 virtual ~OGRPoint();
00365
00366
00367 virtual int WkbSize() const;
00368 virtual OGRErr importFromWkb( unsigned char *, int=-1 );
00369 virtual OGRErr exportToWkb( OGRwkbByteOrder, unsigned char * ) const;
00370 virtual OGRErr importFromWkt( char ** );
00371 virtual OGRErr exportToWkt( char ** ppszDstText ) const;
00372
00373
00374 virtual int getDimension() const;
00375 virtual OGRGeometry *clone() const;
00376 virtual void empty();
00377 virtual void getEnvelope( OGREnvelope * psEnvelope ) const;
00378
00379
00380 double getX() const { return x; }
00381 double getY() const { return y; }
00382 double getZ() const { return z; }
00383
00384
00385 virtual void setCoordinateDimension( int nDimension );
00386 void setX( double xIn ) { x = xIn; }
00387 void setY( double yIn ) { y = yIn; }
00388 void setZ( double zIn ) { z = zIn; nCoordDimension=3; }
00389
00390
00391 virtual OGRBoolean Equals( OGRGeometry * ) const;
00392
00393
00394 virtual const char *getGeometryName() const;
00395 virtual OGRwkbGeometryType getGeometryType() const;
00396 virtual OGRErr transform( OGRCoordinateTransformation *poCT );
00397 virtual void flattenTo2D();
00398
00399 };
00400
00401
00402
00403
00404
00409 class CPL_DLL OGRCurve : public OGRGeometry
00410 {
00411 public:
00412 OGRCurve();
00413 virtual ~OGRCurve();
00414
00415 virtual double get_Length() const = 0;
00416 virtual void StartPoint(OGRPoint *) const = 0;
00417 virtual void EndPoint(OGRPoint *) const = 0;
00418 virtual int get_IsClosed() const;
00419 virtual void Value( double, OGRPoint * ) const = 0;
00420
00421 };
00422
00423
00424
00425
00426
00431 class CPL_DLL OGRLineString : public OGRCurve
00432 {
00433 protected:
00434 int nPointCount;
00435 OGRRawPoint *paoPoints;
00436 double *padfZ;
00437
00438 void Make3D();
00439 void Make2D();
00440
00441 public:
00442 OGRLineString();
00443 virtual ~OGRLineString();
00444
00445
00446 virtual int WkbSize() const;
00447 virtual OGRErr importFromWkb( unsigned char *, int = -1 );
00448 virtual OGRErr exportToWkb( OGRwkbByteOrder, unsigned char * ) const;
00449 virtual OGRErr importFromWkt( char ** );
00450 virtual OGRErr exportToWkt( char ** ppszDstText ) const;
00451
00452
00453 virtual int getDimension() const;
00454 virtual OGRGeometry *clone() const;
00455 virtual void empty();
00456 virtual void getEnvelope( OGREnvelope * psEnvelope ) const;
00457
00458
00459 virtual double get_Length() const;
00460 virtual void StartPoint(OGRPoint *) const;
00461 virtual void EndPoint(OGRPoint *) const;
00462 virtual void Value( double, OGRPoint * ) const;
00463
00464
00465 int getNumPoints() const { return nPointCount; }
00466 void getPoint( int, OGRPoint * ) const;
00467 double getX( int i ) const { return paoPoints[i].x; }
00468 double getY( int i ) const { return paoPoints[i].y; }
00469 double getZ( int i ) const;
00470
00471
00472 virtual OGRBoolean Equals( OGRGeometry * ) const;
00473
00474
00475 virtual void setCoordinateDimension( int nDimension );
00476 void setNumPoints( int );
00477 void setPoint( int, OGRPoint * );
00478 void setPoint( int, double, double );
00479 void setPoint( int, double, double, double );
00480 void setPoints( int, OGRRawPoint *, double * = NULL );
00481 void setPoints( int, double * padfX, double * padfY,
00482 double *padfZ = NULL );
00483 void addPoint( OGRPoint * );
00484 void addPoint( double, double );
00485 void addPoint( double, double, double );
00486
00487 void getPoints( OGRRawPoint *, double * = NULL ) const;
00488
00489 void addSubLineString( const OGRLineString *,
00490 int nStartVertex = 0, int nEndVertex = -1 );
00491
00492
00493 virtual OGRwkbGeometryType getGeometryType() const;
00494 virtual const char *getGeometryName() const;
00495 virtual OGRErr transform( OGRCoordinateTransformation *poCT );
00496 virtual void flattenTo2D();
00497
00498 };
00499
00500
00501
00502
00503
00504
00505
00514 class CPL_DLL OGRLinearRing : public OGRLineString
00515 {
00516 private:
00517 friend class OGRPolygon;
00518
00519
00520 virtual int _WkbSize( int b3D ) const;
00521 virtual OGRErr _importFromWkb( OGRwkbByteOrder, int b3D,
00522 unsigned char *, int=-1 );
00523 virtual OGRErr _exportToWkb( OGRwkbByteOrder, int b3D,
00524 unsigned char * ) const;
00525
00526 public:
00527 OGRLinearRing();
00528 OGRLinearRing( OGRLinearRing * );
00529 ~OGRLinearRing();
00530
00531
00532 virtual const char *getGeometryName() const;
00533 virtual OGRGeometry *clone() const;
00534 virtual int isClockwise() const;
00535 virtual void closeRings();
00536 virtual double get_Area() const;
00537 OGRBoolean isPointInRing(const OGRPoint* pt) const;
00538
00539
00540
00541
00542 virtual int WkbSize() const;
00543 virtual OGRErr importFromWkb( unsigned char *, int=-1 );
00544 virtual OGRErr exportToWkb( OGRwkbByteOrder, unsigned char * ) const;
00545 };
00546
00547
00548
00549
00550
00555 class CPL_DLL OGRSurface : public OGRGeometry
00556 {
00557 public:
00558 virtual double get_Area() const = 0;
00559 virtual OGRErr Centroid( OGRPoint * poPoint ) const = 0;
00560 virtual OGRErr PointOnSurface( OGRPoint * poPoint ) const = 0;
00561 };
00562
00563
00564
00565
00566
00576 class CPL_DLL OGRPolygon : public OGRSurface
00577 {
00578 int nRingCount;
00579 OGRLinearRing **papoRings;
00580
00581 public:
00582 OGRPolygon();
00583 virtual ~OGRPolygon();
00584
00585
00586 virtual const char *getGeometryName() const;
00587 virtual OGRwkbGeometryType getGeometryType() const;
00588 virtual OGRGeometry *clone() const;
00589 virtual void empty();
00590 virtual OGRErr transform( OGRCoordinateTransformation *poCT );
00591 virtual void flattenTo2D();
00592
00593
00594 virtual double get_Area() const;
00595 virtual int Centroid( OGRPoint * poPoint ) const;
00596 virtual int PointOnSurface( OGRPoint * poPoint ) const;
00597
00598
00599 virtual int WkbSize() const;
00600 virtual OGRErr importFromWkb( unsigned char *, int = -1 );
00601 virtual OGRErr exportToWkb( OGRwkbByteOrder, unsigned char * ) const;
00602 virtual OGRErr importFromWkt( char ** );
00603 virtual OGRErr exportToWkt( char ** ppszDstText ) const;
00604
00605
00606 virtual int getDimension() const;
00607 virtual void getEnvelope( OGREnvelope * psEnvelope ) const;
00608
00609
00610 virtual OGRBoolean Equals( OGRGeometry * ) const;
00611
00612
00613 virtual void setCoordinateDimension( int nDimension );
00614
00615 void addRing( OGRLinearRing * );
00616 void addRingDirectly( OGRLinearRing * );
00617
00618 OGRLinearRing *getExteriorRing();
00619 const OGRLinearRing *getExteriorRing() const;
00620 int getNumInteriorRings() const;
00621 OGRLinearRing *getInteriorRing( int );
00622 const OGRLinearRing *getInteriorRing( int ) const;
00623
00624 OGRBoolean IsPointOnSurface( const OGRPoint * ) const;
00625
00626 virtual void closeRings();
00627 };
00628
00629
00630
00631
00632
00640 class CPL_DLL OGRGeometryCollection : public OGRGeometry
00641 {
00642 int nGeomCount;
00643 OGRGeometry **papoGeoms;
00644
00645 int nCoordinateDimension;
00646
00647 public:
00648 OGRGeometryCollection();
00649 virtual ~OGRGeometryCollection();
00650
00651
00652 virtual const char *getGeometryName() const;
00653 virtual OGRwkbGeometryType getGeometryType() const;
00654 virtual OGRGeometry *clone() const;
00655 virtual void empty();
00656 virtual OGRErr transform( OGRCoordinateTransformation *poCT );
00657 virtual void flattenTo2D();
00658
00659
00660 virtual int WkbSize() const;
00661 virtual OGRErr importFromWkb( unsigned char *, int = -1 );
00662 virtual OGRErr exportToWkb( OGRwkbByteOrder, unsigned char * ) const;
00663 virtual OGRErr importFromWkt( char ** );
00664 virtual OGRErr exportToWkt( char ** ppszDstText ) const;
00665
00666
00667 virtual int getDimension() const;
00668 virtual void getEnvelope( OGREnvelope * psEnvelope ) const;
00669
00670
00671 int getNumGeometries() const;
00672 OGRGeometry *getGeometryRef( int );
00673 const OGRGeometry *getGeometryRef( int ) const;
00674
00675
00676 virtual OGRBoolean Equals( OGRGeometry * ) const;
00677
00678
00679 virtual void setCoordinateDimension( int nDimension );
00680 virtual OGRErr addGeometry( const OGRGeometry * );
00681 virtual OGRErr addGeometryDirectly( OGRGeometry * );
00682 virtual OGRErr removeGeometry( int iIndex, int bDelete = TRUE );
00683
00684 void closeRings();
00685 };
00686
00687
00688
00689
00690
00698 class CPL_DLL OGRMultiPolygon : public OGRGeometryCollection
00699 {
00700 public:
00701 OGRMultiPolygon();
00702
00703 virtual const char *getGeometryName() const;
00704 virtual OGRwkbGeometryType getGeometryType() const;
00705 virtual OGRGeometry *clone() const;
00706 virtual OGRErr importFromWkt( char ** );
00707 virtual OGRErr exportToWkt( char ** ) const;
00708
00709
00710 virtual OGRErr addGeometryDirectly( OGRGeometry * );
00711
00712 double get_Area() const;
00713 };
00714
00715
00716
00717
00718
00723 class CPL_DLL OGRMultiPoint : public OGRGeometryCollection
00724 {
00725 private:
00726 OGRErr importFromWkt_Bracketed( char ** );
00727
00728 public:
00729 OGRMultiPoint();
00730
00731 virtual const char *getGeometryName() const;
00732 virtual OGRwkbGeometryType getGeometryType() const;
00733 virtual OGRGeometry *clone() const;
00734 virtual OGRErr importFromWkt( char ** );
00735 virtual OGRErr exportToWkt( char ** ) const;
00736
00737
00738 virtual OGRErr addGeometryDirectly( OGRGeometry * );
00739 };
00740
00741
00742
00743
00744
00749 class CPL_DLL OGRMultiLineString : public OGRGeometryCollection
00750 {
00751 public:
00752 OGRMultiLineString();
00753 ~OGRMultiLineString();
00754
00755 virtual const char *getGeometryName() const;
00756 virtual OGRwkbGeometryType getGeometryType() const;
00757 virtual OGRGeometry *clone() const;
00758 virtual OGRErr importFromWkt( char ** );
00759 virtual OGRErr exportToWkt( char ** ) const;
00760
00761
00762 virtual OGRErr addGeometryDirectly( OGRGeometry * );
00763 };
00764
00765
00766
00767
00768
00769
00774 class CPL_DLL OGRGeometryFactory
00775 {
00776 public:
00777 static OGRErr createFromWkb( unsigned char *, OGRSpatialReference *,
00778 OGRGeometry **, int = -1 );
00779 static OGRErr createFromWkt( char **, OGRSpatialReference *,
00780 OGRGeometry ** );
00781 static OGRGeometry *createFromGML( const char * );
00782 static OGRGeometry *createFromGEOS( GEOSGeom );
00783
00784 static void destroyGeometry( OGRGeometry * );
00785 static OGRGeometry *createGeometry( OGRwkbGeometryType );
00786
00787 static OGRGeometry * forceToPolygon( OGRGeometry * );
00788 static OGRGeometry * forceToMultiPolygon( OGRGeometry * );
00789 static OGRGeometry * forceToMultiPoint( OGRGeometry * );
00790 static OGRGeometry * forceToMultiLineString( OGRGeometry * );
00791
00792 static void *getGEOSGeometryFactory();
00793
00794 static int haveGEOS();
00795
00796 };
00797
00798 #endif