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); }
Polygon* GeometryEditor::editPolygon(const Polygon *polygon,GeometryEditorOperation *operation) { Polygon* newPolygon= dynamic_cast<Polygon*>( operation->edit(polygon, factory) ); if (newPolygon->isEmpty()) { //RemoveSelectedPlugIn relies on this behaviour. [Jon Aquino] return newPolygon; } Geometry* editResult = edit(newPolygon->getExteriorRing(),operation); LinearRing* shell = dynamic_cast<LinearRing*>(editResult); 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); LinearRing *hole = dynamic_cast<LinearRing*>(hole_geom); assert(hole); if (hole->isEmpty()) { continue; } holes->push_back(hole); } delete newPolygon; return factory->createPolygon(shell,holes); }
void Polygon::AddGeometry(Geometry *pGeometry) { LinearRing *pring = dynamic_cast<LinearRing*>(pGeometry); if(pring ==NULL) { return; } //如果环是不闭合的,并且不是一个空环,则不能加入到多边形中 if(!pring->isClosed() && !pring->isEmpty()) { return; } //当外环为空时,将这个环替换外环 if(shell->isEmpty()) { delete shell; shell =pring; return; } holes->push_back(pring); }