Main Page | Class Hierarchy | Class List | Directories | File List | Class Members | File Members | Related Pages

ogr_geometry.h

Go to the documentation of this file.
00001 /******************************************************************************
00002  * $Id: ogr_geometry.h 12517 2007-10-23 15:07:35Z mloskot $
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 { return 0; } 
00088     virtual OGRBoolean  IsSimple() const { return 1; }
00089     virtual void        empty() = 0;
00090     virtual OGRGeometry *clone() const = 0;
00091     virtual void getEnvelope( OGREnvelope * psEnvelope ) const = 0;
00092 
00093     // IWks Interface
00094     virtual int WkbSize() const = 0;
00095     virtual OGRErr importFromWkb( unsigned char *, int=-1 )=0;
00096     virtual OGRErr exportToWkb( OGRwkbByteOrder, unsigned char * ) const = 0;
00097     virtual OGRErr importFromWkt( char ** ppszInput ) = 0;
00098     virtual OGRErr exportToWkt( char ** ppszDstText ) const = 0;
00099     
00100     // non-standard
00101     virtual OGRwkbGeometryType getGeometryType() const = 0;
00102     virtual const char *getGeometryName() const = 0;
00103     virtual void   dumpReadable( FILE *, const char * = NULL ) const;
00104     virtual void   flattenTo2D() = 0;
00105     virtual char * exportToGML() const;
00106     virtual GEOSGeom exportToGEOS() const;
00107     virtual void closeRings();
00108 
00109     virtual void setCoordinateDimension( int nDimension ); 
00110 
00111     void    assignSpatialReference( OGRSpatialReference * poSR );
00112     OGRSpatialReference *getSpatialReference( void ) const { return poSRS; }
00113 
00114     virtual OGRErr  transform( OGRCoordinateTransformation *poCT ) = 0;
00115     OGRErr  transformTo( OGRSpatialReference *poSR );
00116 
00117     // ISpatialRelation
00118     virtual OGRBoolean  Intersects( OGRGeometry * ) const;
00119     virtual OGRBoolean  Equals( OGRGeometry * ) const = 0;
00120     virtual OGRBoolean  Disjoint( const OGRGeometry * ) const;
00121     virtual OGRBoolean  Touches( const OGRGeometry * ) const;
00122     virtual OGRBoolean  Crosses( const OGRGeometry * ) const;
00123     virtual OGRBoolean  Within( const OGRGeometry * ) const;
00124     virtual OGRBoolean  Contains( const OGRGeometry * ) const;
00125     virtual OGRBoolean  Overlaps( const OGRGeometry * ) const;
00126 //    virtual OGRBoolean  Relate( const OGRGeometry *, const char * ) const;
00127 
00128     virtual OGRGeometry *getBoundary() const;
00129     virtual double  Distance( const OGRGeometry * ) const;
00130     virtual OGRGeometry *ConvexHull() const;
00131     virtual OGRGeometry *Buffer( double dfDist, int nQuadSegs = 30 ) const;
00132     virtual OGRGeometry *Intersection( const OGRGeometry *) const;
00133     virtual OGRGeometry *Union( const OGRGeometry * ) const;
00134     virtual OGRGeometry *Difference( const OGRGeometry * ) const;
00135     virtual OGRGeometry *SymmetricDifference( const OGRGeometry * ) const;
00136 
00137     // backward compatibility methods. 
00138     OGRBoolean  Intersect( OGRGeometry * ) const;
00139     OGRBoolean  Equal( OGRGeometry * ) const;
00140 
00141     // Special HACK for DB2 7.2 support
00142     static int bGenerate_DB2_V72_BYTE_ORDER;
00143 };
00144 
00145 /************************************************************************/
00146 /*                               OGRPoint                               */
00147 /************************************************************************/
00148 
00155 class CPL_DLL OGRPoint : public OGRGeometry
00156 {
00157     double      x;
00158     double      y;
00159     double      z;
00160 
00161   public:
00162                 OGRPoint();
00163                 OGRPoint( double x, double y );
00164                 OGRPoint( double x, double y, double z );
00165     virtual     ~OGRPoint();
00166 
00167     // IWks Interface
00168     virtual int WkbSize() const;
00169     virtual OGRErr importFromWkb( unsigned char *, int=-1 );
00170     virtual OGRErr exportToWkb( OGRwkbByteOrder, unsigned char * ) const;
00171     virtual OGRErr importFromWkt( char ** );
00172     virtual OGRErr exportToWkt( char ** ppszDstText ) const;
00173     
00174     // IGeometry
00175     virtual int getDimension() const;
00176     virtual OGRGeometry *clone() const;
00177     virtual void empty();
00178     virtual void getEnvelope( OGREnvelope * psEnvelope ) const;
00179 
00180     // IPoint
00181     double      getX() const { return x; } 
00182     double      getY() const { return y; }
00183     double      getZ() const { return z; }
00184 
00185     // Non standard
00186     virtual void setCoordinateDimension( int nDimension ); 
00187     void        setX( double xIn ) { x = xIn; }
00188     void        setY( double yIn ) { y = yIn; }
00189     void        setZ( double zIn ) { z = zIn; nCoordDimension=3; }
00190 
00191     // ISpatialRelation
00192     virtual OGRBoolean  Equals( OGRGeometry * ) const;
00193     
00194     // Non standard from OGRGeometry
00195     virtual const char *getGeometryName() const;
00196     virtual OGRwkbGeometryType getGeometryType() const;
00197     virtual OGRErr  transform( OGRCoordinateTransformation *poCT );
00198     virtual void flattenTo2D();
00199 
00200 };
00201 
00202 /************************************************************************/
00203 /*                               OGRCurve                               */
00204 /************************************************************************/
00205 
00210 class CPL_DLL OGRCurve : public OGRGeometry
00211 {
00212   public:
00213             OGRCurve();
00214     virtual ~OGRCurve();
00215     // ICurve methods
00216     virtual double get_Length() const = 0;
00217     virtual void StartPoint(OGRPoint *) const = 0;
00218     virtual void EndPoint(OGRPoint *) const = 0;
00219     virtual int  get_IsClosed() const;
00220     virtual void Value( double, OGRPoint * ) const = 0;
00221 
00222 };
00223 
00224 /************************************************************************/
00225 /*                            OGRLineString                             */
00226 /************************************************************************/
00227 
00232 class CPL_DLL OGRLineString : public OGRCurve
00233 {
00234   protected:
00235     int         nPointCount;
00236     OGRRawPoint *paoPoints;
00237     double      *padfZ;
00238 
00239     void        Make3D();
00240     void        Make2D();
00241 
00242   public:
00243                 OGRLineString();
00244     virtual     ~OGRLineString();
00245 
00246     // IWks Interface
00247     virtual int WkbSize() const;
00248     virtual OGRErr importFromWkb( unsigned char *, int = -1 );
00249     virtual OGRErr exportToWkb( OGRwkbByteOrder, unsigned char * ) const;
00250     virtual OGRErr importFromWkt( char ** );
00251     virtual OGRErr exportToWkt( char ** ppszDstText ) const;
00252 
00253     // IGeometry interface
00254     virtual int getDimension() const;
00255     virtual OGRGeometry *clone() const;
00256     virtual void empty();
00257     virtual void getEnvelope( OGREnvelope * psEnvelope ) const;
00258 
00259     // ICurve methods
00260     virtual double get_Length() const;
00261     virtual void StartPoint(OGRPoint *) const;
00262     virtual void EndPoint(OGRPoint *) const;
00263     virtual void Value( double, OGRPoint * ) const;
00264     
00265     // ILineString methods
00266     int         getNumPoints() const { return nPointCount; }
00267     void        getPoint( int, OGRPoint * ) const;
00268     double      getX( int i ) const { return paoPoints[i].x; }
00269     double      getY( int i ) const { return paoPoints[i].y; }
00270     double      getZ( int i ) const;
00271 
00272     // ISpatialRelation
00273     virtual OGRBoolean  Equals( OGRGeometry * ) const;
00274     
00275     // non standard.
00276     virtual void setCoordinateDimension( int nDimension ); 
00277     void        setNumPoints( int );
00278     void        setPoint( int, OGRPoint * );
00279     void        setPoint( int, double, double );
00280     void        setPoint( int, double, double, double );
00281     void        setPoints( int, OGRRawPoint *, double * = NULL );
00282     void        setPoints( int, double * padfX, double * padfY,
00283                            double *padfZ = NULL );
00284     void        addPoint( OGRPoint * );
00285     void        addPoint( double, double );
00286     void        addPoint( double, double, double );
00287 
00288     void        getPoints( OGRRawPoint *, double * = NULL ) const;
00289 
00290     void        addSubLineString( const OGRLineString *, 
00291                                   int nStartVertex = 0, int nEndVertex = -1 );
00292 
00293     // non-standard from OGRGeometry
00294     virtual OGRwkbGeometryType getGeometryType() const;
00295     virtual const char *getGeometryName() const;
00296     virtual OGRErr  transform( OGRCoordinateTransformation *poCT );
00297     virtual void flattenTo2D();
00298 
00299 };
00300 
00301 /************************************************************************/
00302 /*                            OGRLinearRing                             */
00303 /*                                                                      */
00304 /*      This is an alias for OGRLineString for now.                     */
00305 /************************************************************************/
00306 
00315 class CPL_DLL OGRLinearRing : public OGRLineString
00316 {
00317   private:
00318     friend class OGRPolygon; 
00319     
00320     // These are not IWks compatible ... just a convenience for OGRPolygon.
00321     virtual int _WkbSize( int b3D ) const;
00322     virtual OGRErr _importFromWkb( OGRwkbByteOrder, int b3D,
00323                                    unsigned char *, int=-1 );
00324     virtual OGRErr _exportToWkb( OGRwkbByteOrder, int b3D, 
00325                                  unsigned char * ) const;
00326     
00327   public:
00328                         OGRLinearRing();
00329                         OGRLinearRing( OGRLinearRing * );
00330                         ~OGRLinearRing();
00331 
00332     // Non standard.
00333     virtual const char *getGeometryName() const;
00334     virtual OGRGeometry *clone() const;
00335     virtual int isClockwise() const;
00336     virtual void reverseWindingOrder();
00337     virtual void closeRings();
00338     virtual double get_Area() const;
00339     OGRBoolean isPointInRing(const OGRPoint* pt) const;
00340     
00341     // IWks Interface - Note this isnt really a first class object
00342     // for the purposes of WKB form.  These methods always fail since this
00343     // object cant be serialized on its own. 
00344     virtual int WkbSize() const;
00345     virtual OGRErr importFromWkb( unsigned char *, int=-1 );
00346     virtual OGRErr exportToWkb( OGRwkbByteOrder, unsigned char * ) const;
00347 };
00348 
00349 /************************************************************************/
00350 /*                              OGRSurface                              */
00351 /************************************************************************/
00352 
00357 class CPL_DLL OGRSurface : public OGRGeometry
00358 {
00359   public:
00360     virtual double      get_Area() const = 0;
00361     virtual OGRErr      Centroid( OGRPoint * poPoint ) const = 0;
00362     virtual OGRErr      PointOnSurface( OGRPoint * poPoint ) const = 0;
00363 };
00364 
00365 /************************************************************************/
00366 /*                              OGRPolygon                              */
00367 /************************************************************************/
00368 
00378 class CPL_DLL OGRPolygon : public OGRSurface
00379 {
00380     int         nRingCount;
00381     OGRLinearRing **papoRings;
00382     
00383   public:
00384                 OGRPolygon();
00385     virtual     ~OGRPolygon();
00386 
00387     // Non standard (OGRGeometry).
00388     virtual const char *getGeometryName() const;
00389     virtual OGRwkbGeometryType getGeometryType() const;
00390     virtual OGRGeometry *clone() const;
00391     virtual void empty();
00392     virtual OGRErr  transform( OGRCoordinateTransformation *poCT );
00393     virtual void flattenTo2D();
00394     
00395     // ISurface Interface
00396     virtual double      get_Area() const;
00397     virtual int         Centroid( OGRPoint * poPoint ) const;
00398     virtual int         PointOnSurface( OGRPoint * poPoint ) const;
00399     
00400     // IWks Interface
00401     virtual int WkbSize() const;
00402     virtual OGRErr importFromWkb( unsigned char *, int = -1 );
00403     virtual OGRErr exportToWkb( OGRwkbByteOrder, unsigned char * ) const;
00404     virtual OGRErr importFromWkt( char ** );
00405     virtual OGRErr exportToWkt( char ** ppszDstText ) const;
00406 
00407     // IGeometry
00408     virtual int getDimension() const;
00409     virtual void getEnvelope( OGREnvelope * psEnvelope ) const;
00410 
00411     // ISpatialRelation
00412     virtual OGRBoolean  Equals( OGRGeometry * ) const;
00413     
00414     // Non standard
00415     virtual void setCoordinateDimension( int nDimension ); 
00416 
00417     void        addRing( OGRLinearRing * );
00418     void        addRingDirectly( OGRLinearRing * );
00419 
00420     OGRLinearRing *getExteriorRing();
00421     const OGRLinearRing *getExteriorRing() const;
00422     int         getNumInteriorRings() const;
00423     OGRLinearRing *getInteriorRing( int );
00424     const OGRLinearRing *getInteriorRing( int ) const;
00425 
00426     OGRBoolean IsPointOnSurface( const OGRPoint * ) const;
00427 
00428     virtual void closeRings();
00429 };
00430 
00431 /************************************************************************/
00432 /*                        OGRGeometryCollection                         */
00433 /************************************************************************/
00434 
00442 class CPL_DLL OGRGeometryCollection : public OGRGeometry
00443 {
00444     int         nGeomCount;
00445     OGRGeometry **papoGeoms;
00446 
00447     int         nCoordinateDimension;
00448     
00449   public:
00450                 OGRGeometryCollection();
00451     virtual     ~OGRGeometryCollection();
00452 
00453     // Non standard (OGRGeometry).
00454     virtual const char *getGeometryName() const;
00455     virtual OGRwkbGeometryType getGeometryType() const;
00456     virtual OGRGeometry *clone() const;
00457     virtual void empty();
00458     virtual OGRErr  transform( OGRCoordinateTransformation *poCT );
00459     virtual void flattenTo2D();
00460     
00461     // IWks Interface
00462     virtual int WkbSize() const;
00463     virtual OGRErr importFromWkb( unsigned char *, int = -1 );
00464     virtual OGRErr exportToWkb( OGRwkbByteOrder, unsigned char * ) const;
00465     virtual OGRErr importFromWkt( char ** );
00466     virtual OGRErr exportToWkt( char ** ppszDstText ) const;
00467 
00468     // IGeometry methods
00469     virtual int getDimension() const;
00470     virtual void getEnvelope( OGREnvelope * psEnvelope ) const;
00471 
00472     // IGeometryCollection
00473     int         getNumGeometries() const;
00474     OGRGeometry *getGeometryRef( int );
00475     const OGRGeometry *getGeometryRef( int ) const;
00476 
00477     // ISpatialRelation
00478     virtual OGRBoolean  Equals( OGRGeometry * ) const;
00479     
00480     // Non standard
00481     virtual void setCoordinateDimension( int nDimension ); 
00482     virtual OGRErr addGeometry( const OGRGeometry * );
00483     virtual OGRErr addGeometryDirectly( OGRGeometry * );
00484     virtual OGRErr removeGeometry( int iIndex, int bDelete = TRUE );
00485 
00486     void closeRings();
00487 };
00488 
00489 /************************************************************************/
00490 /*                           OGRMultiPolygon                            */
00491 /************************************************************************/
00492 
00500 class CPL_DLL OGRMultiPolygon : public OGRGeometryCollection
00501 {
00502   public:
00503             OGRMultiPolygon();
00504     // Non standard (OGRGeometry).
00505     virtual const char *getGeometryName() const;
00506     virtual OGRwkbGeometryType getGeometryType() const;
00507     virtual OGRGeometry *clone() const;
00508     virtual OGRErr importFromWkt( char ** );
00509     virtual OGRErr exportToWkt( char ** ) const;
00510     
00511     // Non standard
00512     virtual OGRErr addGeometryDirectly( OGRGeometry * );
00513 
00514     double  get_Area() const;
00515 };
00516 
00517 /************************************************************************/
00518 /*                            OGRMultiPoint                             */
00519 /************************************************************************/
00520 
00525 class CPL_DLL OGRMultiPoint : public OGRGeometryCollection
00526 {
00527   private:
00528     OGRErr  importFromWkt_Bracketed( char ** );
00529 
00530   public:
00531             OGRMultiPoint();
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 
00543 /************************************************************************/
00544 /*                          OGRMultiLineString                          */
00545 /************************************************************************/
00546 
00551 class CPL_DLL OGRMultiLineString : public OGRGeometryCollection
00552 {
00553   public:
00554             OGRMultiLineString();
00555             ~OGRMultiLineString();
00556     // Non standard (OGRGeometry).
00557     virtual const char *getGeometryName() const;
00558     virtual OGRwkbGeometryType getGeometryType() const;
00559     virtual OGRGeometry *clone() const;
00560     virtual OGRErr importFromWkt( char ** );
00561     virtual OGRErr exportToWkt( char ** ) const;
00562     
00563     // Non standard
00564     virtual OGRErr addGeometryDirectly( OGRGeometry * );
00565 };
00566 
00567 
00568 /************************************************************************/
00569 /*                          OGRGeometryFactory                          */
00570 /************************************************************************/
00571 
00576 class CPL_DLL OGRGeometryFactory
00577 {
00578   public:
00579     static OGRErr createFromWkb( unsigned char *, OGRSpatialReference *,
00580                                  OGRGeometry **, int = -1 );
00581     static OGRErr createFromWkt( char **, OGRSpatialReference *,
00582                                  OGRGeometry ** );
00583     static OGRGeometry *createFromGML( const char * );
00584     static OGRGeometry *createFromGEOS( GEOSGeom );
00585 
00586     static void   destroyGeometry( OGRGeometry * );
00587     static OGRGeometry *createGeometry( OGRwkbGeometryType );
00588 
00589     static OGRGeometry * forceToPolygon( OGRGeometry * );
00590     static OGRGeometry * forceToMultiPolygon( OGRGeometry * );
00591     static OGRGeometry * forceToMultiPoint( OGRGeometry * );
00592     static OGRGeometry * forceToMultiLineString( OGRGeometry * );
00593 
00594     static void *getGEOSGeometryFactory();
00595 
00596     static int haveGEOS();
00597 
00598 };
00599 
00600 #endif /* ndef _OGR_GEOMETRY_H_INCLUDED */

Generated for GDAL by doxygen 1.4.4.