58 #include <QMouseEvent>
67 , mLastMapUnitsPerPixel( -1.0 )
68 , mCoordinatePrecision( 6 )
100 return identify( x, y, mode, QList<QgsMapLayer *>(), layerType, identifyContext );
110 return identify( geometry, mode, QList<QgsMapLayer *>(), layerType, identifyContext );
115 QList<IdentifyResult> results;
117 mLastGeometry = geometry;
118 mLastExtent =
mCanvas->extent();
119 mLastMapUnitsPerPixel =
mCanvas->mapUnitsPerPixel();
121 mCoordinatePrecision = QgsCoordinateUtils::calculateCoordinatePrecision( mLastMapUnitsPerPixel,
mCanvas->mapSettings().destinationCrs() );
132 int x = canvasPt.x(), y = canvasPt.y();
133 QList<IdentifyResult> results =
identify( x, y,
TopDownAll, layerList, layerType, identifyContext );
134 QPoint globalPos =
mCanvas->mapToGlobal( QPoint( x + 5, y + 5 ) );
137 else if ( mode ==
ActiveLayer && layerList.isEmpty() )
143 emit
identifyMessage( tr(
"No active layer. To identify features, you must choose an active layer." ) );
149 QApplication::setOverrideCursor( Qt::WaitCursor );
151 identifyLayer( &results,
layer, mLastGeometry, mLastExtent, mLastMapUnitsPerPixel, layerType, identifyContext );
155 QApplication::setOverrideCursor( Qt::WaitCursor );
157 QList< QgsMapLayer * > targetLayers;
158 if ( layerList.isEmpty() )
159 targetLayers =
mCanvas->layers(
true );
161 targetLayers = layerList;
163 const int layerCount = targetLayers.size();
164 for (
int i = 0; i < layerCount; i++ )
174 if (
identifyLayer( &results,
layer, mLastGeometry, mLastExtent, mLastMapUnitsPerPixel, layerType, identifyContext ) )
185 QApplication::restoreOverrideCursor();
192 mOverrideCanvasSearchRadius = searchRadiusMapUnits;
197 mOverrideCanvasSearchRadius = -1;
229 return identifyRasterLayer( results, qobject_cast<QgsRasterLayer *>(
layer ), geometry, viewExtent, mapUnitsPerPixel, identifyContext );
243 return identifyVectorTileLayer( results, qobject_cast<QgsVectorTileLayer *>(
layer ), geometry, identifyContext );
250 return identifyPointCloudLayer( results, qobject_cast<QgsPointCloudLayer *>(
layer ), geometry, identifyContext );
281 double searchRadius = mOverrideCanvasSearchRadius < 0 ?
searchRadiusMU(
mCanvas ) : mOverrideCanvasSearchRadius;
284 QList<QgsMeshDatasetIndex> datasetIndexList;
285 int activeScalarGroup =
layer->rendererSettings().activeScalarDatasetGroup();
286 int activeVectorGroup =
layer->rendererSettings().activeVectorDatasetGroup();
288 const QList<int> allGroup =
layer->enabledDatasetGroupsIndexes();
292 if ( activeScalarGroup >= 0 )
293 datasetIndexList.append(
layer->activeScalarDatasetAtTime( time ) );
294 if ( activeVectorGroup >= 0 && activeVectorGroup != activeScalarGroup )
295 datasetIndexList.append(
layer->activeVectorDatasetAtTime( time ) );
297 for (
int groupIndex : allGroup )
299 if ( groupIndex != activeScalarGroup && groupIndex != activeVectorGroup )
300 datasetIndexList.append(
layer->datasetIndexAtTime( time, groupIndex ) );
306 if ( activeScalarGroup >= 0 )
307 datasetIndexList.append(
layer->staticScalarDatasetIndex() );
308 if ( activeVectorGroup >= 0 && activeVectorGroup != activeScalarGroup )
309 datasetIndexList.append(
layer->staticVectorDatasetIndex() );
312 for (
int groupIndex : allGroup )
314 if ( groupIndex != activeScalarGroup && groupIndex != activeVectorGroup )
316 if ( !
layer->datasetGroupMetadata( groupIndex ).isTemporal() )
317 datasetIndexList.append( groupIndex );
325 if ( !index.isValid() )
329 QMap< QString, QString > derivedAttributes;
331 QMap<QString, QString> attribute;
335 const double scalar = scalarValue.
scalar();
336 attribute.insert( tr(
"Scalar Value" ), std::isnan( scalar ) ? tr(
"no data" ) : QLocale().toString( scalar ) );
342 const double vectorX = vectorValue.
x();
343 const double vectorY = vectorValue.
y();
344 if ( std::isnan( vectorX ) || std::isnan( vectorY ) )
345 attribute.insert( tr(
"Vector Value" ), tr(
"no data" ) );
348 attribute.insert( tr(
"Vector Magnitude" ), QLocale().toString( vectorValue.
scalar() ) );
349 derivedAttributes.insert( tr(
"Vector x-component" ), QLocale().toString( vectorY ) );
350 derivedAttributes.insert( tr(
"Vector y-component" ), QLocale().toString( vectorX ) );
357 derivedAttributes.insert( tr(
"Time Step" ),
layer->formatTime( meta.
time() ) );
358 derivedAttributes.insert( tr(
"Source" ), groupMeta.
uri() );
360 QString resultName = groupMeta.
name();
361 if ( isTemporal && ( index.group() == activeScalarGroup || index.group() == activeVectorGroup ) )
362 resultName.append( tr(
" (active)" ) );
369 results->append( result );
372 QMap<QString, QString> derivedGeometry;
377 derivedGeometry.insert( tr(
"Snapped Vertex Position X" ), QLocale().toString( vertexPoint.
x() ) );
378 derivedGeometry.insert( tr(
"Snapped Vertex Position Y" ), QLocale().toString( vertexPoint.
y() ) );
384 derivedGeometry.insert( tr(
"Face Centroid X" ), QLocale().toString( faceCentroid.
x() ) );
385 derivedGeometry.insert( tr(
"Face Centroid Y" ), QLocale().toString( faceCentroid.
y() ) );
391 derivedGeometry.insert( tr(
"Point on Edge X" ), QLocale().toString( pointOnEdge.
x() ) );
392 derivedGeometry.insert( tr(
"Point on Edge Y" ), QLocale().toString( pointOnEdge.
y() ) );
400 results->append( result );
407 Q_UNUSED( identifyContext )
419 QMap< QString, QString > commonDerivedAttributes;
422 bool isPointOrRectangle;
427 isPointOrRectangle =
true;
428 point = selectionGeom.
asPoint();
438 int featureCount = 0;
440 std::unique_ptr<QgsGeometryEngine> selectionGeomPrepared;
450 double sr = mOverrideCanvasSearchRadius < 0 ?
searchRadiusMU(
mCanvas ) : mOverrideCanvasSearchRadius;
457 if ( !isPointOrRectangle )
468 const double tileScale =
layer->tileMatrixSet().calculateTileScaleForMap(
470 mCanvas->mapSettings().destinationCrs(),
471 mCanvas->mapSettings().extent(),
475 const int tileZoom =
layer->tileMatrixSet().scaleToZoomLevel( tileScale );
479 const QVector< QgsTileXYZ> tiles =
layer->tileMatrixSet().tilesInRange( tileRange, tileZoom );
484 if ( data.
data.isEmpty() )
488 if ( !decoder.decode( data ) )
491 QMap<QString, QgsFields> perLayerFields;
492 const QStringList layerNames = decoder.layers();
493 for (
const QString &layerName : layerNames )
495 QSet<QString> fieldNames = qgis::listToSet( decoder.layerFieldNames( layerName ) );
500 const QStringList featuresLayerNames = features.keys();
501 for (
const QString &layerName : featuresLayerNames )
503 const QgsFields fFields = perLayerFields[layerName];
504 const QVector<QgsFeature> &layerFeatures = features[layerName];
507 if ( f.geometry().intersects( r ) && ( !selectionGeomPrepared || selectionGeomPrepared->intersects( f.geometry().constGet() ) ) )
509 QMap< QString, QString > derivedAttributes = commonDerivedAttributes;
510 derivedAttributes.insert( tr(
"Feature ID" ),
FID_TO_STRING( f.id() ) );
511 derivedAttributes.insert( tr(
"Tile column" ), QString::number( tileID.column() ) );
512 derivedAttributes.insert( tr(
"Tile row" ), QString::number( tileID.row() ) );
513 derivedAttributes.insert( tr(
"Tile zoom" ), QString::number( tileID.zoomLevel() ) );
515 results->
append( IdentifyResult(
layer, layerName, fFields, f, derivedAttributes ) );
530 return featureCount > 0;
548 const double searchRadiusMapUnits = mOverrideCanvasSearchRadius < 0 ?
searchRadiusMU(
mCanvas ) : mOverrideCanvasSearchRadius;
550 const QVector<QVariantMap> points = renderer->
identify(
layer, context, geometry, searchRadiusMapUnits );
559 QMap< QString, QString > derivedAttributes;
563 formatCoordinate( point, x, y );
565 derivedAttributes.insert( tr(
"(clicked coordinate X)" ), x );
566 derivedAttributes.insert( tr(
"(clicked coordinate Y)" ), y );
568 derivedAttributes.insert( tr(
"(clicked coordinate Z)" ), QLocale().toString( point.
z(),
'f' ) );
569 return derivedAttributes;
583 QString temporalFilter;
591 temporalFilter = qobject_cast< const QgsVectorLayerTemporalProperties * >(
layer->
temporalProperties() )->createFilterString( temporalContext, identifyContext.
temporalRange() );
596 QApplication::setOverrideCursor( Qt::WaitCursor );
598 QMap< QString, QString > commonDerivedAttributes;
601 bool isPointOrRectangle;
606 isPointOrRectangle =
true;
607 point = *qgsgeometry_cast< const QgsPoint *>( selectionGeom.
constGet() );
618 std::unique_ptr<QgsGeometryEngine> selectionGeomPrepared;
628 double sr = mOverrideCanvasSearchRadius < 0 ?
searchRadiusMU(
mCanvas ) : mOverrideCanvasSearchRadius;
635 if ( !isPointOrRectangle )
649 if ( !temporalFilter.isEmpty() )
656 if ( !selectionGeomPrepared || selectionGeomPrepared->intersects( f.
geometry().
constGet() ) )
672 std::unique_ptr< QgsFeatureRenderer > renderer(
layer->renderer() ?
layer->renderer()->
clone() :
nullptr );
681 if ( !isSingleClick )
684 const int featureCount =
identifyVectorLayer( results,
layer, featureList, filter ? renderer.get() :
nullptr, commonDerivedAttributes,
685 [point,
layer,
this](
const QgsFeature & feature )->QMap< QString, QString >
687 return featureDerivedAttributes( feature, layer, toLayerCoordinates( layer, point ) );
694 QApplication::restoreOverrideCursor();
695 return featureCount > 0;
700 int featureCount = 0;
701 for (
const QgsFeature &feature : std::as_const( features ) )
703 QMap< QString, QString > derivedAttributes = commonDerivedAttributes;
711 derivedAttributes.insert( deriveAttributesForFeature( feature ) );
712 derivedAttributes.insert( tr(
"Feature ID" ), fid < 0 ? tr(
"new feature" ) :
FID_TO_STRING( fid ) );
714 results->append( IdentifyResult( qobject_cast<QgsMapLayer *>(
layer ), feature, derivedAttributes ) );
729 QString
str = QLocale().toString( vId.
vertex + 1 );
730 derivedAttributes.insert( tr(
"Closest vertex number" ),
str );
734 QgsPoint closestPointMapCoords =
mCanvas->mapSettings().layerToMapCoordinates(
layer, closestPoint );
738 formatCoordinate( closestPointMapCoords, x, y );
739 derivedAttributes.insert( tr(
"Closest vertex X" ), x );
740 derivedAttributes.insert( tr(
"Closest vertex Y" ), y );
742 if ( closestPoint.
is3D() )
744 str = QLocale().toString( closestPointMapCoords.
z(),
'g', 10 );
745 derivedAttributes.insert( tr(
"Closest vertex Z" ),
str );
749 str = QLocale().toString( closestPointMapCoords.
m(),
'g', 10 );
750 derivedAttributes.insert( tr(
"Closest vertex M" ),
str );
755 double radius, centerX, centerY;
761 geometry.
vertexAt( vIdAfter ), radius, centerX, centerY );
762 derivedAttributes.insert( QStringLiteral(
"Closest vertex radius" ), QLocale().toString( radius ) );
766 void QgsMapToolIdentify::closestPointAttributes(
const QgsAbstractGeometry &geometry,
const QgsPointXY &layerPoint, QMap<QString, QString> &derivedAttributes )
772 formatCoordinate( closestPoint, x, y );
773 derivedAttributes.insert( tr(
"Closest X" ), x );
774 derivedAttributes.insert( tr(
"Closest Y" ), y );
776 if ( closestPoint.
is3D() )
778 const QString
str = QLocale().toString( closestPoint.
z(),
'g', 10 );
779 derivedAttributes.insert( tr(
"Interpolated Z" ),
str );
783 const QString
str = QLocale().toString( closestPoint.
m(),
'g', 10 );
784 derivedAttributes.insert( tr(
"Interpolated M" ),
str );
788 void QgsMapToolIdentify::formatCoordinate(
const QgsPointXY &canvasPoint, QString &x, QString &y )
const
791 mCoordinatePrecision, x, y );
798 QMap< QString, QString > derivedAttributes;
825 derivedAttributes.insert( tr(
"Parts" ),
str );
828 str = QLocale().toString( vId.
part + 1 );
829 derivedAttributes.insert( tr(
"Part number" ),
str );
834 ? displayDistanceUnits() :
layer->
crs().mapUnits();
847 str = formatDistance( dist );
848 derivedAttributes.insert( tr(
"Length (Ellipsoidal — %1)" ).arg( ellipsoid ),
str );
857 derivedAttributes.insert( tr(
"Length (Cartesian — 2D)" ),
str );
861 return total + qgsgeometry_cast< const QgsLineString * >( part )->length3D();
864 str = formatDistance( totalLength3d, cartesianDistanceUnits );
865 derivedAttributes.insert( tr(
"Length (Cartesian — 3D)" ),
str );
869 derivedAttributes.insert( tr(
"Length (Cartesian)" ),
str );
873 derivedAttributes.insert( tr(
"Vertices" ),
str );
877 closestVertexAttributes( *geom, vId,
layer, derivedAttributes );
878 closestPointAttributes( *geom, layerPoint, derivedAttributes );
881 if (
const QgsCurve *curve = qgsgeometry_cast< const QgsCurve * >( geom ) )
887 formatCoordinate( pnt, x, y );
888 derivedAttributes.insert( tr(
"firstX",
"attributes get sorted; translation for lastX should be lexically larger than this one" ), x );
889 derivedAttributes.insert( tr(
"firstY" ), y );
890 pnt =
mCanvas->mapSettings().layerToMapCoordinates(
layer,
QgsPointXY( curve->endPoint().x(), curve->endPoint().y() ) );
891 formatCoordinate( pnt, x, y );
892 derivedAttributes.insert( tr(
"lastX",
"attributes get sorted; translation for firstX should be lexically smaller than this one" ), x );
893 derivedAttributes.insert( tr(
"lastY" ), y );
903 str = formatArea( area );
904 derivedAttributes.insert( tr(
"Area (Ellipsoidal — %1)" ).arg( ellipsoid ),
str );
908 derivedAttributes.insert( tr(
"Area (Cartesian)" ),
str );
914 str = formatDistance( perimeter );
915 derivedAttributes.insert( tr(
"Perimeter (Ellipsoidal — %1)" ).arg( ellipsoid ),
str );
919 derivedAttributes.insert( tr(
"Perimeter (Cartesian)" ),
str );
922 derivedAttributes.insert( tr(
"Vertices" ),
str );
928 closestPointAttributes( *feature.
geometry().
constGet(), layerPoint, derivedAttributes );
939 formatCoordinate( pnt, x, y );
940 derivedAttributes.insert( tr(
"X" ), x );
941 derivedAttributes.insert( tr(
"Y" ), y );
946 derivedAttributes.insert( tr(
"Z" ),
str );
951 derivedAttributes.insert( tr(
"M" ),
str );
962 closestVertexAttributes( *geom, vId,
layer, derivedAttributes );
972 return derivedAttributes;
987 std::unique_ptr< QgsRasterDataProvider > dprovider(
layer->
dataProvider()->clone() );
991 int capabilities = dprovider->capabilities();
1000 dprovider->temporalCapabilities()->setRequestedTemporalRange( identifyContext.
temporalRange() );
1017 QgsDebugError( QStringLiteral(
"coordinate not reprojectable: %1" ).arg( cse.
what() ) );
1020 QgsDebugMsgLevel( QStringLiteral(
"point = %1 %2" ).arg( point.
x() ).arg( point.
y() ), 2 );
1025 QMap< QString, QString > attributes, derivedAttributes;
1045 if ( dprovider->crs() !=
mCanvas->mapSettings().destinationCrs() )
1054 r.
setXMinimum( pointInCanvasCrs.
x() - mapUnitsPerPixel / 2. );
1055 r.
setXMaximum( pointInCanvasCrs.
x() + mapUnitsPerPixel / 2. );
1056 r.
setYMinimum( pointInCanvasCrs.
y() - mapUnitsPerPixel / 2. );
1057 r.
setYMaximum( pointInCanvasCrs.
y() + mapUnitsPerPixel / 2. );
1061 identifyResult = dprovider->identify( point, format, r, 1, 1 );
1077 int width =
static_cast< int >( std::round( viewExtent.
width() / mapUnitsPerPixel ) );
1078 int height =
static_cast< int >( std::round( viewExtent.
height() / mapUnitsPerPixel ) );
1080 QgsDebugMsgLevel( QStringLiteral(
"viewExtent.width = %1 viewExtent.height = %2" ).arg( viewExtent.
width() ).arg( viewExtent.
height() ), 2 );
1081 QgsDebugMsgLevel( QStringLiteral(
"width = %1 height = %2" ).arg( width ).arg( height ), 2 );
1082 QgsDebugMsgLevel( QStringLiteral(
"xRes = %1 yRes = %2 mapUnitsPerPixel = %3" ).arg( viewExtent.
width() / width ).arg( viewExtent.
height() / height ).arg( mapUnitsPerPixel ), 2 );
1084 identifyResult = dprovider->identify( point, format, viewExtent, width, height );
1095 bool foundMatch =
false;
1096 QMap<int, QVariant> values = identifyResult.
results();
1097 for (
auto it = values.constBegin(); it != values.constEnd(); ++it )
1103 const double value = it.value().toDouble();
1129 const double xres =
layer->rasterUnitsPerPixelX();
1130 const double yres =
layer->rasterUnitsPerPixelY();
1138 const int rasterCol =
static_cast< int >( std::floor( ( point.
x() - extent.
xMinimum() ) / xres ) );
1139 const int rasterRow =
static_cast< int >( std::floor( ( extent.
yMaximum() - point.
y() ) / yres ) );
1141 derivedAttributes.insert( tr(
"Column (0-based)" ), QLocale().toString( rasterCol ) );
1142 derivedAttributes.insert( tr(
"Row (0-based)" ), QLocale().toString( rasterRow ) );
1145 extent.
yMaximum() - ( rasterRow + 1 ) * yres,
1146 ( rasterCol + 1 ) * xres + extent.
xMinimum(),
1147 extent.
yMaximum() - ( rasterRow * yres ) );
1150 if ( identifyResult.
isValid() )
1152 QMap<int, QVariant> values = identifyResult.
results();
1155 for (
auto it = values.constBegin(); it != values.constEnd(); ++it )
1157 QString valueString;
1160 valueString = tr(
"no data" );
1164 QVariant value( it.value() );
1168 if (
static_cast<QMetaType::Type
>( value.type() ) == QMetaType::Float )
1177 attributes.insert( dprovider->generateBandName( it.key() ), valueString );
1183 const double doubleValue { it.value().toDouble( &ok ) };
1186 const QVariantList row = rat->row( doubleValue );
1187 if ( ! row.isEmpty() )
1189 for (
int colIdx = 0; colIdx < std::min( rat->fields().count( ), row.count() ); ++colIdx )
1200 switch ( ratField.type )
1202 case QVariant::Type::Char:
1203 case QVariant::Type::Int:
1204 case QVariant::Type::UInt:
1205 case QVariant::Type::LongLong:
1206 case QVariant::Type::ULongLong:
1207 ratValue = QLocale().toString( row.at( colIdx ).toLongLong() );
1209 case QVariant::Type::Double:
1210 ratValue = QLocale().toString( row.at( colIdx ).toDouble( ) );
1213 ratValue = row.at( colIdx ).toString();
1215 attributes.insert( ratField.name, ratValue );
1225 if ( !pixelRect.
isNull() )
1232 results->append( result );
1236 for (
auto it = values.constBegin(); it != values.constEnd(); ++it )
1238 QVariant value = it.value();
1239 if ( value.type() == QVariant::Bool && !value.toBool() )
1245 if ( value.type() == QVariant::String )
1251 attributes.insert( tr(
"Error" ), value.toString() );
1253 results->append(
IdentifyResult( qobject_cast<QgsMapLayer *>(
layer ), label, attributes, derivedAttributes ) );
1263 for (
const QgsFeature &feature : storeFeatures )
1269 QString sublayer = featureStore.params().value( QStringLiteral(
"sublayer" ) ).toString();
1270 QString featureType = featureStore.params().value( QStringLiteral(
"featureType" ) ).toString();
1272 featureType.remove( QStringLiteral(
"_feature" ) );
1274 if ( sublayer.compare(
layer->
name(), Qt::CaseInsensitive ) != 0 )
1278 if ( featureType.compare( sublayer, Qt::CaseInsensitive ) != 0 || labels.isEmpty() )
1280 labels << featureType;
1283 QMap< QString, QString > derAttributes = derivedAttributes;
1286 IdentifyResult identifyResult( qobject_cast<QgsMapLayer *>(
layer ), labels.join( QLatin1String(
" / " ) ), featureStore.fields(), feature, derAttributes );
1288 identifyResult.
mParams.insert( QStringLiteral(
"getFeatureInfoUrl" ), featureStore.params().value( QStringLiteral(
"getFeatureInfoUrl" ) ) );
1289 results->append( identifyResult );
1296 QgsDebugMsgLevel( QStringLiteral(
"%1 HTML or text values" ).arg( values.size() ), 2 );
1297 for (
auto it = values.constBegin(); it != values.constEnd(); ++it )
1299 QString value = it.value().toString();
1301 attributes.insert( QString(), value );
1304 results->append(
IdentifyResult( qobject_cast<QgsMapLayer *>(
layer ), label, attributes, derivedAttributes ) );
1312 attributes.insert( tr(
"Error" ), value );
1313 QString label = tr(
"Identify error" );
1314 results->append(
IdentifyResult( qobject_cast<QgsMapLayer *>(
layer ), label, attributes, derivedAttributes ) );
1330 QString QgsMapToolIdentify::formatDistance(
double distance )
const
1332 return formatDistance( distance, displayDistanceUnits() );
1335 QString QgsMapToolIdentify::formatArea(
double area )
const
1337 return formatArea( area, displayAreaUnits() );
1340 QString QgsMapToolIdentify::formatDistance(
double distance,
Qgis::DistanceUnit unit )
const
1343 bool baseUnit = settings.
value( QStringLiteral(
"qgis/measure/keepbaseunit" ),
true ).toBool();
1348 QString QgsMapToolIdentify::formatArea(
double area,
Qgis::AreaUnit unit )
const
1351 bool baseUnit = settings.
value( QStringLiteral(
"qgis/measure/keepbaseunit" ),
true ).toBool();
1358 QList<IdentifyResult> results;
1369 for (
const QVariantMap &pt : identified )
1371 QMap<QString, QString> ptStr;
1372 QString classification;
1373 for (
auto attrIt = pt.constBegin(); attrIt != pt.constEnd(); ++attrIt )
1375 if ( attrIt.key().compare( QLatin1String(
"Z" ), Qt::CaseInsensitive ) == 0
1379 ptStr[ tr(
"Z (original)" ) ] = attrIt.value().toString();
1380 ptStr[ tr(
"Z (adjusted)" ) ] = QString::number( attrIt.value().toDouble() * elevationProps->
zScale() + elevationProps->
zOffset() );
1382 else if ( attrIt.key().compare( QLatin1String(
"Classification" ), Qt::CaseInsensitive ) == 0 )
1385 ptStr[ attrIt.key() ] = QStringLiteral(
"%1 (%2)" ).arg( attrIt.value().toString(), classification );
1389 ptStr[attrIt.key()] = attrIt.value().toString();
1392 QgsMapToolIdentify::IdentifyResult res(
layer, classification.isEmpty() ? QString::number(
id ) : QStringLiteral(
"%1 (%2)" ).arg(
id ).arg( classification ), ptStr, QMap<QString, QString>() );
1393 results.append( res );
1403 if ( identified.empty() )
1413 QHash< QgsFeatureId, QVariant > featureDistances;
1414 QHash< QgsFeatureId, QVariant > featureElevations;
1417 for (
const QVariantMap &map : identified )
1419 if ( !map.contains( QStringLiteral(
"id" ) ) )
1421 QMap< QString, QString > attributes;
1422 if ( map.value( QStringLiteral(
"distance" ) ).isValid() )
1423 attributes.insert( tr(
"Distance along curve" ), QString::number( map.value( QStringLiteral(
"distance" ) ).toDouble() ) );
1424 if ( map.value( QStringLiteral(
"elevation" ) ).isValid() )
1425 attributes.insert( tr(
"Elevation" ), QString::number( map.value( QStringLiteral(
"elevation" ) ).toDouble() ) );
1431 const QgsFeatureId id = map.value( QStringLiteral(
"id" ) ).toLongLong();
1432 filterIds.insert(
id );
1434 featureDistances.insert(
id, map.value( QStringLiteral(
"distance" ) ) );
1435 featureElevations.insert(
id, map.value( QStringLiteral(
"elevation" ) ) );
1447 identifyVectorLayer( &results, vl, features,
nullptr, QMap< QString, QString >(), [
this, vl, &featureDistances, &featureElevations](
const QgsFeature & feature )->QMap< QString, QString >
1449 QMap< QString, QString > attributes = featureDerivedAttributes( feature, vl,
QgsPointXY() );
1451 if ( featureDistances.value( feature.
id() ).isValid() )
1452 attributes.insert( tr(
"Distance along curve" ), QString::number( featureDistances.value( feature.
id() ).toDouble() ) );
1453 if ( featureElevations.value( feature.
id() ).isValid() )
1454 attributes.insert( tr(
"Elevation" ), QString::number( featureElevations.value( feature.
id() ).toDouble() ) );
1464 for (
const QVariantMap &map : identified )
1466 QMap< QString, QString > attributes;
1467 if ( map.value( QStringLiteral(
"distance" ) ).isValid() )
1468 attributes.insert( tr(
"Distance along curve" ), QString::number( map.value( QStringLiteral(
"distance" ) ).toDouble() ) );
1469 if ( map.value( QStringLiteral(
"elevation" ) ).isValid() )
1470 attributes.insert( tr(
"Elevation" ), QString::number( map.value( QStringLiteral(
"elevation" ) ).toDouble() ) );
DistanceUnit
Units of distance.
@ ExactIntersect
Use exact geometry intersection (slower) instead of bounding boxes.
@ EmbeddedSymbols
Retrieve any embedded feature symbology (since QGIS 3.20)
@ Curve
An intermediate point on a segment defining the curvature of the segment.
QFlags< FeatureRequestFlag > FeatureRequestFlags
Flags for controlling feature requests.
GeometryType
The geometry types are used to group Qgis::WkbType in a coarse way.
@ 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.
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.
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.
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.
@ 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, FieldOrigin origin=OriginProvider, int originIndex=-1)
Appends a field. The field must have unique name, otherwise it is rejected (returns false)
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.
double zScale() const
Returns the z scale, which is a scaling factor which should be applied to z values from the layer.
virtual bool isVisibleInZRange(const QgsDoubleRange &range) const
Returns true if the layer should be visible and rendered for the specified z range.
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 QgsMapLayer * clone() const =0
Returns a new instance equivalent to this one except for the id which is still unique.
virtual QStringList subLayers() const
Returns the sublayers of this layer.
@ 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.
virtual QgsMapLayerTemporalProperties * temporalProperties()
Returns the layer's temporal properties.
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.
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.
static QgsProject * instance()
Returns the QgsProject singleton instance.
QgsCoordinateTransformContext transformContext
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)
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.
@ Size
Original data source size (and thus resolution) is known, it is not always available,...
Raster layer specific subclass of QgsMapLayerElevationProperties.
bool isEnabled() const
Returns true if the elevation properties are enabled, i.e.
QgsDoubleRange elevationRangeForPixelValue(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.
@ 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)
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.