mirror of
https://github.com/qgis/QGIS.git
synced 2025-04-25 00:03:06 -04:00
fix deleteVertex for POLYGON and MULTILINESTRING
This commit is contained in:
parent
a30a9dd05e
commit
6f15e59ff9
@ -1383,6 +1383,9 @@ bool QgsGeometry::deleteVertex( QgsConstWkbPtr &srcPtr, QgsWkbPtr &dstPtr, int a
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ( isRing && atVertex == pointIndex + nPoints - 1 )
|
||||||
|
atVertex = pointIndex;
|
||||||
|
|
||||||
dstPtr << nPoints - 1;
|
dstPtr << nPoints - 1;
|
||||||
|
|
||||||
int len = ( atVertex - pointIndex ) * ps;
|
int len = ( atVertex - pointIndex ) * ps;
|
||||||
@ -1424,8 +1427,6 @@ bool QgsGeometry::deleteVertex( QgsConstWkbPtr &srcPtr, QgsWkbPtr &dstPtr, int a
|
|||||||
|
|
||||||
bool QgsGeometry::deleteVertex( int atVertex )
|
bool QgsGeometry::deleteVertex( int atVertex )
|
||||||
{
|
{
|
||||||
QgsDebugMsg( QString( "0x%1 %2 %3" ).arg(( qint64 ) mGeometry, 0, 16 ).arg( mGeometrySize ).arg( atVertex ) );
|
|
||||||
|
|
||||||
if ( atVertex < 0 )
|
if ( atVertex < 0 )
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
@ -1449,8 +1450,6 @@ bool QgsGeometry::deleteVertex( int atVertex )
|
|||||||
if ( QGis::flatType( wkbType ) == QGis::WKBMultiPoint )
|
if ( QGis::flatType( wkbType ) == QGis::WKBMultiPoint )
|
||||||
ps += 1 + sizeof( int );
|
ps += 1 + sizeof( int );
|
||||||
|
|
||||||
QgsDebugMsg( QString( "wktType:%1[%2] mGeometrySize:%3 ps:%4" ).arg( wkbType ).arg( QGis::featureType( wkbType ) ).arg( mGeometrySize ).arg( ps ) );
|
|
||||||
|
|
||||||
unsigned char *dstBuffer = new unsigned char[mGeometrySize - ps];
|
unsigned char *dstBuffer = new unsigned char[mGeometrySize - ps];
|
||||||
QgsWkbPtr dstPtr( dstBuffer );
|
QgsWkbPtr dstPtr( dstBuffer );
|
||||||
dstPtr << endianess << wkbType;
|
dstPtr << endianess << wkbType;
|
||||||
@ -1477,7 +1476,6 @@ bool QgsGeometry::deleteVertex( int atVertex )
|
|||||||
srcPtr >> nRings;
|
srcPtr >> nRings;
|
||||||
dstPtr << nRings;
|
dstPtr << nRings;
|
||||||
|
|
||||||
bool deleted = false;
|
|
||||||
for ( int ringnr = 0, pointIndex = 0; ringnr < nRings; ++ringnr )
|
for ( int ringnr = 0, pointIndex = 0; ringnr < nRings; ++ringnr )
|
||||||
deleted |= deleteVertex( srcPtr, dstPtr, atVertex, hasZValue, pointIndex, true, ringnr == nRings - 1 );
|
deleted |= deleteVertex( srcPtr, dstPtr, atVertex, hasZValue, pointIndex, true, ringnr == nRings - 1 );
|
||||||
|
|
||||||
@ -1490,8 +1488,6 @@ bool QgsGeometry::deleteVertex( int atVertex )
|
|||||||
int nPoints;
|
int nPoints;
|
||||||
srcPtr >> nPoints;
|
srcPtr >> nPoints;
|
||||||
|
|
||||||
QgsDebugMsg( QString( "nPoint:%1" ).arg( nPoints ) );
|
|
||||||
|
|
||||||
if ( atVertex < nPoints )
|
if ( atVertex < nPoints )
|
||||||
{
|
{
|
||||||
dstPtr << nPoints - 1;
|
dstPtr << nPoints - 1;
|
||||||
@ -1499,25 +1495,21 @@ bool QgsGeometry::deleteVertex( int atVertex )
|
|||||||
int len = ps * atVertex;
|
int len = ps * atVertex;
|
||||||
if ( len > 0 )
|
if ( len > 0 )
|
||||||
{
|
{
|
||||||
QgsDebugMsg( QString( "first part:%1" ).arg( len ) );
|
|
||||||
memcpy( dstPtr, srcPtr, len );
|
memcpy( dstPtr, srcPtr, len );
|
||||||
srcPtr += len;
|
srcPtr += len;
|
||||||
dstPtr += len;
|
dstPtr += len;
|
||||||
}
|
}
|
||||||
|
|
||||||
QgsDebugMsg( QString( "skip:%1" ).arg( ps ) );
|
|
||||||
srcPtr += ps;
|
srcPtr += ps;
|
||||||
|
|
||||||
len = ps * ( nPoints - atVertex - 1 );
|
len = ps * ( nPoints - atVertex - 1 );
|
||||||
if ( len > 0 )
|
if ( len > 0 )
|
||||||
{
|
{
|
||||||
QgsDebugMsg( QString( "second part:%1" ).arg( ps ) );
|
|
||||||
memcpy( dstPtr, srcPtr, len );
|
memcpy( dstPtr, srcPtr, len );
|
||||||
srcPtr += len;
|
srcPtr += len;
|
||||||
dstPtr += len;
|
dstPtr += len;
|
||||||
}
|
}
|
||||||
|
|
||||||
QgsDebugMsg( QString( "deleted!: size:%1" ).arg( dstPtr - dstBuffer ) );
|
|
||||||
deleted = true;
|
deleted = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1531,7 +1523,6 @@ bool QgsGeometry::deleteVertex( int atVertex )
|
|||||||
srcPtr >> nLines;
|
srcPtr >> nLines;
|
||||||
dstPtr << nLines;
|
dstPtr << nLines;
|
||||||
|
|
||||||
bool deleted = false;
|
|
||||||
for ( int linenr = 0, pointIndex = 0; linenr < nLines; ++linenr )
|
for ( int linenr = 0, pointIndex = 0; linenr < nLines; ++linenr )
|
||||||
{
|
{
|
||||||
srcPtr >> endianess >> wkbType;
|
srcPtr >> endianess >> wkbType;
|
||||||
@ -1568,7 +1559,6 @@ bool QgsGeometry::deleteVertex( int atVertex )
|
|||||||
|
|
||||||
if ( deleted )
|
if ( deleted )
|
||||||
{
|
{
|
||||||
QgsDebugMsg( QString( "deleted true replace:0x%1 with 0x%2" ).arg(( qint64 ) mGeometry, 0, 16 ).arg(( qint64 ) dstBuffer, 0, 16 ) );
|
|
||||||
delete [] mGeometry;
|
delete [] mGeometry;
|
||||||
mGeometry = dstBuffer;
|
mGeometry = dstBuffer;
|
||||||
mGeometrySize -= ps;
|
mGeometrySize -= ps;
|
||||||
@ -1577,7 +1567,6 @@ bool QgsGeometry::deleteVertex( int atVertex )
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
QgsDebugMsg( QString( "deleted false: free 0x%1" ).arg(( qint64 ) dstBuffer, 0, 16 ) );
|
|
||||||
delete [] dstBuffer;
|
delete [] dstBuffer;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -766,7 +766,6 @@ class TestQgsGeometry(TestCase):
|
|||||||
assert compareWkt( expwkt, wkt ), "Expected:\n%s\nGot:\n%s\n" % (expwkt, wkt )
|
assert compareWkt( expwkt, wkt ), "Expected:\n%s\nGot:\n%s\n" % (expwkt, wkt )
|
||||||
|
|
||||||
assert multipoint.insertVertex(6, 6, 2), "MULTIPOINT append 6,6 at 2 failed"
|
assert multipoint.insertVertex(6, 6, 2), "MULTIPOINT append 6,6 at 2 failed"
|
||||||
|
|
||||||
expwkt = "MULTIPOINT(4 4, 5 5, 6 6, 7 7)"
|
expwkt = "MULTIPOINT(4 4, 5 5, 6 6, 7 7)"
|
||||||
wkt = multipoint.exportToWkt()
|
wkt = multipoint.exportToWkt()
|
||||||
assert compareWkt( expwkt, wkt ), "Expected:\n%s\nGot:\n%s\n" % (expwkt, wkt )
|
assert compareWkt( expwkt, wkt ), "Expected:\n%s\nGot:\n%s\n" % (expwkt, wkt )
|
||||||
@ -775,19 +774,16 @@ class TestQgsGeometry(TestCase):
|
|||||||
assert not multipoint.deleteVertex(-1), "MULTIPOINT delete at -1 unexpectedly succeeded"
|
assert not multipoint.deleteVertex(-1), "MULTIPOINT delete at -1 unexpectedly succeeded"
|
||||||
|
|
||||||
assert multipoint.deleteVertex(1), "MULTIPOINT delete at 1 failed"
|
assert multipoint.deleteVertex(1), "MULTIPOINT delete at 1 failed"
|
||||||
|
|
||||||
expwkt = "MULTIPOINT(4 4, 6 6, 7 7)"
|
expwkt = "MULTIPOINT(4 4, 6 6, 7 7)"
|
||||||
wkt = multipoint.exportToWkt()
|
wkt = multipoint.exportToWkt()
|
||||||
assert compareWkt( expwkt, wkt ), "Expected:\n%s\nGot:\n%s\n" % (expwkt, wkt )
|
assert compareWkt( expwkt, wkt ), "Expected:\n%s\nGot:\n%s\n" % (expwkt, wkt )
|
||||||
|
|
||||||
assert multipoint.deleteVertex(2), "MULTIPOINT delete at 2 failed"
|
assert multipoint.deleteVertex(2), "MULTIPOINT delete at 2 failed"
|
||||||
|
|
||||||
expwkt = "MULTIPOINT(4 4, 6 6)"
|
expwkt = "MULTIPOINT(4 4, 6 6)"
|
||||||
wkt = multipoint.exportToWkt()
|
wkt = multipoint.exportToWkt()
|
||||||
assert compareWkt( expwkt, wkt ), "Expected:\n%s\nGot:\n%s\n" % (expwkt, wkt )
|
assert compareWkt( expwkt, wkt ), "Expected:\n%s\nGot:\n%s\n" % (expwkt, wkt )
|
||||||
|
|
||||||
assert multipoint.deleteVertex(0), "MULTIPOINT delete at 2 failed"
|
assert multipoint.deleteVertex(0), "MULTIPOINT delete at 2 failed"
|
||||||
|
|
||||||
expwkt = "MULTIPOINT(6 6)"
|
expwkt = "MULTIPOINT(6 6)"
|
||||||
wkt = multipoint.exportToWkt()
|
wkt = multipoint.exportToWkt()
|
||||||
assert compareWkt( expwkt, wkt ), "Expected:\n%s\nGot:\n%s\n" % (expwkt, wkt )
|
assert compareWkt( expwkt, wkt ), "Expected:\n%s\nGot:\n%s\n" % (expwkt, wkt )
|
||||||
@ -852,6 +848,49 @@ class TestQgsGeometry(TestCase):
|
|||||||
assert not polyline.deleteVertex( -5 ), "Delete vertex -5 unexpectedly succeeded"
|
assert not polyline.deleteVertex( -5 ), "Delete vertex -5 unexpectedly succeeded"
|
||||||
assert not polyline.deleteVertex( 100 ), "Delete vertex 100 unexpectedly succeeded"
|
assert not polyline.deleteVertex( 100 ), "Delete vertex 100 unexpectedly succeeded"
|
||||||
|
|
||||||
|
# 2-3 6-+-7
|
||||||
|
# | | | |
|
||||||
|
# 0-1 4 5 8-9
|
||||||
|
polyline = QgsGeometry.fromWkt("MULTILINESTRING((0 0, 1 0, 1 1, 2 1,2 0),(3 0, 3 1, 5 1, 5 0, 6 0))")
|
||||||
|
assert polyline.deleteVertex(5), "Delete vertex 5 failed"
|
||||||
|
expwkt = "MULTILINESTRING((0 0, 1 0, 1 1, 2 1, 2 0), (3 1, 5 1, 5 0, 6 0))"
|
||||||
|
wkt = polyline.exportToWkt()
|
||||||
|
assert compareWkt( expwkt, wkt ), "Expected:\n%s\nGot:\n%s\n" % (expwkt, wkt )
|
||||||
|
|
||||||
|
assert not polyline.deleteVertex(-100), "Delete vertex -100 unexpectedly succeeded"
|
||||||
|
assert not polyline.deleteVertex(100), "Delete vertex 100 unexpectedly succeeded"
|
||||||
|
|
||||||
|
assert polyline.deleteVertex(0), "Delete vertex 0 failed"
|
||||||
|
expwkt = "MULTILINESTRING((1 0, 1 1, 2 1, 2 0), (3 1, 5 1, 5 0, 6 0))"
|
||||||
|
wkt = polyline.exportToWkt()
|
||||||
|
assert compareWkt( expwkt, wkt ), "Expected:\n%s\nGot:\n%s\n" % (expwkt, wkt )
|
||||||
|
|
||||||
|
# 5---4
|
||||||
|
# | |
|
||||||
|
# | 2-3
|
||||||
|
# | |
|
||||||
|
# 0-1
|
||||||
|
polygon = QgsGeometry.fromWkt("POLYGON((0 0, 1 0, 1 1, 2 1, 2 2, 0 2, 0 0))")
|
||||||
|
|
||||||
|
assert polygon.deleteVertex(2), "Delete vertex 2 failed"
|
||||||
|
print "FIXME: exportToWkt doesn't put a blanks behind the comma"
|
||||||
|
expwkt = "POLYGON((0 0,1 0,2 1,2 2,0 2,0 0))"
|
||||||
|
wkt = polygon.exportToWkt()
|
||||||
|
assert compareWkt( expwkt, wkt ), "Expected:\n%s\nGot:\n%s\n" % (expwkt, wkt )
|
||||||
|
|
||||||
|
assert polygon.deleteVertex(0), "Delete vertex 0 failed"
|
||||||
|
expwkt = "POLYGON((1 0,2 1,2 2,0 2,1 0))"
|
||||||
|
wkt = polygon.exportToWkt()
|
||||||
|
assert compareWkt( expwkt, wkt ), "Expected:\n%s\nGot:\n%s\n" % (expwkt, wkt )
|
||||||
|
|
||||||
|
assert polygon.deleteVertex(4), "Delete vertex 4 failed"
|
||||||
|
expwkt = "POLYGON((2 1,2 2,0 2,2 1))"
|
||||||
|
wkt = polygon.exportToWkt()
|
||||||
|
assert compareWkt( expwkt, wkt ), "Expected:\n%s\nGot:\n%s\n" % (expwkt, wkt )
|
||||||
|
|
||||||
|
assert not polygon.deleteVertex(-100), "Delete vertex -100 unexpectedly succeeded"
|
||||||
|
assert not polygon.deleteVertex(100), "Delete vertex 100 unexpectedly succeeded"
|
||||||
|
|
||||||
# 5-+-4 0-+-9
|
# 5-+-4 0-+-9
|
||||||
# | | | |
|
# | | | |
|
||||||
# 6 2-3 1-2 +
|
# 6 2-3 1-2 +
|
||||||
|
Loading…
x
Reference in New Issue
Block a user