bool QgsGeometryCollection::fromCollectionWkt( const QString &wkt, const QVector<QgsAbstractGeometry *> &subtypes, const QString &defaultChildWkbType ) { clear(); QPair<QgsWkbTypes::Type, QString> parts = QgsGeometryUtils::wktReadBlock( wkt ); if ( QgsWkbTypes::flatType( parts.first ) != QgsWkbTypes::flatType( wkbType() ) ) { qDeleteAll( subtypes ); return false; } mWkbType = parts.first; QString defChildWkbType = QStringLiteral( "%1%2%3 " ).arg( defaultChildWkbType, is3D() ? QStringLiteral( "Z" ) : QString(), isMeasure() ? QStringLiteral( "M" ) : QString() ); const QStringList blocks = QgsGeometryUtils::wktGetChildBlocks( parts.second, defChildWkbType ); for ( const QString &childWkt : blocks ) { QPair<QgsWkbTypes::Type, QString> childParts = QgsGeometryUtils::wktReadBlock( childWkt ); bool success = false; for ( const QgsAbstractGeometry *geom : subtypes ) { if ( QgsWkbTypes::flatType( childParts.first ) == QgsWkbTypes::flatType( geom->wkbType() ) ) { mGeometries.append( geom->clone() ); if ( mGeometries.back()->fromWkt( childWkt ) ) { success = true; break; } } } if ( !success ) { clear(); qDeleteAll( subtypes ); return false; } } qDeleteAll( subtypes ); //scan through geometries and check if dimensionality of geometries is different to collection. //if so, update the type dimensionality of the collection to match bool hasZ = false; bool hasM = false; for ( QgsAbstractGeometry *geom : qgis::as_const( mGeometries ) ) { hasZ = hasZ || geom->is3D(); hasM = hasM || geom->isMeasure(); if ( hasZ && hasM ) break; } if ( hasZ ) addZValue( 0 ); if ( hasM ) addMValue( 0 ); return true; }
bool QgsTriangle::fromWkt( const QString &wkt ) { clear(); QPair<QgsWkbTypes::Type, QString> parts = QgsGeometryUtils::wktReadBlock( wkt ); if ( QgsWkbTypes::geometryType( parts.first ) != QgsWkbTypes::PolygonGeometry ) return false; mWkbType = parts.first; QString defaultChildWkbType = QStringLiteral( "LineString%1%2" ).arg( is3D() ? QStringLiteral( "Z" ) : QString(), isMeasure() ? QStringLiteral( "M" ) : QString() ); const QStringList blocks = QgsGeometryUtils::wktGetChildBlocks( parts.second, defaultChildWkbType ); for ( const QString &childWkt : blocks ) { QPair<QgsWkbTypes::Type, QString> childParts = QgsGeometryUtils::wktReadBlock( childWkt ); QgsWkbTypes::Type flatCurveType = QgsWkbTypes::flatType( childParts.first ); if ( flatCurveType == QgsWkbTypes::LineString ) mInteriorRings.append( new QgsLineString() ); else { clear(); return false; } if ( !mInteriorRings.back()->fromWkt( childWkt ) ) { clear(); return false; } } if ( mInteriorRings.isEmpty() ) { clear(); return false; } mExteriorRing.reset( mInteriorRings.takeFirst() ); //scan through rings and check if dimensionality of rings is different to CurvePolygon. //if so, update the type dimensionality of the CurvePolygon to match bool hasZ = false; bool hasM = false; if ( mExteriorRing ) { hasZ = hasZ || mExteriorRing->is3D(); hasM = hasM || mExteriorRing->isMeasure(); } if ( hasZ ) addZValue( 0 ); if ( hasM ) addMValue( 0 ); return true; }
bool QgsCompoundCurve::fromWkt( const QString &wkt ) { clear(); QPair<QgsWkbTypes::Type, QString> parts = QgsGeometryUtils::wktReadBlock( wkt ); if ( QgsWkbTypes::flatType( parts.first ) != QgsWkbTypes::CompoundCurve ) return false; mWkbType = parts.first; QString defaultChildWkbType = QStringLiteral( "LineString%1%2" ).arg( is3D() ? QStringLiteral( "Z" ) : QString(), isMeasure() ? QStringLiteral( "M" ) : QString() ); const QStringList blocks = QgsGeometryUtils::wktGetChildBlocks( parts.second, defaultChildWkbType ); for ( const QString &childWkt : blocks ) { QPair<QgsWkbTypes::Type, QString> childParts = QgsGeometryUtils::wktReadBlock( childWkt ); if ( QgsWkbTypes::flatType( childParts.first ) == QgsWkbTypes::LineString ) mCurves.append( new QgsLineString() ); else if ( QgsWkbTypes::flatType( childParts.first ) == QgsWkbTypes::CircularString ) mCurves.append( new QgsCircularString() ); else { clear(); return false; } if ( !mCurves.back()->fromWkt( childWkt ) ) { clear(); return false; } } //scan through curves and check if dimensionality of curves is different to compound curve. //if so, update the type dimensionality of the compound curve to match bool hasZ = false; bool hasM = false; for ( const QgsCurve *curve : qgis::as_const( mCurves ) ) { hasZ = hasZ || curve->is3D(); hasM = hasM || curve->isMeasure(); if ( hasZ && hasM ) break; } if ( hasZ ) addZValue( 0 ); if ( hasM ) addMValue( 0 ); return true; }