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 #ifndef _OGR_GEOMETRY_H_INCLUDED
00177 #define _OGR_GEOMETRY_H_INCLUDED
00178
00179 #include "ogr_core.h"
00180 #include "ogr_spatialref.h"
00181
00191 class OGRRawPoint
00192 {
00193 public:
00194 OGRRawPoint()
00195 {
00196 x = y = 0.0;
00197 }
00198 double x;
00199 double y;
00200 };
00201
00202
00203
00204
00205
00206
00216 class CPL_DLL OGRGeometry
00217 {
00218 private:
00219 OGRSpatialReference * poSRS;
00220
00221 public:
00222 OGRGeometry();
00223 virtual ~OGRGeometry();
00224
00225
00226 virtual int getDimension() = 0;
00227 virtual int getCoordinateDimension() = 0;
00228 virtual OGRBoolean IsEmpty() { return 0; }
00229 virtual OGRBoolean IsSimple() { return 1; }
00230 virtual void empty() = 0;
00231 virtual OGRGeometry *clone() = 0;
00232 virtual void getEnvelope( OGREnvelope * psEnvelope ) = 0;
00233
00234
00235 virtual int WkbSize() = 0;
00236 virtual OGRErr importFromWkb( unsigned char *, int=-1 )=0;
00237 virtual OGRErr exportToWkb( OGRwkbByteOrder, unsigned char * ) = 0;
00238 virtual OGRErr importFromWkt( char ** ppszInput ) = 0;
00239 virtual OGRErr exportToWkt( char ** ppszDstText ) = 0;
00240
00241
00242 virtual OGRwkbGeometryType getGeometryType() = 0;
00243 virtual const char *getGeometryName() = 0;
00244 virtual void dumpReadable( FILE *, const char * = NULL );
00245 virtual void flattenTo2D() = 0;
00246 virtual char * exportToGML() const;
00247
00248 void assignSpatialReference( OGRSpatialReference * poSR );
00249 OGRSpatialReference *getSpatialReference( void ) { return poSRS; }
00250
00251 virtual OGRErr transform( OGRCoordinateTransformation *poCT ) = 0;
00252 OGRErr transformTo( OGRSpatialReference *poSR );
00253
00254
00255 virtual OGRBoolean Intersect( OGRGeometry * );
00256 virtual OGRBoolean Equal( OGRGeometry * ) = 0;
00257
00258 #ifdef notdef
00259
00260
00261
00262 OGRGeometry *getBoundary();
00263
00264 OGRBoolean Disjoint( OGRGeometry * );
00265 OGRBoolean Touch( OGRGeometry * );
00266 OGRBoolean Cross( OGRGeometry * );
00267 OGRBoolean Within( OGRGeometry * );
00268 OGRBoolean Contains( OGRGeometry * );
00269 OGRBoolean Overlap( OGRGeometry * );
00270 OGRBoolean Relate( OGRGeometry *, const char * );
00271
00272 double Distance( OGRGeometry * );
00273 OGRGeometry *Intersection(OGRGeometry *);
00274 OGRGeometry *Buffer( double );
00275 OGRGeometry *ConvexHull();
00276 OGRGeometry *Union( OGRGeometry * );
00277 OGRGeometry *Difference( OGRGeometry * );
00278 OGRGeometry *SymmetricDifference( OGRGeometry * );
00279 #endif
00280
00281
00282 static int bGenerate_DB2_V72_BYTE_ORDER;
00283 };
00284
00285
00286
00287
00288
00295 class CPL_DLL OGRPoint : public OGRGeometry
00296 {
00297 double x;
00298 double y;
00299 double z;
00300
00301 public:
00302 OGRPoint();
00303 OGRPoint( double x, double y, double z = 0.0 );
00304 virtual ~OGRPoint();
00305
00306
00307 virtual int WkbSize();
00308 virtual OGRErr importFromWkb( unsigned char *, int=-1 );
00309 virtual OGRErr exportToWkb( OGRwkbByteOrder, unsigned char * );
00310 virtual OGRErr importFromWkt( char ** );
00311 virtual OGRErr exportToWkt( char ** ppszDstText );
00312
00313
00314 virtual int getDimension();
00315 virtual int getCoordinateDimension();
00316 virtual OGRGeometry *clone();
00317 virtual void empty();
00318 virtual void getEnvelope( OGREnvelope * psEnvelope );
00319
00320
00321 double getX() { return x; }
00322 double getY() { return y; }
00323 double getZ() { return z; }
00324
00325
00326 void setX( double xIn ) { x = xIn; }
00327 void setY( double yIn ) { y = yIn; }
00328 void setZ( double zIn ) { z = zIn; }
00329
00330
00331 virtual OGRBoolean Equal( OGRGeometry * );
00332
00333
00334 virtual const char *getGeometryName();
00335 virtual OGRwkbGeometryType getGeometryType();
00336 virtual OGRErr transform( OGRCoordinateTransformation *poCT );
00337 virtual void flattenTo2D();
00338
00339 };
00340
00341
00342
00343
00344
00349 class CPL_DLL OGRCurve : public OGRGeometry
00350 {
00351 public:
00352 OGRCurve();
00353 virtual ~OGRCurve();
00354
00355 virtual double get_Length() = 0;
00356 virtual void StartPoint(OGRPoint *) = 0;
00357 virtual void EndPoint(OGRPoint *) = 0;
00358 virtual int get_IsClosed();
00359 virtual void Value( double, OGRPoint * ) = 0;
00360
00361 };
00362
00363
00364
00365
00366
00371 class CPL_DLL OGRLineString : public OGRCurve
00372 {
00373 protected:
00374 int nPointCount;
00375 OGRRawPoint *paoPoints;
00376 double *padfZ;
00377
00378 void Make3D();
00379 void Make2D();
00380
00381 public:
00382 OGRLineString();
00383 virtual ~OGRLineString();
00384
00385
00386 virtual int WkbSize();
00387 virtual OGRErr importFromWkb( unsigned char *, int = -1 );
00388 virtual OGRErr exportToWkb( OGRwkbByteOrder, unsigned char * );
00389 virtual OGRErr importFromWkt( char ** );
00390 virtual OGRErr exportToWkt( char ** ppszDstText );
00391
00392
00393 virtual int getDimension();
00394 virtual int getCoordinateDimension();
00395 virtual OGRGeometry *clone();
00396 virtual void empty();
00397 virtual void getEnvelope( OGREnvelope * psEnvelope );
00398
00399
00400 virtual double get_Length();
00401 virtual void StartPoint(OGRPoint *);
00402 virtual void EndPoint(OGRPoint *);
00403 virtual void Value( double, OGRPoint * );
00404
00405
00406 int getNumPoints() { return nPointCount; }
00407 void getPoint( int, OGRPoint * );
00408 double getX( int i ) { return paoPoints[i].x; }
00409 double getY( int i ) { return paoPoints[i].y; }
00410 double getZ( int i );
00411
00412
00413 virtual OGRBoolean Equal( OGRGeometry * );
00414
00415
00416 void setNumPoints( int );
00417 void setPoint( int, OGRPoint * );
00418 void setPoint( int, double, double, double = 0.0 );
00419 void setPoints( int, OGRRawPoint *, double * = NULL );
00420 void setPoints( int, double * padfX, double * padfY,
00421 double *padfZ = NULL );
00422 void addPoint( OGRPoint * );
00423 void addPoint( double, double, double = 0.0 );
00424
00425
00426 virtual OGRwkbGeometryType getGeometryType();
00427 virtual const char *getGeometryName();
00428 virtual OGRErr transform( OGRCoordinateTransformation *poCT );
00429 virtual void flattenTo2D();
00430
00431 };
00432
00433
00434
00435
00436
00437
00438
00447 class CPL_DLL OGRLinearRing : public OGRLineString
00448 {
00449 private:
00450 friend class OGRPolygon;
00451
00452
00453 virtual int _WkbSize( int b3D );
00454 virtual OGRErr _importFromWkb( OGRwkbByteOrder, int b3D,
00455 unsigned char *, int=-1 );
00456 virtual OGRErr _exportToWkb( OGRwkbByteOrder, int b3D, unsigned char * );
00457
00458 public:
00459 OGRLinearRing();
00460 OGRLinearRing( OGRLinearRing * );
00461 ~OGRLinearRing();
00462
00463
00464 virtual const char *getGeometryName();
00465 virtual OGRGeometry *clone();
00466 virtual int isClockwise();
00467
00468
00469
00470
00471 virtual int WkbSize();
00472 virtual OGRErr importFromWkb( unsigned char *, int=-1 );
00473 virtual OGRErr exportToWkb( OGRwkbByteOrder, unsigned char * );
00474 };
00475
00476
00477
00478
00479
00484 class CPL_DLL OGRSurface : public OGRGeometry
00485 {
00486 public:
00487 virtual double get_Area() = 0;
00488 virtual OGRErr Centroid( OGRPoint * poPoint ) = 0;
00489 virtual OGRErr PointOnSurface( OGRPoint * poPoint ) = 0;
00490 };
00491
00492
00493
00494
00495
00505 class CPL_DLL OGRPolygon : public OGRSurface
00506 {
00507 int nRingCount;
00508 OGRLinearRing **papoRings;
00509
00510 public:
00511 OGRPolygon();
00512 virtual ~OGRPolygon();
00513
00514
00515 virtual const char *getGeometryName();
00516 virtual OGRwkbGeometryType getGeometryType();
00517 virtual OGRGeometry *clone();
00518 virtual void empty();
00519 virtual OGRErr transform( OGRCoordinateTransformation *poCT );
00520 virtual void flattenTo2D();
00521
00522
00523 virtual double get_Area();
00524 virtual int Centroid( OGRPoint * poPoint );
00525 virtual int PointOnSurface( OGRPoint * poPoint );
00526
00527
00528 virtual int WkbSize();
00529 virtual OGRErr importFromWkb( unsigned char *, int = -1 );
00530 virtual OGRErr exportToWkb( OGRwkbByteOrder, unsigned char * );
00531 virtual OGRErr importFromWkt( char ** );
00532 virtual OGRErr exportToWkt( char ** ppszDstText );
00533
00534
00535 virtual int getDimension();
00536 virtual int getCoordinateDimension();
00537 virtual void getEnvelope( OGREnvelope * psEnvelope );
00538
00539
00540 virtual OGRBoolean Equal( OGRGeometry * );
00541
00542
00543 void addRing( OGRLinearRing * );
00544 void addRingDirectly( OGRLinearRing * );
00545
00546 OGRLinearRing *getExteriorRing();
00547 int getNumInteriorRings();
00548 OGRLinearRing *getInteriorRing( int );
00549
00550
00551 };
00552
00553
00554
00555
00556
00564 class CPL_DLL OGRGeometryCollection : public OGRGeometry
00565 {
00566 int nGeomCount;
00567 OGRGeometry **papoGeoms;
00568
00569 int nCoordinateDimension;
00570
00571 public:
00572 OGRGeometryCollection();
00573 virtual ~OGRGeometryCollection();
00574
00575
00576 virtual const char *getGeometryName();
00577 virtual OGRwkbGeometryType getGeometryType();
00578 virtual OGRGeometry *clone();
00579 virtual void empty();
00580 virtual OGRErr transform( OGRCoordinateTransformation *poCT );
00581 virtual void flattenTo2D();
00582
00583
00584 virtual int WkbSize();
00585 virtual OGRErr importFromWkb( unsigned char *, int = -1 );
00586 virtual OGRErr exportToWkb( OGRwkbByteOrder, unsigned char * );
00587 virtual OGRErr importFromWkt( char ** );
00588 virtual OGRErr exportToWkt( char ** ppszDstText );
00589
00590
00591 virtual int getDimension();
00592 virtual int getCoordinateDimension();
00593 virtual void getEnvelope( OGREnvelope * psEnvelope );
00594
00595
00596 int getNumGeometries();
00597 OGRGeometry *getGeometryRef( int );
00598
00599
00600 virtual OGRBoolean Equal( OGRGeometry * );
00601
00602
00603 virtual OGRErr addGeometry( OGRGeometry * );
00604 virtual OGRErr addGeometryDirectly( OGRGeometry * );
00605 virtual OGRErr removeGeometry( int iIndex, int bDelete = TRUE );
00606 };
00607
00608
00609
00610
00611
00619 class CPL_DLL OGRMultiPolygon : public OGRGeometryCollection
00620 {
00621 public:
00622 OGRMultiPolygon();
00623
00624 virtual const char *getGeometryName();
00625 virtual OGRwkbGeometryType getGeometryType();
00626 virtual OGRGeometry *clone();
00627 virtual OGRErr importFromWkt( char ** );
00628 virtual OGRErr exportToWkt( char ** );
00629
00630
00631 virtual OGRErr addGeometryDirectly( OGRGeometry * );
00632 };
00633
00634
00635
00636
00637
00642 class CPL_DLL OGRMultiPoint : public OGRGeometryCollection
00643 {
00644 private:
00645 OGRErr importFromWkt_Bracketed( char ** );
00646
00647 public:
00648 OGRMultiPoint();
00649
00650 virtual const char *getGeometryName();
00651 virtual OGRwkbGeometryType getGeometryType();
00652 virtual OGRGeometry *clone();
00653 virtual OGRErr importFromWkt( char ** );
00654 virtual OGRErr exportToWkt( char ** );
00655
00656
00657 virtual OGRErr addGeometryDirectly( OGRGeometry * );
00658 };
00659
00660
00661
00662
00663
00668 class CPL_DLL OGRMultiLineString : public OGRGeometryCollection
00669 {
00670 public:
00671 OGRMultiLineString();
00672 ~OGRMultiLineString();
00673
00674 virtual const char *getGeometryName();
00675 virtual OGRwkbGeometryType getGeometryType();
00676 virtual OGRGeometry *clone();
00677 virtual OGRErr importFromWkt( char ** );
00678 virtual OGRErr exportToWkt( char ** );
00679
00680
00681 virtual OGRErr addGeometryDirectly( OGRGeometry * );
00682 };
00683
00684
00685
00686
00687
00688
00693 class CPL_DLL OGRGeometryFactory
00694 {
00695 public:
00696 static OGRErr createFromWkb( unsigned char *, OGRSpatialReference *,
00697 OGRGeometry **, int = -1 );
00698 static OGRErr createFromWkt( char **, OGRSpatialReference *,
00699 OGRGeometry ** );
00700 static OGRGeometry *createFromGML( const char * );
00701
00702 static void destroyGeometry( OGRGeometry * );
00703 static OGRGeometry *createGeometry( OGRwkbGeometryType );
00704
00705 static OGRGeometry * forceToPolygon( OGRGeometry * );
00706 static OGRGeometry * forceToMultiPolygon( OGRGeometry * );
00707 static OGRGeometry * forceToMultiPoint( OGRGeometry * );
00708 static OGRGeometry * forceToMultiLineString( OGRGeometry * );
00709 };
00710
00711 #endif