66 , mLastMapUnitsPerPixel( -1.0 )
67 , mCoordinatePrecision( 6 )
99 return identify( x, y, mode, QList<QgsMapLayer *>(), layerType, identifyContext );
109 return identify( geometry, mode, QList<QgsMapLayer *>(), layerType, identifyContext );
114 QList<IdentifyResult> results;
116 mLastGeometry = geometry;
117 mLastExtent =
mCanvas->extent();
118 mLastMapUnitsPerPixel =
mCanvas->mapUnitsPerPixel();
120 mCoordinatePrecision = QgsCoordinateUtils::calculateCoordinatePrecision( mLastMapUnitsPerPixel,
mCanvas->mapSettings().destinationCrs() );
131 int x = canvasPt.x(), y = canvasPt.y();
132 QList<IdentifyResult> results =
identify( x, y,
TopDownAll, layerList, layerType, identifyContext );
133 QPoint globalPos =
mCanvas->mapToGlobal( QPoint( x + 5, y + 5 ) );
136 else if ( mode ==
ActiveLayer && layerList.isEmpty() )
142 emit
identifyMessage( tr(
"No active layer. To identify features, you must choose an active layer." ) );
148 QApplication::setOverrideCursor( Qt::WaitCursor );
150 identifyLayer( &results,
layer, mLastGeometry, mLastExtent, mLastMapUnitsPerPixel, layerType, identifyContext );
154 QApplication::setOverrideCursor( Qt::WaitCursor );
156 QList< QgsMapLayer * > targetLayers;
157 if ( layerList.isEmpty() )
158 targetLayers =
mCanvas->layers(
true );
160 targetLayers = layerList;
162 const int layerCount = targetLayers.size();
163 for (
int i = 0; i < layerCount; i++ )
173 if (
identifyLayer( &results,
layer, mLastGeometry, mLastExtent, mLastMapUnitsPerPixel, layerType, identifyContext ) )
184 QApplication::restoreOverrideCursor();
191 mOverrideCanvasSearchRadius = searchRadiusMapUnits;
196 mOverrideCanvasSearchRadius = -1;
218 return identifyRasterLayer( results, qobject_cast<QgsRasterLayer *>(
layer ), geometry, viewExtent, mapUnitsPerPixel, identifyContext );
230 return identifyVectorTileLayer( results, qobject_cast<QgsVectorTileLayer *>(
layer ), geometry, identifyContext );
234 return identifyPointCloudLayer( results, qobject_cast<QgsPointCloudLayer *>(
layer ), geometry, identifyContext );
259 double searchRadius = mOverrideCanvasSearchRadius < 0 ?
searchRadiusMU(
mCanvas ) : mOverrideCanvasSearchRadius;
262 QList<QgsMeshDatasetIndex> datasetIndexList;
263 int activeScalarGroup =
layer->rendererSettings().activeScalarDatasetGroup();
264 int activeVectorGroup =
layer->rendererSettings().activeVectorDatasetGroup();
266 const QList<int> allGroup =
layer->enabledDatasetGroupsIndexes();
269 const QgsDateTimeRange &time = identifyContext.
temporalRange();
270 if ( activeScalarGroup >= 0 )
271 datasetIndexList.append(
layer->activeScalarDatasetAtTime( time ) );
272 if ( activeVectorGroup >= 0 && activeVectorGroup != activeScalarGroup )
273 datasetIndexList.append(
layer->activeVectorDatasetAtTime( time ) );
275 for (
int groupIndex : allGroup )
277 if ( groupIndex != activeScalarGroup && groupIndex != activeVectorGroup )
278 datasetIndexList.append(
layer->datasetIndexAtTime( time, groupIndex ) );
284 if ( activeScalarGroup >= 0 )
285 datasetIndexList.append(
layer->staticScalarDatasetIndex() );
286 if ( activeVectorGroup >= 0 && activeVectorGroup != activeScalarGroup )
287 datasetIndexList.append(
layer->staticVectorDatasetIndex() );
290 for (
int groupIndex : allGroup )
292 if ( groupIndex != activeScalarGroup && groupIndex != activeVectorGroup )
294 if ( !
layer->datasetGroupMetadata( groupIndex ).isTemporal() )
295 datasetIndexList.append( groupIndex );
303 if ( !index.isValid() )
307 QMap< QString, QString > derivedAttributes;
309 QMap<QString, QString> attribute;
313 const double scalar = scalarValue.
scalar();
314 attribute.insert( tr(
"Scalar Value" ), std::isnan( scalar ) ? tr(
"no data" ) : QLocale().toString( scalar ) );
320 const double vectorX = vectorValue.
x();
321 const double vectorY = vectorValue.
y();
322 if ( std::isnan( vectorX ) || std::isnan( vectorY ) )
323 attribute.insert( tr(
"Vector Value" ), tr(
"no data" ) );
326 attribute.insert( tr(
"Vector Magnitude" ), QLocale().toString( vectorValue.
scalar() ) );
327 derivedAttributes.insert( tr(
"Vector x-component" ), QLocale().toString( vectorY ) );
328 derivedAttributes.insert( tr(
"Vector y-component" ), QLocale().toString( vectorX ) );
335 derivedAttributes.insert( tr(
"Time Step" ),
layer->formatTime( meta.
time() ) );
336 derivedAttributes.insert( tr(
"Source" ), groupMeta.
uri() );
338 QString resultName = groupMeta.
name();
339 if ( isTemporal && ( index.group() == activeScalarGroup || index.group() == activeVectorGroup ) )
340 resultName.append( tr(
" (active)" ) );
347 results->append( result );
350 QMap<QString, QString> derivedGeometry;
355 derivedGeometry.insert( tr(
"Snapped Vertex Position X" ), QLocale().toString( vertexPoint.
x() ) );
356 derivedGeometry.insert( tr(
"Snapped Vertex Position Y" ), QLocale().toString( vertexPoint.
y() ) );
362 derivedGeometry.insert( tr(
"Face Centroid X" ), QLocale().toString( faceCentroid.
x() ) );
363 derivedGeometry.insert( tr(
"Face Centroid Y" ), QLocale().toString( faceCentroid.
y() ) );
369 derivedGeometry.insert( tr(
"Point on Edge X" ), QLocale().toString( pointOnEdge.
x() ) );
370 derivedGeometry.insert( tr(
"Point on Edge Y" ), QLocale().toString( pointOnEdge.
y() ) );
378 results->append( result );
385 Q_UNUSED( identifyContext )
397 QMap< QString, QString > commonDerivedAttributes;
400 bool isPointOrRectangle;
402 bool isSingleClick = selectionGeom.
type() == Qgis::GeometryType::Point;
405 isPointOrRectangle =
true;
406 point = selectionGeom.
asPoint();
416 int featureCount = 0;
418 std::unique_ptr<QgsGeometryEngine> selectionGeomPrepared;
428 double sr = mOverrideCanvasSearchRadius < 0 ?
searchRadiusMU(
mCanvas ) : mOverrideCanvasSearchRadius;
435 if ( !isPointOrRectangle )
446 const double tileScale =
layer->tileMatrixSet().calculateTileScaleForMap(
448 mCanvas->mapSettings().destinationCrs(),
449 mCanvas->mapSettings().extent(),
453 const int tileZoom =
layer->tileMatrixSet().scaleToZoomLevel( tileScale );
457 const QVector< QgsTileXYZ> tiles =
layer->tileMatrixSet().tilesInRange( tileRange, tileZoom );
462 if ( data.
data.isEmpty() )
466 if ( !decoder.decode( data ) )
469 QMap<QString, QgsFields> perLayerFields;
470 const QStringList layerNames = decoder.layers();
471 for (
const QString &layerName : layerNames )
473 QSet<QString> fieldNames = qgis::listToSet( decoder.layerFieldNames( layerName ) );
478 const QStringList featuresLayerNames = features.keys();
479 for (
const QString &layerName : featuresLayerNames )
481 const QgsFields fFields = perLayerFields[layerName];
482 const QVector<QgsFeature> &layerFeatures = features[layerName];
485 if ( f.geometry().intersects( r ) && ( !selectionGeomPrepared || selectionGeomPrepared->intersects( f.geometry().constGet() ) ) )
487 QMap< QString, QString > derivedAttributes = commonDerivedAttributes;
488 derivedAttributes.insert( tr(
"Feature ID" ),
FID_TO_STRING( f.id() ) );
489 derivedAttributes.insert( tr(
"Tile column" ), QString::number( tileID.column() ) );
490 derivedAttributes.insert( tr(
"Tile row" ), QString::number( tileID.row() ) );
491 derivedAttributes.insert( tr(
"Tile zoom" ), QString::number( tileID.zoomLevel() ) );
493 results->
append( IdentifyResult(
layer, layerName, fFields, f, derivedAttributes ) );
508 return featureCount > 0;
513 Q_UNUSED( identifyContext )
519 const double searchRadiusMapUnits = mOverrideCanvasSearchRadius < 0 ?
searchRadiusMU(
mCanvas ) : mOverrideCanvasSearchRadius;
521 const QVector<QVariantMap> points = renderer->
identify(
layer, context, geometry, searchRadiusMapUnits );
530 QMap< QString, QString > derivedAttributes;
534 formatCoordinate( point, x, y );
536 derivedAttributes.insert( tr(
"(clicked coordinate X)" ), x );
537 derivedAttributes.insert( tr(
"(clicked coordinate Y)" ), y );
539 derivedAttributes.insert( tr(
"(clicked coordinate Z)" ), QLocale().toString( point.
z(),
'f' ) );
540 return derivedAttributes;
554 QString temporalFilter;
562 temporalFilter = qobject_cast< const QgsVectorLayerTemporalProperties * >(
layer->
temporalProperties() )->createFilterString( temporalContext, identifyContext.
temporalRange() );
567 QApplication::setOverrideCursor( Qt::WaitCursor );
569 QMap< QString, QString > commonDerivedAttributes;
572 bool isPointOrRectangle;
574 bool isSingleClick = selectionGeom.
type() == Qgis::GeometryType::Point;
577 isPointOrRectangle =
true;
578 point = *qgsgeometry_cast< const QgsPoint *>( selectionGeom.
constGet() );
589 std::unique_ptr<QgsGeometryEngine> selectionGeomPrepared;
599 double sr = mOverrideCanvasSearchRadius < 0 ?
searchRadiusMU(
mCanvas ) : mOverrideCanvasSearchRadius;
606 if ( !isPointOrRectangle )
620 if ( !temporalFilter.isEmpty() )
627 if ( !selectionGeomPrepared || selectionGeomPrepared->intersects( f.
geometry().
constGet() ) )
643 std::unique_ptr< QgsFeatureRenderer > renderer(
layer->renderer() ?
layer->renderer()->
clone() :
nullptr );
652 if ( !isSingleClick )
655 const int featureCount =
identifyVectorLayer( results,
layer, featureList, filter ? renderer.get() :
nullptr, commonDerivedAttributes,
656 [point,
layer,
this](
const QgsFeature & feature )->QMap< QString, QString >
658 return featureDerivedAttributes( feature, layer, toLayerCoordinates( layer, point ) );
665 QApplication::restoreOverrideCursor();
666 return featureCount > 0;
671 int featureCount = 0;
672 for (
const QgsFeature &feature : std::as_const( features ) )
674 QMap< QString, QString > derivedAttributes = commonDerivedAttributes;
682#if QT_VERSION < QT_VERSION_CHECK(5, 15, 0)
683 derivedAttributes.unite( deriveAttributesForFeature( feature ) );
685 derivedAttributes.insert( deriveAttributesForFeature( feature ) );
688 derivedAttributes.insert( tr(
"Feature ID" ), fid < 0 ? tr(
"new feature" ) :
FID_TO_STRING( fid ) );
690 results->append( IdentifyResult( qobject_cast<QgsMapLayer *>(
layer ), feature, derivedAttributes ) );
705 QString
str = QLocale().toString( vId.
vertex + 1 );
706 derivedAttributes.insert( tr(
"Closest vertex number" ),
str );
710 QgsPoint closestPointMapCoords =
mCanvas->mapSettings().layerToMapCoordinates(
layer, closestPoint );
714 formatCoordinate( closestPointMapCoords, x, y );
715 derivedAttributes.insert( tr(
"Closest vertex X" ), x );
716 derivedAttributes.insert( tr(
"Closest vertex Y" ), y );
718 if ( closestPoint.
is3D() )
720 str = QLocale().toString( closestPointMapCoords.
z(),
'g', 10 );
721 derivedAttributes.insert( tr(
"Closest vertex Z" ),
str );
725 str = QLocale().toString( closestPointMapCoords.
m(),
'g', 10 );
726 derivedAttributes.insert( tr(
"Closest vertex M" ),
str );
729 if ( vId.
type == Qgis::VertexType::Curve )
731 double radius, centerX, centerY;
737 geometry.
vertexAt( vIdAfter ), radius, centerX, centerY );
738 derivedAttributes.insert( QStringLiteral(
"Closest vertex radius" ), QLocale().toString( radius ) );
742void QgsMapToolIdentify::closestPointAttributes(
const QgsAbstractGeometry &geometry,
const QgsPointXY &layerPoint, QMap<QString, QString> &derivedAttributes )
748 formatCoordinate( closestPoint, x, y );
749 derivedAttributes.insert( tr(
"Closest X" ), x );
750 derivedAttributes.insert( tr(
"Closest Y" ), y );
752 if ( closestPoint.
is3D() )
754 const QString
str = QLocale().toString( closestPoint.
z(),
'g', 10 );
755 derivedAttributes.insert( tr(
"Interpolated Z" ),
str );
759 const QString
str = QLocale().toString( closestPoint.
m(),
'g', 10 );
760 derivedAttributes.insert( tr(
"Interpolated M" ),
str );
764void QgsMapToolIdentify::formatCoordinate(
const QgsPointXY &canvasPoint, QString &x, QString &y )
const
767 mCoordinatePrecision, x, y );
774 QMap< QString, QString > derivedAttributes;
803 derivedAttributes.insert( tr(
"Parts" ),
str );
806 str = QLocale().toString( vId.
part + 1 );
807 derivedAttributes.insert( tr(
"Part number" ),
str );
812 ? displayDistanceUnits() :
layer->
crs().mapUnits();
816 if ( geometryType == Qgis::GeometryType::Line )
825 str = formatDistance( dist );
826 derivedAttributes.insert( tr(
"Length (Ellipsoidal — %1)" ).arg( ellipsoid ),
str );
835 derivedAttributes.insert( tr(
"Length (Cartesian — 2D)" ),
str );
839 return total + qgsgeometry_cast< const QgsLineString * >( part )->length3D();
842 str = formatDistance( totalLength3d, cartesianDistanceUnits );
843 derivedAttributes.insert( tr(
"Length (Cartesian — 3D)" ),
str );
847 derivedAttributes.insert( tr(
"Length (Cartesian)" ),
str );
851 derivedAttributes.insert( tr(
"Vertices" ),
str );
855 closestVertexAttributes( *geom, vId,
layer, derivedAttributes );
856 closestPointAttributes( *geom, layerPoint, derivedAttributes );
859 if (
const QgsCurve *curve = qgsgeometry_cast< const QgsCurve * >( geom ) )
865 formatCoordinate( pnt, x, y );
866 derivedAttributes.insert( tr(
"firstX",
"attributes get sorted; translation for lastX should be lexically larger than this one" ), x );
867 derivedAttributes.insert( tr(
"firstY" ), y );
868 pnt =
mCanvas->mapSettings().layerToMapCoordinates(
layer,
QgsPointXY( curve->endPoint().x(), curve->endPoint().y() ) );
869 formatCoordinate( pnt, x, y );
870 derivedAttributes.insert( tr(
"lastX",
"attributes get sorted; translation for firstX should be lexically smaller than this one" ), x );
871 derivedAttributes.insert( tr(
"lastY" ), y );
874 else if ( geometryType == Qgis::GeometryType::Polygon )
881 str = formatArea( area );
882 derivedAttributes.insert( tr(
"Area (Ellipsoidal — %1)" ).arg( ellipsoid ),
str );
886 derivedAttributes.insert( tr(
"Area (Cartesian)" ),
str );
892 str = formatDistance( perimeter );
893 derivedAttributes.insert( tr(
"Perimeter (Ellipsoidal — %1)" ).arg( ellipsoid ),
str );
897 derivedAttributes.insert( tr(
"Perimeter (Cartesian)" ),
str );
900 derivedAttributes.insert( tr(
"Vertices" ),
str );
906 closestPointAttributes( *feature.
geometry().
constGet(), layerPoint, derivedAttributes );
909 else if ( geometryType == Qgis::GeometryType::Point )
917 formatCoordinate( pnt, x, y );
918 derivedAttributes.insert( tr(
"X" ), x );
919 derivedAttributes.insert( tr(
"Y" ), y );
924 derivedAttributes.insert( tr(
"Z" ),
str );
929 derivedAttributes.insert( tr(
"M" ),
str );
940 closestVertexAttributes( *geom, vId,
layer, derivedAttributes );
950 return derivedAttributes;
965 std::unique_ptr< QgsRasterDataProvider > dprovider(
layer->
dataProvider()->clone() );
969 int capabilities = dprovider->capabilities();
978 dprovider->temporalCapabilities()->setRequestedTemporalRange( identifyContext.
temporalRange() );
989 QgsDebugError( QStringLiteral(
"coordinate not reprojectable: %1" ).arg( cse.
what() ) );
992 QgsDebugMsgLevel( QStringLiteral(
"point = %1 %2" ).arg( point.
x() ).arg( point.
y() ), 2 );
997 QMap< QString, QString > attributes, derivedAttributes;
1005 format = Qgis::RasterIdentifyFormat::Feature;
1007 format = Qgis::RasterIdentifyFormat::Value;
1009 format = Qgis::RasterIdentifyFormat::Html;
1011 format = Qgis::RasterIdentifyFormat::Text;
1017 if ( dprovider->crs() !=
mCanvas->mapSettings().destinationCrs() )
1026 r.
setXMinimum( pointInCanvasCrs.
x() - mapUnitsPerPixel / 2. );
1027 r.
setXMaximum( pointInCanvasCrs.
x() + mapUnitsPerPixel / 2. );
1028 r.
setYMinimum( pointInCanvasCrs.
y() - mapUnitsPerPixel / 2. );
1029 r.
setYMaximum( pointInCanvasCrs.
y() + mapUnitsPerPixel / 2. );
1033 identifyResult = dprovider->identify( point, format, r, 1, 1 );
1049 int width =
static_cast< int >( std::round( viewExtent.
width() / mapUnitsPerPixel ) );
1050 int height =
static_cast< int >( std::round( viewExtent.
height() / mapUnitsPerPixel ) );
1052 QgsDebugMsgLevel( QStringLiteral(
"viewExtent.width = %1 viewExtent.height = %2" ).arg( viewExtent.
width() ).arg( viewExtent.
height() ), 2 );
1053 QgsDebugMsgLevel( QStringLiteral(
"width = %1 height = %2" ).arg( width ).arg( height ), 2 );
1054 QgsDebugMsgLevel( QStringLiteral(
"xRes = %1 yRes = %2 mapUnitsPerPixel = %3" ).arg( viewExtent.
width() / width ).arg( viewExtent.
height() / height ).arg( mapUnitsPerPixel ), 2 );
1056 identifyResult = dprovider->identify( point, format, viewExtent, width, height );
1059#if QT_VERSION < QT_VERSION_CHECK(5, 15, 0)
1065 if ( identifyResult.
isValid() )
1067 QMap<int, QVariant> values = identifyResult.
results();
1069 if ( format == Qgis::RasterIdentifyFormat::Value )
1071 for (
auto it = values.constBegin(); it != values.constEnd(); ++it )
1073 QString valueString;
1076 valueString = tr(
"no data" );
1080 QVariant value( it.value() );
1084 if (
static_cast<QMetaType::Type
>( value.type() ) == QMetaType::Float )
1093 attributes.insert( dprovider->generateBandName( it.key() ), valueString );
1099 const double doubleValue { it.value().toDouble( &ok ) };
1102 const QVariantList row = rat->row( doubleValue );
1103 if ( ! row.isEmpty() )
1105 for (
int colIdx = 0; colIdx < std::min( rat->fields().count( ), row.count() ); ++colIdx )
1116 switch ( ratField.type )
1118 case QVariant::Type::Char:
1119 case QVariant::Type::Int:
1120 case QVariant::Type::UInt:
1121 case QVariant::Type::LongLong:
1122 case QVariant::Type::ULongLong:
1123 ratValue = QLocale().toString( row.at( colIdx ).toLongLong() );
1125 case QVariant::Type::Double:
1126 ratValue = QLocale().toString( row.at( colIdx ).toDouble( ) );
1129 ratValue = row.at( colIdx ).toString();
1131 attributes.insert( ratField.name, ratValue );
1140 results->append(
IdentifyResult( qobject_cast<QgsMapLayer *>(
layer ), label, attributes, derivedAttributes ) );
1142 else if ( format == Qgis::RasterIdentifyFormat::Feature )
1144 for (
auto it = values.constBegin(); it != values.constEnd(); ++it )
1146 QVariant value = it.value();
1147 if ( value.type() == QVariant::Bool && !value.toBool() )
1153 if ( value.type() == QVariant::String )
1159 attributes.insert( tr(
"Error" ), value.toString() );
1161 results->append(
IdentifyResult( qobject_cast<QgsMapLayer *>(
layer ), label, attributes, derivedAttributes ) );
1171 for (
const QgsFeature &feature : storeFeatures )
1177 QString sublayer = featureStore.params().value( QStringLiteral(
"sublayer" ) ).toString();
1178 QString featureType = featureStore.params().value( QStringLiteral(
"featureType" ) ).toString();
1180 featureType.remove( QStringLiteral(
"_feature" ) );
1182 if ( sublayer.compare(
layer->
name(), Qt::CaseInsensitive ) != 0 )
1186 if ( featureType.compare( sublayer, Qt::CaseInsensitive ) != 0 || labels.isEmpty() )
1188 labels << featureType;
1191 QMap< QString, QString > derAttributes = derivedAttributes;
1192#if QT_VERSION < QT_VERSION_CHECK(5, 15, 0)
1198 IdentifyResult identifyResult( qobject_cast<QgsMapLayer *>(
layer ), labels.join( QLatin1String(
" / " ) ), featureStore.fields(), feature, derAttributes );
1200 identifyResult.
mParams.insert( QStringLiteral(
"getFeatureInfoUrl" ), featureStore.params().value( QStringLiteral(
"getFeatureInfoUrl" ) ) );
1201 results->append( identifyResult );
1208 QgsDebugMsgLevel( QStringLiteral(
"%1 HTML or text values" ).arg( values.size() ), 2 );
1209 for (
auto it = values.constBegin(); it != values.constEnd(); ++it )
1211 QString value = it.value().toString();
1213 attributes.insert( QString(), value );
1216 results->append(
IdentifyResult( qobject_cast<QgsMapLayer *>(
layer ), label, attributes, derivedAttributes ) );
1224 attributes.insert( tr(
"Error" ), value );
1225 QString label = tr(
"Identify error" );
1226 results->append(
IdentifyResult( qobject_cast<QgsMapLayer *>(
layer ), label, attributes, derivedAttributes ) );
1242QString QgsMapToolIdentify::formatDistance(
double distance )
const
1244 return formatDistance( distance, displayDistanceUnits() );
1247QString QgsMapToolIdentify::formatArea(
double area )
const
1249 return formatArea( area, displayAreaUnits() );
1252QString QgsMapToolIdentify::formatDistance(
double distance,
Qgis::DistanceUnit unit )
const
1255 bool baseUnit = settings.
value( QStringLiteral(
"qgis/measure/keepbaseunit" ),
true ).toBool();
1260QString QgsMapToolIdentify::formatArea(
double area,
Qgis::AreaUnit unit )
const
1263 bool baseUnit = settings.
value( QStringLiteral(
"qgis/measure/keepbaseunit" ),
true ).toBool();
1270 QList<IdentifyResult> results;
1281 for (
const QVariantMap &pt : identified )
1283 QMap<QString, QString> ptStr;
1284 QString classification;
1285 for (
auto attrIt = pt.constBegin(); attrIt != pt.constEnd(); ++attrIt )
1287 if ( attrIt.key().compare( QLatin1String(
"Z" ), Qt::CaseInsensitive ) == 0
1291 ptStr[ tr(
"Z (original)" ) ] = attrIt.value().toString();
1292 ptStr[ tr(
"Z (adjusted)" ) ] = QString::number( attrIt.value().toDouble() * elevationProps->
zScale() + elevationProps->
zOffset() );
1294 else if ( attrIt.key().compare( QLatin1String(
"Classification" ), Qt::CaseInsensitive ) == 0 )
1297 ptStr[ attrIt.key() ] = QStringLiteral(
"%1 (%2)" ).arg( attrIt.value().toString(), classification );
1301 ptStr[attrIt.key()] = attrIt.value().toString();
1304 QgsMapToolIdentify::IdentifyResult res(
layer, classification.isEmpty() ? QString::number(
id ) : QStringLiteral(
"%1 (%2)" ).arg(
id ).arg( classification ), ptStr, QMap<QString, QString>() );
1305 results.append( res );
1315 if ( identified.empty() )
1320 case Qgis::LayerType::Vector:
1325 QHash< QgsFeatureId, QVariant > featureDistances;
1326 QHash< QgsFeatureId, QVariant > featureElevations;
1329 for (
const QVariantMap &map : identified )
1331 if ( !map.contains( QStringLiteral(
"id" ) ) )
1333 QMap< QString, QString > attributes;
1334 if ( map.value( QStringLiteral(
"distance" ) ).isValid() )
1335 attributes.insert( tr(
"Distance along curve" ), QString::number( map.value( QStringLiteral(
"distance" ) ).toDouble() ) );
1336 if ( map.value( QStringLiteral(
"elevation" ) ).isValid() )
1337 attributes.insert( tr(
"Elevation" ), QString::number( map.value( QStringLiteral(
"elevation" ) ).toDouble() ) );
1343 const QgsFeatureId id = map.value( QStringLiteral(
"id" ) ).toLongLong();
1344 filterIds.insert(
id );
1346 featureDistances.insert(
id, map.value( QStringLiteral(
"distance" ) ) );
1347 featureElevations.insert(
id, map.value( QStringLiteral(
"elevation" ) ) );
1359 identifyVectorLayer( &results, vl, features,
nullptr, QMap< QString, QString >(), [
this, vl, &featureDistances, &featureElevations](
const QgsFeature & feature )->QMap< QString, QString >
1361 QMap< QString, QString > attributes = featureDerivedAttributes( feature, vl,
QgsPointXY() );
1363 if ( featureDistances.value( feature.
id() ).isValid() )
1364 attributes.insert( tr(
"Distance along curve" ), QString::number( featureDistances.value( feature.
id() ).toDouble() ) );
1365 if ( featureElevations.value( feature.
id() ).isValid() )
1366 attributes.insert( tr(
"Elevation" ), QString::number( featureElevations.value( feature.
id() ).toDouble() ) );
1373 case Qgis::LayerType::Raster:
1374 case Qgis::LayerType::Mesh:
1376 for (
const QVariantMap &map : identified )
1378 QMap< QString, QString > attributes;
1379 if ( map.value( QStringLiteral(
"distance" ) ).isValid() )
1380 attributes.insert( tr(
"Distance along curve" ), QString::number( map.value( QStringLiteral(
"distance" ) ).toDouble() ) );
1381 if ( map.value( QStringLiteral(
"elevation" ) ).isValid() )
1382 attributes.insert( tr(
"Elevation" ), QString::number( map.value( QStringLiteral(
"elevation" ) ).toDouble() ) );
1390 case Qgis::LayerType::PointCloud:
1397 case Qgis::LayerType::Plugin:
1398 case Qgis::LayerType::VectorTile:
1399 case Qgis::LayerType::Annotation:
1400 case Qgis::LayerType::Group:
DistanceUnit
Units of distance.
GeometryType
The geometry types are used to group Qgis::WkbType in a coarse way.
RasterIdentifyFormat
Raster identify formats.
WkbType
The WKB type describes the number of dimensions a geometry has.
Abstract base class for all geometries.
bool is3D() const SIP_HOLDGIL
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.
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.
Qgis::WkbType wkbType() const SIP_HOLDGIL
Returns the WKB type of the geometry.
const_part_iterator const_parts_begin() const
Returns STL-style iterator pointing to the const first part of the geometry.
bool isMeasure() const SIP_HOLDGIL
Returns true if the geometry contains m values.
static QCursor getThemeCursor(Cursor cursor)
Helper to get a theme cursor.
Q_GADGET 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.
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)
@ 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 & setFilterFids(const QgsFeatureIds &fids)
Sets the feature IDs that should be fetched.
QgsFeatureRequest & setFlags(QgsFeatureRequest::Flags flags)
Sets flags that affect how features will be fetched.
QgsFeatureRequest & setFilterExpression(const QString &expression)
Set the filter expression.
@ ExactIntersect
Use exact geometry intersection (slower) instead of bounding boxes.
@ EmbeddedSymbols
Retrieve any embedded feature symbology (since QGIS 3.20)
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.
Container of fields for a vector layer.
bool append(const QgsField &field, FieldOrigin origin=OriginProvider, int originIndex=-1)
Appends a field. The field must have unique name, otherwise it is rejected (returns false)
int numGeometries() const SIP_HOLDGIL
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) SIP_HOLDGIL
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.
const QgsAbstractGeometry * constGet() const SIP_HOLDGIL
Returns a non-modifiable (const) reference to the underlying abstract geometry primitive.
Qgis::GeometryOperationResult transform(const QgsCoordinateTransform &ct, Qgis::TransformDirection direction=Qgis::TransformDirection::Forward, bool transformZ=false) SIP_THROW(QgsCsException)
Transforms this geometry as described by the coordinate transform ct.
Qgis::WkbType wkbType() const SIP_HOLDGIL
Returns type of the geometry as a WKB type (point / linestring / polygon etc.)
static QgsGeometry fromRect(const QgsRectangle &rect) SIP_HOLDGIL
Creates a new geometry from a QgsRectangle.
QgsPointXY asPoint() const
Returns the contents of the geometry as a 2-dimensional point.
static QgsGeometry fromPointXY(const QgsPointXY &point) SIP_HOLDGIL
Creates a new geometry from a QgsPointXY object.
double area() const
Returns the planar, 2-dimensional area of the geometry.
static QgsGeometryEngine * createGeometryEngine(const QgsAbstractGeometry *geometry)
Creates and returns a new geometry engine representing the specified geometry.
QgsRectangle boundingBox() const
Returns the bounding box of the geometry.
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.
Map canvas is a class for displaying all GIS data types on a canvas.
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 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 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.
bool isEmpty() const SIP_HOLDGIL
Returns true if the geometry is empty.
QString toString(int precision=-1) const
Returns a string representation of the point (x, y) with a preset precision.
Point geometry type, with support for z-dimension and m-values.
static QgsProject * instance()
Returns the QgsProject singleton instance.
QgsCoordinateTransformContext transformContext
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)
Print double value with all necessary significant digits.
static Capability 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.
@ IdentifyValue
Numerical values.
@ Identify
At least one identify format supported.
@ IdentifyFeature
WMS GML -> feature.
Represents a raster layer.
A rectangle specified with double values.
void setYMinimum(double y) SIP_HOLDGIL
Set the minimum y value.
void setXMaximum(double x) SIP_HOLDGIL
Set the maximum x value.
void setXMinimum(double x) SIP_HOLDGIL
Set the minimum x value.
double height() const SIP_HOLDGIL
Returns the height of the rectangle.
void setYMaximum(double y) SIP_HOLDGIL
Set the maximum y value.
double width() const SIP_HOLDGIL
Returns the width of the rectangle.
bool contains(const QgsRectangle &rect) const SIP_HOLDGIL
Returns true when rectangle contains other 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.
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)
Returns true if the specified variant should be considered a NULL value.
@ FeatureSymbology
Provider is able retrieve embedded symbology associated with individual features. Since QGIS 3....
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) SIP_HOLDGIL
Returns true if the WKB type is a multi type.
static bool hasZ(Qgis::WkbType type) SIP_HOLDGIL
Tests whether a WKB type contains the z-dimension.
static Qgis::WkbType singleType(Qgis::WkbType type) SIP_HOLDGIL
Returns the single type for a WKB type.
static bool hasM(Qgis::WkbType type) SIP_HOLDGIL
Tests whether a WKB type contains m values.
static Qgis::WkbType flatType(Qgis::WkbType type) SIP_HOLDGIL
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.
Qgis::VertexType type
Vertex type.
bool isValid() const SIP_HOLDGIL
Returns true if the vertex id is valid.