/********************************************************************** * $Id: GeometryTransformer.h 1820 2006-09-06 16:54:23Z mloskot $ * * GEOS - Geometry Engine Open Source * http://geos.refractions.net * * Copyright (C) 2006 Refractions Research Inc. * * This is free software; you can redistribute and/or modify it under * the terms of the GNU Lesser General Public Licence as published * by the Free Software Foundation. * See the COPYING file for more information. * ********************************************************************** * * Last port: geom/util/GeometryTransformer.java rev. 1.6 (JTS-1.7.1+) * **********************************************************************/ #ifndef GEOS_GEOM_UTIL_GEOMETRYTRANSFORMER_H #define GEOS_GEOM_UTIL_GEOMETRYTRANSFORMER_H #include // destructor visibility for vector #include // destructor visibility for auto_ptr #include // destructor visibility for auto_ptr #include // for auto_ptr #include // Forward declarations namespace geos { namespace geom { class Geometry; class GeometryFactory; class Point; class LinearRing; class LineString; class Polygon; class MultiPoint; class MultiPolygon; class MultiLineString; class GeometryCollection; namespace util { //class GeometryEditorOperation; } } } namespace geos { namespace geom { // geos.geom namespace util { // geos.geom.util /** \brief * A framework for processes which transform an input {@link Geometry} into * an output {@link Geometry}, possibly changing its structure and type(s). * * This class is a framework for implementing subclasses * which perform transformations on * various different Geometry subclasses. * It provides an easy way of applying specific transformations * to given geometry types, while allowing unhandled types to be simply copied. * Also, the framework ensures that if subcomponents change type * the parent geometries types change appropriately to maintain valid structure. * Subclasses will override whichever transformX methods * they need to to handle particular Geometry types. * * A typically usage would be a transformation that may transform Polygons into * Polygons, LineStrings * or Points. This class would likely need to override the * {@link transformMultiPolygon} method to ensure that if input Polygons * change type the result is a GeometryCollection, * not a MultiPolygon * * The default behaviour of this class is to simply recursively transform * each Geometry component into an identical object by copying. * * Note that all transformX methods may return null, * to avoid creating empty geometry objects. This will be handled correctly * by the transformer. * The {@link transform} method itself will always * return a geometry object. * * @see GeometryEditor * * Possible extensions: * getParent() method to return immediate parent e.g. of LinearRings in Polygons * */ class GeometryTransformer { public: GeometryTransformer(); virtual ~GeometryTransformer(); std::auto_ptr transform(const Geometry* nInputGeom); protected: const GeometryFactory* factory; /** * Convenience method which provides standard way of * creating a {@link CoordinateSequence} * * @param coords the coordinate array to copy * @return a coordinate sequence for the array * * [final] */ CoordinateSequence::AutoPtr createCoordinateSequence( std::auto_ptr< std::vector > coords); virtual CoordinateSequence::AutoPtr transformCoordinates( const CoordinateSequence* coords, const Geometry* parent); virtual Geometry::AutoPtr transformPoint( const Point* geom, const Geometry* parent); virtual Geometry::AutoPtr transformMultiPoint( const MultiPoint* geom, const Geometry* parent); virtual Geometry::AutoPtr transformLinearRing( const LinearRing* geom, const Geometry* parent); virtual Geometry::AutoPtr transformLineString( const LineString* geom, const Geometry* parent); virtual Geometry::AutoPtr transformMultiLineString( const MultiLineString* geom, const Geometry* parent); virtual Geometry::AutoPtr transformPolygon( const Polygon* geom, const Geometry* parent); virtual Geometry::AutoPtr transformMultiPolygon( const MultiPolygon* geom, const Geometry* parent); virtual Geometry::AutoPtr transformGeometryCollection( const GeometryCollection* geom, const Geometry* parent); private: const Geometry* inputGeom; // these could eventually be exposed to clients /** * true if empty geometries should not be included in the result */ bool pruneEmptyGeometry; /** * true if a homogenous collection result * from a {@link GeometryCollection} should still * be a general GeometryCollection */ bool preserveGeometryCollectionType; /** * true if the output from a collection argument should still be a collection */ bool preserveCollections; /** * true if the type of the input should be preserved */ bool preserveType; }; } // namespace geos.geom.util } // namespace geos.geom } // namespace geos //#ifdef GEOS_INLINE //# include "geos/geom/util/GeometryTransformer.inl" //#endif #endif // GEOS_GEOM_UTIL_GEOMETRYTRANSFORMER_H /********************************************************************** * $Log$ * Revision 1.4 2006/06/19 21:20:22 strk * updated port info * * Revision 1.3 2006/04/13 14:25:17 strk * TopologyPreservingSimplifier initial port * * Revision 1.2 2006/04/11 12:56:06 strk * used typedef for auto_ptr * * Revision 1.1 2006/04/11 12:21:49 strk * GeometryTransformer class ported * **********************************************************************/