OGR
|
00001 /****************************************************************************** 00002 * $Id: ogr_geometry.h 18155 2009-12-02 15:27:29Z warmerdam $ 00003 * 00004 * Project: OpenGIS Simple Features Reference Implementation 00005 * Purpose: Classes for manipulating simple features that is not specific 00006 * to a particular interface technology. 00007 * Author: Frank Warmerdam, warmerdam@pobox.com 00008 * 00009 ****************************************************************************** 00010 * Copyright (c) 1999, Frank Warmerdam 00011 * 00012 * Permission is hereby granted, free of charge, to any person obtaining a 00013 * copy of this software and associated documentation files (the "Software"), 00014 * to deal in the Software without restriction, including without limitation 00015 * the rights to use, copy, modify, merge, publish, distribute, sublicense, 00016 * and/or sell copies of the Software, and to permit persons to whom the 00017 * Software is furnished to do so, subject to the following conditions: 00018 * 00019 * The above copyright notice and this permission notice shall be included 00020 * in all copies or substantial portions of the Software. 00021 * 00022 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 00023 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 00024 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 00025 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 00026 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 00027 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 00028 * DEALINGS IN THE SOFTWARE. 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 /* OGRGeometry */ 00061 /************************************************************************/ 00062 00080 class CPL_DLL OGRGeometry 00081 { 00082 private: 00083 OGRSpatialReference * poSRS; // may be NULL 00084 00085 protected: 00086 int nCoordDimension; 00087 00088 public: 00089 OGRGeometry(); 00090 virtual ~OGRGeometry(); 00091 00092 // standard IGeometry 00093 virtual int getDimension() const = 0; 00094 virtual int getCoordinateDimension() const; 00095 virtual OGRBoolean IsEmpty() const = 0; 00096 virtual OGRBoolean IsValid() const; 00097 virtual OGRBoolean IsSimple() const; 00098 virtual OGRBoolean IsRing() const; 00099 virtual void empty() = 0; 00100 virtual OGRGeometry *clone() const = 0; 00101 virtual void getEnvelope( OGREnvelope * psEnvelope ) const = 0; 00102 00103 // IWks Interface 00104 virtual int WkbSize() const = 0; 00105 virtual OGRErr importFromWkb( unsigned char *, int=-1 )=0; 00106 virtual OGRErr exportToWkb( OGRwkbByteOrder, unsigned char * ) const = 0; 00107 virtual OGRErr importFromWkt( char ** ppszInput ) = 0; 00108 virtual OGRErr exportToWkt( char ** ppszDstText ) const = 0; 00109 00110 // non-standard 00111 virtual OGRwkbGeometryType getGeometryType() const = 0; 00112 virtual const char *getGeometryName() const = 0; 00113 virtual void dumpReadable( FILE *, const char * = NULL, char** papszOptions = NULL ) const; 00114 virtual void flattenTo2D() = 0; 00115 virtual char * exportToGML() const; 00116 virtual char * exportToKML() const; 00117 virtual char * exportToJson() const; 00118 virtual GEOSGeom exportToGEOS() const; 00119 virtual void closeRings(); 00120 00121 virtual void setCoordinateDimension( int nDimension ); 00122 00123 void assignSpatialReference( OGRSpatialReference * poSR ); 00124 OGRSpatialReference *getSpatialReference( void ) const { return poSRS; } 00125 00126 virtual OGRErr transform( OGRCoordinateTransformation *poCT ) = 0; 00127 OGRErr transformTo( OGRSpatialReference *poSR ); 00128 00129 virtual void segmentize(double dfMaxLength); 00130 00131 // ISpatialRelation 00132 virtual OGRBoolean Intersects( OGRGeometry * ) const; 00133 virtual OGRBoolean Equals( OGRGeometry * ) const = 0; 00134 virtual OGRBoolean Disjoint( const OGRGeometry * ) const; 00135 virtual OGRBoolean Touches( const OGRGeometry * ) const; 00136 virtual OGRBoolean Crosses( const OGRGeometry * ) const; 00137 virtual OGRBoolean Within( const OGRGeometry * ) const; 00138 virtual OGRBoolean Contains( const OGRGeometry * ) const; 00139 virtual OGRBoolean Overlaps( const OGRGeometry * ) const; 00140 // virtual OGRBoolean Relate( const OGRGeometry *, const char * ) const; 00141 00142 virtual OGRGeometry *getBoundary() const; 00143 virtual double Distance( const OGRGeometry * ) const; 00144 virtual OGRGeometry *ConvexHull() const; 00145 virtual OGRGeometry *Buffer( double dfDist, int nQuadSegs = 30 ) const; 00146 virtual OGRGeometry *Intersection( const OGRGeometry *) const; 00147 virtual OGRGeometry *Union( const OGRGeometry * ) const; 00148 virtual OGRGeometry *Difference( const OGRGeometry * ) const; 00149 virtual OGRGeometry *SymmetricDifference( const OGRGeometry * ) const; 00150 00151 // backward compatibility methods. 00152 OGRBoolean Intersect( OGRGeometry * ) const; 00153 OGRBoolean Equal( OGRGeometry * ) const; 00154 00155 // Special HACK for DB2 7.2 support 00156 static int bGenerate_DB2_V72_BYTE_ORDER; 00157 }; 00158 00159 /************************************************************************/ 00160 /* OGRPoint */ 00161 /************************************************************************/ 00162 00169 class CPL_DLL OGRPoint : public OGRGeometry 00170 { 00171 double x; 00172 double y; 00173 double z; 00174 00175 public: 00176 OGRPoint(); 00177 OGRPoint( double x, double y ); 00178 OGRPoint( double x, double y, double z ); 00179 virtual ~OGRPoint(); 00180 00181 // IWks Interface 00182 virtual int WkbSize() const; 00183 virtual OGRErr importFromWkb( unsigned char *, int=-1 ); 00184 virtual OGRErr exportToWkb( OGRwkbByteOrder, unsigned char * ) const; 00185 virtual OGRErr importFromWkt( char ** ); 00186 virtual OGRErr exportToWkt( char ** ppszDstText ) const; 00187 00188 // IGeometry 00189 virtual int getDimension() const; 00190 virtual OGRGeometry *clone() const; 00191 virtual void empty(); 00192 virtual void getEnvelope( OGREnvelope * psEnvelope ) const; 00193 virtual OGRBoolean IsEmpty() const; 00194 00195 // IPoint 00196 double getX() const { return x; } 00197 double getY() const { return y; } 00198 double getZ() const { return z; } 00199 00200 // Non standard 00201 virtual void setCoordinateDimension( int nDimension ); 00202 void setX( double xIn ) { x = xIn; if (nCoordDimension == 0) nCoordDimension = 2; } 00203 void setY( double yIn ) { y = yIn; if (nCoordDimension == 0) nCoordDimension = 2; } 00204 void setZ( double zIn ) { z = zIn; nCoordDimension=3; } 00205 00206 // ISpatialRelation 00207 virtual OGRBoolean Equals( OGRGeometry * ) const; 00208 00209 // Non standard from OGRGeometry 00210 virtual const char *getGeometryName() const; 00211 virtual OGRwkbGeometryType getGeometryType() const; 00212 virtual OGRErr transform( OGRCoordinateTransformation *poCT ); 00213 virtual void flattenTo2D(); 00214 }; 00215 00216 /************************************************************************/ 00217 /* OGRCurve */ 00218 /************************************************************************/ 00219 00224 class CPL_DLL OGRCurve : public OGRGeometry 00225 { 00226 public: 00227 OGRCurve(); 00228 virtual ~OGRCurve(); 00229 // ICurve methods 00230 virtual double get_Length() const = 0; 00231 virtual void StartPoint(OGRPoint *) const = 0; 00232 virtual void EndPoint(OGRPoint *) const = 0; 00233 virtual int get_IsClosed() const; 00234 virtual void Value( double, OGRPoint * ) const = 0; 00235 00236 }; 00237 00238 /************************************************************************/ 00239 /* OGRLineString */ 00240 /************************************************************************/ 00241 00246 class CPL_DLL OGRLineString : public OGRCurve 00247 { 00248 protected: 00249 int nPointCount; 00250 OGRRawPoint *paoPoints; 00251 double *padfZ; 00252 00253 void Make3D(); 00254 void Make2D(); 00255 00256 public: 00257 OGRLineString(); 00258 virtual ~OGRLineString(); 00259 00260 // IWks Interface 00261 virtual int WkbSize() const; 00262 virtual OGRErr importFromWkb( unsigned char *, int = -1 ); 00263 virtual OGRErr exportToWkb( OGRwkbByteOrder, unsigned char * ) const; 00264 virtual OGRErr importFromWkt( char ** ); 00265 virtual OGRErr exportToWkt( char ** ppszDstText ) const; 00266 00267 // IGeometry interface 00268 virtual int getDimension() const; 00269 virtual OGRGeometry *clone() const; 00270 virtual void empty(); 00271 virtual void getEnvelope( OGREnvelope * psEnvelope ) const; 00272 virtual OGRBoolean IsEmpty() const; 00273 00274 // ICurve methods 00275 virtual double get_Length() const; 00276 virtual void StartPoint(OGRPoint *) const; 00277 virtual void EndPoint(OGRPoint *) const; 00278 virtual void Value( double, OGRPoint * ) const; 00279 00280 // ILineString methods 00281 int getNumPoints() const { return nPointCount; } 00282 void getPoint( int, OGRPoint * ) const; 00283 double getX( int i ) const { return paoPoints[i].x; } 00284 double getY( int i ) const { return paoPoints[i].y; } 00285 double getZ( int i ) const; 00286 00287 // ISpatialRelation 00288 virtual OGRBoolean Equals( OGRGeometry * ) const; 00289 00290 // non standard. 00291 virtual void setCoordinateDimension( int nDimension ); 00292 void setNumPoints( int ); 00293 void setPoint( int, OGRPoint * ); 00294 void setPoint( int, double, double ); 00295 void setPoint( int, double, double, double ); 00296 void setPoints( int, OGRRawPoint *, double * = NULL ); 00297 void setPoints( int, double * padfX, double * padfY, 00298 double *padfZ = NULL ); 00299 void addPoint( OGRPoint * ); 00300 void addPoint( double, double ); 00301 void addPoint( double, double, double ); 00302 00303 void getPoints( OGRRawPoint *, double * = NULL ) const; 00304 00305 void addSubLineString( const OGRLineString *, 00306 int nStartVertex = 0, int nEndVertex = -1 ); 00307 00308 // non-standard from OGRGeometry 00309 virtual OGRwkbGeometryType getGeometryType() const; 00310 virtual const char *getGeometryName() const; 00311 virtual OGRErr transform( OGRCoordinateTransformation *poCT ); 00312 virtual void flattenTo2D(); 00313 virtual void segmentize(double dfMaxLength); 00314 }; 00315 00316 /************************************************************************/ 00317 /* OGRLinearRing */ 00318 /************************************************************************/ 00319 00338 class CPL_DLL OGRLinearRing : public OGRLineString 00339 { 00340 private: 00341 friend class OGRPolygon; 00342 00343 // These are not IWks compatible ... just a convenience for OGRPolygon. 00344 virtual int _WkbSize( int b3D ) const; 00345 virtual OGRErr _importFromWkb( OGRwkbByteOrder, int b3D, 00346 unsigned char *, int=-1 ); 00347 virtual OGRErr _exportToWkb( OGRwkbByteOrder, int b3D, 00348 unsigned char * ) const; 00349 00350 public: 00351 OGRLinearRing(); 00352 OGRLinearRing( OGRLinearRing * ); 00353 ~OGRLinearRing(); 00354 00355 // Non standard. 00356 virtual const char *getGeometryName() const; 00357 virtual OGRGeometry *clone() const; 00358 virtual int isClockwise() const; 00359 virtual void reverseWindingOrder(); 00360 virtual void closeRings(); 00361 virtual double get_Area() const; 00362 OGRBoolean isPointInRing(const OGRPoint* pt, int bTestEnvelope = TRUE) const; 00363 OGRBoolean isPointOnRingBoundary(const OGRPoint* pt, int bTestEnvelope = TRUE) const; 00364 00365 // IWks Interface - Note this isnt really a first class object 00366 // for the purposes of WKB form. These methods always fail since this 00367 // object cant be serialized on its own. 00368 virtual int WkbSize() const; 00369 virtual OGRErr importFromWkb( unsigned char *, int=-1 ); 00370 virtual OGRErr exportToWkb( OGRwkbByteOrder, unsigned char * ) const; 00371 }; 00372 00373 /************************************************************************/ 00374 /* OGRSurface */ 00375 /************************************************************************/ 00376 00381 class CPL_DLL OGRSurface : public OGRGeometry 00382 { 00383 public: 00384 virtual double get_Area() const = 0; 00385 virtual OGRErr Centroid( OGRPoint * poPoint ) const = 0; 00386 virtual OGRErr PointOnSurface( OGRPoint * poPoint ) const = 0; 00387 }; 00388 00389 /************************************************************************/ 00390 /* OGRPolygon */ 00391 /************************************************************************/ 00392 00402 class CPL_DLL OGRPolygon : public OGRSurface 00403 { 00404 int nRingCount; 00405 OGRLinearRing **papoRings; 00406 00407 public: 00408 OGRPolygon(); 00409 virtual ~OGRPolygon(); 00410 00411 // Non standard (OGRGeometry). 00412 virtual const char *getGeometryName() const; 00413 virtual OGRwkbGeometryType getGeometryType() const; 00414 virtual OGRGeometry *clone() const; 00415 virtual void empty(); 00416 virtual OGRErr transform( OGRCoordinateTransformation *poCT ); 00417 virtual void flattenTo2D(); 00418 virtual OGRBoolean IsEmpty() const; 00419 virtual void segmentize(double dfMaxLength); 00420 00421 // ISurface Interface 00422 virtual double get_Area() const; 00423 virtual int Centroid( OGRPoint * poPoint ) const; 00424 virtual int PointOnSurface( OGRPoint * poPoint ) const; 00425 00426 // IWks Interface 00427 virtual int WkbSize() const; 00428 virtual OGRErr importFromWkb( unsigned char *, int = -1 ); 00429 virtual OGRErr exportToWkb( OGRwkbByteOrder, unsigned char * ) const; 00430 virtual OGRErr importFromWkt( char ** ); 00431 virtual OGRErr exportToWkt( char ** ppszDstText ) const; 00432 00433 // IGeometry 00434 virtual int getDimension() const; 00435 virtual void getEnvelope( OGREnvelope * psEnvelope ) const; 00436 00437 // ISpatialRelation 00438 virtual OGRBoolean Equals( OGRGeometry * ) const; 00439 00440 // Non standard 00441 virtual void setCoordinateDimension( int nDimension ); 00442 00443 void addRing( OGRLinearRing * ); 00444 void addRingDirectly( OGRLinearRing * ); 00445 00446 OGRLinearRing *getExteriorRing(); 00447 const OGRLinearRing *getExteriorRing() const; 00448 int getNumInteriorRings() const; 00449 OGRLinearRing *getInteriorRing( int ); 00450 const OGRLinearRing *getInteriorRing( int ) const; 00451 00452 OGRBoolean IsPointOnSurface( const OGRPoint * ) const; 00453 00454 virtual void closeRings(); 00455 }; 00456 00457 /************************************************************************/ 00458 /* OGRGeometryCollection */ 00459 /************************************************************************/ 00460 00468 class CPL_DLL OGRGeometryCollection : public OGRGeometry 00469 { 00470 int nGeomCount; 00471 OGRGeometry **papoGeoms; 00472 00473 public: 00474 OGRGeometryCollection(); 00475 virtual ~OGRGeometryCollection(); 00476 00477 // Non standard (OGRGeometry). 00478 virtual const char *getGeometryName() const; 00479 virtual OGRwkbGeometryType getGeometryType() const; 00480 virtual OGRGeometry *clone() const; 00481 virtual void empty(); 00482 virtual OGRErr transform( OGRCoordinateTransformation *poCT ); 00483 virtual void flattenTo2D(); 00484 virtual OGRBoolean IsEmpty() const; 00485 virtual void segmentize(double dfMaxLength); 00486 00487 // IWks Interface 00488 virtual int WkbSize() const; 00489 virtual OGRErr importFromWkb( unsigned char *, int = -1 ); 00490 virtual OGRErr exportToWkb( OGRwkbByteOrder, unsigned char * ) const; 00491 virtual OGRErr importFromWkt( char ** ); 00492 virtual OGRErr exportToWkt( char ** ppszDstText ) const; 00493 00494 virtual double get_Area() const; 00495 00496 // IGeometry methods 00497 virtual int getDimension() const; 00498 virtual void getEnvelope( OGREnvelope * psEnvelope ) const; 00499 00500 // IGeometryCollection 00501 int getNumGeometries() const; 00502 OGRGeometry *getGeometryRef( int ); 00503 const OGRGeometry *getGeometryRef( int ) const; 00504 00505 // ISpatialRelation 00506 virtual OGRBoolean Equals( OGRGeometry * ) const; 00507 00508 // Non standard 00509 virtual void setCoordinateDimension( int nDimension ); 00510 virtual OGRErr addGeometry( const OGRGeometry * ); 00511 virtual OGRErr addGeometryDirectly( OGRGeometry * ); 00512 virtual OGRErr removeGeometry( int iIndex, int bDelete = TRUE ); 00513 00514 void closeRings(); 00515 }; 00516 00517 /************************************************************************/ 00518 /* OGRMultiPolygon */ 00519 /************************************************************************/ 00520 00528 class CPL_DLL OGRMultiPolygon : public OGRGeometryCollection 00529 { 00530 public: 00531 OGRMultiPolygon(); 00532 // Non standard (OGRGeometry). 00533 virtual const char *getGeometryName() const; 00534 virtual OGRwkbGeometryType getGeometryType() const; 00535 virtual OGRGeometry *clone() const; 00536 virtual OGRErr importFromWkt( char ** ); 00537 virtual OGRErr exportToWkt( char ** ) const; 00538 00539 // Non standard 00540 virtual OGRErr addGeometryDirectly( OGRGeometry * ); 00541 00542 virtual double get_Area() const; 00543 }; 00544 00545 /************************************************************************/ 00546 /* OGRMultiPoint */ 00547 /************************************************************************/ 00548 00553 class CPL_DLL OGRMultiPoint : public OGRGeometryCollection 00554 { 00555 private: 00556 OGRErr importFromWkt_Bracketed( char ** ); 00557 00558 public: 00559 OGRMultiPoint(); 00560 // Non standard (OGRGeometry). 00561 virtual const char *getGeometryName() const; 00562 virtual OGRwkbGeometryType getGeometryType() const; 00563 virtual OGRGeometry *clone() const; 00564 virtual OGRErr importFromWkt( char ** ); 00565 virtual OGRErr exportToWkt( char ** ) const; 00566 00567 // Non standard 00568 virtual OGRErr addGeometryDirectly( OGRGeometry * ); 00569 }; 00570 00571 /************************************************************************/ 00572 /* OGRMultiLineString */ 00573 /************************************************************************/ 00574 00579 class CPL_DLL OGRMultiLineString : public OGRGeometryCollection 00580 { 00581 public: 00582 OGRMultiLineString(); 00583 ~OGRMultiLineString(); 00584 // Non standard (OGRGeometry). 00585 virtual const char *getGeometryName() const; 00586 virtual OGRwkbGeometryType getGeometryType() const; 00587 virtual OGRGeometry *clone() const; 00588 virtual OGRErr importFromWkt( char ** ); 00589 virtual OGRErr exportToWkt( char ** ) const; 00590 00591 // Non standard 00592 virtual OGRErr addGeometryDirectly( OGRGeometry * ); 00593 }; 00594 00595 00596 /************************************************************************/ 00597 /* OGRGeometryFactory */ 00598 /************************************************************************/ 00599 00604 class CPL_DLL OGRGeometryFactory 00605 { 00606 public: 00607 static OGRErr createFromWkb( unsigned char *, OGRSpatialReference *, 00608 OGRGeometry **, int = -1 ); 00609 static OGRErr createFromWkt( char **, OGRSpatialReference *, 00610 OGRGeometry ** ); 00611 static OGRErr createFromFgf( unsigned char *, OGRSpatialReference *, 00612 OGRGeometry **, int = -1, int * = NULL ); 00613 static OGRGeometry *createFromGML( const char * ); 00614 static OGRGeometry *createFromGEOS( GEOSGeom ); 00615 00616 static void destroyGeometry( OGRGeometry * ); 00617 static OGRGeometry *createGeometry( OGRwkbGeometryType ); 00618 00619 static OGRGeometry * forceToPolygon( OGRGeometry * ); 00620 static OGRGeometry * forceToMultiPolygon( OGRGeometry * ); 00621 static OGRGeometry * forceToMultiPoint( OGRGeometry * ); 00622 static OGRGeometry * forceToMultiLineString( OGRGeometry * ); 00623 00624 static OGRGeometry * organizePolygons( OGRGeometry **papoPolygons, 00625 int nPolygonCount, 00626 int *pbResultValidGeometry, 00627 const char **papszOptions = NULL); 00628 00629 static void *getGEOSGeometryFactory(); 00630 00631 static int haveGEOS(); 00632 00633 static OGRGeometry* transformWithOptions( const OGRGeometry* poSrcGeom, 00634 OGRCoordinateTransformation *poCT, 00635 char** papszOptions ); 00636 00637 static OGRGeometry* 00638 approximateArcAngles( double dfX, double dfY, double dfZ, 00639 double dfPrimaryRadius, double dfSecondaryAxis, 00640 double dfRotation, 00641 double dfStartAngle, double dfEndAngle, 00642 double dfMaxAngleStepSizeDegrees ); 00643 }; 00644 00645 #endif /* ndef _OGR_GEOMETRY_H_INCLUDED */