OGR

ogr_geometry.h

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

Generated for GDAL by doxygen 1.7.3.