@@ -633,9 +633,16 @@ bool QgsGeometry::deleteVertexAt(QgsGeometryVertexIndex atVertex)
633
633
634
634
case geos::GEOS_POLYGON: // a polygon
635
635
{
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
+ }
639
646
640
647
case geos::GEOS_MULTIPOINT: // a collection of points
641
648
{
@@ -2143,7 +2150,77 @@ bool QgsGeometry::moveVertexFromPolygon(int atVertex, double x, double y)
2143
2150
2144
2151
bool QgsGeometry::deleteVertexFromPolygon (int atVertex)
2145
2152
{
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
+ }
2147
2224
}
2148
2225
2149
2226
bool QgsGeometry::insertVertexToPolygon (int beforeVertex, double x, double y)
@@ -2168,7 +2245,6 @@ geos::Polygon* QgsGeometry::createPolygonFromCoordSequence(const geos::Coordinat
2168
2245
}
2169
2246
catch (geos::IllegalArgumentException* e)
2170
2247
{
2171
- delete outerRingSequence;
2172
2248
return 0 ;
2173
2249
}
2174
2250
@@ -2189,12 +2265,6 @@ geos::Polygon* QgsGeometry::createPolygonFromCoordSequence(const geos::Coordinat
2189
2265
}
2190
2266
catch (geos::IllegalArgumentException* e)
2191
2267
{
2192
- delete outerRingSequence;
2193
- // also delete the already created rings
2194
- for (int j = 0 ; j < i; ++j)
2195
- {
2196
- delete (*newInnerRings)[i];
2197
- }
2198
2268
return 0 ;
2199
2269
}
2200
2270
(*newInnerRings)[i] = newInnerRing;
@@ -2207,11 +2277,6 @@ geos::Polygon* QgsGeometry::createPolygonFromCoordSequence(const geos::Coordinat
2207
2277
}
2208
2278
catch (geos::IllegalArgumentException* e)
2209
2279
{
2210
- delete newOuterRing;
2211
- for (int i = 0 ; i < newInnerRings->size (); ++i)
2212
- {
2213
- delete (*newInnerRings)[i];
2214
- }
2215
2280
return 0 ;
2216
2281
}
2217
2282
0 commit comments