⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 geometryeditor.cpp

📁 在Linux下做的QuadTree的程序
💻 CPP
字号:
/********************************************************************** * $Id: GeometryEditor.cpp 1820 2006-09-06 16:54:23Z mloskot $ * * GEOS - Geometry Engine Open Source * http://geos.refractions.net * * Copyright (C) 2001-2002 Vivid Solutions 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. * **********************************************************************/#include <geos/geom/util/GeometryEditor.h>#include <geos/geom/GeometryFactory.h>#include <geos/geom/Geometry.h>#include <geos/geom/MultiPoint.h>#include <geos/geom/MultiPolygon.h>#include <geos/geom/MultiLineString.h>#include <geos/geom/CoordinateSequence.h>#include <geos/geom/Polygon.h>#include <geos/geom/Point.h>#include <geos/geom/LineString.h>#include <geos/geom/LinearRing.h>#include <geos/geom/GeometryCollection.h>#include <geos/geom/util/GeometryEditorOperation.h>#include <geos/util/UnsupportedOperationException.h>#include <vector>#include <cassert>#include <typeinfo>using namespace std;namespace geos {namespace geom { // geos.geomnamespace util { // geos.geom.util/** * Creates a new GeometryEditor object which will create * an edited Geometry with the same GeometryFactory as the input Geometry. */GeometryEditor::GeometryEditor(){	factory=NULL;}/** * Creates a new GeometryEditor object which will create * the edited Geometry with the given {@link GeometryFactory} * * @param factory the GeometryFactory to create the edited Geometry with */GeometryEditor::GeometryEditor(const GeometryFactory *newFactory){	factory=newFactory;}/** * Edit the input {@link Geometry} with the given edit operation. * Clients will create subclasses of GeometryEditorOperation or * CoordinateOperation to perform required modifications. * * @param geometry the Geometry to edit * @param operation the edit operation to carry out * @return a new {@link Geometry} which is the result of the editing */Geometry*GeometryEditor::edit(const Geometry *geometry, GeometryEditorOperation *operation){	// if client did not supply a GeometryFactory, use the one from the input Geometry	if (factory == NULL)		factory=geometry->getFactory();	if ((typeid(*geometry)==typeid(GeometryCollection)) ||				(typeid(*geometry)==typeid(MultiPoint)) ||				(typeid(*geometry)==typeid(MultiPolygon)) ||				(typeid(*geometry)==typeid(MultiLineString))) {		return editGeometryCollection((const GeometryCollection*) geometry, operation);	}	if (typeid(*geometry)==typeid(Polygon)) {		return editPolygon((Polygon*) geometry, operation);	}	if (typeid(*geometry)==typeid(Point)) {		return operation->edit(geometry, factory);	}	if (typeid(*geometry)==typeid(LineString) || typeid(*geometry)==typeid(LinearRing)) {		return operation->edit(geometry, factory);	}	assert(0); // Unsupported Geometry classes should be caught in the GeometryEditorOperation.	return NULL;}Polygon*GeometryEditor::editPolygon(const Polygon *polygon,GeometryEditorOperation *operation){	Polygon* newPolygon=(Polygon*) operation->edit(polygon, factory);	if (newPolygon->isEmpty()) {		//RemoveSelectedPlugIn relies on this behaviour. [Jon Aquino]		return newPolygon;	}	LinearRing* shell = (LinearRing*) edit(newPolygon->getExteriorRing(),operation);	if (shell->isEmpty()) {		//RemoveSelectedPlugIn relies on this behaviour. [Jon Aquino]		delete shell;		delete newPolygon;		return factory->createPolygon(NULL,NULL);	}	vector<Geometry*> *holes=new vector<Geometry*>;	for (size_t i=0, n=newPolygon->getNumInteriorRing(); i<n; ++i)	{		Geometry *hole_geom = edit(newPolygon->getInteriorRingN(i),			operation);		assert(dynamic_cast<LinearRing*>(hole_geom));		LinearRing *hole = static_cast<LinearRing*>(hole_geom);		if (hole->isEmpty())		{			continue;		}		holes->push_back(hole);	}	delete newPolygon;	return factory->createPolygon(shell,holes);}GeometryCollection*GeometryEditor::editGeometryCollection(const GeometryCollection *collection, GeometryEditorOperation *operation){	GeometryCollection *newCollection = (GeometryCollection*) operation->edit(collection,factory);	vector<Geometry*> *geometries = new vector<Geometry*>();	for (unsigned int i=0, n=newCollection->getNumGeometries(); i<n; i++)	{		Geometry *geometry = edit(newCollection->getGeometryN(i),			operation);		if (geometry->isEmpty()) {			delete geometry;			continue;		}		geometries->push_back(geometry);	}	if (typeid(*newCollection)==typeid(MultiPoint)) {		delete newCollection;		return factory->createMultiPoint(geometries);	}	else if (typeid(*newCollection)==typeid(MultiLineString)) {		delete newCollection;		return factory->createMultiLineString(geometries);	}	else if (typeid(*newCollection)==typeid(MultiPolygon)) {		delete newCollection;		return factory->createMultiPolygon(geometries);	}	else {		delete newCollection;		return factory->createGeometryCollection(geometries);	}}} // namespace geos.geom.util} // namespace geos.geom} // namespace geos/********************************************************************** * $Log$ * Revision 1.18  2006/06/08 17:58:57  strk * Polygon::getNumInteriorRing() return size_t, Polygon::interiorRingN() takes size_t. * * Revision 1.17  2006/04/07 09:54:30  strk * Geometry::getNumGeometries() changed to return 'unsigned int' * rather then 'int' * * Revision 1.16  2006/03/09 16:46:47  strk * geos::geom namespace definition, first pass at headers split * * Revision 1.15  2006/03/06 19:40:46  strk * geos::util namespace. New GeometryCollection::iterator interface, many cleanups. * * Revision 1.14  2006/03/03 10:46:21  strk * Removed 'using namespace' from headers, added missing headers in .cpp files, removed useless includes in headers (bug#46) * * Revision 1.13  2006/01/31 19:07:34  strk * - Renamed DefaultCoordinateSequence to CoordinateArraySequence. * - Moved GetNumGeometries() and GetGeometryN() interfaces *   from GeometryCollection to Geometry class. * - Added getAt(int pos, Coordinate &to) funtion to CoordinateSequence class. * - Reworked automake scripts to produce a static lib for each subdir and *   then link all subsystem's libs togheter * - Moved C-API in it's own top-level dir capi/ * - Moved source/bigtest and source/test to tests/bigtest and test/xmltester * - Fixed PointLocator handling of LinearRings * - Changed CoordinateArrayFilter to reduce memory copies * - Changed UniqueCoordinateArrayFilter to reduce memory copies * - Added CGAlgorithms::isPointInRing() version working with *   Coordinate::ConstVect type (faster!) * - Ported JTS-1.7 version of ConvexHull with big attention to *   memory usage optimizations. * - Improved XMLTester output and user interface * - geos::geom::util namespace used for geom/util stuff * - Improved memory use in geos::geom::util::PolygonExtractor * - New ShortCircuitedGeometryVisitor class * - New operation/predicate package * * Revision 1.12  2004/12/22 09:42:45  strk * Fixed a premature Geometry destruction, Avoided CoordinateSequence copies * when possible. * * Revision 1.11  2004/12/08 13:54:43  strk * gcc warnings checked and fixed, general cleanups. * * Revision 1.10  2004/07/08 19:34:49  strk * Mirrored JTS interface of CoordinateSequence, factory and * default implementations. * Added CoordinateArraySequenceFactory::instance() function. * * Revision 1.9  2004/07/02 13:28:26  strk * Fixed all #include lines to reflect headers layout change. * Added client application build tips in README. * * Revision 1.8  2004/07/01 14:12:44  strk * * Geometry constructors come now in two flavors: * 	- deep-copy args (pass-by-reference) * 	- take-ownership of args (pass-by-pointer) * Same functionality is available through GeometryFactory, * including buildGeometry(). * * Revision 1.7  2004/06/15 20:20:45  strk * updated to respect deep-copy GeometryCollection interface * * Revision 1.6  2004/05/05 12:20:22  strk * Memory leak plugged in editGeometryCollection * * Revision 1.5  2004/05/03 17:15:38  strk * leaks on exception fixed. * * Revision 1.4  2004/04/20 10:14:20  strk * Memory leaks removed. * * Revision 1.3  2004/04/20 08:52:01  strk * GeometryFactory and Geometry const correctness. * Memory leaks removed from SimpleGeometryPrecisionReducer * and GeometryFactory. * * Revision 1.2  2004/04/14 11:05:07  strk * Added support for LinearRing in GeometryEditor * * Revision 1.1  2004/04/04 06:29:11  ybychkov * "planargraph" and "geom/utill" upgraded to JTS 1.4 * * **********************************************************************/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -