ogr_geometry.h

Go to the documentation of this file.
00001 /******************************************************************************
00002  * $Id: ogr_geometry.h 14336 2008-04-20 14:36:09Z 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 ) 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     // ISpatialRelation
00122     virtual OGRBoolean  Intersects( OGRGeometry * ) const;
00123     virtual OGRBoolean  Equals( OGRGeometry * ) const = 0;
00124     virtual OGRBoolean  Disjoint( const OGRGeometry * ) const;
00125     virtual OGRBoolean  Touches( const OGRGeometry * ) const;
00126     virtual OGRBoolean  Crosses( const OGRGeometry * ) const;
00127     virtual OGRBoolean  Within( const OGRGeometry * ) const;
00128     virtual OGRBoolean  Contains( const OGRGeometry * ) const;
00129     virtual OGRBoolean  Overlaps( const OGRGeometry * ) const;
00130 //    virtual OGRBoolean  Relate( const OGRGeometry *, const char * ) const;
00131 
00132     virtual OGRGeometry *getBoundary() const;
00133     virtual double  Distance( const OGRGeometry * ) const;
00134     virtual OGRGeometry *ConvexHull() const;
00135     virtual OGRGeometry *Buffer( double dfDist, int nQuadSegs = 30 ) const;
00136     virtual OGRGeometry *Intersection( const OGRGeometry *) const;
00137     virtual OGRGeometry *Union( const OGRGeometry * ) const;
00138     virtual OGRGeometry *Difference( const OGRGeometry * ) const;
00139     virtual OGRGeometry *SymmetricDifference( const OGRGeometry * ) const;
00140 
00141     // backward compatibility methods. 
00142     OGRBoolean  Intersect( OGRGeometry * ) const;
00143     OGRBoolean  Equal( OGRGeometry * ) const;
00144 
00145     // Special HACK for DB2 7.2 support
00146     static int bGenerate_DB2_V72_BYTE_ORDER;
00147 };
00148 
00149 /************************************************************************/
00150 /*                               OGRPoint                               */
00151 /************************************************************************/
00152 
00159 class CPL_DLL OGRPoint : public OGRGeometry
00160 {
00161     double      x;
00162     double      y;
00163     double      z;
00164 
00165   public:
00166                 OGRPoint();
00167                 OGRPoint( double x, double y );
00168                 OGRPoint( double x, double y, double z );
00169     virtual     ~OGRPoint();
00170 
00171     // IWks Interface
00172     virtual int WkbSize() const;
00173     virtual OGRErr importFromWkb( unsigned char *, int=-1 );
00174     virtual OGRErr exportToWkb( OGRwkbByteOrder, unsigned char * ) const;
00175     virtual OGRErr importFromWkt( char ** );
00176     virtual OGRErr exportToWkt( char ** ppszDstText ) const;
00177     
00178     // IGeometry
00179     virtual int getDimension() const;
00180     virtual OGRGeometry *clone() const;
00181     virtual void empty();
00182     virtual void getEnvelope( OGREnvelope * psEnvelope ) const;
00183     virtual OGRBoolean  IsEmpty() const;
00184 
00185     // IPoint
00186     double      getX() const { return x; } 
00187     double      getY() const { return y; }
00188     double      getZ() const { return z; }
00189 
00190     // Non standard
00191     virtual void setCoordinateDimension( int nDimension ); 
00192     void        setX( double xIn ) { x = xIn; if (nCoordDimension == 0) nCoordDimension = 2; }
00193     void        setY( double yIn ) { y = yIn; if (nCoordDimension == 0) nCoordDimension = 2; }
00194     void        setZ( double zIn ) { z = zIn; nCoordDimension=3; }
00195 
00196     // ISpatialRelation
00197     virtual OGRBoolean  Equals( OGRGeometry * ) const;
00198     
00199     // Non standard from OGRGeometry
00200     virtual const char *getGeometryName() const;
00201     virtual OGRwkbGeometryType getGeometryType() const;
00202     virtual OGRErr  transform( OGRCoordinateTransformation *poCT );
00203     virtual void flattenTo2D();
00204 };
00205 
00206 /************************************************************************/
00207 /*                               OGRCurve                               */
00208 /************************************************************************/
00209 
00214 class CPL_DLL OGRCurve : public OGRGeometry
00215 {
00216   public:
00217             OGRCurve();
00218     virtual ~OGRCurve();
00219     // ICurve methods
00220     virtual double get_Length() const = 0;
00221     virtual void StartPoint(OGRPoint *) const = 0;
00222     virtual void EndPoint(OGRPoint *) const = 0;
00223     virtual int  get_IsClosed() const;
00224     virtual void Value( double, OGRPoint * ) const = 0;
00225 
00226 };
00227 
00228 /************************************************************************/
00229 /*                            OGRLineString                             */
00230 /************************************************************************/
00231 
00236 class CPL_DLL OGRLineString : public OGRCurve
00237 {
00238   protected:
00239     int         nPointCount;
00240     OGRRawPoint *paoPoints;
00241     double      *padfZ;
00242 
00243     void        Make3D();
00244     void        Make2D();
00245 
00246   public:
00247                 OGRLineString();
00248     virtual     ~OGRLineString();
00249 
00250     // IWks Interface
00251     virtual int WkbSize() const;
00252     virtual OGRErr importFromWkb( unsigned char *, int = -1 );
00253     virtual OGRErr exportToWkb( OGRwkbByteOrder, unsigned char * ) const;
00254     virtual OGRErr importFromWkt( char ** );
00255     virtual OGRErr exportToWkt( char ** ppszDstText ) const;
00256 
00257     // IGeometry interface
00258     virtual int getDimension() const;
00259     virtual OGRGeometry *clone() const;
00260     virtual void empty();
00261     virtual void getEnvelope( OGREnvelope * psEnvelope ) const;
00262     virtual OGRBoolean  IsEmpty() const;
00263 
00264     // ICurve methods
00265     virtual double get_Length() const;
00266     virtual void StartPoint(OGRPoint *) const;
00267     virtual void EndPoint(OGRPoint *) const;
00268     virtual void Value( double, OGRPoint * ) const;
00269     
00270     // ILineString methods
00271     int         getNumPoints() const { return nPointCount; }
00272     void        getPoint( int, OGRPoint * ) const;
00273     double      getX( int i ) const { return paoPoints[i].x; }
00274     double      getY( int i ) const { return paoPoints[i].y; }
00275     double      getZ( int i ) const;
00276 
00277     // ISpatialRelation
00278     virtual OGRBoolean  Equals( OGRGeometry * ) const;
00279     
00280     // non standard.
00281     virtual void setCoordinateDimension( int nDimension ); 
00282     void        setNumPoints( int );
00283     void        setPoint( int, OGRPoint * );
00284     void        setPoint( int, double, double );
00285     void        setPoint( int, double, double, double );
00286     void        setPoints( int, OGRRawPoint *, double * = NULL );
00287     void        setPoints( int, double * padfX, double * padfY,
00288                            double *padfZ = NULL );
00289     void        addPoint( OGRPoint * );
00290     void        addPoint( double, double );
00291     void        addPoint( double, double, double );
00292 
00293     void        getPoints( OGRRawPoint *, double * = NULL ) const;
00294 
00295     void        addSubLineString( const OGRLineString *, 
00296                                   int nStartVertex = 0, int nEndVertex = -1 );
00297 
00298     // non-standard from OGRGeometry
00299     virtual OGRwkbGeometryType getGeometryType() const;
00300     virtual const char *getGeometryName() const;
00301     virtual OGRErr  transform( OGRCoordinateTransformation *poCT );
00302     virtual void flattenTo2D();
00303 
00304 };
00305 
00306 /************************************************************************/
00307 /*                            OGRLinearRing                             */
00308 /************************************************************************/
00309 
00328 class CPL_DLL OGRLinearRing : public OGRLineString
00329 {
00330   private:
00331     friend class OGRPolygon; 
00332     
00333     // These are not IWks compatible ... just a convenience for OGRPolygon.
00334     virtual int _WkbSize( int b3D ) const;
00335     virtual OGRErr _importFromWkb( OGRwkbByteOrder, int b3D,
00336                                    unsigned char *, int=-1 );
00337     virtual OGRErr _exportToWkb( OGRwkbByteOrder, int b3D, 
00338                                  unsigned char * ) const;
00339     
00340   public:
00341                         OGRLinearRing();
00342                         OGRLinearRing( OGRLinearRing * );
00343                         ~OGRLinearRing();
00344 
00345     // Non standard.
00346     virtual const char *getGeometryName() const;
00347     virtual OGRGeometry *clone() const;
00348     virtual int isClockwise() const;
00349     virtual void reverseWindingOrder();
00350     virtual void closeRings();
00351     virtual double get_Area() const;
00352     OGRBoolean isPointInRing(const OGRPoint* pt) const;
00353     
00354     // IWks Interface - Note this isnt really a first class object
00355     // for the purposes of WKB form.  These methods always fail since this
00356     // object cant be serialized on its own. 
00357     virtual int WkbSize() const;
00358     virtual OGRErr importFromWkb( unsigned char *, int=-1 );
00359     virtual OGRErr exportToWkb( OGRwkbByteOrder, unsigned char * ) const;
00360 };
00361 
00362 /************************************************************************/
00363 /*                              OGRSurface                              */
00364 /************************************************************************/
00365 
00370 class CPL_DLL OGRSurface : public OGRGeometry
00371 {
00372   public:
00373     virtual double      get_Area() const = 0;
00374     virtual OGRErr      Centroid( OGRPoint * poPoint ) const = 0;
00375     virtual OGRErr      PointOnSurface( OGRPoint * poPoint ) const = 0;
00376 };
00377 
00378 /************************************************************************/
00379 /*                              OGRPolygon                              */
00380 /************************************************************************/
00381 
00391 class CPL_DLL OGRPolygon : public OGRSurface
00392 {
00393     int         nRingCount;
00394     OGRLinearRing **papoRings;
00395     
00396   public:
00397                 OGRPolygon();
00398     virtual     ~OGRPolygon();
00399 
00400     // Non standard (OGRGeometry).
00401     virtual const char *getGeometryName() const;
00402     virtual OGRwkbGeometryType getGeometryType() const;
00403     virtual OGRGeometry *clone() const;
00404     virtual void empty();
00405     virtual OGRErr  transform( OGRCoordinateTransformation *poCT );
00406     virtual void flattenTo2D();
00407     virtual OGRBoolean  IsEmpty() const;
00408     
00409     // ISurface Interface
00410     virtual double      get_Area() const;
00411     virtual int         Centroid( OGRPoint * poPoint ) const;
00412     virtual int         PointOnSurface( OGRPoint * poPoint ) const;
00413     
00414     // IWks Interface
00415     virtual int WkbSize() const;
00416     virtual OGRErr importFromWkb( unsigned char *, int = -1 );
00417     virtual OGRErr exportToWkb( OGRwkbByteOrder, unsigned char * ) const;
00418     virtual OGRErr importFromWkt( char ** );
00419     virtual OGRErr exportToWkt( char ** ppszDstText ) const;
00420 
00421     // IGeometry
00422     virtual int getDimension() const;
00423     virtual void getEnvelope( OGREnvelope * psEnvelope ) const;
00424 
00425     // ISpatialRelation
00426     virtual OGRBoolean  Equals( OGRGeometry * ) const;
00427     
00428     // Non standard
00429     virtual void setCoordinateDimension( int nDimension ); 
00430 
00431     void        addRing( OGRLinearRing * );
00432     void        addRingDirectly( OGRLinearRing * );
00433 
00434     OGRLinearRing *getExteriorRing();
00435     const OGRLinearRing *getExteriorRing() const;
00436     int         getNumInteriorRings() const;
00437     OGRLinearRing *getInteriorRing( int );
00438     const OGRLinearRing *getInteriorRing( int ) const;
00439 
00440     OGRBoolean IsPointOnSurface( const OGRPoint * ) const;
00441 
00442     virtual void closeRings();
00443 };
00444 
00445 /************************************************************************/
00446 /*                        OGRGeometryCollection                         */
00447 /************************************************************************/
00448 
00456 class CPL_DLL OGRGeometryCollection : public OGRGeometry
00457 {
00458     int         nGeomCount;
00459     OGRGeometry **papoGeoms;
00460 
00461   public:
00462                 OGRGeometryCollection();
00463     virtual     ~OGRGeometryCollection();
00464 
00465     // Non standard (OGRGeometry).
00466     virtual const char *getGeometryName() const;
00467     virtual OGRwkbGeometryType getGeometryType() const;
00468     virtual OGRGeometry *clone() const;
00469     virtual void empty();
00470     virtual OGRErr  transform( OGRCoordinateTransformation *poCT );
00471     virtual void flattenTo2D();
00472     virtual OGRBoolean  IsEmpty() const;
00473 
00474     // IWks Interface
00475     virtual int WkbSize() const;
00476     virtual OGRErr importFromWkb( unsigned char *, int = -1 );
00477     virtual OGRErr exportToWkb( OGRwkbByteOrder, unsigned char * ) const;
00478     virtual OGRErr importFromWkt( char ** );
00479     virtual OGRErr exportToWkt( char ** ppszDstText ) const;
00480 
00481     virtual double get_Area() const;
00482 
00483     // IGeometry methods
00484     virtual int getDimension() const;
00485     virtual void getEnvelope( OGREnvelope * psEnvelope ) const;
00486 
00487     // IGeometryCollection
00488     int         getNumGeometries() const;
00489     OGRGeometry *getGeometryRef( int );
00490     const OGRGeometry *getGeometryRef( int ) const;
00491 
00492     // ISpatialRelation
00493     virtual OGRBoolean  Equals( OGRGeometry * ) const;
00494     
00495     // Non standard
00496     virtual void setCoordinateDimension( int nDimension ); 
00497     virtual OGRErr addGeometry( const OGRGeometry * );
00498     virtual OGRErr addGeometryDirectly( OGRGeometry * );
00499     virtual OGRErr removeGeometry( int iIndex, int bDelete = TRUE );
00500 
00501     void closeRings();
00502 };
00503 
00504 /************************************************************************/
00505 /*                           OGRMultiPolygon                            */
00506 /************************************************************************/
00507 
00515 class CPL_DLL OGRMultiPolygon : public OGRGeometryCollection
00516 {
00517   public:
00518             OGRMultiPolygon();
00519     // Non standard (OGRGeometry).
00520     virtual const char *getGeometryName() const;
00521     virtual OGRwkbGeometryType getGeometryType() const;
00522     virtual OGRGeometry *clone() const;
00523     virtual OGRErr importFromWkt( char ** );
00524     virtual OGRErr exportToWkt( char ** ) const;
00525     
00526     // Non standard
00527     virtual OGRErr addGeometryDirectly( OGRGeometry * );
00528 
00529     virtual double  get_Area() const;
00530 };
00531 
00532 /************************************************************************/
00533 /*                            OGRMultiPoint                             */
00534 /************************************************************************/
00535 
00540 class CPL_DLL OGRMultiPoint : public OGRGeometryCollection
00541 {
00542   private:
00543     OGRErr  importFromWkt_Bracketed( char ** );
00544 
00545   public:
00546             OGRMultiPoint();
00547     // Non standard (OGRGeometry).
00548     virtual const char *getGeometryName() const;
00549     virtual OGRwkbGeometryType getGeometryType() const;
00550     virtual OGRGeometry *clone() const;
00551     virtual OGRErr importFromWkt( char ** );
00552     virtual OGRErr exportToWkt( char ** ) const;
00553     
00554     // Non standard
00555     virtual OGRErr addGeometryDirectly( OGRGeometry * );
00556 };
00557 
00558 /************************************************************************/
00559 /*                          OGRMultiLineString                          */
00560 /************************************************************************/
00561 
00566 class CPL_DLL OGRMultiLineString : public OGRGeometryCollection
00567 {
00568   public:
00569             OGRMultiLineString();
00570             ~OGRMultiLineString();
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 /************************************************************************/
00584 /*                          OGRGeometryFactory                          */
00585 /************************************************************************/
00586 
00591 class CPL_DLL OGRGeometryFactory
00592 {
00593   public:
00594     static OGRErr createFromWkb( unsigned char *, OGRSpatialReference *,
00595                                  OGRGeometry **, int = -1 );
00596     static OGRErr createFromWkt( char **, OGRSpatialReference *,
00597                                  OGRGeometry ** );
00598     static OGRErr createFromFgf( unsigned char *, OGRSpatialReference *,
00599                                  OGRGeometry **, int = -1, int * = NULL );
00600     static OGRGeometry *createFromGML( const char * );
00601     static OGRGeometry *createFromGEOS( GEOSGeom );
00602 
00603     static void   destroyGeometry( OGRGeometry * );
00604     static OGRGeometry *createGeometry( OGRwkbGeometryType );
00605 
00606     static OGRGeometry * forceToPolygon( OGRGeometry * );
00607     static OGRGeometry * forceToMultiPolygon( OGRGeometry * );
00608     static OGRGeometry * forceToMultiPoint( OGRGeometry * );
00609     static OGRGeometry * forceToMultiLineString( OGRGeometry * );
00610 
00611     static OGRGeometry * organizePolygons( OGRGeometry **papoPolygons,
00612                                            int nPolygonCount,
00613                                            int *pbResultValidGeometry );
00614 
00615     static void *getGEOSGeometryFactory();
00616 
00617     static int haveGEOS();
00618 
00619 };
00620 
00621 #endif /* ndef _OGR_GEOMETRY_H_INCLUDED */

Generated for GDAL by doxygen 1.5.1.