OGR
|
00001 /****************************************************************************** 00002 * $Id: ogr_geometry.h 21023 2010-10-30 19:48:23Z 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 00063 class OGRPoint; 00064 00077 class CPL_DLL OGRGeometry 00078 { 00079 private: 00080 OGRSpatialReference * poSRS; // may be NULL 00081 00082 protected: 00083 int nCoordDimension; 00084 00085 public: 00086 OGRGeometry(); 00087 virtual ~OGRGeometry(); 00088 00089 // standard IGeometry 00090 virtual int getDimension() const = 0; 00091 virtual int getCoordinateDimension() const; 00092 virtual OGRBoolean IsEmpty() const = 0; 00093 virtual OGRBoolean IsValid() const; 00094 virtual OGRBoolean IsSimple() const; 00095 virtual OGRBoolean IsRing() const; 00096 virtual void empty() = 0; 00097 virtual OGRGeometry *clone() const = 0; 00098 virtual void getEnvelope( OGREnvelope * psEnvelope ) const = 0; 00099 00100 // IWks Interface 00101 virtual int WkbSize() const = 0; 00102 virtual OGRErr importFromWkb( unsigned char *, int=-1 )=0; 00103 virtual OGRErr exportToWkb( OGRwkbByteOrder, unsigned char * ) const = 0; 00104 virtual OGRErr importFromWkt( char ** ppszInput ) = 0; 00105 virtual OGRErr exportToWkt( char ** ppszDstText ) const = 0; 00106 00107 // non-standard 00108 virtual OGRwkbGeometryType getGeometryType() const = 0; 00109 virtual const char *getGeometryName() const = 0; 00110 virtual void dumpReadable( FILE *, const char * = NULL, char** papszOptions = NULL ) const; 00111 virtual void flattenTo2D() = 0; 00112 virtual char * exportToGML( const char* const * papszOptions = NULL ) const; 00113 virtual char * exportToKML() const; 00114 virtual char * exportToJson() const; 00115 virtual GEOSGeom exportToGEOS() const; 00116 virtual void closeRings(); 00117 00118 virtual void setCoordinateDimension( int nDimension ); 00119 00120 void assignSpatialReference( OGRSpatialReference * poSR ); 00121 OGRSpatialReference *getSpatialReference( void ) const { return poSRS; } 00122 00123 virtual OGRErr transform( OGRCoordinateTransformation *poCT ) = 0; 00124 OGRErr transformTo( OGRSpatialReference *poSR ); 00125 00126 virtual void segmentize(double dfMaxLength); 00127 00128 // ISpatialRelation 00129 virtual OGRBoolean Intersects( OGRGeometry * ) const; 00130 virtual OGRBoolean Equals( OGRGeometry * ) const = 0; 00131 virtual OGRBoolean Disjoint( const OGRGeometry * ) const; 00132 virtual OGRBoolean Touches( const OGRGeometry * ) const; 00133 virtual OGRBoolean Crosses( const OGRGeometry * ) const; 00134 virtual OGRBoolean Within( const OGRGeometry * ) const; 00135 virtual OGRBoolean Contains( const OGRGeometry * ) const; 00136 virtual OGRBoolean Overlaps( const OGRGeometry * ) const; 00137 // virtual OGRBoolean Relate( const OGRGeometry *, const char * ) const; 00138 00139 virtual OGRGeometry *Boundary() const; 00140 virtual double Distance( const OGRGeometry * ) const; 00141 virtual OGRGeometry *ConvexHull() const; 00142 virtual OGRGeometry *Buffer( double dfDist, int nQuadSegs = 30 ) const; 00143 virtual OGRGeometry *Intersection( const OGRGeometry *) const; 00144 virtual OGRGeometry *Union( const OGRGeometry * ) const; 00145 virtual OGRGeometry *UnionCascaded() const; 00146 virtual OGRGeometry *Difference( const OGRGeometry * ) const; 00147 virtual OGRGeometry *SymDifference( const OGRGeometry * ) const; 00148 virtual OGRErr Centroid( OGRPoint * poPoint ) const; 00149 virtual OGRGeometry *Simplify(double dTolerance) const; 00150 00151 // backward compatibility to non-standard method names. 00152 OGRBoolean Intersect( OGRGeometry * ) const; 00153 OGRBoolean Equal( OGRGeometry * ) const; 00154 virtual OGRGeometry *SymmetricDifference( const OGRGeometry * ) const; 00155 virtual OGRGeometry *getBoundary() const; 00156 00157 // Special HACK for DB2 7.2 support 00158 static int bGenerate_DB2_V72_BYTE_ORDER; 00159 00160 virtual void swapXY(); 00161 }; 00162 00163 /************************************************************************/ 00164 /* OGRPoint */ 00165 /************************************************************************/ 00166 00173 class CPL_DLL OGRPoint : public OGRGeometry 00174 { 00175 double x; 00176 double y; 00177 double z; 00178 00179 public: 00180 OGRPoint(); 00181 OGRPoint( double x, double y ); 00182 OGRPoint( double x, double y, double z ); 00183 virtual ~OGRPoint(); 00184 00185 // IWks Interface 00186 virtual int WkbSize() const; 00187 virtual OGRErr importFromWkb( unsigned char *, int=-1 ); 00188 virtual OGRErr exportToWkb( OGRwkbByteOrder, unsigned char * ) const; 00189 virtual OGRErr importFromWkt( char ** ); 00190 virtual OGRErr exportToWkt( char ** ppszDstText ) const; 00191 00192 // IGeometry 00193 virtual int getDimension() const; 00194 virtual OGRGeometry *clone() const; 00195 virtual void empty(); 00196 virtual void getEnvelope( OGREnvelope * psEnvelope ) const; 00197 virtual OGRBoolean IsEmpty() const; 00198 00199 // IPoint 00200 double getX() const { return x; } 00201 double getY() const { return y; } 00202 double getZ() const { return z; } 00203 00204 // Non standard 00205 virtual void setCoordinateDimension( int nDimension ); 00206 void setX( double xIn ) { x = xIn; if (nCoordDimension == 0) nCoordDimension = 2; } 00207 void setY( double yIn ) { y = yIn; if (nCoordDimension == 0) nCoordDimension = 2; } 00208 void setZ( double zIn ) { z = zIn; nCoordDimension=3; } 00209 00210 // ISpatialRelation 00211 virtual OGRBoolean Equals( OGRGeometry * ) const; 00212 00213 // Non standard from OGRGeometry 00214 virtual const char *getGeometryName() const; 00215 virtual OGRwkbGeometryType getGeometryType() const; 00216 virtual OGRErr transform( OGRCoordinateTransformation *poCT ); 00217 virtual void flattenTo2D(); 00218 00219 virtual void swapXY(); 00220 }; 00221 00222 /************************************************************************/ 00223 /* OGRCurve */ 00224 /************************************************************************/ 00225 00230 class CPL_DLL OGRCurve : public OGRGeometry 00231 { 00232 public: 00233 OGRCurve(); 00234 virtual ~OGRCurve(); 00235 // ICurve methods 00236 virtual double get_Length() const = 0; 00237 virtual void StartPoint(OGRPoint *) const = 0; 00238 virtual void EndPoint(OGRPoint *) const = 0; 00239 virtual int get_IsClosed() const; 00240 virtual void Value( double, OGRPoint * ) const = 0; 00241 00242 }; 00243 00244 /************************************************************************/ 00245 /* OGRLineString */ 00246 /************************************************************************/ 00247 00252 class CPL_DLL OGRLineString : public OGRCurve 00253 { 00254 protected: 00255 int nPointCount; 00256 OGRRawPoint *paoPoints; 00257 double *padfZ; 00258 00259 void Make3D(); 00260 void Make2D(); 00261 00262 public: 00263 OGRLineString(); 00264 virtual ~OGRLineString(); 00265 00266 // IWks Interface 00267 virtual int WkbSize() const; 00268 virtual OGRErr importFromWkb( unsigned char *, int = -1 ); 00269 virtual OGRErr exportToWkb( OGRwkbByteOrder, unsigned char * ) const; 00270 virtual OGRErr importFromWkt( char ** ); 00271 virtual OGRErr exportToWkt( char ** ppszDstText ) const; 00272 00273 // IGeometry interface 00274 virtual int getDimension() const; 00275 virtual OGRGeometry *clone() const; 00276 virtual void empty(); 00277 virtual void getEnvelope( OGREnvelope * psEnvelope ) const; 00278 virtual OGRBoolean IsEmpty() const; 00279 00280 // ICurve methods 00281 virtual double get_Length() const; 00282 virtual void StartPoint(OGRPoint *) const; 00283 virtual void EndPoint(OGRPoint *) const; 00284 virtual void Value( double, OGRPoint * ) const; 00285 00286 // ILineString methods 00287 int getNumPoints() const { return nPointCount; } 00288 void getPoint( int, OGRPoint * ) const; 00289 double getX( int i ) const { return paoPoints[i].x; } 00290 double getY( int i ) const { return paoPoints[i].y; } 00291 double getZ( int i ) const; 00292 00293 // ISpatialRelation 00294 virtual OGRBoolean Equals( OGRGeometry * ) const; 00295 00296 // non standard. 00297 virtual void setCoordinateDimension( int nDimension ); 00298 void setNumPoints( int ); 00299 void setPoint( int, OGRPoint * ); 00300 void setPoint( int, double, double ); 00301 void setPoint( int, double, double, double ); 00302 void setPoints( int, OGRRawPoint *, double * = NULL ); 00303 void setPoints( int, double * padfX, double * padfY, 00304 double *padfZ = NULL ); 00305 void addPoint( OGRPoint * ); 00306 void addPoint( double, double ); 00307 void addPoint( double, double, double ); 00308 00309 void getPoints( OGRRawPoint *, double * = NULL ) const; 00310 00311 void addSubLineString( const OGRLineString *, 00312 int nStartVertex = 0, int nEndVertex = -1 ); 00313 00314 // non-standard from OGRGeometry 00315 virtual OGRwkbGeometryType getGeometryType() const; 00316 virtual const char *getGeometryName() const; 00317 virtual OGRErr transform( OGRCoordinateTransformation *poCT ); 00318 virtual void flattenTo2D(); 00319 virtual void segmentize(double dfMaxLength); 00320 00321 virtual void swapXY(); 00322 }; 00323 00324 /************************************************************************/ 00325 /* OGRLinearRing */ 00326 /************************************************************************/ 00327 00346 class CPL_DLL OGRLinearRing : public OGRLineString 00347 { 00348 private: 00349 friend class OGRPolygon; 00350 00351 // These are not IWks compatible ... just a convenience for OGRPolygon. 00352 virtual int _WkbSize( int b3D ) const; 00353 virtual OGRErr _importFromWkb( OGRwkbByteOrder, int b3D, 00354 unsigned char *, int=-1 ); 00355 virtual OGRErr _exportToWkb( OGRwkbByteOrder, int b3D, 00356 unsigned char * ) const; 00357 00358 public: 00359 OGRLinearRing(); 00360 OGRLinearRing( OGRLinearRing * ); 00361 ~OGRLinearRing(); 00362 00363 // Non standard. 00364 virtual const char *getGeometryName() const; 00365 virtual OGRGeometry *clone() const; 00366 virtual int isClockwise() const; 00367 virtual void reverseWindingOrder(); 00368 virtual void closeRings(); 00369 virtual double get_Area() const; 00370 OGRBoolean isPointInRing(const OGRPoint* pt, int bTestEnvelope = TRUE) const; 00371 OGRBoolean isPointOnRingBoundary(const OGRPoint* pt, int bTestEnvelope = TRUE) const; 00372 00373 // IWks Interface - Note this isnt really a first class object 00374 // for the purposes of WKB form. These methods always fail since this 00375 // object cant be serialized on its own. 00376 virtual int WkbSize() const; 00377 virtual OGRErr importFromWkb( unsigned char *, int=-1 ); 00378 virtual OGRErr exportToWkb( OGRwkbByteOrder, unsigned char * ) const; 00379 }; 00380 00381 /************************************************************************/ 00382 /* OGRSurface */ 00383 /************************************************************************/ 00384 00389 class CPL_DLL OGRSurface : public OGRGeometry 00390 { 00391 public: 00392 virtual double get_Area() const = 0; 00393 virtual OGRErr PointOnSurface( OGRPoint * poPoint ) const = 0; 00394 }; 00395 00396 /************************************************************************/ 00397 /* OGRPolygon */ 00398 /************************************************************************/ 00399 00409 class CPL_DLL OGRPolygon : public OGRSurface 00410 { 00411 int nRingCount; 00412 OGRLinearRing **papoRings; 00413 00414 public: 00415 OGRPolygon(); 00416 virtual ~OGRPolygon(); 00417 00418 // Non standard (OGRGeometry). 00419 virtual const char *getGeometryName() const; 00420 virtual OGRwkbGeometryType getGeometryType() const; 00421 virtual OGRGeometry *clone() const; 00422 virtual void empty(); 00423 virtual OGRErr transform( OGRCoordinateTransformation *poCT ); 00424 virtual void flattenTo2D(); 00425 virtual OGRBoolean IsEmpty() const; 00426 virtual void segmentize(double dfMaxLength); 00427 00428 // ISurface Interface 00429 virtual double get_Area() const; 00430 virtual int PointOnSurface( OGRPoint * poPoint ) const; 00431 00432 // IWks Interface 00433 virtual int WkbSize() const; 00434 virtual OGRErr importFromWkb( unsigned char *, int = -1 ); 00435 virtual OGRErr exportToWkb( OGRwkbByteOrder, unsigned char * ) const; 00436 virtual OGRErr importFromWkt( char ** ); 00437 virtual OGRErr exportToWkt( char ** ppszDstText ) const; 00438 00439 // IGeometry 00440 virtual int getDimension() const; 00441 virtual void getEnvelope( OGREnvelope * psEnvelope ) const; 00442 00443 // ISpatialRelation 00444 virtual OGRBoolean Equals( OGRGeometry * ) const; 00445 00446 // Non standard 00447 virtual void setCoordinateDimension( int nDimension ); 00448 00449 void addRing( OGRLinearRing * ); 00450 void addRingDirectly( OGRLinearRing * ); 00451 00452 OGRLinearRing *getExteriorRing(); 00453 const OGRLinearRing *getExteriorRing() const; 00454 int getNumInteriorRings() const; 00455 OGRLinearRing *getInteriorRing( int ); 00456 const OGRLinearRing *getInteriorRing( int ) const; 00457 00458 OGRBoolean IsPointOnSurface( const OGRPoint * ) const; 00459 00460 virtual void closeRings(); 00461 00462 virtual void swapXY(); 00463 }; 00464 00465 /************************************************************************/ 00466 /* OGRGeometryCollection */ 00467 /************************************************************************/ 00468 00476 class CPL_DLL OGRGeometryCollection : public OGRGeometry 00477 { 00478 int nGeomCount; 00479 OGRGeometry **papoGeoms; 00480 00481 public: 00482 OGRGeometryCollection(); 00483 virtual ~OGRGeometryCollection(); 00484 00485 // Non standard (OGRGeometry). 00486 virtual const char *getGeometryName() const; 00487 virtual OGRwkbGeometryType getGeometryType() const; 00488 virtual OGRGeometry *clone() const; 00489 virtual void empty(); 00490 virtual OGRErr transform( OGRCoordinateTransformation *poCT ); 00491 virtual void flattenTo2D(); 00492 virtual OGRBoolean IsEmpty() const; 00493 virtual void segmentize(double dfMaxLength); 00494 00495 // IWks Interface 00496 virtual int WkbSize() const; 00497 virtual OGRErr importFromWkb( unsigned char *, int = -1 ); 00498 virtual OGRErr exportToWkb( OGRwkbByteOrder, unsigned char * ) const; 00499 virtual OGRErr importFromWkt( char ** ); 00500 virtual OGRErr exportToWkt( char ** ppszDstText ) const; 00501 00502 virtual double get_Length() const; 00503 virtual double get_Area() const; 00504 00505 // IGeometry methods 00506 virtual int getDimension() const; 00507 virtual void getEnvelope( OGREnvelope * psEnvelope ) const; 00508 00509 // IGeometryCollection 00510 int getNumGeometries() const; 00511 OGRGeometry *getGeometryRef( int ); 00512 const OGRGeometry *getGeometryRef( int ) const; 00513 00514 // ISpatialRelation 00515 virtual OGRBoolean Equals( OGRGeometry * ) const; 00516 00517 // Non standard 00518 virtual void setCoordinateDimension( int nDimension ); 00519 virtual OGRErr addGeometry( const OGRGeometry * ); 00520 virtual OGRErr addGeometryDirectly( OGRGeometry * ); 00521 virtual OGRErr removeGeometry( int iIndex, int bDelete = TRUE ); 00522 00523 void closeRings(); 00524 00525 virtual void swapXY(); 00526 }; 00527 00528 /************************************************************************/ 00529 /* OGRMultiPolygon */ 00530 /************************************************************************/ 00531 00539 class CPL_DLL OGRMultiPolygon : public OGRGeometryCollection 00540 { 00541 public: 00542 OGRMultiPolygon(); 00543 // Non standard (OGRGeometry). 00544 virtual const char *getGeometryName() const; 00545 virtual OGRwkbGeometryType getGeometryType() const; 00546 virtual OGRGeometry *clone() const; 00547 virtual OGRErr importFromWkt( char ** ); 00548 virtual OGRErr exportToWkt( char ** ) const; 00549 00550 // Non standard 00551 virtual OGRErr addGeometryDirectly( OGRGeometry * ); 00552 00553 virtual double get_Area() const; 00554 }; 00555 00556 /************************************************************************/ 00557 /* OGRMultiPoint */ 00558 /************************************************************************/ 00559 00564 class CPL_DLL OGRMultiPoint : public OGRGeometryCollection 00565 { 00566 private: 00567 OGRErr importFromWkt_Bracketed( char **, int bHasM, int bHasZ ); 00568 00569 public: 00570 OGRMultiPoint(); 00571 // Non standard (OGRGeometry). 00572 virtual const char *getGeometryName() const; 00573 virtual OGRwkbGeometryType getGeometryType() const; 00574 virtual OGRGeometry *clone() const; 00575 virtual OGRErr importFromWkt( char ** ); 00576 virtual OGRErr exportToWkt( char ** ) const; 00577 00578 // Non standard 00579 virtual OGRErr addGeometryDirectly( OGRGeometry * ); 00580 }; 00581 00582 /************************************************************************/ 00583 /* OGRMultiLineString */ 00584 /************************************************************************/ 00585 00590 class CPL_DLL OGRMultiLineString : public OGRGeometryCollection 00591 { 00592 public: 00593 OGRMultiLineString(); 00594 ~OGRMultiLineString(); 00595 // Non standard (OGRGeometry). 00596 virtual const char *getGeometryName() const; 00597 virtual OGRwkbGeometryType getGeometryType() const; 00598 virtual OGRGeometry *clone() const; 00599 virtual OGRErr importFromWkt( char ** ); 00600 virtual OGRErr exportToWkt( char ** ) const; 00601 00602 // Non standard 00603 virtual OGRErr addGeometryDirectly( OGRGeometry * ); 00604 }; 00605 00606 00607 /************************************************************************/ 00608 /* OGRGeometryFactory */ 00609 /************************************************************************/ 00610 00615 class CPL_DLL OGRGeometryFactory 00616 { 00617 public: 00618 static OGRErr createFromWkb( unsigned char *, OGRSpatialReference *, 00619 OGRGeometry **, int = -1 ); 00620 static OGRErr createFromWkt( char **, OGRSpatialReference *, 00621 OGRGeometry ** ); 00622 static OGRErr createFromFgf( unsigned char *, OGRSpatialReference *, 00623 OGRGeometry **, int = -1, int * = NULL ); 00624 static OGRGeometry *createFromGML( const char * ); 00625 static OGRGeometry *createFromGEOS( GEOSGeom ); 00626 00627 static void destroyGeometry( OGRGeometry * ); 00628 static OGRGeometry *createGeometry( OGRwkbGeometryType ); 00629 00630 static OGRGeometry * forceToPolygon( OGRGeometry * ); 00631 static OGRGeometry * forceToMultiPolygon( OGRGeometry * ); 00632 static OGRGeometry * forceToMultiPoint( OGRGeometry * ); 00633 static OGRGeometry * forceToMultiLineString( OGRGeometry * ); 00634 00635 static OGRGeometry * organizePolygons( OGRGeometry **papoPolygons, 00636 int nPolygonCount, 00637 int *pbResultValidGeometry, 00638 const char **papszOptions = NULL); 00639 00640 static void *getGEOSGeometryFactory(); 00641 00642 static int haveGEOS(); 00643 00644 static OGRGeometry* transformWithOptions( const OGRGeometry* poSrcGeom, 00645 OGRCoordinateTransformation *poCT, 00646 char** papszOptions ); 00647 00648 static OGRGeometry* 00649 approximateArcAngles( double dfX, double dfY, double dfZ, 00650 double dfPrimaryRadius, double dfSecondaryAxis, 00651 double dfRotation, 00652 double dfStartAngle, double dfEndAngle, 00653 double dfMaxAngleStepSizeDegrees ); 00654 }; 00655 00656 OGRwkbGeometryType CPL_DLL OGRFromOGCGeomType( const char *pszGeomType ); 00657 const char CPL_DLL * OGRToOGCGeomType( OGRwkbGeometryType eGeomType ); 00658 00659 #endif /* ndef _OGR_GEOMETRY_H_INCLUDED */