46 #include <QMouseEvent> 56 , mLastMapUnitsPerPixel( -1.0 )
57 , mCoordinatePrecision( 6 )
89 return identify( x, y, mode, QList<QgsMapLayer *>(), layerType );
99 return identify( geometry, mode, QList<QgsMapLayer *>(), layerType );
104 QList<IdentifyResult> results;
106 mLastGeometry = geometry;
121 int x = canvasPt.x(), y = canvasPt.y();
123 QPoint globalPos =
mCanvas->mapToGlobal( QPoint( x + 5, y + 5 ) );
126 else if ( mode ==
ActiveLayer && layerList.isEmpty() )
132 emit
identifyMessage( tr(
"No active layer. To identify features, you must choose an active layer." ) );
136 QApplication::setOverrideCursor( Qt::WaitCursor );
138 identifyLayer( &results, layer, mLastGeometry, mLastExtent, mLastMapUnitsPerPixel, layerType );
142 QApplication::setOverrideCursor( Qt::WaitCursor );
147 if ( layerList.isEmpty() )
150 layerCount = layerList.count();
153 for (
int i = 0; i < layerCount; i++ )
157 if ( layerList.isEmpty() )
160 layer = layerList.value( i );
165 if ( noIdentifyLayerIdList.contains( layer->
id() ) )
168 if (
identifyLayer( &results, layer, mLastGeometry, mLastExtent, mLastMapUnitsPerPixel, layerType ) )
179 QApplication::restoreOverrideCursor();
203 return identifyRasterLayer( results, qobject_cast<QgsRasterLayer *>( layer ), geometry, viewExtent, mapUnitsPerPixel );
231 QApplication::setOverrideCursor( Qt::WaitCursor );
233 QMap< QString, QString > commonDerivedAttributes;
236 bool isPointOrRectangle;
241 isPointOrRectangle =
true;
242 point = selectionGeom.
asPoint();
244 commonDerivedAttributes.insert( tr(
"(clicked coordinate X)" ), formatXCoordinate( point ) );
245 commonDerivedAttributes.insert( tr(
"(clicked coordinate Y)" ), formatYCoordinate( point ) );
253 int featureCount = 0;
256 std::unique_ptr<QgsGeometryEngine> selectionGeomPrepared;
273 if ( !isPointOrRectangle )
288 if ( !selectionGeomPrepared || selectionGeomPrepared->intersects( f.
geometry().
constGet() ) )
296 QgsDebugMsg( QStringLiteral(
"Caught CRS exception %1" ).arg( cse.
what() ) );
303 std::unique_ptr< QgsFeatureRenderer > renderer( layer->
renderer() ? layer->
renderer()->
clone() : nullptr );
307 renderer->startRender( context, layer->
fields() );
311 for (
const QgsFeature &feature : qgis::as_const( featureList ) )
313 QMap< QString, QString > derivedAttributes = commonDerivedAttributes;
318 if ( filter && !renderer->willRenderFeature( feature, context ) )
324 derivedAttributes.unite( featureDerivedAttributes( feature, layer,
toLayerCoordinates( layer, point ) ) );
326 derivedAttributes.insert( tr(
"Feature ID" ), fid < 0 ? tr(
"new feature" ) :
FID_TO_STRING( fid ) );
328 results->append(
IdentifyResult( qobject_cast<QgsMapLayer *>( layer ), feature, derivedAttributes ) );
333 renderer->stopRender( context );
336 QgsDebugMsg(
"Feature count on identify: " + QString::number( featureCount ) );
338 QApplication::restoreOverrideCursor();
339 return featureCount > 0;
344 QString str = QLocale().toString( vId.
vertex + 1 );
345 derivedAttributes.insert( tr(
"Closest vertex number" ), str );
350 derivedAttributes.insert( QStringLiteral(
"Closest vertex X" ), formatXCoordinate( closestPointMapCoords ) );
351 derivedAttributes.insert( QStringLiteral(
"Closest vertex Y" ), formatYCoordinate( closestPointMapCoords ) );
353 if ( closestPoint.
is3D() )
355 str = QLocale().
toString( closestPoint.
z(),
'g', 10 );
356 derivedAttributes.insert( QStringLiteral(
"Closest vertex Z" ), str );
360 str = QLocale().toString( closestPoint.
m(),
'g', 10 );
361 derivedAttributes.insert( QStringLiteral(
"Closest vertex M" ), str );
366 double radius, centerX, centerY;
372 geometry.
vertexAt( vIdAfter ), radius, centerX, centerY );
373 derivedAttributes.insert( QStringLiteral(
"Closest vertex radius" ), QLocale().toString( radius ) );
377 QString QgsMapToolIdentify::formatCoordinate(
const QgsPointXY &canvasPoint )
const 380 mCoordinatePrecision );
383 QString QgsMapToolIdentify::formatXCoordinate(
const QgsPointXY &canvasPoint )
const 385 QString coordinate = formatCoordinate( canvasPoint );
386 return coordinate.split(
',' ).at( 0 );
389 QString QgsMapToolIdentify::formatYCoordinate(
const QgsPointXY &canvasPoint )
const 391 QString coordinate = formatCoordinate( canvasPoint );
392 return coordinate.split(
',' ).at( 1 );
399 QMap< QString, QString > derivedAttributes;
422 QString str = QLocale().toString( static_cast<const QgsGeometryCollection *>( feature.
geometry().
constGet() )->numGeometries() );
423 derivedAttributes.insert( tr(
"Parts" ), str );
424 str = QLocale().toString( vId.
part + 1 );
425 derivedAttributes.insert( tr(
"Part number" ), str );
429 ? displayDistanceUnits() : layer->
crs().
mapUnits();
440 str = formatDistance( dist );
441 derivedAttributes.insert( tr(
"Length (Ellipsoidal, %1)" ).arg( ellipsoid ), str );
445 derivedAttributes.insert( tr(
"Length (Cartesian)" ), str );
451 derivedAttributes.insert( tr(
"Vertices" ), str );
453 closestVertexAttributes( *geom, vId, layer, derivedAttributes );
455 if (
const QgsCurve *curve = qgsgeometry_cast< const QgsCurve * >( geom ) )
459 str = formatXCoordinate( pnt );
460 derivedAttributes.insert( tr(
"firstX",
"attributes get sorted; translation for lastX should be lexically larger than this one" ), str );
461 str = formatYCoordinate( pnt );
462 derivedAttributes.insert( tr(
"firstY" ), str );
464 str = formatXCoordinate( pnt );
465 derivedAttributes.insert( tr(
"lastX",
"attributes get sorted; translation for firstX should be lexically smaller than this one" ), str );
466 str = formatYCoordinate( pnt );
467 derivedAttributes.insert( tr(
"lastY" ), str );
478 str = formatArea( area );
479 derivedAttributes.insert( tr(
"Area (Ellipsoidal, %1)" ).arg( ellipsoid ), str );
483 derivedAttributes.insert( tr(
"Area (Cartesian)" ), str );
489 str = formatDistance( perimeter );
490 derivedAttributes.insert( tr(
"Perimeter (Ellipsoidal, %1)" ).arg( ellipsoid ), str );
494 derivedAttributes.insert( tr(
"Perimeter (Cartesian)" ), str );
497 derivedAttributes.insert( tr(
"Vertices" ), str );
500 closestVertexAttributes( *feature.
geometry().
constGet(), vId, layer, derivedAttributes );
508 QString str = formatXCoordinate( pnt );
509 derivedAttributes.insert( QStringLiteral(
"X" ), str );
510 str = formatYCoordinate( pnt );
511 derivedAttributes.insert( QStringLiteral(
"Y" ), str );
515 str = QLocale().toString( static_cast<const QgsPoint *>( feature.
geometry().
constGet() )->z(),
'g', 10 );
516 derivedAttributes.insert( QStringLiteral(
"Z" ), str );
520 str = QLocale().toString( static_cast<const QgsPoint *>( feature.
geometry().
constGet() )->m(),
'g', 10 );
521 derivedAttributes.insert( QStringLiteral(
"M" ), str );
531 closestVertexAttributes( *geom, vId, layer, derivedAttributes );
536 return derivedAttributes;
567 QgsDebugMsg( QStringLiteral(
"coordinate not reprojectable: %1" ).arg( cse.
what() ) );
570 QgsDebugMsg( QStringLiteral(
"point = %1 %2" ).arg( point.
x() ).arg( point.
y() ) );
575 QMap< QString, QString > attributes, derivedAttributes;
600 r.
setXMinimum( pointInCanvasCrs.
x() - mapUnitsPerPixel / 2. );
601 r.
setXMaximum( pointInCanvasCrs.
x() + mapUnitsPerPixel / 2. );
602 r.
setYMinimum( pointInCanvasCrs.
y() - mapUnitsPerPixel / 2. );
603 r.
setYMaximum( pointInCanvasCrs.
y() + mapUnitsPerPixel / 2. );
607 identifyResult = dprovider->
identify( point, format, r, 1, 1 );
623 int width = std::round( viewExtent.
width() / mapUnitsPerPixel );
624 int height = std::round( viewExtent.
height() / mapUnitsPerPixel );
626 QgsDebugMsg( QStringLiteral(
"viewExtent.width = %1 viewExtent.height = %2" ).arg( viewExtent.
width() ).arg( viewExtent.
height() ) );
627 QgsDebugMsg( QStringLiteral(
"width = %1 height = %2" ).arg( width ).arg( height ) );
628 QgsDebugMsg( QStringLiteral(
"xRes = %1 yRes = %2 mapUnitsPerPixel = %3" ).arg( viewExtent.
width() / width ).arg( viewExtent.
height() / height ).arg( mapUnitsPerPixel ) );
630 identifyResult = dprovider->
identify( point, format, viewExtent, width, height );
633 derivedAttributes.insert( tr(
"(clicked coordinate X)" ), formatXCoordinate( pointInCanvasCrs ) );
634 derivedAttributes.insert( tr(
"(clicked coordinate Y)" ), formatYCoordinate( pointInCanvasCrs ) );
636 if ( identifyResult.
isValid() )
638 QMap<int, QVariant> values = identifyResult.
results();
642 for (
auto it = values.constBegin(); it != values.constEnd(); ++it )
645 if ( it.value().isNull() )
647 valueString = tr(
"no data" );
651 QVariant value( it.value() );
655 if ( static_cast<QMetaType::Type>( value.type() ) == QMetaType::Float )
666 QString label = layer->
name();
667 results->append(
IdentifyResult( qobject_cast<QgsMapLayer *>( layer ), label, attributes, derivedAttributes ) );
671 for (
auto it = values.constBegin(); it != values.constEnd(); ++it )
673 QVariant value = it.value();
674 if ( value.type() == QVariant::Bool && !value.toBool() )
680 if ( value.type() == QVariant::String )
684 QString label = layer->
subLayers().value( it.key() );
686 attributes.insert( tr(
"Error" ), value.toString() );
688 results->append(
IdentifyResult( qobject_cast<QgsMapLayer *>( layer ), label, attributes, derivedAttributes ) );
704 QString sublayer = featureStore.params().value( QStringLiteral(
"sublayer" ) ).toString();
705 QString featureType = featureStore.params().value( QStringLiteral(
"featureType" ) ).toString();
707 featureType.remove( QStringLiteral(
"_feature" ) );
709 if ( sublayer.compare( layer->
name(), Qt::CaseInsensitive ) != 0 )
713 if ( featureType.compare( sublayer, Qt::CaseInsensitive ) != 0 || labels.isEmpty() )
715 labels << featureType;
718 QMap< QString, QString > derAttributes = derivedAttributes;
719 derAttributes.unite( featureDerivedAttributes( feature, layer ) );
721 IdentifyResult identifyResult( qobject_cast<QgsMapLayer *>( layer ), labels.join( QStringLiteral(
" / " ) ), featureStore.fields(), feature, derAttributes );
723 identifyResult.mParams.insert( QStringLiteral(
"getFeatureInfoUrl" ), featureStore.params().value( QStringLiteral(
"getFeatureInfoUrl" ) ) );
724 results->append( identifyResult );
731 QgsDebugMsg( QStringLiteral(
"%1 HTML or text values" ).arg( values.size() ) );
732 for (
auto it = values.constBegin(); it != values.constEnd(); ++it )
734 QString value = it.value().toString();
736 attributes.insert( QLatin1String(
"" ), value );
738 QString label = layer->
subLayers().value( it.key() );
739 results->append(
IdentifyResult( qobject_cast<QgsMapLayer *>( layer ), label, attributes, derivedAttributes ) );
747 attributes.insert( tr(
"Error" ), value );
748 QString label = tr(
"Identify error" );
749 results->append(
IdentifyResult( qobject_cast<QgsMapLayer *>( layer ), label, attributes, derivedAttributes ) );
765 QString QgsMapToolIdentify::formatDistance(
double distance )
const 767 return formatDistance( distance, displayDistanceUnits() );
770 QString QgsMapToolIdentify::formatArea(
double area )
const 772 return formatArea( area, displayAreaUnits() );
778 bool baseUnit = settings.
value( QStringLiteral(
"qgis/measure/keepbaseunit" ),
true ).toBool();
786 bool baseUnit = settings.
value( QStringLiteral(
"qgis/measure/keepbaseunit" ),
true ).toBool();
793 QList<IdentifyResult> results;
794 if (
identifyRasterLayer( &results, layer, mLastGeometry, mLastExtent, mLastMapUnitsPerPixel ) )
bool isMeasure() const
Returns true if the geometry contains m values.
Wrapper for iterator of features from vector data provider or vector layer.
A container for features with the same fields and crs.
bool contains(const QgsRectangle &rect) const
Returns true when rectangle contains other rectangle.
A rectangle specified with double values.
Base class for all map layer types.
QStringList subLayers() const override
Returns the sublayers of this layer.
static QString printValue(double value)
Print double value with all necessary significant digits.
QgsCoordinateTransformContext transformContext() const
Returns the coordinate transform context, which stores various information regarding which datum tran...
OperationResult transform(const QgsCoordinateTransform &ct, QgsCoordinateTransform::TransformDirection direction=QgsCoordinateTransform::ForwardTransform, bool transformZ=false) SIP_THROW(QgsCsException)
Transforms this geometry as described by the coordinate transform ct.
void setXMaximum(double x)
Set the maximum x value.
Use exact geometry intersection (slower) instead of bounding boxes.
This class is a composition of two QSettings instances:
static bool isMultiType(Type type)
Returns true if the WKB type is a multi type.
QVariant value(const QString &key, const QVariant &defaultValue=QVariant(), Section section=NoSection) const
Returns the value for setting key.
void setFeature(const QgsFeature &feature)
Convenience function for setting a feature for the context.
This class provides qgis with the ability to render raster datasets onto the mapcanvas.
Features may be filtered, i.e. some features may not be rendered (categorized, rule based ...
QList< QgsFeatureStore > QgsFeatureStoreList
QList< QgsFeature > QgsFeatureList
QgsWkbTypes::Type wkbType() const
Returns type of the geometry as a WKB type (point / linestring / polygon etc.)
A class to represent a 2D point.
#define FID_TO_STRING(fid)
int layerCount() const
Returns number of layers on the map.
A QgsMapMouseEvent is the result of a user interaction with the mouse on a QgsMapCanvas.
static Capability identifyFormatToCapability(QgsRaster::IdentifyFormat format)
bool isInScaleRange(double scale) const
Tests whether the layer should be visible at the specified scale.
A geometry is the spatial representation of a feature.
QString toString(int precision=-1) const
Returns a string representation of the point (x, y) with a preset precision.
double convertLengthMeasurement(double length, QgsUnitTypes::DistanceUnit toUnits) const
Takes a length measurement calculated by this QgsDistanceArea object and converts it to a different d...
QgsUnitTypes::DistanceUnit mapUnits
bool setEllipsoid(const QString &ellipsoid)
Sets the ellipsoid by its acronym.
The feature class encapsulates a single feature including its id, geometry and a list of field/values...
static QgsPoint closestVertex(const QgsAbstractGeometry &geom, const QgsPoint &pt, QgsVertexId &id)
Returns the closest vertex to a geometry for a specified point.
double convertAreaMeasurement(double area, QgsUnitTypes::AreaUnit toUnits) const
Takes an area measurement calculated by this QgsDistanceArea object and converts it to a different ar...
bool hasGeometry() const
Returns true if the feature has an associated geometry.
QgsMapLayer::LayerType type() const
Returns the type of the layer.
static bool hasZ(Type type)
Tests whether a WKB type contains the z-dimension.
Map canvas is a class for displaying all GIS data types on a canvas.
QgsCoordinateTransformContext transformContext() const
Returns a copy of the project's coordinate transform context, which stores various information regard...
const QString GEO_NONE
Constant that holds the string representation for "No ellips/No CRS".
QgsCoordinateReferenceSystem destinationCrs() const
returns CRS of destination coordinate reference system
virtual QgsRectangle extent() const
Returns the extent of the layer.
Raster identify results container.
static QgsGeometry fromRect(const QgsRectangle &rect)
Creates a new geometry from a QgsRectangle.
QgsRasterDataProvider * dataProvider() override
Returns the layer's data provider.
virtual double length() const
Returns the length of the geometry.
bool isValid() const
Returns true if valid.
Type
The WKB type describes the number of dimensions a geometry has.
QString id() const
Returns the layer's unique ID, which is used to access this layer from QgsProject.
double mapUnitsPerPixel() const
Returns the mapUnitsPerPixel (map units per pixel) for the canvas.
QgsFields fields() const override
Returns the list of fields of this layer.
Utility class for identifying a unique vertex within a geometry.
static QgsRaster::IdentifyFormat identifyFormatFromName(const QString &formatName)
virtual int capabilities() const
Returns a bitmask containing the supported capabilities.
virtual QgsCoordinateReferenceSystem crs() const =0
Returns the coordinate system for the data source.
double scale() const
Returns the calculated map scale.
double width() const
Returns the width of the rectangle.
void setYMinimum(double y)
Set the minimum y value.
QgsRectangle extent() const
Returns the current zoom extent of the map canvas.
This class wraps a request for features to a vector layer (or directly its vector data provider)...
bool isSpatial() const override
Returns true if this is a geometry layer and false in case of NoGeometry (table only) or UnknownGeome...
QStringList readListEntry(const QString &scope, const QString &key, const QStringList &def=QStringList(), bool *ok=nullptr) const
Key value accessors.
QgsCoordinateReferenceSystem crs() const
Returns the layer's spatial reference system.
QgsFeatureRenderer * renderer()
Returns renderer.
Abstract base class for curved geometry type.
double measureLength(const QgsGeometry &geometry) const
Measures the length of a geometry.
Abstract base class for all geometries.
QgsGeometry geometry() const
Returns the geometry associated with this feature.
Point geometry type, with support for z-dimension and m-values.
QgsWkbTypes::GeometryType type() const
Returns type of the geometry as a QgsWkbTypes::GeometryType.
double measurePerimeter(const QgsGeometry &geometry) const
Measures the perimeter of a polygon geometry.
QgsFeatureIterator getFeatures(const QgsFeatureRequest &request=QgsFeatureRequest()) const override
Query the layer for features specified in request.
QMap< int, QVariant > results() const
Returns the identify results.
static QgsGeometryEngine * createGeometryEngine(const QgsAbstractGeometry *geometry)
Creates and returns a new geometry engine.
const QgsAbstractGeometry * constGet() const
Returns a non-modifiable (const) reference to the underlying abstract geometry primitive.
QgsMapLayer * currentLayer()
returns current layer (set by legend widget)
QgsExpressionContext & expressionContext()
Gets the expression context.
DistanceUnit
Units of distance.
static Q_INVOKABLE DistanceUnitType unitType(QgsUnitTypes::DistanceUnit unit)
Returns the type for a distance unit.
const QgsMapSettings & mapSettings() const
Gets access to properties used for map rendering.
GeometryType
The geometry types are used to group QgsWkbTypes::Type in a coarse way.
A general purpose distance and area calculator, capable of performing ellipsoid based calculations...
QgsUnitTypes::DistanceUnit mapUnits() const
Convenience function for returning the current canvas map units.
Contains information about the context of a rendering operation.
QString message(QgsErrorMessage::Format format=QgsErrorMessage::Html) const
Full error messages description.
QgsPointXY asPoint() const
Returns contents of the geometry as a point if wkbType is WKBPoint, otherwise returns [0...
QgsError error() const
Returns the last error.
void setYMaximum(double y)
Set the maximum y value.
QgsPointXY layerToMapCoordinates(const QgsMapLayer *layer, QgsPointXY point) const
transform point coordinates from layer's CRS to output CRS
static QgsRenderContext fromMapSettings(const QgsMapSettings &mapSettings)
create initialized QgsRenderContext instance from given QgsMapSettings
static QgsProject * instance()
Returns the QgsProject singleton instance.
virtual double perimeter() const
Returns the perimeter of the geometry.
QgsRectangle boundingBox() const
Returns the bounding box of the geometry.
virtual QgsRasterIdentifyResult identify(const QgsPointXY &point, QgsRaster::IdentifyFormat format, const QgsRectangle &boundingBox=QgsRectangle(), int width=0, int height=0, int dpi=96)
Identify raster value(s) found on the point position.
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 QString formatArea(double area, int decimals, QgsUnitTypes::AreaUnit unit, bool keepBaseUnit=false)
Returns an area formatted as a friendly string.
T enumValue(const QString &key, const T &defaultValue, const Section section=NoSection)
Returns the setting value for a setting based on an enum.
static bool hasM(Type type)
Tests whether a WKB type contains m values.
static QCursor getThemeCursor(Cursor cursor)
Helper to get a theme cursor.
void setSourceCrs(const QgsCoordinateReferenceSystem &crs, const QgsCoordinateTransformContext &context)
Sets source spatial reference system crs.
Custom exception class for Coordinate Reference System related exceptions.
QVariant customProperty(const QString &value, const QVariant &defaultValue=QVariant()) const
Read a custom property from layer.
double area() const
Returns the area of the geometry using GEOS.
static QgsExpressionContextScope * layerScope(const QgsMapLayer *layer)
Creates a new scope which contains variables and functions relating to a QgsMapLayer.
bool nextFeature(QgsFeature &f)
virtual QString generateBandName(int bandNumber) const
helper function to create zero padded band names
static Q_INVOKABLE double fromUnitToUnitFactor(QgsUnitTypes::DistanceUnit fromUnit, QgsUnitTypes::DistanceUnit toUnit)
Returns the conversion factor between the specified distance units.
virtual QgsPoint vertexAt(QgsVertexId id) const =0
Returns the point corresponding to a specified vertex id.
virtual int nCoordinates() const
Returns the number of nodes contained in the geometry.
Represents a vector layer which manages a vector based data sets.
static Type flatType(Type type)
Returns the flat type for a WKB type.
static Q_INVOKABLE QgsUnitTypes::AreaUnit distanceToAreaUnit(QgsUnitTypes::DistanceUnit distanceUnit)
Converts a distance unit to its corresponding area unit, e.g., meters to square meters.
bool is3D() const
Returns true if the geometry is 3D and contains a z-value.
QgsMapLayer * layer(int index)
Returns the map layer at position index in the layer stack.
virtual QgsFeatureRenderer * clone() const =0
Create a deep copy of this renderer.
double measureArea(const QgsGeometry &geometry) const
Measures the area of a geometry.
static QgsGeometry fromPointXY(const QgsPointXY &point)
Creates a new geometry from a QgsPointXY object.
void setXMinimum(double x)
Set the minimum x value.
double height() const
Returns the height of the rectangle.
Base class for raster data providers.
static QString formatDistance(double distance, int decimals, QgsUnitTypes::DistanceUnit unit, bool keepBaseUnit=false)
Returns an distance formatted as a friendly string.