OGR
|
00001 /****************************************************************************** 00002 * $Id: ogr_geometry.h 15517 2008-10-11 18:34:03Z rouault $ 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 00072 class CPL_DLL OGRGeometry 00073 { 00074 private: 00075 OGRSpatialReference * poSRS; // may be NULL 00076 00077 protected: 00078 int nCoordDimension; 00079 00080 public: 00081 OGRGeometry(); 00082 virtual ~OGRGeometry(); 00083 00084 // standard IGeometry 00085 virtual int getDimension() const = 0; 00086 virtual int getCoordinateDimension() const; 00087 virtual OGRBoolean IsEmpty() const = 0; 00088 virtual OGRBoolean IsValid() const; 00089 virtual OGRBoolean IsSimple() const; 00090 virtual OGRBoolean IsRing() const; 00091 virtual void empty() = 0; 00092 virtual OGRGeometry *clone() const = 0; 00093 virtual void getEnvelope( OGREnvelope * psEnvelope ) const = 0; 00094 00095 // IWks Interface 00096 virtual int WkbSize() const = 0; 00097 virtual OGRErr importFromWkb( unsigned char *, int=-1 )=0; 00098 virtual OGRErr exportToWkb( OGRwkbByteOrder, unsigned char * ) const = 0; 00099 virtual OGRErr importFromWkt( char ** ppszInput ) = 0; 00100 virtual OGRErr exportToWkt( char ** ppszDstText ) const = 0; 00101 00102 // non-standard 00103 virtual OGRwkbGeometryType getGeometryType() const = 0; 00104 virtual const char *getGeometryName() const = 0; 00105 virtual void dumpReadable( FILE *, const char * = NULL, char** papszOptions = NULL ) const; 00106 virtual void flattenTo2D() = 0; 00107 virtual char * exportToGML() const; 00108 virtual char * exportToKML() const; 00109 virtual char * exportToJson() const; 00110 virtual GEOSGeom exportToGEOS() const; 00111 virtual void closeRings(); 00112 00113 virtual void setCoordinateDimension( int nDimension ); 00114 00115 void assignSpatialReference( OGRSpatialReference * poSR ); 00116 OGRSpatialReference *getSpatialReference( void ) const { return poSRS; } 00117 00118 virtual OGRErr transform( OGRCoordinateTransformation *poCT ) = 0; 00119 OGRErr transformTo( OGRSpatialReference *poSR ); 00120 00121 virtual void segmentize(double dfMaxLength); 00122 00123 // ISpatialRelation 00124 virtual OGRBoolean Intersects( OGRGeometry * ) const; 00125 virtual OGRBoolean Equals( OGRGeometry * ) const = 0; 00126 virtual OGRBoolean Disjoint( const OGRGeometry * ) const; 00127 virtual OGRBoolean Touches( const OGRGeometry * ) const; 00128 virtual OGRBoolean Crosses( const OGRGeometry * ) const; 00129 virtual OGRBoolean Within( const OGRGeometry * ) const; 00130 virtual OGRBoolean Contains( const OGRGeometry * ) const; 00131 virtual OGRBoolean Overlaps( const OGRGeometry * ) const; 00132 // virtual OGRBoolean Relate( const OGRGeometry *, const char * ) const; 00133 00134 virtual OGRGeometry *getBoundary() const; 00135 virtual double Distance( const OGRGeometry * ) const; 00136 virtual OGRGeometry *ConvexHull() const; 00137 virtual OGRGeometry *Buffer( double dfDist, int nQuadSegs = 30 ) const; 00138 virtual OGRGeometry *Intersection( const OGRGeometry *) const; 00139 virtual OGRGeometry *Union( const OGRGeometry * ) const; 00140 virtual OGRGeometry *Difference( const OGRGeometry * ) const; 00141 virtual OGRGeometry *SymmetricDifference( const OGRGeometry * ) const; 00142 00143 // backward compatibility methods. 00144 OGRBoolean Intersect( OGRGeometry * ) const; 00145 OGRBoolean Equal( OGRGeometry * ) const; 00146 00147 // Special HACK for DB2 7.2 support 00148 static int bGenerate_DB2_V72_BYTE_ORDER; 00149 }; 00150 00151 /************************************************************************/ 00152 /* OGRPoint */ 00153 /************************************************************************/ 00154 00161 class CPL_DLL OGRPoint : public OGRGeometry 00162 { 00163 double x; 00164 double y; 00165 double z; 00166 00167 public: 00168 OGRPoint(); 00169 OGRPoint( double x, double y ); 00170 OGRPoint( double x, double y, double z ); 00171 virtual ~OGRPoint(); 00172 00173 // IWks Interface 00174 virtual int WkbSize() const; 00175 virtual OGRErr importFromWkb( unsigned char *, int=-1 ); 00176 virtual OGRErr exportToWkb( OGRwkbByteOrder, unsigned char * ) const; 00177 virtual OGRErr importFromWkt( char ** ); 00178 virtual OGRErr exportToWkt( char ** ppszDstText ) const; 00179 00180 // IGeometry 00181 virtual int getDimension() const; 00182 virtual OGRGeometry *clone() const; 00183 virtual void empty(); 00184 virtual void getEnvelope( OGREnvelope * psEnvelope ) const; 00185 virtual OGRBoolean IsEmpty() const; 00186 00187 // IPoint 00188 double getX() const { return x; } 00189 double getY() const { return y; } 00190 double getZ() const { return z; } 00191 00192 // Non standard 00193 virtual void setCoordinateDimension( int nDimension ); 00194 void setX( double xIn ) { x = xIn; if (nCoordDimension == 0) nCoordDimension = 2; } 00195 void setY( double yIn ) { y = yIn; if (nCoordDimension == 0) nCoordDimension = 2; } 00196 void setZ( double zIn ) { z = zIn; nCoordDimension=3; } 00197 00198 // ISpatialRelation 00199 virtual OGRBoolean Equals( OGRGeometry * ) const; 00200 00201 // Non standard from OGRGeometry 00202 virtual const char *getGeometryName() const; 00203 virtual OGRwkbGeometryType getGeometryType() const; 00204 virtual OGRErr transform( OGRCoordinateTransformation *poCT ); 00205 virtual void flattenTo2D(); 00206 }; 00207 00208 /************************************************************************/ 00209 /* OGRCurve */ 00210 /************************************************************************/ 00211 00216 class CPL_DLL OGRCurve : public OGRGeometry 00217 { 00218 public: 00219 OGRCurve(); 00220 virtual ~OGRCurve(); 00221 // ICurve methods 00222 virtual double get_Length() const = 0; 00223 virtual void StartPoint(OGRPoint *) const = 0; 00224 virtual void EndPoint(OGRPoint *) const = 0; 00225 virtual int get_IsClosed() const; 00226 virtual void Value( double, OGRPoint * ) const = 0; 00227 00228 }; 00229 00230 /************************************************************************/ 00231 /* OGRLineString */ 00232 /************************************************************************/ 00233 00238 class CPL_DLL OGRLineString : public OGRCurve 00239 { 00240 protected: 00241 int nPointCount; 00242 OGRRawPoint *paoPoints; 00243 double *padfZ; 00244 00245 void Make3D(); 00246 void Make2D(); 00247 00248 public: 00249 OGRLineString(); 00250 virtual ~OGRLineString(); 00251 00252 // IWks Interface 00253 virtual int WkbSize() const; 00254 virtual OGRErr importFromWkb( unsigned char *, int = -1 ); 00255 virtual OGRErr exportToWkb( OGRwkbByteOrder, unsigned char * ) const; 00256 virtual OGRErr importFromWkt( char ** ); 00257 virtual OGRErr exportToWkt( char ** ppszDstText ) const; 00258 00259 // IGeometry interface 00260 virtual int getDimension() const; 00261 virtual OGRGeometry *clone() const; 00262 virtual void empty(); 00263 virtual void getEnvelope( OGREnvelope * psEnvelope ) const; 00264 virtual OGRBoolean IsEmpty() const; 00265 00266 // ICurve methods 00267 virtual double get_Length() const; 00268 virtual void StartPoint(OGRPoint *) const; 00269 virtual void EndPoint(OGRPoint *) const; 00270 virtual void Value( double, OGRPoint * ) const; 00271 00272 // ILineString methods 00273 int getNumPoints() const { return nPointCount; } 00274 void getPoint( int, OGRPoint * ) const; 00275 double getX( int i ) const { return paoPoints[i].x; } 00276 double getY( int i ) const { return paoPoints[i].y; } 00277 double getZ( int i ) const; 00278 00279 // ISpatialRelation 00280 virtual OGRBoolean Equals( OGRGeometry * ) const; 00281 00282 // non standard. 00283 virtual void setCoordinateDimension( int nDimension ); 00284 void setNumPoints( int ); 00285 void setPoint( int, OGRPoint * ); 00286 void setPoint( int, double, double ); 00287 void setPoint( int, double, double, double ); 00288 void setPoints( int, OGRRawPoint *, double * = NULL ); 00289 void setPoints( int, double * padfX, double * padfY, 00290 double *padfZ = NULL ); 00291 void addPoint( OGRPoint * ); 00292 void addPoint( double, double ); 00293 void addPoint( double, double, double ); 00294 00295 void getPoints( OGRRawPoint *, double * = NULL ) const; 00296 00297 void addSubLineString( const OGRLineString *, 00298 int nStartVertex = 0, int nEndVertex = -1 ); 00299 00300 // non-standard from OGRGeometry 00301 virtual OGRwkbGeometryType getGeometryType() const; 00302 virtual const char *getGeometryName() const; 00303 virtual OGRErr transform( OGRCoordinateTransformation *poCT ); 00304 virtual void flattenTo2D(); 00305 virtual void segmentize(double dfMaxLength); 00306 }; 00307 00308 /************************************************************************/ 00309 /* OGRLinearRing */ 00310 /************************************************************************/ 00311 00330 class CPL_DLL OGRLinearRing : public OGRLineString 00331 { 00332 private: 00333 friend class OGRPolygon; 00334 00335 // These are not IWks compatible ... just a convenience for OGRPolygon. 00336 virtual int _WkbSize( int b3D ) const; 00337 virtual OGRErr _importFromWkb( OGRwkbByteOrder, int b3D, 00338 unsigned char *, int=-1 ); 00339 virtual OGRErr _exportToWkb( OGRwkbByteOrder, int b3D, 00340 unsigned char * ) const; 00341 00342 public: 00343 OGRLinearRing(); 00344 OGRLinearRing( OGRLinearRing * ); 00345 ~OGRLinearRing(); 00346 00347 // Non standard. 00348 virtual const char *getGeometryName() const; 00349 virtual OGRGeometry *clone() const; 00350 virtual int isClockwise() const; 00351 virtual void reverseWindingOrder(); 00352 virtual void closeRings(); 00353 virtual double get_Area() const; 00354 OGRBoolean isPointInRing(const OGRPoint* pt, int bTestEnvelope = TRUE) const; 00355 OGRBoolean isPointOnRingBoundary(const OGRPoint* pt, int bTestEnvelope = TRUE) const; 00356 00357 // IWks Interface - Note this isnt really a first class object 00358 // for the purposes of WKB form. These methods always fail since this 00359 // object cant be serialized on its own. 00360 virtual int WkbSize() const; 00361 virtual OGRErr importFromWkb( unsigned char *, int=-1 ); 00362 virtual OGRErr exportToWkb( OGRwkbByteOrder, unsigned char * ) const; 00363 }; 00364 00365 /************************************************************************/ 00366 /* OGRSurface */ 00367 /************************************************************************/ 00368 00373 class CPL_DLL OGRSurface : public OGRGeometry 00374 { 00375 public: 00376 virtual double get_Area() const = 0; 00377 virtual OGRErr Centroid( OGRPoint * poPoint ) const = 0; 00378 virtual OGRErr PointOnSurface( OGRPoint * poPoint ) const = 0; 00379 }; 00380 00381 /************************************************************************/ 00382 /* OGRPolygon */ 00383 /************************************************************************/ 00384 00394 class CPL_DLL OGRPolygon : public OGRSurface 00395 { 00396 int nRingCount; 00397 OGRLinearRing **papoRings; 00398 00399 public: 00400 OGRPolygon(); 00401 virtual ~OGRPolygon(); 00402 00403 // Non standard (OGRGeometry). 00404 virtual const char *getGeometryName() const; 00405 virtual OGRwkbGeometryType getGeometryType() const; 00406 virtual OGRGeometry *clone() const; 00407 virtual void empty(); 00408 virtual OGRErr transform( OGRCoordinateTransformation *poCT ); 00409 virtual void flattenTo2D(); 00410 virtual OGRBoolean IsEmpty() const; 00411 virtual void segmentize(double dfMaxLength); 00412 00413 // ISurface Interface 00414 virtual double get_Area() const; 00415 virtual int Centroid( OGRPoint * poPoint ) const; 00416 virtual int PointOnSurface( OGRPoint * poPoint ) const; 00417 00418 // IWks Interface 00419 virtual int WkbSize() const; 00420 virtual OGRErr importFromWkb( unsigned char *, int = -1 ); 00421 virtual OGRErr exportToWkb( OGRwkbByteOrder, unsigned char * ) const; 00422 virtual OGRErr importFromWkt( char ** ); 00423 virtual OGRErr exportToWkt( char ** ppszDstText ) const; 00424 00425 // IGeometry 00426 virtual int getDimension() const; 00427 virtual void getEnvelope( OGREnvelope * psEnvelope ) const; 00428 00429 // ISpatialRelation 00430 virtual OGRBoolean Equals( OGRGeometry * ) const; 00431 00432 // Non standard 00433 virtual void setCoordinateDimension( int nDimension ); 00434 00435 void addRing( OGRLinearRing * ); 00436 void addRingDirectly( OGRLinearRing * ); 00437 00438 OGRLinearRing *getExteriorRing(); 00439 const OGRLinearRing *getExteriorRing() const; 00440 int getNumInteriorRings() const; 00441 OGRLinearRing *getInteriorRing( int ); 00442 const OGRLinearRing *getInteriorRing( int ) const; 00443 00444 OGRBoolean IsPointOnSurface( const OGRPoint * ) const; 00445 00446 virtual void closeRings(); 00447 }; 00448 00449 /************************************************************************/ 00450 /* OGRGeometryCollection */ 00451 /************************************************************************/ 00452 00460 class CPL_DLL OGRGeometryCollection : public OGRGeometry 00461 { 00462 int nGeomCount; 00463 OGRGeometry **papoGeoms; 00464 00465 public: 00466 OGRGeometryCollection(); 00467 virtual ~OGRGeometryCollection(); 00468 00469 // Non standard (OGRGeometry). 00470 virtual const char *getGeometryName() const; 00471 virtual OGRwkbGeometryType getGeometryType() const; 00472 virtual OGRGeometry *clone() const; 00473 virtual void empty(); 00474 virtual OGRErr transform( OGRCoordinateTransformation *poCT ); 00475 virtual void flattenTo2D(); 00476 virtual OGRBoolean IsEmpty() const; 00477 virtual void segmentize(double dfMaxLength); 00478 00479 // IWks Interface 00480 virtual int WkbSize() const; 00481 virtual OGRErr importFromWkb( unsigned char *, int = -1 ); 00482 virtual OGRErr exportToWkb( OGRwkbByteOrder, unsigned char * ) const; 00483 virtual OGRErr importFromWkt( char ** ); 00484 virtual OGRErr exportToWkt( char ** ppszDstText ) const; 00485 00486 virtual double get_Area() const; 00487 00488 // IGeometry methods 00489 virtual int getDimension() const; 00490 virtual void getEnvelope( OGREnvelope * psEnvelope ) const; 00491 00492 // IGeometryCollection 00493 int getNumGeometries() const; 00494 OGRGeometry *getGeometryRef( int ); 00495 const OGRGeometry *getGeometryRef( int ) const; 00496 00497 // ISpatialRelation 00498 virtual OGRBoolean Equals( OGRGeometry * ) const; 00499 00500 // Non standard 00501 virtual void setCoordinateDimension( int nDimension ); 00502 virtual OGRErr addGeometry( const OGRGeometry * ); 00503 virtual OGRErr addGeometryDirectly( OGRGeometry * ); 00504 virtual OGRErr removeGeometry( int iIndex, int bDelete = TRUE ); 00505 00506 void closeRings(); 00507 }; 00508 00509 /************************************************************************/ 00510 /* OGRMultiPolygon */ 00511 /************************************************************************/ 00512 00520 class CPL_DLL OGRMultiPolygon : public OGRGeometryCollection 00521 { 00522 public: 00523 OGRMultiPolygon(); 00524 // Non standard (OGRGeometry). 00525 virtual const char *getGeometryName() const; 00526 virtual OGRwkbGeometryType getGeometryType() const; 00527 virtual OGRGeometry *clone() const; 00528 virtual OGRErr importFromWkt( char ** ); 00529 virtual OGRErr exportToWkt( char ** ) const; 00530 00531 // Non standard 00532 virtual OGRErr addGeometryDirectly( OGRGeometry * ); 00533 00534 virtual double get_Area() const; 00535 }; 00536 00537 /************************************************************************/ 00538 /* OGRMultiPoint */ 00539 /************************************************************************/ 00540 00545 class CPL_DLL OGRMultiPoint : public OGRGeometryCollection 00546 { 00547 private: 00548 OGRErr importFromWkt_Bracketed( char ** ); 00549 00550 public: 00551 OGRMultiPoint(); 00552 // Non standard (OGRGeometry). 00553 virtual const char *getGeometryName() const; 00554 virtual OGRwkbGeometryType getGeometryType() const; 00555 virtual OGRGeometry *clone() const; 00556 virtual OGRErr importFromWkt( char ** ); 00557 virtual OGRErr exportToWkt( char ** ) const; 00558 00559 // Non standard 00560 virtual OGRErr addGeometryDirectly( OGRGeometry * ); 00561 }; 00562 00563 /************************************************************************/ 00564 /* OGRMultiLineString */ 00565 /************************************************************************/ 00566 00571 class CPL_DLL OGRMultiLineString : public OGRGeometryCollection 00572 { 00573 public: 00574 OGRMultiLineString(); 00575 ~OGRMultiLineString(); 00576 // Non standard (OGRGeometry). 00577 virtual const char *getGeometryName() const; 00578 virtual OGRwkbGeometryType getGeometryType() const; 00579 virtual OGRGeometry *clone() const; 00580 virtual OGRErr importFromWkt( char ** ); 00581 virtual OGRErr exportToWkt( char ** ) const; 00582 00583 // Non standard 00584 virtual OGRErr addGeometryDirectly( OGRGeometry * ); 00585 }; 00586 00587 00588 /************************************************************************/ 00589 /* OGRGeometryFactory */ 00590 /************************************************************************/ 00591 00596 class CPL_DLL OGRGeometryFactory 00597 { 00598 public: 00599 static OGRErr createFromWkb( unsigned char *, OGRSpatialReference *, 00600 OGRGeometry **, int = -1 ); 00601 static OGRErr createFromWkt( char **, OGRSpatialReference *, 00602 OGRGeometry ** ); 00603 static OGRErr createFromFgf( unsigned char *, OGRSpatialReference *, 00604 OGRGeometry **, int = -1, int * = NULL ); 00605 static OGRGeometry *createFromGML( const char * ); 00606 static OGRGeometry *createFromGEOS( GEOSGeom ); 00607 00608 static void destroyGeometry( OGRGeometry * ); 00609 static OGRGeometry *createGeometry( OGRwkbGeometryType ); 00610 00611 static OGRGeometry * forceToPolygon( OGRGeometry * ); 00612 static OGRGeometry * forceToMultiPolygon( OGRGeometry * ); 00613 static OGRGeometry * forceToMultiPoint( OGRGeometry * ); 00614 static OGRGeometry * forceToMultiLineString( OGRGeometry * ); 00615 00616 static OGRGeometry * organizePolygons( OGRGeometry **papoPolygons, 00617 int nPolygonCount, 00618 int *pbResultValidGeometry, 00619 const char **papszOptions = NULL); 00620 00621 static void *getGEOSGeometryFactory(); 00622 00623 static int haveGEOS(); 00624 00625 }; 00626 00627 #endif /* ndef _OGR_GEOMETRY_H_INCLUDED */