OGR

ogr_geometry.h

Go to the documentation of this file.
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 */

Generated for GDAL by doxygen 1.7.3.