GeometryFactory.h

00001 /**********************************************************************
00002  * $Id: GeometryFactory.h 3471 2011-09-20 14:34:57Z strk $
00003  *
00004  * GEOS - Geometry Engine Open Source
00005  * http://geos.refractions.net
00006  *
00007  * Copyright (C) 2011 Sandro Santilli <strk@keybit.net>
00008  * Copyright (C) 2006 Refractions Research Inc.
00009  *
00010  * This is free software; you can redistribute and/or modify it under
00011  * the terms of the GNU Lesser General Public Licence as published
00012  * by the Free Software Foundation. 
00013  * See the COPYING file for more information.
00014  *
00015  **********************************************************************
00016  *
00017  * Last port: geom/GeometryFactory.java r320 (JTS-1.12)
00018  *
00019  **********************************************************************/
00020 
00021 #ifndef GEOS_GEOM_GEOMETRYFACTORY_H
00022 #define GEOS_GEOM_GEOMETRYFACTORY_H
00023 
00024 #include <geos/geom/Geometry.h>
00025 #include <geos/geom/GeometryCollection.h>
00026 #include <geos/geom/MultiPoint.h>
00027 #include <geos/geom/MultiLineString.h>
00028 #include <geos/geom/MultiPolygon.h>
00029 #include <geos/export.h>
00030 #include <geos/inline.h>
00031 
00032 #include <vector>
00033 #include <memory>
00034 #include <cassert>
00035 
00036 namespace geos {
00037         namespace geom { 
00038                 class CoordinateSequenceFactory;
00039                 class Coordinate;
00040                 class CoordinateSequence;
00041                 class Envelope;
00042                 class Geometry;
00043                 class GeometryCollection;
00044                 class LineString;
00045                 class LinearRing;
00046                 class MultiLineString;
00047                 class MultiPoint;
00048                 class MultiPolygon;
00049                 class Point;
00050                 class Polygon;
00051                 class PrecisionModel;
00052         }
00053 }
00054 
00055 namespace geos {
00056 namespace geom { // geos::geom
00057 
00068 class GEOS_DLL GeometryFactory {
00069 public:
00075         GeometryFactory();
00076 
00089         GeometryFactory(const PrecisionModel *pm, int newSRID,
00090                 CoordinateSequenceFactory *nCoordinateSequenceFactory);
00091 
00098         GeometryFactory(CoordinateSequenceFactory *nCoordinateSequenceFactory);
00099 
00108         GeometryFactory(const PrecisionModel *pm);
00109 
00119         GeometryFactory(const PrecisionModel* pm, int newSRID);
00120 
00126         GeometryFactory(const GeometryFactory &gf);
00127 
00134         static const GeometryFactory*
00135         getDefaultInstance();
00136 
00138         virtual ~GeometryFactory();
00139 
00140 //Skipped a lot of list to array convertors
00141 
00142         Point* createPointFromInternalCoord(const Coordinate* coord,
00143                         const Geometry *exemplar) const;
00144 
00146         //
00149         Geometry* toGeometry(const Envelope* envelope) const;
00150 
00154         const PrecisionModel* getPrecisionModel() const;
00155 
00157         Point* createPoint() const;
00158 
00160         Point* createPoint(const Coordinate& coordinate) const;
00161 
00163         Point* createPoint(CoordinateSequence *coordinates) const;
00164 
00166         Point* createPoint(const CoordinateSequence &coordinates) const;
00167 
00169         GeometryCollection* createGeometryCollection() const;
00170 
00172         Geometry* createEmptyGeometry() const;
00173 
00175         GeometryCollection* createGeometryCollection(
00176                         std::vector<Geometry *> *newGeoms) const;
00177 
00179         GeometryCollection* createGeometryCollection(
00180                         const std::vector<Geometry *> &newGeoms) const;
00181 
00183         MultiLineString* createMultiLineString() const;
00184 
00186         MultiLineString* createMultiLineString(
00187                         std::vector<Geometry *> *newLines) const;
00188 
00190         MultiLineString* createMultiLineString(
00191                         const std::vector<Geometry *> &fromLines) const;
00192 
00194         MultiPolygon* createMultiPolygon() const;
00195 
00197         MultiPolygon* createMultiPolygon(std::vector<Geometry *> *newPolys) const;
00198 
00200         MultiPolygon* createMultiPolygon(
00201                         const std::vector<Geometry *> &fromPolys) const;
00202 
00204         LinearRing* createLinearRing() const;
00205 
00207         LinearRing* createLinearRing(CoordinateSequence* newCoords) const;
00208 
00209         std::auto_ptr<Geometry> createLinearRing(
00210                         std::auto_ptr<CoordinateSequence> newCoords) const;
00211 
00213         LinearRing* createLinearRing(
00214                         const CoordinateSequence& coordinates) const;
00215 
00217         MultiPoint* createMultiPoint() const;
00218 
00220         MultiPoint* createMultiPoint(std::vector<Geometry *> *newPoints) const;
00221 
00223         MultiPoint* createMultiPoint(
00224                         const std::vector<Geometry *> &fromPoints) const;
00225 
00229         MultiPoint* createMultiPoint(
00230                         const CoordinateSequence &fromCoords) const;
00231 
00235         MultiPoint* createMultiPoint(
00236                         const std::vector<Coordinate> &fromCoords) const;
00237 
00239         Polygon* createPolygon() const;
00240 
00242         Polygon* createPolygon(LinearRing *shell,
00243                         std::vector<Geometry *> *holes) const;
00244 
00246         Polygon* createPolygon(const LinearRing &shell,
00247                         const std::vector<Geometry *> &holes) const;
00248 
00250         LineString* createLineString() const;
00251 
00253         std::auto_ptr<LineString> createLineString(const LineString& ls) const;
00254 
00256         LineString* createLineString(CoordinateSequence* coordinates) const;
00257 
00258         std::auto_ptr<Geometry> createLineString(
00259                         std::auto_ptr<CoordinateSequence> coordinates) const;
00260 
00262         LineString* createLineString(
00263                         const CoordinateSequence& coordinates) const;
00264 
00296         Geometry* buildGeometry(std::vector<Geometry *> *geoms) const;
00297 
00299   //
00306   template <class T>
00307         std::auto_ptr<Geometry> buildGeometry(T from, T toofar) const
00308   {
00309     bool isHeterogeneous = false;
00310     size_t count = 0;
00311     int geomClass = -1;
00312     for (T i=from; i != toofar; ++i)
00313     {
00314       ++count;
00315       const Geometry* g = *i;
00316       if ( geomClass < 0 ) {
00317         geomClass = g->getClassSortIndex();
00318       }
00319       else if ( geomClass != g->getClassSortIndex() ) {
00320         isHeterogeneous = true;
00321       }
00322     }
00323 
00324     // for the empty geometry, return an empty GeometryCollection
00325     if ( count == 0 ) {
00326       return std::auto_ptr<Geometry>( createGeometryCollection() );
00327     }
00328 
00329     // for the single geometry, return a clone
00330     if ( count == 1 ) {
00331       return std::auto_ptr<Geometry>( (*from)->clone() );
00332     }
00333 
00334     // Now we know it is a collection
00335 
00336     // FIXME:
00337     // Until we tweak all the createMulti* interfaces
00338     // to support taking iterators we'll have to build
00339     // a custom vector here.
00340     std::vector<Geometry*> fromGeoms;
00341     for (T i=from; i != toofar; ++i) {
00342       const Geometry* g = *i;
00343       fromGeoms.push_back(const_cast<Geometry*>(g));
00344     }
00345     
00346 
00347     // for an heterogeneous ...
00348     if ( isHeterogeneous ) {
00349       return std::auto_ptr<Geometry>( createGeometryCollection(fromGeoms) );
00350     }
00351 
00352     // At this point we know the collection is not hetereogenous.
00353     if ( dynamic_cast<const Polygon*>(*from) ) {
00354       return std::auto_ptr<Geometry>( createMultiPolygon(fromGeoms) );
00355     } else if ( dynamic_cast<const LineString*>(*from) ) {
00356       return std::auto_ptr<Geometry>( createMultiLineString(fromGeoms) );
00357     } else if ( dynamic_cast<const Point*>(*from) ) {
00358       return std::auto_ptr<Geometry>( createMultiPoint(fromGeoms) );
00359     }
00360     // FIXME: Why not to throw an exception? --mloskot
00361     assert(0); // buildGeomtry encountered an unkwnon geometry type
00362     return std::auto_ptr<Geometry>(); // nullptr
00363   }
00364 
00372         Geometry* buildGeometry(const std::vector<Geometry *> &geoms) const;
00373         
00374         int getSRID() const;
00375 
00379         const CoordinateSequenceFactory* getCoordinateSequenceFactory() const;
00380 
00382         Geometry* createGeometry(const Geometry *g) const;
00383 
00385         void destroyGeometry(Geometry *g) const;
00386 
00387 private:
00388         const PrecisionModel* precisionModel;
00389         int SRID;
00390         const CoordinateSequenceFactory *coordinateListFactory;
00391 };
00392 
00393 } // namespace geos::geom
00394 } // namespace geos
00395 
00396 #ifdef GEOS_INLINE
00397 # include "geos/geom/GeometryFactory.inl"
00398 #endif
00399 
00400 #endif // ndef GEOS_GEOM_GEOMETRYFACTORY_H
00401 
00402 /**********************************************************************
00403  * $Log$
00404  * Revision 1.11  2006/07/08 00:33:55  strk
00405  *         * configure.in: incremented CAPI minor version, to avoid                        falling behind any future version from the 2.2. branch.
00406  *         * source/geom/Geometry.cpp, source/geom/GeometryFactory.cpp,
00407  *         source/geomgraph/EdgeRing.cpp,
00408  *         source/headers/geos/geom/Geometry.h,
00409  *         source/headers/geos/geom/GeometryFactory.h,
00410  *         source/headers/geos/geom/GeometryFactory.inl,
00411  *         source/headers/geos/geomgraph/EdgeRing.h:
00412  *         updated doxygen comments (sync with JTS head).
00413  *         * source/headers/geos/platform.h.in: include <inttypes.h>
00414  *         rather then <stdint.h>
00415  *
00416  * Revision 1.10  2006/06/19 21:17:24  strk
00417  * port info and doxygen dox.
00418  *
00419  * Revision 1.9  2006/04/28 11:56:52  strk
00420  * * source/geom/GeometryFactory.cpp, source/headers/geos/geom/GeometryFactory.h: added LineString copy constructor.
00421  * * source/geom/Polygon.cpp: fixed getBoundary method to always return a geometry composed by LineStrings (not LinearRings)
00422  *
00423  * Revision 1.8  2006/04/12 11:39:34  strk
00424  * Removed Geometry.h and CoordinateSequence.h includes.
00425  * The former created a circular dependency.
00426  *
00427  * Revision 1.7  2006/04/11 11:16:25  strk
00428  * Added LineString and LinearRing constructors by auto_ptr
00429  *
00430  * Revision 1.6  2006/04/10 13:09:49  strk
00431  * Added GeometryFactory::defaultInstance()
00432  * Made Geometry::INTERNAL_GEOMETRY_FACTORY an alias for it
00433  * removed last deletion from Unload::Release class
00434  *
00435  * Revision 1.5  2006/03/31 17:51:26  strk
00436  * A few assertion checking, comments cleanup, use of initialization lists
00437  * in constructors, handled NULL parameters.
00438  *
00439  * Revision 1.4  2006/03/28 16:33:14  strk
00440  * Added note about args responsibility in GeometryFactory constructor
00441  *
00442  * Revision 1.3  2006/03/24 09:52:41  strk
00443  * USE_INLINE => GEOS_INLINE
00444  *
00445  * Revision 1.2  2006/03/20 17:27:03  strk
00446  * Bug #72 - Missing <vector> header
00447  *
00448  * Revision 1.1  2006/03/09 16:46:49  strk
00449  * geos::geom namespace definition, first pass at headers split
00450  *
00451  **********************************************************************/
00452 

Generated on 16 Sep 2013 for GEOS by  doxygen 1.4.7