geometryeditor.cpp

来自「一个很好的vc底层代码」· C++ 代码 · 共 192 行

CPP
192
字号
/********************************************************************** * $Id: GeometryEditor.cpp,v 1.11.2.1 2005/05/24 07:39:26 strk Exp $ * * GEOS - Geometry Engine Open Source * http://geos.refractions.net * * Copyright (C) 2001-2002 Vivid Solutions Inc. * Copyright (C) 2005 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. * **********************************************************************/#include <geos/geomUtil.h>#include <geos/util.h>#include <typeinfo>namespace geos {/** * 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 {@link GeometryEditorOperation} or * {@link 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::shouldNeverReachHere("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 (int i=0;i<newPolygon->getNumInteriorRing(); i++) {		LinearRing *hole =(LinearRing*) edit(newPolygon->getInteriorRingN(i),operation);		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 (int i = 0; i < newCollection->getNumGeometries(); 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);	}}/** * Return a newly created geometry  */Geometry*CoordinateOperation::edit(const Geometry *geometry, const GeometryFactory *factory){	const LinearRing *ring = dynamic_cast<const LinearRing *>(geometry);	if (ring) {		const CoordinateSequence *coords = ring->getCoordinatesRO();		CoordinateSequence *newCoords = edit(coords,geometry);		return factory->createLinearRing(newCoords);	}	const LineString *line = dynamic_cast<const LineString *>(geometry);	if (line) {		const CoordinateSequence *coords = line->getCoordinatesRO();		CoordinateSequence *newCoords = edit(coords,geometry);		return factory->createLineString(newCoords);	}	if (typeid(*geometry)==typeid(Point)) {		CoordinateSequence *coords = geometry->getCoordinates();		CoordinateSequence *newCoords = edit(coords,geometry);		delete coords;		return factory->createPoint(newCoords);	}	return geometry->clone();}} // namespace geos/********************************************************************** * $Log: GeometryEditor.cpp,v $ * Revision 1.11.2.1  2005/05/24 07:39:26  strk * Segfault fix in GeometryEditor::editPolygon(), CoordinateSequence copy * reduction * * 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 DefaultCoordinateSequenceFactory::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. * **********************************************************************/

⌨️ 快捷键说明

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