Skip to content

Commit 6f15e59

Browse files
committed
fix deleteVertex for POLYGON and MULTILINESTRING
1 parent a30a9dd commit 6f15e59

File tree

2 files changed

+46
-18
lines changed

2 files changed

+46
-18
lines changed

src/core/qgsgeometry.cpp

+3-14
Original file line numberDiff line numberDiff line change
@@ -1383,6 +1383,9 @@ bool QgsGeometry::deleteVertex( QgsConstWkbPtr &srcPtr, QgsWkbPtr &dstPtr, int a
13831383
return false;
13841384
}
13851385

1386+
if ( isRing && atVertex == pointIndex + nPoints - 1 )
1387+
atVertex = pointIndex;
1388+
13861389
dstPtr << nPoints - 1;
13871390

13881391
int len = ( atVertex - pointIndex ) * ps;
@@ -1424,8 +1427,6 @@ bool QgsGeometry::deleteVertex( QgsConstWkbPtr &srcPtr, QgsWkbPtr &dstPtr, int a
14241427

14251428
bool QgsGeometry::deleteVertex( int atVertex )
14261429
{
1427-
QgsDebugMsg( QString( "0x%1 %2 %3" ).arg(( qint64 ) mGeometry, 0, 16 ).arg( mGeometrySize ).arg( atVertex ) );
1428-
14291430
if ( atVertex < 0 )
14301431
return false;
14311432

@@ -1449,8 +1450,6 @@ bool QgsGeometry::deleteVertex( int atVertex )
14491450
if ( QGis::flatType( wkbType ) == QGis::WKBMultiPoint )
14501451
ps += 1 + sizeof( int );
14511452

1452-
QgsDebugMsg( QString( "wktType:%1[%2] mGeometrySize:%3 ps:%4" ).arg( wkbType ).arg( QGis::featureType( wkbType ) ).arg( mGeometrySize ).arg( ps ) );
1453-
14541453
unsigned char *dstBuffer = new unsigned char[mGeometrySize - ps];
14551454
QgsWkbPtr dstPtr( dstBuffer );
14561455
dstPtr << endianess << wkbType;
@@ -1477,7 +1476,6 @@ bool QgsGeometry::deleteVertex( int atVertex )
14771476
srcPtr >> nRings;
14781477
dstPtr << nRings;
14791478

1480-
bool deleted = false;
14811479
for ( int ringnr = 0, pointIndex = 0; ringnr < nRings; ++ringnr )
14821480
deleted |= deleteVertex( srcPtr, dstPtr, atVertex, hasZValue, pointIndex, true, ringnr == nRings - 1 );
14831481

@@ -1490,34 +1488,28 @@ bool QgsGeometry::deleteVertex( int atVertex )
14901488
int nPoints;
14911489
srcPtr >> nPoints;
14921490

1493-
QgsDebugMsg( QString( "nPoint:%1" ).arg( nPoints ) );
1494-
14951491
if ( atVertex < nPoints )
14961492
{
14971493
dstPtr << nPoints - 1;
14981494

14991495
int len = ps * atVertex;
15001496
if ( len > 0 )
15011497
{
1502-
QgsDebugMsg( QString( "first part:%1" ).arg( len ) );
15031498
memcpy( dstPtr, srcPtr, len );
15041499
srcPtr += len;
15051500
dstPtr += len;
15061501
}
15071502

1508-
QgsDebugMsg( QString( "skip:%1" ).arg( ps ) );
15091503
srcPtr += ps;
15101504

15111505
len = ps * ( nPoints - atVertex - 1 );
15121506
if ( len > 0 )
15131507
{
1514-
QgsDebugMsg( QString( "second part:%1" ).arg( ps ) );
15151508
memcpy( dstPtr, srcPtr, len );
15161509
srcPtr += len;
15171510
dstPtr += len;
15181511
}
15191512

1520-
QgsDebugMsg( QString( "deleted!: size:%1" ).arg( dstPtr - dstBuffer ) );
15211513
deleted = true;
15221514
}
15231515

@@ -1531,7 +1523,6 @@ bool QgsGeometry::deleteVertex( int atVertex )
15311523
srcPtr >> nLines;
15321524
dstPtr << nLines;
15331525

1534-
bool deleted = false;
15351526
for ( int linenr = 0, pointIndex = 0; linenr < nLines; ++linenr )
15361527
{
15371528
srcPtr >> endianess >> wkbType;
@@ -1568,7 +1559,6 @@ bool QgsGeometry::deleteVertex( int atVertex )
15681559

15691560
if ( deleted )
15701561
{
1571-
QgsDebugMsg( QString( "deleted true replace:0x%1 with 0x%2" ).arg(( qint64 ) mGeometry, 0, 16 ).arg(( qint64 ) dstBuffer, 0, 16 ) );
15721562
delete [] mGeometry;
15731563
mGeometry = dstBuffer;
15741564
mGeometrySize -= ps;
@@ -1577,7 +1567,6 @@ bool QgsGeometry::deleteVertex( int atVertex )
15771567
}
15781568
else
15791569
{
1580-
QgsDebugMsg( QString( "deleted false: free 0x%1" ).arg(( qint64 ) dstBuffer, 0, 16 ) );
15811570
delete [] dstBuffer;
15821571
return false;
15831572
}

tests/src/python/test_qgsgeometry.py

+43-4
Original file line numberDiff line numberDiff line change
@@ -766,7 +766,6 @@ def testMultipoint(self):
766766
assert compareWkt( expwkt, wkt ), "Expected:\n%s\nGot:\n%s\n" % (expwkt, wkt )
767767

768768
assert multipoint.insertVertex(6, 6, 2), "MULTIPOINT append 6,6 at 2 failed"
769-
770769
expwkt = "MULTIPOINT(4 4, 5 5, 6 6, 7 7)"
771770
wkt = multipoint.exportToWkt()
772771
assert compareWkt( expwkt, wkt ), "Expected:\n%s\nGot:\n%s\n" % (expwkt, wkt )
@@ -775,19 +774,16 @@ def testMultipoint(self):
775774
assert not multipoint.deleteVertex(-1), "MULTIPOINT delete at -1 unexpectedly succeeded"
776775

777776
assert multipoint.deleteVertex(1), "MULTIPOINT delete at 1 failed"
778-
779777
expwkt = "MULTIPOINT(4 4, 6 6, 7 7)"
780778
wkt = multipoint.exportToWkt()
781779
assert compareWkt( expwkt, wkt ), "Expected:\n%s\nGot:\n%s\n" % (expwkt, wkt )
782780

783781
assert multipoint.deleteVertex(2), "MULTIPOINT delete at 2 failed"
784-
785782
expwkt = "MULTIPOINT(4 4, 6 6)"
786783
wkt = multipoint.exportToWkt()
787784
assert compareWkt( expwkt, wkt ), "Expected:\n%s\nGot:\n%s\n" % (expwkt, wkt )
788785

789786
assert multipoint.deleteVertex(0), "MULTIPOINT delete at 2 failed"
790-
791787
expwkt = "MULTIPOINT(6 6)"
792788
wkt = multipoint.exportToWkt()
793789
assert compareWkt( expwkt, wkt ), "Expected:\n%s\nGot:\n%s\n" % (expwkt, wkt )
@@ -852,6 +848,49 @@ def testDeleteVertex(self):
852848
assert not polyline.deleteVertex( -5 ), "Delete vertex -5 unexpectedly succeeded"
853849
assert not polyline.deleteVertex( 100 ), "Delete vertex 100 unexpectedly succeeded"
854850

851+
# 2-3 6-+-7
852+
# | | | |
853+
# 0-1 4 5 8-9
854+
polyline = QgsGeometry.fromWkt("MULTILINESTRING((0 0, 1 0, 1 1, 2 1,2 0),(3 0, 3 1, 5 1, 5 0, 6 0))")
855+
assert polyline.deleteVertex(5), "Delete vertex 5 failed"
856+
expwkt = "MULTILINESTRING((0 0, 1 0, 1 1, 2 1, 2 0), (3 1, 5 1, 5 0, 6 0))"
857+
wkt = polyline.exportToWkt()
858+
assert compareWkt( expwkt, wkt ), "Expected:\n%s\nGot:\n%s\n" % (expwkt, wkt )
859+
860+
assert not polyline.deleteVertex(-100), "Delete vertex -100 unexpectedly succeeded"
861+
assert not polyline.deleteVertex(100), "Delete vertex 100 unexpectedly succeeded"
862+
863+
assert polyline.deleteVertex(0), "Delete vertex 0 failed"
864+
expwkt = "MULTILINESTRING((1 0, 1 1, 2 1, 2 0), (3 1, 5 1, 5 0, 6 0))"
865+
wkt = polyline.exportToWkt()
866+
assert compareWkt( expwkt, wkt ), "Expected:\n%s\nGot:\n%s\n" % (expwkt, wkt )
867+
868+
# 5---4
869+
# | |
870+
# | 2-3
871+
# | |
872+
# 0-1
873+
polygon = QgsGeometry.fromWkt("POLYGON((0 0, 1 0, 1 1, 2 1, 2 2, 0 2, 0 0))")
874+
875+
assert polygon.deleteVertex(2), "Delete vertex 2 failed"
876+
print "FIXME: exportToWkt doesn't put a blanks behind the comma"
877+
expwkt = "POLYGON((0 0,1 0,2 1,2 2,0 2,0 0))"
878+
wkt = polygon.exportToWkt()
879+
assert compareWkt( expwkt, wkt ), "Expected:\n%s\nGot:\n%s\n" % (expwkt, wkt )
880+
881+
assert polygon.deleteVertex(0), "Delete vertex 0 failed"
882+
expwkt = "POLYGON((1 0,2 1,2 2,0 2,1 0))"
883+
wkt = polygon.exportToWkt()
884+
assert compareWkt( expwkt, wkt ), "Expected:\n%s\nGot:\n%s\n" % (expwkt, wkt )
885+
886+
assert polygon.deleteVertex(4), "Delete vertex 4 failed"
887+
expwkt = "POLYGON((2 1,2 2,0 2,2 1))"
888+
wkt = polygon.exportToWkt()
889+
assert compareWkt( expwkt, wkt ), "Expected:\n%s\nGot:\n%s\n" % (expwkt, wkt )
890+
891+
assert not polygon.deleteVertex(-100), "Delete vertex -100 unexpectedly succeeded"
892+
assert not polygon.deleteVertex(100), "Delete vertex 100 unexpectedly succeeded"
893+
855894
# 5-+-4 0-+-9
856895
# | | | |
857896
# 6 2-3 1-2 +

0 commit comments

Comments
 (0)