Skip to content

Commit b371ae3

Browse files
author
mhugent
committed
Added method to delete vertices from polygons
git-svn-id: http://svn.osgeo.org/qgis/trunk/qgis@5249 c8812cc2-4d05-0410-92ff-de0c093fc19c
1 parent 927f5d5 commit b371ae3

File tree

3 files changed

+82
-18
lines changed

3 files changed

+82
-18
lines changed

configure.in

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -506,7 +506,6 @@ AC_CONFIG_FILES([
506506
tests/src/core/Makefile
507507
tests/src/gui/Makefile
508508
qgis.spec
509-
src/plugins/qgis_community/Makefile
510509
])
511510

512511
AC_OUTPUT

src/core/qgsgeometry.cpp

Lines changed: 81 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -633,9 +633,16 @@ bool QgsGeometry::deleteVertexAt(QgsGeometryVertexIndex atVertex)
633633

634634
case geos::GEOS_POLYGON: // a polygon
635635
{
636-
// TODO
637-
break;
638-
} // case geos::GEOS_POLYGON
636+
if(deleteVertexFromPolygon(atVertex.back()))
637+
{
638+
mDirtyWkb = true;
639+
return true;
640+
}
641+
else
642+
{
643+
return false;
644+
}
645+
}
639646

640647
case geos::GEOS_MULTIPOINT: // a collection of points
641648
{
@@ -2143,7 +2150,77 @@ bool QgsGeometry::moveVertexFromPolygon(int atVertex, double x, double y)
21432150

21442151
bool QgsGeometry::deleteVertexFromPolygon(int atVertex)
21452152
{
2146-
return false; //soon
2153+
if(!mGeos)
2154+
{
2155+
return false;
2156+
}
2157+
2158+
geos::Polygon* originalpoly = dynamic_cast<geos::Polygon*>(mGeos);
2159+
if(!originalpoly)
2160+
{
2161+
return false;
2162+
}
2163+
2164+
geos::CoordinateSequence* coordinates = originalpoly->getCoordinates();
2165+
std::vector<int> rings(originalpoly->getNumInteriorRing() + 1); //a vector storing the number of points in each ring
2166+
//todo: consider that the point to be moved could be the starting point/ end point of a ring
2167+
const geos::LineString* outerRing = originalpoly->getExteriorRing();
2168+
int pointcounter = 0;
2169+
2170+
if(atVertex == 0 || atVertex == outerRing->getNumPoints()-1)
2171+
{
2172+
coordinates->setAt(coordinates->getAt(1), outerRing->getNumPoints()-1);
2173+
coordinates->deleteAt(0);
2174+
rings[0] = outerRing->getNumPoints()-1;
2175+
pointcounter += outerRing->getNumPoints()-1;
2176+
}
2177+
else if(atVertex < outerRing->getNumPoints())
2178+
{
2179+
coordinates->deleteAt(atVertex);
2180+
rings[0] = outerRing->getNumPoints()-1;
2181+
pointcounter += outerRing->getNumPoints()-1;
2182+
}
2183+
else
2184+
{
2185+
rings[0] = outerRing->getNumPoints();
2186+
pointcounter += outerRing->getNumPoints();
2187+
}
2188+
2189+
for(int i = 0; i < originalpoly->getNumInteriorRing(); ++i)
2190+
{
2191+
const geos::LineString* innerRing = originalpoly->getInteriorRingN(i);
2192+
if(atVertex == pointcounter || atVertex== pointcounter + innerRing->getNumPoints()-1)
2193+
{
2194+
coordinates->setAt(coordinates->getAt(pointcounter+1), pointcounter + innerRing->getNumPoints()-1);
2195+
coordinates->deleteAt(pointcounter);
2196+
pointcounter += innerRing->getNumPoints()-1;
2197+
rings[i+1] = innerRing->getNumPoints()-1;
2198+
}
2199+
else if(atVertex > pointcounter && atVertex < pointcounter + innerRing->getNumPoints()-1)
2200+
{
2201+
coordinates->deleteAt(atVertex);
2202+
rings[i+1] = innerRing->getNumPoints()-1;
2203+
pointcounter += innerRing->getNumPoints()-1;
2204+
}
2205+
else
2206+
{
2207+
rings[i+1] = innerRing->getNumPoints();
2208+
pointcounter += innerRing->getNumPoints();
2209+
}
2210+
}
2211+
2212+
geos::Polygon* newPolygon = createPolygonFromCoordSequence(coordinates, rings);
2213+
delete coordinates;
2214+
if(newPolygon)
2215+
{
2216+
delete mGeos;
2217+
mGeos = newPolygon;
2218+
return true;
2219+
}
2220+
else
2221+
{
2222+
return false;
2223+
}
21472224
}
21482225

21492226
bool QgsGeometry::insertVertexToPolygon(int beforeVertex, double x, double y)
@@ -2168,7 +2245,6 @@ geos::Polygon* QgsGeometry::createPolygonFromCoordSequence(const geos::Coordinat
21682245
}
21692246
catch(geos::IllegalArgumentException* e)
21702247
{
2171-
delete outerRingSequence;
21722248
return 0;
21732249
}
21742250

@@ -2189,12 +2265,6 @@ geos::Polygon* QgsGeometry::createPolygonFromCoordSequence(const geos::Coordinat
21892265
}
21902266
catch(geos::IllegalArgumentException* e)
21912267
{
2192-
delete outerRingSequence;
2193-
//also delete the already created rings
2194-
for(int j = 0; j < i; ++j)
2195-
{
2196-
delete (*newInnerRings)[i];
2197-
}
21982268
return 0;
21992269
}
22002270
(*newInnerRings)[i] = newInnerRing;
@@ -2207,11 +2277,6 @@ geos::Polygon* QgsGeometry::createPolygonFromCoordSequence(const geos::Coordinat
22072277
}
22082278
catch(geos::IllegalArgumentException* e)
22092279
{
2210-
delete newOuterRing;
2211-
for(int i = 0; i < newInnerRings->size(); ++i)
2212-
{
2213-
delete (*newInnerRings)[i];
2214-
}
22152280
return 0;
22162281
}
22172282

src/plugins/Makefile.am

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ endif
1414

1515

1616
SUBDIRS = $(GEOPROCESSING) \
17-
qgis_community \
17+
#qgis_community \
1818
$(SPIT) \
1919
$(GRASS) \
2020
$(COMMUNITY) \

0 commit comments

Comments
 (0)