Skip to content

Commit d1e83b5

Browse files
committedDec 27, 2017
Fix some handling of wkb types which is broken for z/m type geometries
1 parent 060a36b commit d1e83b5

File tree

6 files changed

+132
-124
lines changed

6 files changed

+132
-124
lines changed
 

‎src/app/qgsmaptooldeletepart.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -136,13 +136,13 @@ QgsGeometry QgsMapToolDeletePart::partUnderPoint( QPoint point, QgsFeatureId &fi
136136
fid = match.featureId();
137137
return QgsGeometry::fromPointXY( match.point() );
138138
}
139-
if ( g.wkbType() == QgsWkbTypes::MultiPoint || g.wkbType() == QgsWkbTypes::MultiPoint25D )
139+
else if ( QgsWkbTypes::geometryType( g.wkbType() ) == QgsWkbTypes::PointGeometry )
140140
{
141141
fid = match.featureId();
142142
partNum = snapVertex;
143143
return QgsGeometry::fromPointXY( match.point() );
144144
}
145-
if ( g.wkbType() == QgsWkbTypes::MultiLineString || g.wkbType() == QgsWkbTypes::MultiLineString25D )
145+
else if ( QgsWkbTypes::geometryType( g.wkbType() ) == QgsWkbTypes::LineGeometry )
146146
{
147147
QgsMultiPolylineXY mline = g.asMultiPolyline();
148148
for ( int part = 0; part < mline.count(); part++ )

‎src/app/qgsmaptooldeletering.cpp

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -133,9 +133,10 @@ QgsGeometry QgsMapToolDeleteRing::ringUnderPoint( const QgsPointXY &p, QgsFeatur
133133
while ( fit.nextFeature( f ) )
134134
{
135135
g = f.geometry();
136-
if ( g.isNull() )
136+
if ( g.isNull() || QgsWkbTypes::geometryType( g.wkbType() ) != QgsWkbTypes::PolygonGeometry )
137137
continue;
138-
if ( g.wkbType() == QgsWkbTypes::Polygon || g.wkbType() == QgsWkbTypes::Polygon25D )
138+
139+
if ( !QgsWkbTypes::isMultiType( g.wkbType() ) )
139140
{
140141
pol = QgsMultiPolygonXY() << g.asPolygon();
141142
}
@@ -178,16 +179,17 @@ void QgsMapToolDeleteRing::deleteRing( QgsFeatureId fId, int beforeVertexNr, Qgs
178179
QgsWkbTypes::Type wkbtype = g.wkbType();
179180
int ringNum, partNum = 0;
180181

181-
if ( wkbtype == QgsWkbTypes::Polygon || wkbtype == QgsWkbTypes::Polygon25D )
182+
if ( QgsWkbTypes::geometryType( wkbtype ) != QgsWkbTypes::PolygonGeometry )
183+
return;
184+
185+
if ( !QgsWkbTypes::isMultiType( wkbtype ) )
182186
{
183187
ringNum = ringNumInPolygon( g, beforeVertexNr );
184188
}
185-
else if ( wkbtype == QgsWkbTypes::MultiPolygon || wkbtype == QgsWkbTypes::MultiPolygon25D )
189+
else
186190
{
187191
ringNum = ringNumInMultiPolygon( g, beforeVertexNr, partNum );
188192
}
189-
else
190-
return;
191193

192194
QgsGeometry editableGeom = f.geometry();
193195
if ( editableGeom.deleteRing( ringNum, partNum ) )

‎src/app/qgsmaptoolfillring.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -198,11 +198,11 @@ QgsGeometry QgsMapToolFillRing::ringUnderPoint( const QgsPointXY &p, QgsFeatureI
198198
while ( fit.nextFeature( f ) )
199199
{
200200
QgsGeometry g = f.geometry();
201-
if ( g.isNull() )
201+
if ( g.isNull() || QgsWkbTypes::geometryType( g.wkbType() ) != QgsWkbTypes::PolygonGeometry )
202202
continue;
203203

204204
QgsMultiPolygonXY pol;
205-
if ( g.wkbType() == QgsWkbTypes::Polygon || g.wkbType() == QgsWkbTypes::Polygon25D )
205+
if ( !QgsWkbTypes::isMultiType( g.wkbType() ) )
206206
{
207207
pol = QgsMultiPolygonXY() << g.asPolygon();
208208
}

‎src/core/qgsvectorlayereditutils.cpp

Lines changed: 51 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -513,81 +513,53 @@ int QgsVectorLayerEditUtils::addTopologicalPoints( const QgsGeometry &geom )
513513

514514
QgsWkbTypes::Type wkbType = geom.wkbType();
515515

516-
switch ( wkbType )
516+
switch ( QgsWkbTypes::geometryType( wkbType ) )
517517
{
518518
//line
519-
case QgsWkbTypes::LineString25D:
520-
case QgsWkbTypes::LineString:
519+
case QgsWkbTypes::LineGeometry:
521520
{
522-
QgsPolylineXY line = geom.asPolyline();
523-
QgsPolylineXY::const_iterator line_it = line.constBegin();
524-
for ( ; line_it != line.constEnd(); ++line_it )
521+
if ( !QgsWkbTypes::isMultiType( wkbType ) )
525522
{
526-
if ( addTopologicalPoints( *line_it ) != 0 )
527-
{
528-
returnVal = 2;
529-
}
530-
}
531-
break;
532-
}
533-
534-
//multiline
535-
case QgsWkbTypes::MultiLineString25D:
536-
case QgsWkbTypes::MultiLineString:
537-
{
538-
QgsMultiPolylineXY multiLine = geom.asMultiPolyline();
539-
QgsPolylineXY currentPolyline;
540-
541-
for ( int i = 0; i < multiLine.size(); ++i )
542-
{
543-
QgsPolylineXY::const_iterator line_it = currentPolyline.constBegin();
544-
for ( ; line_it != currentPolyline.constEnd(); ++line_it )
523+
QgsPolylineXY line = geom.asPolyline();
524+
QgsPolylineXY::const_iterator line_it = line.constBegin();
525+
for ( ; line_it != line.constEnd(); ++line_it )
545526
{
546527
if ( addTopologicalPoints( *line_it ) != 0 )
547528
{
548529
returnVal = 2;
549530
}
550531
}
551532
}
552-
break;
553-
}
554-
555-
//polygon
556-
case QgsWkbTypes::Polygon25D:
557-
case QgsWkbTypes::Polygon:
558-
{
559-
QgsPolygonXY polygon = geom.asPolygon();
560-
QgsPolylineXY currentRing;
561-
562-
for ( int i = 0; i < polygon.size(); ++i )
533+
else
563534
{
564-
currentRing = polygon.at( i );
565-
QgsPolylineXY::const_iterator line_it = currentRing.constBegin();
566-
for ( ; line_it != currentRing.constEnd(); ++line_it )
535+
QgsMultiPolylineXY multiLine = geom.asMultiPolyline();
536+
QgsPolylineXY currentPolyline;
537+
538+
for ( int i = 0; i < multiLine.size(); ++i )
567539
{
568-
if ( addTopologicalPoints( *line_it ) != 0 )
540+
QgsPolylineXY::const_iterator line_it = currentPolyline.constBegin();
541+
for ( ; line_it != currentPolyline.constEnd(); ++line_it )
569542
{
570-
returnVal = 2;
543+
if ( addTopologicalPoints( *line_it ) != 0 )
544+
{
545+
returnVal = 2;
546+
}
571547
}
572548
}
573549
}
574550
break;
575551
}
576552

577-
//multipolygon
578-
case QgsWkbTypes::MultiPolygon25D:
579-
case QgsWkbTypes::MultiPolygon:
553+
case QgsWkbTypes::PolygonGeometry:
580554
{
581-
QgsMultiPolygonXY multiPolygon = geom.asMultiPolygon();
582-
QgsPolygonXY currentPolygon;
583-
QgsPolylineXY currentRing;
584-
585-
for ( int i = 0; i < multiPolygon.size(); ++i )
555+
if ( !QgsWkbTypes::isMultiType( wkbType ) )
586556
{
587-
currentPolygon = multiPolygon.at( i );
588-
for ( int j = 0; j < currentPolygon.size(); ++j )
557+
QgsPolygonXY polygon = geom.asPolygon();
558+
QgsPolylineXY currentRing;
559+
560+
for ( int i = 0; i < polygon.size(); ++i )
589561
{
590-
currentRing = currentPolygon.at( j );
562+
currentRing = polygon.at( i );
591563
QgsPolylineXY::const_iterator line_it = currentRing.constBegin();
592564
for ( ; line_it != currentRing.constEnd(); ++line_it )
593565
{
@@ -598,9 +570,35 @@ int QgsVectorLayerEditUtils::addTopologicalPoints( const QgsGeometry &geom )
598570
}
599571
}
600572
}
573+
else
574+
{
575+
QgsMultiPolygonXY multiPolygon = geom.asMultiPolygon();
576+
QgsPolygonXY currentPolygon;
577+
QgsPolylineXY currentRing;
578+
579+
for ( int i = 0; i < multiPolygon.size(); ++i )
580+
{
581+
currentPolygon = multiPolygon.at( i );
582+
for ( int j = 0; j < currentPolygon.size(); ++j )
583+
{
584+
currentRing = currentPolygon.at( j );
585+
QgsPolylineXY::const_iterator line_it = currentRing.constBegin();
586+
for ( ; line_it != currentRing.constEnd(); ++line_it )
587+
{
588+
if ( addTopologicalPoints( *line_it ) != 0 )
589+
{
590+
returnVal = 2;
591+
}
592+
}
593+
}
594+
}
595+
}
601596
break;
602597
}
603-
default:
598+
599+
case QgsWkbTypes::PointGeometry:
600+
case QgsWkbTypes::UnknownGeometry:
601+
case QgsWkbTypes::NullGeometry:
604602
break;
605603
}
606604
return returnVal;

‎src/gui/symbology/qgspointdisplacementrendererwidget.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ QgsPointDisplacementRendererWidget::QgsPointDisplacementRendererWidget( QgsVecto
4040
}
4141

4242
//the renderer only applies to point vector layers
43-
if ( layer->wkbType() != QgsWkbTypes::Point && layer->wkbType() != QgsWkbTypes::Point25D )
43+
if ( QgsWkbTypes::geometryType( layer->wkbType() ) != QgsWkbTypes::PointGeometry || QgsWkbTypes::isMultiType( layer->wkbType() ) )
4444
{
4545
//setup blank dialog
4646
mRenderer = nullptr;

‎src/plugins/topology/topolTest.cpp

Lines changed: 68 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -1006,96 +1006,73 @@ ErrorList topolTest::checkSegmentLength( double tolerance, QgsVectorLayer *layer
10061006

10071007

10081008
// switching by type here, because layer can contain both single and multi version geometries
1009-
switch ( g1.wkbType() )
1009+
switch ( QgsWkbTypes::geometryType( g1.wkbType() ) )
10101010
{
1011-
case QgsWkbTypes::LineString:
1012-
case QgsWkbTypes::LineString25D:
1013-
ls = g1.asPolyline();
1014-
1015-
1016-
for ( int i = 1; i < ls.size(); ++i )
1011+
case QgsWkbTypes::LineGeometry:
1012+
{
1013+
if ( !QgsWkbTypes::isMultiType( g1.wkbType() ) )
10171014
{
1018-
distance = std::sqrt( ls[i - 1].sqrDist( ls[i] ) );
1019-
if ( distance < tolerance )
1020-
{
1021-
fls.clear();
1022-
fls << *it << *it;
1023-
segm.clear();
1024-
segm << ls[i - 1] << ls[i];
1025-
QgsGeometry conflict = QgsGeometry::fromPolylineXY( segm );
1026-
err = new TopolErrorShort( g1.boundingBox(), conflict, fls );
1027-
//err = new TopolErrorShort(g1->boundingBox(), QgsGeometry::fromPolyline(segm), fls);
1028-
errorList << err;
1029-
//break on getting the first error
1030-
break;
1031-
}
1032-
}
1033-
break;
1015+
ls = g1.asPolyline();
10341016

1035-
case QgsWkbTypes::Polygon:
1036-
case QgsWkbTypes::Polygon25D:
1037-
pol = g1.asPolygon();
10381017

1039-
for ( int i = 0; i < pol.size(); ++i )
1040-
{
1041-
for ( int j = 1; j < pol[i].size(); ++j )
1018+
for ( int i = 1; i < ls.size(); ++i )
10421019
{
1043-
distance = std::sqrt( pol[i][j - 1].sqrDist( pol[i][j] ) );
1020+
distance = std::sqrt( ls[i - 1].sqrDist( ls[i] ) );
10441021
if ( distance < tolerance )
10451022
{
10461023
fls.clear();
10471024
fls << *it << *it;
10481025
segm.clear();
1049-
segm << pol[i][j - 1] << pol[i][j];
1026+
segm << ls[i - 1] << ls[i];
10501027
QgsGeometry conflict = QgsGeometry::fromPolylineXY( segm );
10511028
err = new TopolErrorShort( g1.boundingBox(), conflict, fls );
1029+
//err = new TopolErrorShort(g1->boundingBox(), QgsGeometry::fromPolyline(segm), fls);
10521030
errorList << err;
10531031
//break on getting the first error
10541032
break;
10551033
}
10561034
}
10571035
}
1058-
1059-
break;
1060-
1061-
case QgsWkbTypes::MultiLineString:
1062-
case QgsWkbTypes::MultiLineString25D:
1063-
mls = g1.asMultiPolyline();
1064-
1065-
for ( int k = 0; k < mls.size(); ++k )
1036+
else
10661037
{
1067-
QgsPolylineXY &ls = mls[k];
1068-
for ( int i = 1; i < ls.size(); ++i )
1038+
mls = g1.asMultiPolyline();
1039+
1040+
for ( int k = 0; k < mls.size(); ++k )
10691041
{
1070-
distance = std::sqrt( ls[i - 1].sqrDist( ls[i] ) );
1071-
if ( distance < tolerance )
1042+
QgsPolylineXY &ls = mls[k];
1043+
for ( int i = 1; i < ls.size(); ++i )
10721044
{
1073-
fls.clear();
1074-
fls << *it << *it;
1075-
segm.clear();
1076-
segm << ls[i - 1] << ls[i];
1077-
QgsGeometry conflict = QgsGeometry::fromPolylineXY( segm );
1078-
err = new TopolErrorShort( g1.boundingBox(), conflict, fls );
1079-
errorList << err;
1080-
//break on getting the first error
1081-
break;
1045+
distance = std::sqrt( ls[i - 1].sqrDist( ls[i] ) );
1046+
if ( distance < tolerance )
1047+
{
1048+
fls.clear();
1049+
fls << *it << *it;
1050+
segm.clear();
1051+
segm << ls[i - 1] << ls[i];
1052+
QgsGeometry conflict = QgsGeometry::fromPolylineXY( segm );
1053+
err = new TopolErrorShort( g1.boundingBox(), conflict, fls );
1054+
errorList << err;
1055+
//break on getting the first error
1056+
break;
1057+
}
10821058
}
10831059
}
10841060
}
10851061
break;
1062+
}
10861063

1087-
case QgsWkbTypes::MultiPolygon:
1088-
case QgsWkbTypes::MultiPolygon25D:
1089-
mpol = g1.asMultiPolygon();
1090-
1091-
for ( int k = 0; k < mpol.size(); ++k )
1064+
case QgsWkbTypes::PolygonGeometry:
1065+
{
1066+
if ( !QgsWkbTypes::isMultiType( g1.wkbType() ) )
10921067
{
1093-
QgsPolygonXY &pol = mpol[k];
1068+
1069+
pol = g1.asPolygon();
1070+
10941071
for ( int i = 0; i < pol.size(); ++i )
10951072
{
10961073
for ( int j = 1; j < pol[i].size(); ++j )
10971074
{
1098-
distance = pol[i][j - 1].sqrDist( pol[i][j] );
1075+
distance = std::sqrt( pol[i][j - 1].sqrDist( pol[i][j] ) );
10991076
if ( distance < tolerance )
11001077
{
11011078
fls.clear();
@@ -1111,9 +1088,40 @@ ErrorList topolTest::checkSegmentLength( double tolerance, QgsVectorLayer *layer
11111088
}
11121089
}
11131090
}
1091+
else
1092+
{
1093+
mpol = g1.asMultiPolygon();
1094+
1095+
for ( int k = 0; k < mpol.size(); ++k )
1096+
{
1097+
QgsPolygonXY &pol = mpol[k];
1098+
for ( int i = 0; i < pol.size(); ++i )
1099+
{
1100+
for ( int j = 1; j < pol[i].size(); ++j )
1101+
{
1102+
distance = pol[i][j - 1].sqrDist( pol[i][j] );
1103+
if ( distance < tolerance )
1104+
{
1105+
fls.clear();
1106+
fls << *it << *it;
1107+
segm.clear();
1108+
segm << pol[i][j - 1] << pol[i][j];
1109+
QgsGeometry conflict = QgsGeometry::fromPolylineXY( segm );
1110+
err = new TopolErrorShort( g1.boundingBox(), conflict, fls );
1111+
errorList << err;
1112+
//break on getting the first error
1113+
break;
1114+
}
1115+
}
1116+
}
1117+
}
1118+
}
11141119
break;
1120+
}
11151121

1116-
default:
1122+
case QgsWkbTypes::PointGeometry:
1123+
case QgsWkbTypes::UnknownGeometry:
1124+
case QgsWkbTypes::NullGeometry:
11171125
continue;
11181126
}
11191127
}

0 commit comments

Comments
 (0)
Please sign in to comment.