66#include "moc_qgsmaptoolidentify.cpp"
105 return identify( x, y, mode, QList<QgsMapLayer *>(), layerType, identifyContext );
115 return identify( geometry, mode, QList<QgsMapLayer *>(), layerType, identifyContext );
120 QList<IdentifyResult> results;
122 mLastGeometry = geometry;
123 mLastExtent =
mCanvas->extent();
124 mLastMapUnitsPerPixel =
mCanvas->mapUnitsPerPixel();
126 mCoordinatePrecision = QgsCoordinateUtils::calculateCoordinatePrecision( mLastMapUnitsPerPixel,
mCanvas->mapSettings().destinationCrs() );
137 int x = canvasPt.x(), y = canvasPt.y();
138 QList<IdentifyResult> results =
identify( x, y,
TopDownAll, layerList, layerType, identifyContext );
139 QPoint globalPos =
mCanvas->mapToGlobal( QPoint( x + 5, y + 5 ) );
142 else if ( mode ==
ActiveLayer && layerList.isEmpty() )
148 emit
identifyMessage( tr(
"No active layer. To identify features, you must choose an active layer." ) );
154 QApplication::setOverrideCursor( Qt::WaitCursor );
156 identifyLayer( &results,
layer, mLastGeometry, mLastExtent, mLastMapUnitsPerPixel, layerType, identifyContext );
160 QApplication::setOverrideCursor( Qt::WaitCursor );
162 QList<QgsMapLayer *> targetLayers;
163 if ( layerList.isEmpty() )
164 targetLayers =
mCanvas->layers(
true );
166 targetLayers = layerList;
168 const int layerCount = targetLayers.size();
169 for (
int i = 0; i < layerCount; i++ )
179 if (
identifyLayer( &results,
layer, mLastGeometry, mLastExtent, mLastMapUnitsPerPixel, layerType, identifyContext ) )
190 QApplication::restoreOverrideCursor();
197 mPropertiesOverrides.searchRadiusMapUnits = searchRadiusMapUnits;
202 mPropertiesOverrides.searchRadiusMapUnits = -1;
203 mPropertiesOverrides.skip3DLayers =
false;
208 mPropertiesOverrides = overrides;
214 mPropertiesOverrides.skip3DLayers =
false;
246 return identifyRasterLayer( results, qobject_cast<QgsRasterLayer *>(
layer ), geometry, viewExtent, mapUnitsPerPixel, identifyContext );
260 return identifyVectorTileLayer( results, qobject_cast<QgsVectorTileLayer *>(
layer ), geometry, identifyContext );
267 return identifyPointCloudLayer( results, qobject_cast<QgsPointCloudLayer *>(
layer ), geometry, identifyContext );
298 if ( mPropertiesOverrides.skip3DLayers &&
layer->renderer3D() )
303 if ( !
layer->elevationProperties()->isVisibleInZRange( identifyContext.
zRange() ) )
307 double searchRadius = mPropertiesOverrides.searchRadiusMapUnits < 0 ?
searchRadiusMU(
mCanvas ) : mPropertiesOverrides.searchRadiusMapUnits;
308 bool isTemporal = identifyContext.
isTemporal() &&
layer->temporalProperties()->isActive();
310 QList<QgsMeshDatasetIndex> datasetIndexList;
311 int activeScalarGroup =
layer->rendererSettings().activeScalarDatasetGroup();
312 int activeVectorGroup =
layer->rendererSettings().activeVectorDatasetGroup();
314 const QList<int> allGroup =
layer->enabledDatasetGroupsIndexes();
318 if ( activeScalarGroup >= 0 )
319 datasetIndexList.append(
layer->activeScalarDatasetAtTime( time ) );
320 if ( activeVectorGroup >= 0 && activeVectorGroup != activeScalarGroup )
321 datasetIndexList.append(
layer->activeVectorDatasetAtTime( time ) );
323 for (
int groupIndex : allGroup )
325 if ( groupIndex != activeScalarGroup && groupIndex != activeVectorGroup )
326 datasetIndexList.append(
layer->datasetIndexAtTime( time, groupIndex ) );
332 if ( activeScalarGroup >= 0 )
333 datasetIndexList.append(
layer->staticScalarDatasetIndex() );
334 if ( activeVectorGroup >= 0 && activeVectorGroup != activeScalarGroup )
335 datasetIndexList.append(
layer->staticVectorDatasetIndex() );
338 for (
int groupIndex : allGroup )
340 if ( groupIndex != activeScalarGroup && groupIndex != activeVectorGroup )
342 if ( !
layer->datasetGroupMetadata( groupIndex ).isTemporal() )
343 datasetIndexList.append( groupIndex );
351 if ( !index.isValid() )
355 QMap<QString, QString> derivedAttributes;
357 QMap<QString, QString> attribute;
361 const double scalar = scalarValue.
scalar();
362 attribute.insert( tr(
"Scalar Value" ), std::isnan( scalar ) ? tr(
"no data" ) : QLocale().toString( scalar ) );
368 const double vectorX = vectorValue.
x();
369 const double vectorY = vectorValue.
y();
370 if ( std::isnan( vectorX ) || std::isnan( vectorY ) )
371 attribute.insert( tr(
"Vector Value" ), tr(
"no data" ) );
374 attribute.insert( tr(
"Vector Magnitude" ), QLocale().toString( vectorValue.
scalar() ) );
375 derivedAttributes.insert( tr(
"Vector x-component" ), QLocale().toString( vectorY ) );
376 derivedAttributes.insert( tr(
"Vector y-component" ), QLocale().toString( vectorX ) );
383 derivedAttributes.insert( tr(
"Time Step" ),
layer->formatTime( meta.
time() ) );
384 derivedAttributes.insert( tr(
"Source" ), groupMeta.
uri() );
386 QString resultName = groupMeta.
name();
387 if ( isTemporal && ( index.group() == activeScalarGroup || index.group() == activeVectorGroup ) )
388 resultName.append( tr(
" (active)" ) );
392 results->append( result );
395 QMap<QString, QString> derivedGeometry;
398 const int vertexId =
layer->closestElement(
QgsMesh::Vertex, point, searchRadius, vertexPoint );
401 derivedGeometry.insert( tr(
"Snapped Vertex Index" ), QLocale().toString( vertexId ) );
402 derivedGeometry.insert( tr(
"Snapped Vertex Position X" ), QLocale().toString( vertexPoint.
x() ) );
403 derivedGeometry.insert( tr(
"Snapped Vertex Position Y" ), QLocale().toString( vertexPoint.
y() ) );
407 const int faceId =
layer->closestElement(
QgsMesh::Face, point, searchRadius, faceCentroid );
410 derivedGeometry.insert( tr(
"Face Index" ), QLocale().toString( faceId ) );
411 derivedGeometry.insert( tr(
"Face Centroid X" ), QLocale().toString( faceCentroid.
x() ) );
412 derivedGeometry.insert( tr(
"Face Centroid Y" ), QLocale().toString( faceCentroid.
y() ) );
416 const int edgeId =
layer->closestElement(
QgsMesh::Edge, point, searchRadius, pointOnEdge );
419 derivedGeometry.insert( tr(
"Edge Index" ), QLocale().toString( edgeId ) );
420 derivedGeometry.insert( tr(
"Point on Edge X" ), QLocale().toString( pointOnEdge.
x() ) );
421 derivedGeometry.insert( tr(
"Point on Edge Y" ), QLocale().toString( pointOnEdge.
y() ) );
426 results->append( result );
433 Q_UNUSED( identifyContext )
443 QgsTemporaryCursorOverride waitCursor( Qt::WaitCursor );
445 QMap<QString, QString> commonDerivedAttributes;
447 QgsGeometry selectionGeom = geometry;
448 bool isPointOrRectangle;
453 isPointOrRectangle =
true;
454 point = selectionGeom.
asPoint();
464 int featureCount = 0;
466 std::unique_ptr<QgsGeometryEngine> selectionGeomPrepared;
476 double sr = mPropertiesOverrides.searchRadiusMapUnits < 0 ?
searchRadiusMU(
mCanvas ) : mPropertiesOverrides.searchRadiusMapUnits;
483 if ( !isPointOrRectangle )
485 QgsCoordinateTransform ct(
mCanvas->mapSettings().destinationCrs(),
layer->crs(),
mCanvas->mapSettings().transformContext() );
494 const double tileScale =
layer->tileMatrixSet().calculateTileScaleForMap(
496 mCanvas->mapSettings().destinationCrs(),
497 mCanvas->mapSettings().extent(),
502 const int tileZoom =
layer->tileMatrixSet().scaleToZoomLevel( tileScale );
503 const QgsTileMatrix tileMatrix =
layer->tileMatrixSet().tileMatrix( tileZoom );
506 const QVector<QgsTileXYZ> tiles =
layer->tileMatrixSet().tilesInRange( tileRange, tileZoom );
508 for (
const QgsTileXYZ &tileID : tiles )
510 const QgsVectorTileRawData data =
layer->getRawTile( tileID );
511 if ( data.
data.isEmpty() )
514 QgsVectorTileMVTDecoder decoder(
layer->tileMatrixSet() );
515 if ( !decoder.decode( data ) )
518 QMap<QString, QgsFields> perLayerFields;
519 const QStringList layerNames = decoder.layers();
520 for (
const QString &layerName : layerNames )
522 QSet<QString> fieldNames = qgis::listToSet( decoder.layerFieldNames( layerName ) );
526 const QgsVectorTileFeatures features = decoder.layerFeatures( perLayerFields, QgsCoordinateTransform() );
527 const QStringList featuresLayerNames = features.keys();
528 for (
const QString &layerName : featuresLayerNames )
530 const QgsFields fFields = perLayerFields[layerName];
531 const QVector<QgsFeature> &layerFeatures = features[layerName];
532 for (
const QgsFeature &f : layerFeatures )
534 if ( f.geometry().intersects( r ) && ( !selectionGeomPrepared || selectionGeomPrepared->intersects( f.geometry().constGet() ) ) )
536 QMap<QString, QString> derivedAttributes = commonDerivedAttributes;
537 derivedAttributes.insert( tr(
"Feature ID" ),
FID_TO_STRING( f.id() ) );
538 derivedAttributes.insert( tr(
"Tile column" ), QString::number( tileID.column() ) );
539 derivedAttributes.insert( tr(
"Tile row" ), QString::number( tileID.row() ) );
540 derivedAttributes.insert( tr(
"Tile zoom" ), QString::number( tileID.zoomLevel() ) );
550 catch ( QgsCsException &cse )
557 return featureCount > 0;
562 if ( mPropertiesOverrides.skip3DLayers &&
layer->renderer3D() )
567 if ( !
layer->elevationProperties()->isVisibleInZRange( identifyContext.
zRange(),
layer ) )
571 QgsPointCloudRenderer *renderer =
layer->renderer();
578 const double searchRadiusMapUnits = mPropertiesOverrides.searchRadiusMapUnits < 0 ?
searchRadiusMU(
mCanvas ) : mPropertiesOverrides.searchRadiusMapUnits;
580 const QVector<QVariantMap> points = renderer->
identify(
layer, context, geometry, searchRadiusMapUnits );
589 QMap<QString, QString> derivedAttributes;
593 formatCoordinate( point, x, y );
595 derivedAttributes.insert( tr(
"(clicked coordinate X)" ), x );
596 derivedAttributes.insert( tr(
"(clicked coordinate Y)" ), y );
598 derivedAttributes.insert( tr(
"(clicked coordinate Z)" ), QLocale().toString( point.
z(),
'f' ) );
599 return derivedAttributes;
616 QString temporalFilter;
619 if ( !
layer->temporalProperties()->isVisibleInTemporalRange( identifyContext.
temporalRange() ) )
622 QgsVectorLayerTemporalContext temporalContext;
624 temporalFilter = qobject_cast<const QgsVectorLayerTemporalProperties *>(
layer->temporalProperties() )->createFilterString( temporalContext, identifyContext.
temporalRange() );
629 QApplication::setOverrideCursor( Qt::WaitCursor );
631 QMap<QString, QString> commonDerivedAttributes;
633 QgsGeometry selectionGeom = geometry;
634 bool isPointOrRectangle;
639 isPointOrRectangle =
true;
651 std::unique_ptr<QgsGeometryEngine> selectionGeomPrepared;
661 double sr = mPropertiesOverrides.searchRadiusMapUnits < 0 ?
searchRadiusMU(
mCanvas ) : mPropertiesOverrides.searchRadiusMapUnits;
668 if ( !isPointOrRectangle )
670 QgsCoordinateTransform ct(
mCanvas->mapSettings().destinationCrs(),
layer->crs(),
mCanvas->mapSettings().transformContext() );
679 QgsFeatureRequest featureRequest;
682 if ( !temporalFilter.isEmpty() )
685 QgsFeatureIterator fit =
layer->getFeatures( featureRequest );
689 if ( !selectionGeomPrepared || selectionGeomPrepared->intersects( f.
geometry().
constGet() ) )
690 featureList << QgsFeature( f );
693 catch ( QgsCsException &cse )
705 std::unique_ptr<QgsFeatureRenderer> renderer(
layer->renderer() ?
layer->renderer()->clone() :
nullptr );
714 if ( !isSingleClick )
717 const int featureCount =
identifyVectorLayer( results,
layer, featureList, filter ? renderer.get() :
nullptr, commonDerivedAttributes, [point,
layer,
this](
const QgsFeature &feature ) -> QMap<QString, QString> { return featureDerivedAttributes( feature, layer, toLayerCoordinates( layer, point ) ); }, context );
723 QApplication::restoreOverrideCursor();
724 return featureCount > 0;
729 int featureCount = 0;
730 for (
const QgsFeature &feature : std::as_const( features ) )
732 QMap<QString, QString> derivedAttributes = commonDerivedAttributes;
740 derivedAttributes.insert( deriveAttributesForFeature( feature ) );
741 derivedAttributes.insert( tr(
"Feature ID" ), fid < 0 ? tr(
"new feature" ) :
FID_TO_STRING( fid ) );
743 results->append(
IdentifyResult( qobject_cast<QgsMapLayer *>(
layer ), feature, derivedAttributes ) );
758 QString str = QLocale().toString( vId.
vertex + 1 );
759 derivedAttributes.insert( tr(
"Closest vertex number" ), str );
761 QgsPoint closestPoint = geometry.
vertexAt( vId );
762 QgsPoint closestPointMapCoords = closestPoint;
763 if ( layerToMapTransform.
isValid() )
769 catch ( QgsCsException &cse )
777 formatCoordinate( closestPointMapCoords, x, y );
778 derivedAttributes.insert( tr(
"Closest vertex X" ), x );
779 derivedAttributes.insert( tr(
"Closest vertex Y" ), y );
781 if ( closestPoint.
is3D() )
783 str = QLocale().toString( closestPoint.
z(),
'g', 10 );
786 if ( showTransformedZ && !std::isnan( closestPointMapCoords.
z() ) && !
qgsDoubleNear( closestPoint.
z(), closestPointMapCoords.
z() ) )
788 const QString str = QLocale().toString( closestPointMapCoords.
z(),
'g', 10 );
794 str = QLocale().toString( closestPointMapCoords.
m(),
'g', 10 );
795 derivedAttributes.insert( tr(
"Closest vertex M" ), str );
800 double radius, centerX, centerY;
801 QgsVertexId vIdBefore = vId;
803 QgsVertexId vIdAfter = vId;
806 derivedAttributes.insert( QStringLiteral(
"Closest vertex radius" ), QLocale().toString( radius ) );
813 QgsPoint closestPointMapCrs = closestPoint;
814 if ( layerToMapTransform.
isValid() )
820 catch ( QgsCsException &cse )
828 formatCoordinate( closestPoint, x, y );
829 derivedAttributes.insert( tr(
"Closest X" ), x );
830 derivedAttributes.insert( tr(
"Closest Y" ), y );
832 if ( closestPoint.
is3D() )
834 const QString str = QLocale().toString( closestPoint.
z(),
'g', 10 );
837 if ( showTransformedZ && !std::isnan( closestPointMapCrs.
z() ) && !
qgsDoubleNear( closestPoint.
z(), closestPointMapCrs.
z() ) )
839 const QString str = QLocale().toString( closestPointMapCrs.
z(),
'g', 10 );
845 const QString str = QLocale().toString( closestPoint.
m(),
'g', 10 );
846 derivedAttributes.insert( tr(
"Interpolated M" ), str );
852 QgsCoordinateUtils::formatCoordinatePartsForProject(
QgsProject::instance(), canvasPoint, mapCrs, coordinatePrecision, x, y );
855void QgsMapToolIdentify::formatCoordinate(
const QgsPointXY &canvasPoint, QString &x, QString &y )
const
857 formatCoordinate( canvasPoint, x, y,
mCanvas->mapSettings().destinationCrs(), mCoordinatePrecision );
864 QMap<QString, QString> derivedAttributes;
868 QgsDistanceArea calc;
876 QgsPoint closestPoint;
890 QString str = QLocale().toString(
static_cast<const QgsGeometryCollection *
>( feature.
geometry().
constGet() )->numGeometries() );
891 derivedAttributes.insert( tr(
"Parts" ), str );
894 str = QLocale().toString( vId.
part + 1 );
895 derivedAttributes.insert( tr(
"Part number" ), str );
900 ? displayDistanceUnits()
901 :
layer->crs().mapUnits();
904 : QgsUnitTypes::distanceToAreaUnit(
layer->crs().mapUnits() );
908 const QgsCoordinateReferenceSystem layerVertCrs =
layer->crs3D().verticalCrs().isValid() ?
layer->crs3D().verticalCrs()
913 const QgsGeometry layerCrsGeometry = feature.
geometry();
914 QgsGeometry mapCrsGeometry = layerCrsGeometry;
917 if ( layerToMapTransform.
isValid() )
922 catch ( QgsCsException &cse )
929 const QgsAbstractGeometry *layerCrsGeom = layerCrsGeometry.
constGet();
937 catch ( QgsCsException & )
940 QgsDebugError( QStringLiteral(
"An error occurred while calculating length" ) );
946 str = formatDistance( dist );
947 derivedAttributes.insert( tr(
"Length (Ellipsoidal — %1)" ).arg( ellipsoid ), str );
955 derivedAttributes.insert( tr(
"Length (Cartesian — 2D)" ), str );
957 double totalLength3d = std::accumulate( layerCrsGeom->
const_parts_begin(), layerCrsGeom->
const_parts_end(), 0.0, [](
double total,
const QgsAbstractGeometry *part ) {
958 return total + qgsgeometry_cast<const QgsLineString *>( part )->length3D();
961 str = formatDistance( totalLength3d, cartesianDistanceUnits );
962 derivedAttributes.insert( tr(
"Length (Cartesian — 3D)" ), str );
966 derivedAttributes.insert( tr(
"Length (Cartesian)" ), str );
969 str = QLocale().toString( layerCrsGeom->
nCoordinates() );
970 derivedAttributes.insert( tr(
"Vertices" ), str );
974 closestVertexAttributes( layerToMapTransform, layerVertCrs, mapVertCrs, *layerCrsGeom, vId, showTransformedZ, derivedAttributes );
975 closestPointAttributes( layerToMapTransform, layerVertCrs, mapVertCrs, *layerCrsGeom, layerPoint, showTransformedZ, derivedAttributes );
981 QgsPointXY pnt =
mCanvas->mapSettings().layerToMapCoordinates(
layer, QgsPointXY( curve->startPoint().x(), curve->startPoint().y() ) );
984 formatCoordinate( pnt, x, y );
985 derivedAttributes.insert( tr(
"firstX",
"attributes get sorted; translation for lastX should be lexically larger than this one" ), x );
986 derivedAttributes.insert( tr(
"firstY" ), y );
987 pnt =
mCanvas->mapSettings().layerToMapCoordinates(
layer, QgsPointXY( curve->endPoint().x(), curve->endPoint().y() ) );
988 formatCoordinate( pnt, x, y );
989 derivedAttributes.insert( tr(
"lastX",
"attributes get sorted; translation for firstX should be lexically smaller than this one" ), x );
990 derivedAttributes.insert( tr(
"lastY" ), y );
1001 catch ( QgsCsException & )
1004 QgsDebugError( QStringLiteral(
"An error occurred while calculating area" ) );
1010 str = formatArea( area );
1011 derivedAttributes.insert( tr(
"Area (Ellipsoidal — %1)" ).arg( ellipsoid ), str );
1014 derivedAttributes.insert( tr(
"Area (Cartesian)" ), str );
1018 double perimeter = 0;
1024 catch ( QgsCsException & )
1027 QgsDebugError( QStringLiteral(
"An error occurred while calculating perimeter" ) );
1029 str = formatDistance( perimeter );
1030 derivedAttributes.insert( tr(
"Perimeter (Ellipsoidal — %1)" ).arg( ellipsoid ), str );
1033 derivedAttributes.insert( tr(
"Perimeter (Cartesian)" ), str );
1036 derivedAttributes.insert( tr(
"Vertices" ), str );
1041 closestVertexAttributes( layerToMapTransform, layerVertCrs, mapVertCrs, *layerCrsGeometry.
constGet(), vId, showTransformedZ, derivedAttributes );
1042 closestPointAttributes( layerToMapTransform, layerVertCrs, mapVertCrs, *layerCrsGeometry.
constGet(), layerPoint, showTransformedZ, derivedAttributes );
1052 formatCoordinate( QgsPointXY( mapCrsPoint->x(), mapCrsPoint->y() ), x, y );
1053 derivedAttributes.insert( tr(
"X" ), x );
1054 derivedAttributes.insert( tr(
"Y" ), y );
1057 : std::numeric_limits<double>::quiet_NaN();
1058 const double mapCrsZ = mapCrsPoint->is3D() ? mapCrsPoint->z() : std::numeric_limits<double>::quiet_NaN();
1060 if ( !std::isnan( originalZ ) )
1062 const QString str = QLocale().toString( originalZ,
'g', 10 );
1065 if ( showTransformedZ && !std::isnan( mapCrsZ ) && !
qgsDoubleNear( originalZ, mapCrsZ ) )
1067 const QString str = QLocale().toString( mapCrsZ,
'g', 10 );
1074 derivedAttributes.insert( tr(
"M" ), str );
1083 const QgsAbstractGeometry *geom = layerCrsGeometry.
constGet();
1084 closestVertexAttributes( layerToMapTransform, layerVertCrs, mapVertCrs, *geom, vId, showTransformedZ, derivedAttributes );
1094 return derivedAttributes;
1099 QgsPointXY point = geometry.
asPoint();
1109 std::unique_ptr<QgsRasterDataProvider> dprovider(
layer->dataProvider()->clone() );
1119 if ( !
layer->temporalProperties()->isVisibleInTemporalRange( identifyContext.
temporalRange() ) )
1122 dprovider->temporalCapabilities()->setRequestedTemporalRange( identifyContext.
temporalRange() );
1127 if ( !
layer->elevationProperties()->isVisibleInZRange( identifyContext.
zRange(),
layer ) )
1139 QgsDebugError( QStringLiteral(
"coordinate not reprojectable: %1" ).arg( cse.
what() ) );
1142 QgsDebugMsgLevel( QStringLiteral(
"point = %1 %2" ).arg( point.
x() ).arg( point.
y() ), 2 );
1144 if ( !
layer->extent().contains( point ) )
1147 QMap<QString, QString> attributes, derivedAttributes;
1168 if ( dprovider->crs() !=
mCanvas->mapSettings().destinationCrs() )
1177 r.
setXMinimum( pointInCanvasCrs.
x() - mapUnitsPerPixel / 2. );
1178 r.
setXMaximum( pointInCanvasCrs.
x() + mapUnitsPerPixel / 2. );
1179 r.
setYMinimum( pointInCanvasCrs.
y() - mapUnitsPerPixel / 2. );
1180 r.
setYMaximum( pointInCanvasCrs.
y() + mapUnitsPerPixel / 2. );
1184 identifyResult = dprovider->identify( point, format, r, 1, 1 );
1200 int width =
static_cast<int>( std::round( viewExtent.
width() / mapUnitsPerPixel ) );
1201 int height =
static_cast<int>( std::round( viewExtent.
height() / mapUnitsPerPixel ) );
1203 QgsDebugMsgLevel( QStringLiteral(
"viewExtent.width = %1 viewExtent.height = %2" ).arg( viewExtent.
width() ).arg( viewExtent.
height() ), 2 );
1204 QgsDebugMsgLevel( QStringLiteral(
"width = %1 height = %2" ).arg( width ).arg( height ), 2 );
1205 QgsDebugMsgLevel( QStringLiteral(
"xRes = %1 yRes = %2 mapUnitsPerPixel = %3" ).arg( viewExtent.
width() / width ).arg( viewExtent.
height() / height ).arg( mapUnitsPerPixel ), 2 );
1207 identifyResult = dprovider->identify( point, format, viewExtent, width, height );
1218 bool foundMatch =
false;
1219 QMap<int, QVariant> values = identifyResult.
results();
1220 QMap<int, QVariant> filteredValues;
1221 for (
auto it = values.constBegin(); it != values.constEnd(); ++it )
1227 const double value = it.value().toDouble();
1231 filteredValues.insert( it.key(), it.value() );
1255 const double xres =
layer->rasterUnitsPerPixelX();
1256 const double yres =
layer->rasterUnitsPerPixelY();
1264 const int rasterCol =
static_cast<int>( std::floor( ( point.
x() - extent.
xMinimum() ) / xres ) );
1265 const int rasterRow =
static_cast<int>( std::floor( ( extent.
yMaximum() - point.
y() ) / yres ) );
1267 derivedAttributes.insert( tr(
"Column (0-based)" ), QLocale().toString( rasterCol ) );
1268 derivedAttributes.insert( tr(
"Row (0-based)" ), QLocale().toString( rasterRow ) );
1273 if ( identifyResult.
isValid() )
1275 QMap<int, QVariant> values = identifyResult.
results();
1278 for (
auto it = values.constBegin(); it != values.constEnd(); ++it )
1280 QString valueString;
1283 valueString = tr(
"no data" );
1287 QVariant value( it.value() );
1291 if (
static_cast<QMetaType::Type
>( value.userType() ) == QMetaType::Float )
1300 attributes.insert( dprovider->generateBandName( it.key() ), valueString );
1306 const double doubleValue { it.value().toDouble( &ok ) };
1309 const QVariantList row = rat->row( doubleValue );
1310 if ( !row.isEmpty() )
1312 for (
int colIdx = 0; colIdx < std::min( rat->fields().count(), row.count() ); ++colIdx )
1323 switch ( ratField.
type )
1325 case QMetaType::Type::QChar:
1326 case QMetaType::Type::Int:
1327 case QMetaType::Type::UInt:
1328 case QMetaType::Type::LongLong:
1329 case QMetaType::Type::ULongLong:
1330 ratValue = QLocale().toString( row.at( colIdx ).toLongLong() );
1332 case QMetaType::Type::Double:
1333 ratValue = QLocale().toString( row.at( colIdx ).toDouble() );
1336 ratValue = row.at( colIdx ).toString();
1338 attributes.insert( ratField.
name, ratValue );
1345 QString label =
layer->name();
1347 if ( !pixelRect.
isNull() )
1354 results->append( result );
1358 for (
auto it = values.constBegin(); it != values.constEnd(); ++it )
1360 QVariant value = it.value();
1361 if ( value.userType() == QMetaType::Type::Bool && !value.toBool() )
1367 if ( value.userType() == QMetaType::Type::QString )
1371 QString label =
layer->subLayers().value( it.key() );
1373 attributes.insert( tr(
"Error" ), value.toString() );
1375 results->append(
IdentifyResult( qobject_cast<QgsMapLayer *>(
layer ), label, attributes, derivedAttributes ) );
1385 for (
const QgsFeature &feature : storeFeatures )
1391 QString sublayer = featureStore.params().value( QStringLiteral(
"sublayer" ) ).toString();
1392 QString featureType = featureStore.params().value( QStringLiteral(
"featureType" ) ).toString();
1394 featureType.remove( QStringLiteral(
"_feature" ) );
1396 if ( sublayer.compare(
layer->name(), Qt::CaseInsensitive ) != 0 )
1400 if ( featureType.compare( sublayer, Qt::CaseInsensitive ) != 0 || labels.isEmpty() )
1402 labels << featureType;
1405 QMap<QString, QString> derAttributes = derivedAttributes;
1408 IdentifyResult identifyResult( qobject_cast<QgsMapLayer *>(
layer ), labels.join( QLatin1String(
" / " ) ), featureStore.fields(), feature, derAttributes );
1410 identifyResult.
mParams.insert( QStringLiteral(
"getFeatureInfoUrl" ), featureStore.params().value( QStringLiteral(
"getFeatureInfoUrl" ) ) );
1411 results->append( identifyResult );
1418 QgsDebugMsgLevel( QStringLiteral(
"%1 HTML or text values" ).arg( values.size() ), 2 );
1419 for (
auto it = values.constBegin(); it != values.constEnd(); ++it )
1421 QString value = it.value().toString();
1423 attributes.insert( QString(), value );
1425 QString label =
layer->subLayers().value( it.key() );
1426 results->append(
IdentifyResult( qobject_cast<QgsMapLayer *>(
layer ), label, attributes, derivedAttributes ) );
1434 attributes.insert( tr(
"Error" ), value );
1435 QString label = tr(
"Identify error" );
1436 results->append(
IdentifyResult( qobject_cast<QgsMapLayer *>(
layer ), label, attributes, derivedAttributes ) );
1452QString QgsMapToolIdentify::formatDistance(
double distance )
const
1454 return formatDistance( distance, displayDistanceUnits() );
1457QString QgsMapToolIdentify::formatArea(
double area )
const
1459 return formatArea( area, displayAreaUnits() );
1462QString QgsMapToolIdentify::formatDistance(
double distance,
Qgis::DistanceUnit unit )
const
1464 QgsSettings settings;
1465 bool baseUnit = settings.
value( QStringLiteral(
"qgis/measure/keepbaseunit" ),
true ).toBool();
1470QString QgsMapToolIdentify::formatArea(
double area,
Qgis::AreaUnit unit )
const
1472 QgsSettings settings;
1473 bool baseUnit = settings.
value( QStringLiteral(
"qgis/measure/keepbaseunit" ),
true ).toBool();
1480 QList<IdentifyResult> results;
1498 for (
const QVariantMap &pt : identified )
1500 QMap<QString, QString> ptStr;
1501 QString classification;
1502 for (
auto attrIt = pt.constBegin(); attrIt != pt.constEnd(); ++attrIt )
1504 if ( attrIt.key().compare( QLatin1String(
"Z" ), Qt::CaseInsensitive ) == 0
1508 ptStr[tr(
"Z (original)" )] = attrIt.value().toString();
1509 ptStr[tr(
"Z (adjusted)" )] = QString::number( attrIt.value().toDouble() * elevationProps->
zScale() + elevationProps->
zOffset() );
1511 else if ( attrIt.key().compare( QLatin1String(
"Classification" ), Qt::CaseInsensitive ) == 0 )
1514 ptStr[attrIt.key()] = QStringLiteral(
"%1 (%2)" ).arg( attrIt.value().toString(), classification );
1518 ptStr[attrIt.key()] = attrIt.value().toString();
1522 QMap<QString, QString> derivedAttributes;
1523 QgsPoint layerPoint( pt.value(
"X" ).toDouble(), pt.value(
"Y" ).toDouble(), pt.value(
"Z" ).toDouble() );
1528 if ( layerToMapTransform.
isValid() )
1543 derivedAttributes.insert( tr(
"X" ), x );
1544 derivedAttributes.insert( tr(
"Y" ), y );
1546 const double originalZ = layerPoint.
z();
1547 const double mapCrsZ = mapCrsPoint.
is3D() ? mapCrsPoint.
z() : std::numeric_limits<double>::quiet_NaN();
1549 if ( !std::isnan( originalZ ) )
1551 const QString str = QLocale().toString( originalZ,
'g', 10 );
1554 if ( showTransformedZ && !std::isnan( mapCrsZ ) && !
qgsDoubleNear( originalZ, mapCrsZ ) )
1556 const QString str = QLocale().toString( mapCrsZ,
'g', 10 );
1561 results.append( res );
1571 if ( identified.empty() )
1574 switch (
layer->type() )
1581 QHash<QgsFeatureId, QVariant> featureDistances;
1582 QHash<QgsFeatureId, QVariant> featureElevations;
1585 for (
const QVariantMap &map : identified )
1587 if ( !map.contains( QStringLiteral(
"id" ) ) )
1589 QMap<QString, QString> attributes;
1590 if ( map.value( QStringLiteral(
"distance" ) ).isValid() )
1591 attributes.insert( tr(
"Distance along curve" ), QString::number( map.value( QStringLiteral(
"distance" ) ).toDouble() ) );
1592 if ( map.value( QStringLiteral(
"elevation" ) ).isValid() )
1593 attributes.insert( tr(
"Elevation" ), QString::number( map.value( QStringLiteral(
"elevation" ) ).toDouble() ) );
1599 const QgsFeatureId id = map.value( QStringLiteral(
"id" ) ).toLongLong();
1600 filterIds.insert(
id );
1602 featureDistances.insert(
id, map.value( QStringLiteral(
"distance" ) ) );
1603 featureElevations.insert(
id, map.value( QStringLiteral(
"elevation" ) ) );
1615 identifyVectorLayer( &results, vl, features,
nullptr, QMap<QString, QString>(), [
this, vl, &featureDistances, &featureElevations](
const QgsFeature &feature ) -> QMap<QString, QString> {
1616 QMap< QString, QString > attributes = featureDerivedAttributes( feature, vl,
QgsPointXY() );
1618 if ( featureDistances.value( feature.
id() ).isValid() )
1619 attributes.insert( tr(
"Distance along curve" ), QString::number( featureDistances.value( feature.
id() ).toDouble() ) );
1620 if ( featureElevations.value( feature.
id() ).isValid() )
1621 attributes.insert( tr(
"Elevation" ), QString::number( featureElevations.value( feature.
id() ).toDouble() ) );
1623 return attributes; }, context );
1630 for (
const QVariantMap &map : identified )
1632 QMap<QString, QString> attributes;
1633 if ( map.value( QStringLiteral(
"distance" ) ).isValid() )
1634 attributes.insert( tr(
"Distance along curve" ), QString::number( map.value( QStringLiteral(
"distance" ) ).toDouble() ) );
1635 if ( map.value( QStringLiteral(
"elevation" ) ).isValid() )
1636 attributes.insert( tr(
"Elevation" ), QString::number( map.value( QStringLiteral(
"elevation" ) ).toDouble() ) );
@ FeatureSymbology
Provider is able retrieve embedded symbology associated with individual features.
@ MediumString
A medium-length string, recommended for general purpose use.
DistanceUnit
Units of distance.
@ ExactIntersect
Use exact geometry intersection (slower) instead of bounding boxes.
@ EmbeddedSymbols
Retrieve any embedded feature symbology.
@ Curve
An intermediate point on a segment defining the curvature of the segment.
QFlags< RasterInterfaceCapability > RasterInterfaceCapabilities
Raster interface capabilities.
QFlags< FeatureRequestFlag > FeatureRequestFlags
Flags for controlling feature requests.
GeometryType
The geometry types are used to group Qgis::WkbType in a coarse way.
@ Size
Original data source size (and thus resolution) is known, it is not always available,...
@ IdentifyValue
Numerical values.
@ Identify
At least one identify format supported.
@ IdentifyFeature
WMS GML -> feature.
@ Group
Composite group layer. Added in QGIS 3.24.
@ Plugin
Plugin based layer.
@ TiledScene
Tiled scene layer. Added in QGIS 3.34.
@ Annotation
Contains freeform, georeferenced annotations. Added in QGIS 3.16.
@ VectorTile
Vector tile layer. Added in QGIS 3.14.
@ Mesh
Mesh layer. Added in QGIS 3.2.
@ PointCloud
Point cloud layer. Added in QGIS 3.18.
static QString geoNone()
Constant that holds the string representation for "No ellipse/No CRS".
RasterIdentifyFormat
Raster identify formats.
@ Feature
WMS GML/JSON -> feature.
@ Value
Numerical pixel value.
WkbType
The WKB type describes the number of dimensions a geometry has.
@ Forward
Forward transform (from source to destination).
Abstract base class for all geometries.
bool isMeasure() const
Returns true if the geometry contains m values.
bool is3D() const
Returns true if the geometry is 3D and contains a z-value.
virtual double perimeter() const
Returns the planar, 2-dimensional perimeter of the geometry.
virtual int nCoordinates() const
Returns the number of nodes contained in the geometry.
virtual QgsPoint vertexAt(QgsVertexId id) const =0
Returns the point corresponding to a specified vertex id.
Qgis::WkbType wkbType() const
Returns the WKB type of the geometry.
virtual double length() const
Returns the planar, 2-dimensional length of the geometry.
const_part_iterator const_parts_end() const
Returns STL-style iterator pointing to the imaginary const part after the last part of the geometry.
const_part_iterator const_parts_begin() const
Returns STL-style iterator pointing to the const first part of the geometry.
static QCursor getThemeCursor(Cursor cursor)
Helper to get a theme cursor.
@ Identify
Identify: obtain information about the object.
Represents a coordinate reference system (CRS).
bool isValid() const
Returns whether this CRS is correctly initialized and usable.
bool hasVerticalAxis() const
Returns true if the CRS has a vertical axis.
QString userFriendlyIdentifier(Qgis::CrsIdentifierType type=Qgis::CrsIdentifierType::MediumString) const
Returns a user friendly identifier for the CRS.
QgsCoordinateReferenceSystem verticalCrs() const
Returns the vertical CRS associated with this CRS object.
Custom exception class for Coordinate Reference System related exceptions.
static QString formatDistance(double distance, int decimals, Qgis::DistanceUnit unit, bool keepBaseUnit=false)
Returns an distance formatted as a friendly string.
double measureArea(const QgsGeometry &geometry) const
Measures the area of a geometry.
double convertLengthMeasurement(double length, Qgis::DistanceUnit toUnits) const
Takes a length measurement calculated by this QgsDistanceArea object and converts it to a different d...
double measurePerimeter(const QgsGeometry &geometry) const
Measures the perimeter of a polygon geometry.
double measureLength(const QgsGeometry &geometry) const
Measures the length of a geometry.
void setSourceCrs(const QgsCoordinateReferenceSystem &crs, const QgsCoordinateTransformContext &context)
Sets source spatial reference system crs.
bool setEllipsoid(const QString &ellipsoid)
Sets the ellipsoid by its acronym.
double convertAreaMeasurement(double area, Qgis::AreaUnit toUnits) const
Takes an area measurement calculated by this QgsDistanceArea object and converts it to a different ar...
static QString formatArea(double area, int decimals, Qgis::AreaUnit unit, bool keepBaseUnit=false)
Returns an area formatted as a friendly string.
QgsRange which stores a range of double values.
bool isInfinite() const
Returns true if the range consists of all possible values.
QString message(QgsErrorMessage::Format format=QgsErrorMessage::Html) const
Full error messages description.
static QgsExpressionContextScope * layerScope(const QgsMapLayer *layer)
Creates a new scope which contains variables and functions relating to a QgsMapLayer.
void setFeature(const QgsFeature &feature)
Convenience function for setting a feature for the context.
Wrapper for iterator of features from vector data provider or vector layer.
bool nextFeature(QgsFeature &f)
Fetch next feature and stores in f, returns true on success.
Abstract base class for all 2D vector feature renderers.
@ Filter
Features may be filtered, i.e. some features may not be rendered (categorized, rule based ....
virtual bool willRenderFeature(const QgsFeature &feature, QgsRenderContext &context) const
Returns whether the renderer will render a feature or not.
Wraps a request for features to a vector layer (or directly its vector data provider).
QgsFeatureRequest & setFlags(Qgis::FeatureRequestFlags flags)
Sets flags that affect how features will be fetched.
QgsFeatureRequest & setFilterFids(const QgsFeatureIds &fids)
Sets the feature IDs that should be fetched.
QgsFeatureRequest & setFilterExpression(const QString &expression)
Set the filter expression.
QgsFeatureRequest & setFilterRect(const QgsRectangle &rectangle)
Sets the rectangle from which features will be taken.
A container for features with the same fields and crs.
The feature class encapsulates a single feature including its unique ID, geometry and a list of field...
const QgsSymbol * embeddedSymbol() const
Returns the feature's embedded symbology, or nullptr if the feature has no embedded symbol.
bool hasGeometry() const
Returns true if the feature has an associated geometry.
void setGeometry(const QgsGeometry &geometry)
Set the feature's geometry.
Container of fields for a vector layer.
static QgsPoint closestPoint(const QgsAbstractGeometry &geometry, const QgsPoint &point)
Returns the nearest point on a segment of a geometry for the specified point.
static void circleCenterRadius(const QgsPoint &pt1, const QgsPoint &pt2, const QgsPoint &pt3, double &radius, double ¢erX, double ¢erY)
Returns radius and center of the circle through pt1, pt2, pt3.
static QgsPoint closestVertex(const QgsAbstractGeometry &geom, const QgsPoint &pt, QgsVertexId &id)
Returns the closest vertex to a geometry for a specified point.
A geometry is the spatial representation of a feature.
static QgsGeometry fromRect(const QgsRectangle &rect)
Creates a new geometry from a QgsRectangle.
Qgis::GeometryOperationResult transform(const QgsCoordinateTransform &ct, Qgis::TransformDirection direction=Qgis::TransformDirection::Forward, bool transformZ=false)
Transforms this geometry as described by the coordinate transform ct.
const QgsAbstractGeometry * constGet() const
Returns a non-modifiable (const) reference to the underlying abstract geometry primitive.
QgsPointXY asPoint() const
Returns the contents of the geometry as a 2-dimensional point.
static QgsGeometry fromPointXY(const QgsPointXY &point)
Creates a new geometry from a QgsPointXY object.
double area() const
Returns the planar, 2-dimensional area of the geometry.
QgsRectangle boundingBox() const
Returns the bounding box of the geometry.
Qgis::WkbType wkbType() const
Returns type of the geometry as a WKB type (point / linestring / polygon etc.).
bool isGeosEqual(const QgsGeometry &) const
Compares the geometry with another geometry using GEOS.
static QgsGeometryEngine * createGeometryEngine(const QgsAbstractGeometry *geometry, double precision=0.0, Qgis::GeosCreationFlags flags=Qgis::GeosCreationFlag::SkipEmptyInteriorRings)
Creates and returns a new geometry engine representing the specified geometry using precision on a gr...
Identify contexts are used to encapsulate the settings to be used to perform an identify action.
bool isTemporal() const
Returns true if the temporal range setting is enabled.
const QgsDateTimeRange & temporalRange() const
Returns the datetime range to be used with the identify action.
QgsDoubleRange zRange() const
Returns the range of z-values to identify within, or an infinite range if no filtering by z should be...
double zScale() const
Returns the z scale, which is a scaling factor which should be applied to z values from the layer.
double zOffset() const
Returns the z offset, which is a fixed offset amount which should be added to z values from the layer...
Base class for all map layer types.
virtual bool isSpatial() const
Returns true if the layer is considered a spatial layer, ie it has some form of geometry associated w...
QgsAbstract3DRenderer * renderer3D() const
Returns 3D renderer associated with the layer.
bool isInScaleRange(double scale) const
Tests whether the layer should be visible at the specified scale.
@ Identifiable
If the layer is identifiable using the identify map tool and as a WMS layer.
virtual Q_INVOKABLE QgsDataProvider * dataProvider()
Returns the layer's data provider, it may be nullptr.
A mouse event which is the result of a user interaction with a QgsMapCanvas.
An index that identifies the dataset group (e.g.
Represents a single mesh dataset value.
double y() const
Returns y value.
double scalar() const
Returns magnitude of vector for vector data or scalar value for scalar data.
double x() const
Returns x value.
Represents a mesh layer supporting display of data on structured or unstructured meshes.
static void logMessage(const QString &message, const QString &tag=QString(), Qgis::MessageLevel level=Qgis::MessageLevel::Warning, bool notifyUser=true, const char *file=__builtin_FILE(), const char *function=__builtin_FUNCTION(), int line=__builtin_LINE())
Adds a message to the log instance (and creates it if necessary).
static QMap< int, QString > translatedLasClassificationCodes()
Returns the map of LAS classification code to translated string value, corresponding to the ASPRS Sta...
Point cloud layer specific subclass of QgsMapLayerElevationProperties.
Represents a map layer supporting display of point clouds.
QVector< QVariantMap > identify(QgsPointCloudLayer *layer, const QgsRenderContext &context, const QgsGeometry &geometry, double toleranceForPointIdentification=0)
Returns the list of visible points of the point cloud layer layer and an extent defined by a geometry...
virtual void startRender(QgsPointCloudRenderContext &context)
Must be called when a new render cycle is started.
virtual void stopRender(QgsPointCloudRenderContext &context)
Must be called when a render cycle has finished, to allow the renderer to clean up.
QString toString(int precision=-1) const
Returns a string representation of the point (x, y) with a preset precision.
bool isEmpty() const
Returns true if the geometry is empty.
Point geometry type, with support for z-dimension and m-values.
void transform(const QgsCoordinateTransform &ct, Qgis::TransformDirection d=Qgis::TransformDirection::Forward, bool transformZ=false) override
Transforms the geometry using a coordinate transform.
static QgsProject * instance()
Returns the QgsProject singleton instance.
QgsCoordinateTransformContext transformContext
QgsCoordinateReferenceSystem crs3D() const
Returns the CRS to use for the project when transforming 3D data, or when z/elevation value handling ...
bool overlaps(const QgsRange< T > &other) const
Returns true if this range overlaps another range.
The Field class represents a Raster Attribute Table field, including its name, usage and type.
Qgis::RasterAttributeTableFieldUsage usage
Represents a Raster Attribute Table (RAT).
static QList< Qgis::RasterAttributeTableFieldUsage > valueAndColorFieldUsages()
Returns the list of field usages for colors and values.
static QString printValue(double value, bool localized=false)
Print double value with all necessary significant digits.
static Qgis::RasterInterfaceCapability identifyFormatToCapability(Qgis::RasterIdentifyFormat format)
Converts a raster identify format to a capability.
static Qgis::RasterIdentifyFormat identifyFormatFromName(const QString &formatName)
Converts a string formatName to a raster identify format.
Raster identify results container.
QgsError error() const
Returns the last error.
bool isValid() const
Returns true if valid.
QMap< int, QVariant > results() const
Returns the identify results.
Raster layer specific subclass of QgsMapLayerElevationProperties.
bool isEnabled() const
Returns true if the elevation properties are enabled, i.e.
QgsDoubleRange elevationRangeForPixelValue(QgsRasterLayer *layer, int band, double pixelValue) const
Returns the elevation range corresponding to a raw pixel value from the specified band.
Represents a raster layer.
A rectangle specified with double values.
void setYMinimum(double y)
Set the minimum y value.
void setXMinimum(double x)
Set the minimum x value.
void setYMaximum(double y)
Set the maximum y value.
void setXMaximum(double x)
Set the maximum x value.
Contains information about the context of a rendering operation.
void setCoordinateTransform(const QgsCoordinateTransform &t)
Sets the current coordinate transform for the context.
QgsExpressionContext & expressionContext()
Gets the expression context.
static QgsRenderContext fromMapSettings(const QgsMapSettings &mapSettings)
create initialized QgsRenderContext instance from given QgsMapSettings
void setExpressionContext(const QgsExpressionContext &context)
Sets the expression context.
void setZRange(const QgsDoubleRange &range)
Sets the range of z-values which should be rendered.
Stores settings for use within QGIS.
QVariant value(const QString &key, const QVariant &defaultValue=QVariant(), Section section=NoSection) const
Returns the value for setting key.
T enumValue(const QString &key, const T &defaultValue, const Section section=NoSection)
Returns the setting value for a setting based on an enum.
static QString symbolTypeToString(Qgis::SymbolType type)
Returns a translated string version of the specified symbol type.
QColor color() const
Returns the symbol's color.
Qgis::SymbolType type() const
Returns the symbol's type.
QgsTileRange tileRangeFromExtent(const QgsRectangle &mExtent) const
Returns tile range that fully covers the given extent.
static Q_INVOKABLE double fromUnitToUnitFactor(Qgis::DistanceUnit fromUnit, Qgis::DistanceUnit toUnit)
Returns the conversion factor between the specified distance units.
static Q_INVOKABLE Qgis::DistanceUnitType unitType(Qgis::DistanceUnit unit)
Returns the type for a distance unit.
static Q_INVOKABLE Qgis::AreaUnit distanceToAreaUnit(Qgis::DistanceUnit distanceUnit)
Converts a distance unit to its corresponding area unit, e.g., meters to square meters.
static bool isNull(const QVariant &variant, bool silenceNullWarnings=false)
Returns true if the specified variant should be considered a NULL value.
void setLayer(QgsVectorLayer *layer)
Sets the associated layer.
Represents a vector layer which manages a vector based dataset.
QgsFeatureIterator getFeatures(const QgsFeatureRequest &request=QgsFeatureRequest()) const final
Queries the layer for features specified in request.
Implements a map layer that is dedicated to rendering of vector tiles.
QMap< QString, QByteArray > data
Raw tile data by source ID.
static QgsFields makeQgisFields(const QSet< QString > &flds)
Returns QgsFields instance based on the set of field names.
static Q_INVOKABLE bool hasZ(Qgis::WkbType type)
Tests whether a WKB type contains the z-dimension.
static Qgis::WkbType singleType(Qgis::WkbType type)
Returns the single type for a WKB type.
static Q_INVOKABLE bool hasM(Qgis::WkbType type)
Tests whether a WKB type contains m values.
static Qgis::WkbType flatType(Qgis::WkbType type)
Returns the flat type for a WKB type.
static Q_INVOKABLE bool isMultiType(Qgis::WkbType type)
Returns true if the WKB type is a multi type.
bool qgsDoubleNear(double a, double b, double epsilon=4 *std::numeric_limits< double >::epsilon())
Compare two doubles (but allow some difference).
T qgsgeometry_cast(QgsAbstractGeometry *geom)
QList< QgsFeature > QgsFeatureList
QSet< QgsFeatureId > QgsFeatureIds
#define FID_TO_STRING(fid)
qint64 QgsFeatureId
64 bit feature ids negative numbers are used for uncommitted/newly added features
QVector< QgsFeatureStore > QgsFeatureStoreList
#define QgsDebugMsgLevel(str, level)
#define QgsDebugError(str)
QgsTemporalRange< QDateTime > QgsDateTimeRange
QgsRange which stores a range of date times.
QMap< QString, QVector< QgsFeature > > QgsVectorTileFeatures
Features of a vector tile, grouped by sub-layer names (key of the map).
Utility class for identifying a unique vertex within a geometry.
bool isValid() const
Returns true if the vertex id is valid.
Qgis::VertexType type
Vertex type.