/******************************************************************************
* $Id: ogr_geometry.h 12921 2007-11-21 19:37:49Z mloskot $
*
* Project: OpenGIS Simple Features Reference Implementation
* Purpose: Classes for manipulating simple features that is not specific
* to a particular interface technology.
* Author: Frank Warmerdam, warmerdam@pobox.com
*
******************************************************************************
* Copyright (c) 1999, Frank Warmerdam
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
* DEALINGS IN THE SOFTWARE.
****************************************************************************/
#ifndef _OGR_GEOMETRY_H_INCLUDED
#define _OGR_GEOMETRY_H_INCLUDED
#include "ogr_core.h"
#include "ogr_spatialref.h"
/**
* \file ogr_geometry.h
*
* Simple feature geometry classes.
*/
/**
* Simple container for a position.
*/
class OGRRawPoint
{
public:
OGRRawPoint()
{
x = y = 0.0;
}
double x;
double y;
};
typedef struct GEOSGeom_t *GEOSGeom;
/************************************************************************/
/* OGRGeometry */
/************************************************************************/
/**
* Abstract base class for all geometry classes.
*
* Note that the family of spatial analysis methods (Equal(), Disjoint(), ...,
* ConvexHull(), Buffer(), ...) are not implemented at ths time. Some other
* required and optional geometry methods have also been omitted at this
* time.
*/
class CPL_DLL OGRGeometry
{
private:
OGRSpatialReference * poSRS; // may be NULL
protected:
int nCoordDimension;
public:
OGRGeometry();
virtual ~OGRGeometry();
// standard IGeometry
virtual int getDimension() const = 0;
virtual int getCoordinateDimension() const;
virtual OGRBoolean IsEmpty() const { return 0; }
virtual OGRBoolean IsSimple() const { return 1; }
virtual void empty() = 0;
virtual OGRGeometry *clone() const = 0;
virtual void getEnvelope( OGREnvelope * psEnvelope ) const = 0;
// IWks Interface
virtual int WkbSize() const = 0;
virtual OGRErr importFromWkb( unsigned char *, int=-1 )=0;
virtual OGRErr exportToWkb( OGRwkbByteOrder, unsigned char * ) const = 0;
virtual OGRErr importFromWkt( char ** ppszInput ) = 0;
virtual OGRErr exportToWkt( char ** ppszDstText ) const = 0;
// non-standard
virtual OGRwkbGeometryType getGeometryType() const = 0;
virtual const char *getGeometryName() const = 0;
virtual void dumpReadable( FILE *, const char * = NULL ) const;
virtual void flattenTo2D() = 0;
virtual char * exportToGML() const;
virtual GEOSGeom exportToGEOS() const;
virtual void closeRings();
virtual void setCoordinateDimension( int nDimension );
void assignSpatialReference( OGRSpatialReference * poSR );
OGRSpatialReference *getSpatialReference( void ) const { return poSRS; }
virtual OGRErr transform( OGRCoordinateTransformation *poCT ) = 0;
OGRErr transformTo( OGRSpatialReference *poSR );
// ISpatialRelation
virtual OGRBoolean Intersects( OGRGeometry * ) const;
virtual OGRBoolean Equals( OGRGeometry * ) const = 0;
virtual OGRBoolean Disjoint( const OGRGeometry * ) const;
virtual OGRBoolean Touches( const OGRGeometry * ) const;
virtual OGRBoolean Crosses( const OGRGeometry * ) const;
virtual OGRBoolean Within( const OGRGeometry * ) const;
virtual OGRBoolean Contains( const OGRGeometry * ) const;
virtual OGRBoolean Overlaps( const OGRGeometry * ) const;
// virtual OGRBoolean Relate( const OGRGeometry *, const char * ) const;
virtual OGRGeometry *getBoundary() const;
virtual double Distance( const OGRGeometry * ) const;
virtual OGRGeometry *ConvexHull() const;
virtual OGRGeometry *Buffer( double dfDist, int nQuadSegs = 30 ) const;
virtual OGRGeometry *Intersection( const OGRGeometry *) const;
virtual OGRGeometry *Union( const OGRGeometry * ) const;
virtual OGRGeometry *Difference( const OGRGeometry * ) const;
virtual OGRGeometry *SymmetricDifference( const OGRGeometry * ) const;
// backward compatibility methods.
OGRBoolean Intersect( OGRGeometry * ) const;
OGRBoolean Equal( OGRGeometry * ) const;
// Special HACK for DB2 7.2 support
static int bGenerate_DB2_V72_BYTE_ORDER;
};
/************************************************************************/
/* OGRPoint */
/************************************************************************/
/**
* Point class.
*
* Implements SFCOM IPoint methods.
*/
class CPL_DLL OGRPoint : public OGRGeometry
{
double x;
double y;
double z;
public:
OGRPoint();
OGRPoint( double x, double y );
OGRPoint( double x, double y, double z );
virtual ~OGRPoint();
// IWks Interface
virtual int WkbSize() const;
virtual OGRErr importFromWkb( unsigned char *, int=-1 );
virtual OGRErr exportToWkb( OGRwkbByteOrder, unsigned char * ) const;
virtual OGRErr importFromWkt( char ** );
virtual OGRErr exportToWkt( char ** ppszDstText ) const;
// IGeometry
virtual int getDimension() const;
virtual OGRGeometry *clone() const;
virtual void empty();
virtual void getEnvelope( OGREnvelope * psEnvelope ) const;
// IPoint
double getX() const { return x; }
double getY() const { return y; }
double getZ() const { return z; }
// Non standard
virtual void setCoordinateDimension( int nDimension );
void setX( double xIn ) { x = xIn; }
void setY( double yIn ) { y = yIn; }
void setZ( double zIn ) { z = zIn; nCoordDimension=3; }
// ISpatialRelation
virtual OGRBoolean Equals( OGRGeometry * ) const;
// Non standard from OGRGeometry
virtual const char *getGeometryName() const;
virtual OGRwkbGeometryType getGeometryType() const;
virtual OGRErr transform( OGRCoordinateTransformation *poCT );
virtual void flattenTo2D();
};
/************************************************************************/
/* OGRCurve */
/************************************************************************/
/**
* Abstract curve base class.
*/
class CPL_DLL OGRCurve : public OGRGeometry
{
public:
OGRCurve();
virtual ~OGRCurve();
// ICurve methods
virtual double get_Length() const = 0;
virtual void StartPoint(OGRPoint *) const = 0;
virtual void EndPoint(OGRPoint *) const = 0;
virtual int get_IsClosed() const;
virtual void Value( double, OGRPoint * ) const = 0;
};
/************