68 , mLastMapUnitsPerPixel( -1.0 )
69 , mCoordinatePrecision( 6 )
101 return identify( x, y, mode, QList<QgsMapLayer *>(), layerType, identifyContext );
111 return identify( geometry, mode, QList<QgsMapLayer *>(), layerType, identifyContext );
116 QList<IdentifyResult> results;
118 mLastGeometry = geometry;
119 mLastExtent =
mCanvas->extent();
120 mLastMapUnitsPerPixel =
mCanvas->mapUnitsPerPixel();
122 mCoordinatePrecision = QgsCoordinateUtils::calculateCoordinatePrecision( mLastMapUnitsPerPixel,
mCanvas->mapSettings().destinationCrs() );
133 int x = canvasPt.x(), y = canvasPt.y();
134 QList<IdentifyResult> results =
identify( x, y,
TopDownAll, layerList, layerType, identifyContext );
135 QPoint globalPos =
mCanvas->mapToGlobal( QPoint( x + 5, y + 5 ) );
138 else if ( mode ==
ActiveLayer && layerList.isEmpty() )
144 emit
identifyMessage( tr(
"No active layer. To identify features, you must choose an active layer." ) );
150 QApplication::setOverrideCursor( Qt::WaitCursor );
152 identifyLayer( &results,
layer, mLastGeometry, mLastExtent, mLastMapUnitsPerPixel, layerType, identifyContext );
156 QApplication::setOverrideCursor( Qt::WaitCursor );
158 QList< QgsMapLayer * > targetLayers;
159 if ( layerList.isEmpty() )
160 targetLayers =
mCanvas->layers(
true );
162 targetLayers = layerList;
164 const int layerCount = targetLayers.size();
165 for (
int i = 0; i < layerCount; i++ )
175 if (
identifyLayer( &results,
layer, mLastGeometry, mLastExtent, mLastMapUnitsPerPixel, layerType, identifyContext ) )
186 QApplication::restoreOverrideCursor();
193 mOverrideCanvasSearchRadius = searchRadiusMapUnits;
198 mOverrideCanvasSearchRadius = -1;
230 return identifyRasterLayer( results, qobject_cast<QgsRasterLayer *>(
layer ), geometry, viewExtent, mapUnitsPerPixel, identifyContext );
244 return identifyVectorTileLayer( results, qobject_cast<QgsVectorTileLayer *>(
layer ), geometry, identifyContext );
251 return identifyPointCloudLayer( results, qobject_cast<QgsPointCloudLayer *>(
layer ), geometry, identifyContext );
288 double searchRadius = mOverrideCanvasSearchRadius < 0 ?
searchRadiusMU(
mCanvas ) : mOverrideCanvasSearchRadius;
291 QList<QgsMeshDatasetIndex> datasetIndexList;
292 int activeScalarGroup =
layer->rendererSettings().activeScalarDatasetGroup();
293 int activeVectorGroup =
layer->rendererSettings().activeVectorDatasetGroup();
295 const QList<int> allGroup =
layer->enabledDatasetGroupsIndexes();
299 if ( activeScalarGroup >= 0 )
300 datasetIndexList.append(
layer->activeScalarDatasetAtTime( time ) );
301 if ( activeVectorGroup >= 0 && activeVectorGroup != activeScalarGroup )
302 datasetIndexList.append(
layer->activeVectorDatasetAtTime( time ) );
304 for (
int groupIndex : allGroup )
306 if ( groupIndex != activeScalarGroup && groupIndex != activeVectorGroup )
307 datasetIndexList.append(
layer->datasetIndexAtTime( time, groupIndex ) );
313 if ( activeScalarGroup >= 0 )
314 datasetIndexList.append(
layer->staticScalarDatasetIndex() );
315 if ( activeVectorGroup >= 0 && activeVectorGroup != activeScalarGroup )
316 datasetIndexList.append(
layer->staticVectorDatasetIndex() );
319 for (
int groupIndex : allGroup )
321 if ( groupIndex != activeScalarGroup && groupIndex != activeVectorGroup )
323 if ( !
layer->datasetGroupMetadata( groupIndex ).isTemporal() )
324 datasetIndexList.append( groupIndex );
332 if ( !index.isValid() )
336 QMap< QString, QString > derivedAttributes;
338 QMap<QString, QString> attribute;
342 const double scalar = scalarValue.
scalar();
343 attribute.insert( tr(
"Scalar Value" ), std::isnan( scalar ) ? tr(
"no data" ) : QLocale().toString( scalar ) );
349 const double vectorX = vectorValue.
x();
350 const double vectorY = vectorValue.
y();
351 if ( std::isnan( vectorX ) || std::isnan( vectorY ) )
352 attribute.insert( tr(
"Vector Value" ), tr(
"no data" ) );
355 attribute.insert( tr(
"Vector Magnitude" ), QLocale().toString( vectorValue.
scalar() ) );
356 derivedAttributes.insert( tr(
"Vector x-component" ), QLocale().toString( vectorY ) );
357 derivedAttributes.insert( tr(
"Vector y-component" ), QLocale().toString( vectorX ) );
364 derivedAttributes.insert( tr(
"Time Step" ),
layer->formatTime( meta.
time() ) );
365 derivedAttributes.insert( tr(
"Source" ), groupMeta.
uri() );
367 QString resultName = groupMeta.
name();
368 if ( isTemporal && ( index.group() == activeScalarGroup || index.group() == activeVectorGroup ) )
369 resultName.append( tr(
" (active)" ) );
376 results->append( result );
379 QMap<QString, QString> derivedGeometry;
384 derivedGeometry.insert( tr(
"Snapped Vertex Position X" ), QLocale().toString( vertexPoint.
x() ) );
385 derivedGeometry.insert( tr(
"Snapped Vertex Position Y" ), QLocale().toString( vertexPoint.
y() ) );
391 derivedGeometry.insert( tr(
"Face Centroid X" ), QLocale().toString( faceCentroid.
x() ) );
392 derivedGeometry.insert( tr(
"Face Centroid Y" ), QLocale().toString( faceCentroid.
y() ) );
398 derivedGeometry.insert( tr(
"Point on Edge X" ), QLocale().toString( pointOnEdge.
x() ) );
399 derivedGeometry.insert( tr(
"Point on Edge Y" ), QLocale().toString( pointOnEdge.
y() ) );
407 results->append( result );
414 Q_UNUSED( identifyContext )
426 QMap< QString, QString > commonDerivedAttributes;
429 bool isPointOrRectangle;
434 isPointOrRectangle =
true;
435 point = selectionGeom.
asPoint();
445 int featureCount = 0;
447 std::unique_ptr<QgsGeometryEngine> selectionGeomPrepared;
457 double sr = mOverrideCanvasSearchRadius < 0 ?
searchRadiusMU(
mCanvas ) : mOverrideCanvasSearchRadius;
464 if ( !isPointOrRectangle )
475 const double tileScale =
layer->tileMatrixSet().calculateTileScaleForMap(
477 mCanvas->mapSettings().destinationCrs(),
478 mCanvas->mapSettings().extent(),
482 const int tileZoom =
layer->tileMatrixSet().scaleToZoomLevel( tileScale );
486 const QVector< QgsTileXYZ> tiles =
layer->tileMatrixSet().tilesInRange( tileRange, tileZoom );
491 if ( data.
data.isEmpty() )
495 if ( !decoder.decode( data ) )
498 QMap<QString, QgsFields> perLayerFields;
499 const QStringList layerNames = decoder.layers();
500 for (
const QString &layerName : layerNames )
502 QSet<QString> fieldNames = qgis::listToSet( decoder.layerFieldNames( layerName ) );
507 const QStringList featuresLayerNames = features.keys();
508 for (
const QString &layerName : featuresLayerNames )
510 const QgsFields fFields = perLayerFields[layerName];
511 const QVector<QgsFeature> &layerFeatures = features[layerName];
514 if ( f.geometry().intersects( r ) && ( !selectionGeomPrepared || selectionGeomPrepared->intersects( f.geometry().constGet() ) ) )
516 QMap< QString, QString > derivedAttributes = commonDerivedAttributes;
517 derivedAttributes.insert( tr(
"Feature ID" ),
FID_TO_STRING( f.id() ) );
518 derivedAttributes.insert( tr(
"Tile column" ), QString::number( tileID.column() ) );
519 derivedAttributes.insert( tr(
"Tile row" ), QString::number( tileID.row() ) );
520 derivedAttributes.insert( tr(
"Tile zoom" ), QString::number( tileID.zoomLevel() ) );
522 results->
append( IdentifyResult(
layer, layerName, fFields, f, derivedAttributes ) );
537 return featureCount > 0;
555 const double searchRadiusMapUnits = mOverrideCanvasSearchRadius < 0 ?
searchRadiusMU(
mCanvas ) : mOverrideCanvasSearchRadius;
557 const QVector<QVariantMap> points = renderer->
identify(
layer, context, geometry, searchRadiusMapUnits );
566 QMap< QString, QString > derivedAttributes;
570 formatCoordinate( point, x, y );
572 derivedAttributes.insert( tr(
"(clicked coordinate X)" ), x );
573 derivedAttributes.insert( tr(
"(clicked coordinate Y)" ), y );
575 derivedAttributes.insert( tr(
"(clicked coordinate Z)" ), QLocale().toString( point.
z(),
'f' ) );
576 return derivedAttributes;
590 QString temporalFilter;
598 temporalFilter = qobject_cast< const QgsVectorLayerTemporalProperties * >(
layer->
temporalProperties() )->createFilterString( temporalContext, identifyContext.
temporalRange() );
603 QApplication::setOverrideCursor( Qt::WaitCursor );
605 QMap< QString, QString > commonDerivedAttributes;
608 bool isPointOrRectangle;
613 isPointOrRectangle =
true;
614 point = *qgsgeometry_cast< const QgsPoint *>( selectionGeom.
constGet() );
625 std::unique_ptr<QgsGeometryEngine> selectionGeomPrepared;
635 double sr = mOverrideCanvasSearchRadius < 0 ?
searchRadiusMU(
mCanvas ) : mOverrideCanvasSearchRadius;
642 if ( !isPointOrRectangle )
656 if ( !temporalFilter.isEmpty() )
663 if ( !selectionGeomPrepared || selectionGeomPrepared->intersects( f.
geometry().
constGet() ) )
679 std::unique_ptr< QgsFeatureRenderer > renderer(
layer->renderer() ?
layer->renderer()->
clone() : nullptr );
688 if ( !isSingleClick )
691 const int featureCount =
identifyVectorLayer( results,
layer, featureList, filter ? renderer.get() : nullptr, commonDerivedAttributes,
692 [point,
layer, this]( const
QgsFeature & feature )->QMap< QString, QString >
701 QApplication::restoreOverrideCursor();
702 return featureCount > 0;
707 int featureCount = 0;
708 for (
const QgsFeature &feature : std::as_const( features ) )
710 QMap< QString, QString > derivedAttributes = commonDerivedAttributes;
718 derivedAttributes.insert( deriveAttributesForFeature( feature ) );
719 derivedAttributes.insert( tr(
"Feature ID" ), fid < 0 ? tr(
"new feature" ) :
FID_TO_STRING( fid ) );
721 results->append( IdentifyResult( qobject_cast<QgsMapLayer *>(
layer ), feature, derivedAttributes ) );
731 bool showTransformedZ, QMap< QString, QString > &derivedAttributes )
740 QString
str = QLocale().toString( vId.
vertex + 1 );
741 derivedAttributes.insert( tr(
"Closest vertex number" ),
str );
744 QgsPoint closestPointMapCoords = closestPoint;
745 if ( layerToMapTransform.
isValid() )
759 formatCoordinate( closestPointMapCoords, x, y );
760 derivedAttributes.insert( tr(
"Closest vertex X" ), x );
761 derivedAttributes.insert( tr(
"Closest vertex Y" ), y );
763 if ( closestPoint.
is3D() )
765 str = QLocale().toString( closestPoint.
z(),
'g', 10 );
767 : tr(
"Closest vertex Z" ),
str );
769 if ( showTransformedZ && !std::isnan( closestPointMapCoords.
z() ) && !
qgsDoubleNear( closestPoint.
z(), closestPointMapCoords.
z() ) )
771 const QString
str = QLocale().toString( closestPointMapCoords.
z(),
'g', 10 );
777 str = QLocale().toString( closestPointMapCoords.
m(),
'g', 10 );
778 derivedAttributes.insert( tr(
"Closest vertex M" ),
str );
783 double radius, centerX, centerY;
789 geometry.
vertexAt( vIdAfter ), radius, centerX, centerY );
790 derivedAttributes.insert( QStringLiteral(
"Closest vertex radius" ), QLocale().toString( radius ) );
799 bool showTransformedZ,
800 QMap<QString, QString> &derivedAttributes )
803 QgsPoint closestPointMapCrs = closestPoint;
804 if ( layerToMapTransform.
isValid() )
818 formatCoordinate( closestPoint, x, y );
819 derivedAttributes.insert( tr(
"Closest X" ), x );
820 derivedAttributes.insert( tr(
"Closest Y" ), y );
822 if ( closestPoint.
is3D() )
824 const QString
str = QLocale().toString( closestPoint.
z(),
'g', 10 );
826 : tr(
"Interpolated Z" ),
str );
828 if ( showTransformedZ && !std::isnan( closestPointMapCrs.
z() ) && !
qgsDoubleNear( closestPoint.
z(), closestPointMapCrs.
z() ) )
830 const QString
str = QLocale().toString( closestPointMapCrs.
z(),
'g', 10 );
836 const QString
str = QLocale().toString( closestPoint.
m(),
'g', 10 );
837 derivedAttributes.insert( tr(
"Interpolated M" ),
str );
843 QgsCoordinateUtils::formatCoordinatePartsForProject(
QgsProject::instance(), canvasPoint, mapCrs,
844 coordinatePrecision, x, y );
847void QgsMapToolIdentify::formatCoordinate(
const QgsPointXY &canvasPoint, QString &x, QString &y )
const
849 formatCoordinate( canvasPoint, x, y,
mCanvas->mapSettings().destinationCrs(),
850 mCoordinatePrecision );
857 QMap< QString, QString > derivedAttributes;
884 derivedAttributes.insert( tr(
"Parts" ),
str );
887 str = QLocale().toString( vId.
part + 1 );
888 derivedAttributes.insert( tr(
"Part number" ),
str );
893 ? displayDistanceUnits() :
layer->
crs().mapUnits();
908 if ( layerToMapTransform.
isValid() )
927 str = formatDistance( dist );
928 derivedAttributes.insert( tr(
"Length (Ellipsoidal — %1)" ).arg( ellipsoid ),
str );
931 str = formatDistance( layerCrsGeom->
length()
937 derivedAttributes.insert( tr(
"Length (Cartesian — 2D)" ),
str );
941 return total + qgsgeometry_cast< const QgsLineString * >( part )->length3D();
944 str = formatDistance( totalLength3d, cartesianDistanceUnits );
945 derivedAttributes.insert( tr(
"Length (Cartesian — 3D)" ),
str );
949 derivedAttributes.insert( tr(
"Length (Cartesian)" ),
str );
953 derivedAttributes.insert( tr(
"Vertices" ),
str );
957 closestVertexAttributes( layerToMapTransform, layerVertCrs, mapVertCrs, *layerCrsGeom, vId, showTransformedZ, derivedAttributes );
958 closestPointAttributes( layerToMapTransform, layerVertCrs, mapVertCrs, *layerCrsGeom, layerPoint, showTransformedZ, derivedAttributes );
961 if (
const QgsCurve *curve = qgsgeometry_cast< const QgsCurve * >( layerCrsGeom ) )
967 formatCoordinate( pnt, x, y );
968 derivedAttributes.insert( tr(
"firstX",
"attributes get sorted; translation for lastX should be lexically larger than this one" ), x );
969 derivedAttributes.insert( tr(
"firstY" ), y );
970 pnt =
mCanvas->mapSettings().layerToMapCoordinates(
layer,
QgsPointXY( curve->endPoint().x(), curve->endPoint().y() ) );
971 formatCoordinate( pnt, x, y );
972 derivedAttributes.insert( tr(
"lastX",
"attributes get sorted; translation for firstX should be lexically smaller than this one" ), x );
973 derivedAttributes.insert( tr(
"lastY" ), y );
978 double area = calc.
measureArea( layerCrsGeometry );
983 str = formatArea( area );
984 derivedAttributes.insert( tr(
"Area (Ellipsoidal — %1)" ).arg( ellipsoid ),
str );
986 str = formatArea( layerCrsGeometry.
area()
988 derivedAttributes.insert( tr(
"Area (Cartesian)" ),
str );
994 str = formatDistance( perimeter );
995 derivedAttributes.insert( tr(
"Perimeter (Ellipsoidal — %1)" ).arg( ellipsoid ),
str );
999 derivedAttributes.insert( tr(
"Perimeter (Cartesian)" ),
str );
1002 derivedAttributes.insert( tr(
"Vertices" ),
str );
1007 closestVertexAttributes( layerToMapTransform, layerVertCrs, mapVertCrs, *layerCrsGeometry.
constGet(), vId, showTransformedZ, derivedAttributes );
1008 closestPointAttributes( layerToMapTransform, layerVertCrs, mapVertCrs, *layerCrsGeometry.
constGet(), layerPoint, showTransformedZ, derivedAttributes );
1014 if (
const QgsPoint *mapCrsPoint = qgsgeometry_cast< const QgsPoint * >( mapCrsGeometry.
constGet() ) )
1018 formatCoordinate(
QgsPointXY( mapCrsPoint->x(), mapCrsPoint->y() ), x, y );
1019 derivedAttributes.insert( tr(
"X" ), x );
1020 derivedAttributes.insert( tr(
"Y" ), y );
1022 const double originalZ =
QgsWkbTypes::hasZ( wkbType ) ? qgsgeometry_cast<const QgsPoint *>( layerCrsGeometry.
constGet() )->z()
1023 : std::numeric_limits< double >::quiet_NaN();
1024 const double mapCrsZ = mapCrsPoint->is3D() ? mapCrsPoint->z() : std::numeric_limits< double >::quiet_NaN();
1026 if ( !std::isnan( originalZ ) )
1028 const QString
str = QLocale().toString( originalZ,
'g', 10 );
1032 if ( showTransformedZ && !std::isnan( mapCrsZ ) && !
qgsDoubleNear( originalZ, mapCrsZ ) )
1034 const QString
str = QLocale().toString( mapCrsZ,
'g', 10 );
1040 const QString
str = QLocale().toString( qgsgeometry_cast<const QgsPoint *>( layerCrsGeometry.
constGet() )->m(),
'g', 10 );
1041 derivedAttributes.insert( tr(
"M" ),
str );
1051 closestVertexAttributes( layerToMapTransform, layerVertCrs, mapVertCrs, *geom, vId, showTransformedZ, derivedAttributes );
1061 return derivedAttributes;
1076 std::unique_ptr< QgsRasterDataProvider > dprovider(
layer->
dataProvider()->clone() );
1089 dprovider->temporalCapabilities()->setRequestedTemporalRange( identifyContext.
temporalRange() );
1106 QgsDebugError( QStringLiteral(
"coordinate not reprojectable: %1" ).arg( cse.
what() ) );
1109 QgsDebugMsgLevel( QStringLiteral(
"point = %1 %2" ).arg( point.
x() ).arg( point.
y() ), 2 );
1114 QMap< QString, QString > attributes, derivedAttributes;
1134 if ( dprovider->crs() !=
mCanvas->mapSettings().destinationCrs() )
1143 r.
setXMinimum( pointInCanvasCrs.
x() - mapUnitsPerPixel / 2. );
1144 r.
setXMaximum( pointInCanvasCrs.
x() + mapUnitsPerPixel / 2. );
1145 r.
setYMinimum( pointInCanvasCrs.
y() - mapUnitsPerPixel / 2. );
1146 r.
setYMaximum( pointInCanvasCrs.
y() + mapUnitsPerPixel / 2. );
1150 identifyResult = dprovider->identify( point, format, r, 1, 1 );
1166 int width =
static_cast< int >( std::round( viewExtent.
width() / mapUnitsPerPixel ) );
1167 int height =
static_cast< int >( std::round( viewExtent.
height() / mapUnitsPerPixel ) );
1169 QgsDebugMsgLevel( QStringLiteral(
"viewExtent.width = %1 viewExtent.height = %2" ).arg( viewExtent.
width() ).arg( viewExtent.
height() ), 2 );
1170 QgsDebugMsgLevel( QStringLiteral(
"width = %1 height = %2" ).arg( width ).arg( height ), 2 );
1171 QgsDebugMsgLevel( QStringLiteral(
"xRes = %1 yRes = %2 mapUnitsPerPixel = %3" ).arg( viewExtent.
width() / width ).arg( viewExtent.
height() / height ).arg( mapUnitsPerPixel ), 2 );
1173 identifyResult = dprovider->identify( point, format, viewExtent, width, height );
1184 bool foundMatch =
false;
1185 QMap<int, QVariant> values = identifyResult.
results();
1186 QMap<int, QVariant> filteredValues;
1187 for (
auto it = values.constBegin(); it != values.constEnd(); ++it )
1193 const double value = it.value().toDouble();
1197 filteredValues.insert( it.key(), it.value() );
1221 const double xres =
layer->rasterUnitsPerPixelX();
1222 const double yres =
layer->rasterUnitsPerPixelY();
1230 const int rasterCol =
static_cast< int >( std::floor( ( point.
x() - extent.
xMinimum() ) / xres ) );
1231 const int rasterRow =
static_cast< int >( std::floor( ( extent.
yMaximum() - point.
y() ) / yres ) );
1233 derivedAttributes.insert( tr(
"Column (0-based)" ), QLocale().toString( rasterCol ) );
1234 derivedAttributes.insert( tr(
"Row (0-based)" ), QLocale().toString( rasterRow ) );
1237 extent.
yMaximum() - ( rasterRow + 1 ) * yres,
1238 ( rasterCol + 1 ) * xres + extent.
xMinimum(),
1239 extent.
yMaximum() - ( rasterRow * yres ) );
1242 if ( identifyResult.
isValid() )
1244 QMap<int, QVariant> values = identifyResult.
results();
1247 for (
auto it = values.constBegin(); it != values.constEnd(); ++it )
1249 QString valueString;
1252 valueString = tr(
"no data" );
1256 QVariant value( it.value() );
1260 if (
static_cast<QMetaType::Type
>( value.userType() ) == QMetaType::Float )
1269 attributes.insert( dprovider->generateBandName( it.key() ), valueString );
1275 const double doubleValue { it.value().toDouble( &ok ) };
1278 const QVariantList row = rat->row( doubleValue );
1279 if ( ! row.isEmpty() )
1281 for (
int colIdx = 0; colIdx < std::min( rat->fields().count( ), row.count() ); ++colIdx )
1292 switch ( ratField.type )
1294 case QMetaType::Type::QChar:
1295 case QMetaType::Type::Int:
1296 case QMetaType::Type::UInt:
1297 case QMetaType::Type::LongLong:
1298 case QMetaType::Type::ULongLong:
1299 ratValue = QLocale().toString( row.at( colIdx ).toLongLong() );
1301 case QMetaType::Type::Double:
1302 ratValue = QLocale().toString( row.at( colIdx ).toDouble( ) );
1305 ratValue = row.at( colIdx ).toString();
1307 attributes.insert( ratField.name, ratValue );
1317 if ( !pixelRect.
isNull() )
1324 results->append( result );
1328 for (
auto it = values.constBegin(); it != values.constEnd(); ++it )
1330 QVariant value = it.value();
1331 if ( value.userType() == QMetaType::Type::Bool && !value.toBool() )
1337 if ( value.userType() == QMetaType::Type::QString )
1343 attributes.insert( tr(
"Error" ), value.toString() );
1345 results->append(
IdentifyResult( qobject_cast<QgsMapLayer *>(
layer ), label, attributes, derivedAttributes ) );
1355 for (
const QgsFeature &feature : storeFeatures )
1361 QString sublayer = featureStore.params().value( QStringLiteral(
"sublayer" ) ).toString();
1362 QString featureType = featureStore.params().value( QStringLiteral(
"featureType" ) ).toString();
1364 featureType.remove( QStringLiteral(
"_feature" ) );
1366 if ( sublayer.compare(
layer->
name(), Qt::CaseInsensitive ) != 0 )
1370 if ( featureType.compare( sublayer, Qt::CaseInsensitive ) != 0 || labels.isEmpty() )
1372 labels << featureType;
1375 QMap< QString, QString > derAttributes = derivedAttributes;
1378 IdentifyResult identifyResult( qobject_cast<QgsMapLayer *>(
layer ), labels.join( QLatin1String(
" / " ) ), featureStore.fields(), feature, derAttributes );
1380 identifyResult.
mParams.insert( QStringLiteral(
"getFeatureInfoUrl" ), featureStore.params().value( QStringLiteral(
"getFeatureInfoUrl" ) ) );
1381 results->append( identifyResult );
1388 QgsDebugMsgLevel( QStringLiteral(
"%1 HTML or text values" ).arg( values.size() ), 2 );
1389 for (
auto it = values.constBegin(); it != values.constEnd(); ++it )
1391 QString value = it.value().toString();
1393 attributes.insert( QString(), value );
1396 results->append(
IdentifyResult( qobject_cast<QgsMapLayer *>(
layer ), label, attributes, derivedAttributes ) );
1404 attributes.insert( tr(
"Error" ), value );
1405 QString label = tr(
"Identify error" );
1406 results->append(
IdentifyResult( qobject_cast<QgsMapLayer *>(
layer ), label, attributes, derivedAttributes ) );
1422QString QgsMapToolIdentify::formatDistance(
double distance )
const
1424 return formatDistance( distance, displayDistanceUnits() );
1427QString QgsMapToolIdentify::formatArea(
double area )
const
1429 return formatArea( area, displayAreaUnits() );
1432QString QgsMapToolIdentify::formatDistance(
double distance,
Qgis::DistanceUnit unit )
const
1435 bool baseUnit = settings.
value( QStringLiteral(
"qgis/measure/keepbaseunit" ),
true ).toBool();
1440QString QgsMapToolIdentify::formatArea(
double area,
Qgis::AreaUnit unit )
const
1443 bool baseUnit = settings.
value( QStringLiteral(
"qgis/measure/keepbaseunit" ),
true ).toBool();
1450 QList<IdentifyResult> results;
1468 for (
const QVariantMap &pt : identified )
1470 QMap<QString, QString> ptStr;
1471 QString classification;
1472 for (
auto attrIt = pt.constBegin(); attrIt != pt.constEnd(); ++attrIt )
1474 if ( attrIt.key().compare( QLatin1String(
"Z" ), Qt::CaseInsensitive ) == 0
1478 ptStr[ tr(
"Z (original)" ) ] = attrIt.value().toString();
1479 ptStr[ tr(
"Z (adjusted)" ) ] = QString::number( attrIt.value().toDouble() * elevationProps->
zScale() + elevationProps->
zOffset() );
1481 else if ( attrIt.key().compare( QLatin1String(
"Classification" ), Qt::CaseInsensitive ) == 0 )
1484 ptStr[ attrIt.key() ] = QStringLiteral(
"%1 (%2)" ).arg( attrIt.value().toString(), classification );
1488 ptStr[attrIt.key()] = attrIt.value().toString();
1492 QMap< QString, QString > derivedAttributes;
1493 QgsPoint layerPoint( pt.value(
"X" ).toDouble(), pt.value(
"Y" ).toDouble(), pt.value(
"Z" ).toDouble() );
1498 if ( layerToMapTransform.
isValid() )
1513 derivedAttributes.insert( tr(
"X" ), x );
1514 derivedAttributes.insert( tr(
"Y" ), y );
1516 const double originalZ = layerPoint.
z();
1517 const double mapCrsZ = mapCrsPoint.
is3D() ? mapCrsPoint.
z() : std::numeric_limits< double >::quiet_NaN();
1519 if ( !std::isnan( originalZ ) )
1521 const QString
str = QLocale().toString( originalZ,
'g', 10 );
1525 if ( showTransformedZ && !std::isnan( mapCrsZ ) && !
qgsDoubleNear( originalZ, mapCrsZ ) )
1527 const QString
str = QLocale().toString( mapCrsZ,
'g', 10 );
1532 results.append( res );
1542 if ( identified.empty() )
1552 QHash< QgsFeatureId, QVariant > featureDistances;
1553 QHash< QgsFeatureId, QVariant > featureElevations;
1556 for (
const QVariantMap &map : identified )
1558 if ( !map.contains( QStringLiteral(
"id" ) ) )
1560 QMap< QString, QString > attributes;
1561 if ( map.value( QStringLiteral(
"distance" ) ).isValid() )
1562 attributes.insert( tr(
"Distance along curve" ), QString::number( map.value( QStringLiteral(
"distance" ) ).toDouble() ) );
1563 if ( map.value( QStringLiteral(
"elevation" ) ).isValid() )
1564 attributes.insert( tr(
"Elevation" ), QString::number( map.value( QStringLiteral(
"elevation" ) ).toDouble() ) );
1570 const QgsFeatureId id = map.value( QStringLiteral(
"id" ) ).toLongLong();
1571 filterIds.insert(
id );
1573 featureDistances.insert(
id, map.value( QStringLiteral(
"distance" ) ) );
1574 featureElevations.insert(
id, map.value( QStringLiteral(
"elevation" ) ) );
1586 identifyVectorLayer( &results, vl, features,
nullptr, QMap< QString, QString >(), [
this, vl, &featureDistances, &featureElevations](
const QgsFeature & feature )->QMap< QString, QString >
1588 QMap< QString, QString > attributes = featureDerivedAttributes( feature, vl,
QgsPointXY() );
1590 if ( featureDistances.value( feature.
id() ).isValid() )
1591 attributes.insert( tr(
"Distance along curve" ), QString::number( featureDistances.value( feature.
id() ).toDouble() ) );
1592 if ( featureElevations.value( feature.
id() ).isValid() )
1593 attributes.insert( tr(
"Elevation" ), QString::number( featureElevations.value( feature.
id() ).toDouble() ) );
1603 for (
const QVariantMap &map : identified )
1605 QMap< QString, QString > attributes;
1606 if ( map.value( QStringLiteral(
"distance" ) ).isValid() )
1607 attributes.insert( tr(
"Distance along curve" ), QString::number( map.value( QStringLiteral(
"distance" ) ).toDouble() ) );
1608 if ( map.value( QStringLiteral(
"elevation" ) ).isValid() )
1609 attributes.insert( tr(
"Elevation" ), QString::number( map.value( QStringLiteral(
"elevation" ) ).toDouble() ) );
The Qgis class provides global constants for use throughout the application.
@ 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.
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.
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.
This class 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.
Qgis::DistanceUnit mapUnits
Custom exception class for Coordinate Reference System related exceptions.
Abstract base class for curved geometry type.
A general purpose distance and area calculator, capable of performing ellipsoid based calculations.
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.
This class 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.
bool append(const QgsField &field, Qgis::FieldOrigin origin=Qgis::FieldOrigin::Provider, int originIndex=-1)
Appends a field.
int numGeometries() const
Returns the number of geometries within the collection.
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.
static QgsGeometryEngine * createGeometryEngine(const QgsAbstractGeometry *geometry, double precision=0.0)
Creates and returns a new geometry engine representing the specified geometry using precision on a gr...
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.
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...
Map canvas is a class for displaying all GIS data types on a canvas.
virtual bool isVisibleInZRange(const QgsDoubleRange &range, QgsMapLayer *layer=nullptr) const
Returns true if the layer should be visible and rendered for the specified z range.
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...
virtual bool isVisibleInTemporalRange(const QgsDateTimeRange &range) const
Returns true if the layer should be visible and rendered for the specified time range.
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...
bool isInScaleRange(double scale) const
Tests whether the layer should be visible at the specified scale.
virtual QgsRectangle extent() const
Returns the extent of the layer.
Q_INVOKABLE QVariant customProperty(const QString &value, const QVariant &defaultValue=QVariant()) const
Read a custom property from layer.
QgsMapLayer::LayerFlags flags() const
Returns the flags for this layer.
QgsCoordinateReferenceSystem crs3D
QgsCoordinateReferenceSystem crs
virtual QgsMapLayerTemporalProperties * temporalProperties()
Returns the layer's temporal properties.
virtual QStringList subLayers() const
Returns the sublayers of this layer.
virtual QgsMapLayer * clone() const =0
Returns a new instance equivalent to this one except for the id which is still unique.
@ Identifiable
If the layer is identifiable using the identify map tool and as a WMS layer.
virtual QgsMapLayerElevationProperties * elevationProperties()
Returns the layer's elevation properties.
virtual Q_INVOKABLE QgsDataProvider * dataProvider()
Returns the layer's data provider, it may be nullptr.
A QgsMapMouseEvent is the result of a user interaction with the mouse on a QgsMapCanvas.
QgsMeshDatasetIndex is index that identifies the dataset group (e.g.
QgsMeshDatasetValue represents single 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)
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.
Abstract base class for 2d point cloud renderers.
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.
A class to represent a 2D point.
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 ...
QgsCoordinateReferenceSystem crs
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.
The QgsRasterAttributeTable class 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.
bool contains(const QgsRectangle &rect) const
Returns true when rectangle contains other rectangle.
double xMinimum() const
Returns the x minimum value (left side of rectangle).
void setYMinimum(double y)
Set the minimum y value.
void setXMinimum(double x)
Set the minimum x value.
double width() const
Returns the width of the rectangle.
bool isNull() const
Test if the rectangle is null (holding no spatial information).
double yMaximum() const
Returns the y maximum value (top side of rectangle).
void setYMaximum(double y)
Set the maximum y value.
void setXMaximum(double x)
Set the maximum x value.
double height() const
Returns the height of the rectangle.
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.
This class is a composition of two QSettings instances:
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.
bool isActive() const
Returns true if the temporal property is active.
Temporarily sets a cursor override for the QApplication for the lifetime of the object.
Defines a matrix of tiles for a single zoom level: it is defined by its size (width *.
QgsTileRange tileRangeFromExtent(const QgsRectangle &mExtent) const
Returns tile range that fully covers the given extent.
Range of tiles in a tile matrix to be rendered.
Stores coordinates of a tile in a tile matrix set.
Helper functions for various unit types.
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.
Encapsulates the context in which a QgsVectorLayer's temporal capabilities will be applied.
void setLayer(QgsVectorLayer *layer)
Sets the associated layer.
Represents a vector layer which manages a vector based data sets.
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.
This class is responsible for decoding raw tile data written with Mapbox Vector Tiles encoding.
Keeps track of raw tile data that need to be decoded.
QByteArray data
Raw tile data.
static QgsFields makeQgisFields(const QSet< QString > &flds)
Returns QgsFields instance based on the set of field names.
static bool isMultiType(Qgis::WkbType type)
Returns true if the WKB type is a multi type.
static Qgis::WkbType singleType(Qgis::WkbType type)
Returns the single type for a WKB type.
static bool hasZ(Qgis::WkbType type)
Tests whether a WKB type contains the z-dimension.
static 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.
CONSTLATIN1STRING geoNone()
Constant that holds the string representation for "No ellips/No CRS".
bool qgsDoubleNear(double a, double b, double epsilon=4 *std::numeric_limits< double >::epsilon())
Compare two doubles (but allow some difference)
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)
QMap< QString, QVector< QgsFeature > > QgsVectorTileFeatures
Features of a vector tile, grouped by sub-layer names (key of the map)
const QgsCoordinateReferenceSystem & crs
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.