- Main Page
- Related Pages
- Classes
- Files
- Directories

- File List
- File Members

# ogr_geometry.h

Go to the documentation of this file.

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

Generated for GDAL by 1.5.7.1.