68#include "moc_qgsmaptoolidentify.cpp"
70using namespace Qt::StringLiterals;
109 return identify( x, y, mode, QList<QgsMapLayer *>(), layerType, identifyContext );
119 return identify( geometry, mode, QList<QgsMapLayer *>(), layerType, identifyContext );
126 QList<IdentifyResult> results;
128 mLastGeometry = geometry;
129 mLastExtent =
mCanvas->extent();
130 mLastMapUnitsPerPixel =
mCanvas->mapUnitsPerPixel();
132 mCoordinatePrecision = QgsCoordinateUtils::calculateCoordinatePrecision( mLastMapUnitsPerPixel,
mCanvas->mapSettings().destinationCrs() );
143 int x = canvasPt.x(), y = canvasPt.y();
144 QList<IdentifyResult> results =
identify( x, y,
TopDownAll, layerList, layerType, identifyContext );
145 QPoint globalPos =
mCanvas->mapToGlobal( QPoint( x + 5, y + 5 ) );
148 else if ( mode ==
ActiveLayer && layerList.isEmpty() )
154 emit
identifyMessage( tr(
"No active layer. To identify features, you must choose an active layer." ) );
160 QApplication::setOverrideCursor( Qt::WaitCursor );
162 identifyLayer( &results,
layer, mLastGeometry, mLastExtent, mLastMapUnitsPerPixel, layerType, identifyContext );
166 QApplication::setOverrideCursor( Qt::WaitCursor );
168 QList<QgsMapLayer *> targetLayers;
169 if ( layerList.isEmpty() )
170 targetLayers =
mCanvas->layers(
true );
172 targetLayers = layerList;
174 const int layerCount = targetLayers.size();
175 for (
int i = 0; i < layerCount; i++ )
185 if (
identifyLayer( &results,
layer, mLastGeometry, mLastExtent, mLastMapUnitsPerPixel, layerType, identifyContext ) )
196 QApplication::restoreOverrideCursor();
203 mPropertiesOverrides.searchRadiusMapUnits = searchRadiusMapUnits;
208 mPropertiesOverrides.searchRadiusMapUnits = -1;
209 mPropertiesOverrides.skip3DLayers =
false;
214 mPropertiesOverrides = overrides;
220 mPropertiesOverrides.skip3DLayers =
false;
241 QList<IdentifyResult> *results,
245 double mapUnitsPerPixel,
262 return identifyRasterLayer( results, qobject_cast<QgsRasterLayer *>(
layer ), geometry, viewExtent, mapUnitsPerPixel, identifyContext );
276 return identifyVectorTileLayer( results, qobject_cast<QgsVectorTileLayer *>(
layer ), geometry, identifyContext );
283 return identifyPointCloudLayer( results, qobject_cast<QgsPointCloudLayer *>(
layer ), geometry, identifyContext );
314 if ( mPropertiesOverrides.skip3DLayers &&
layer->renderer3D() )
319 if ( !
layer->elevationProperties()->isVisibleInZRange( identifyContext.
zRange() ) )
323 double searchRadius = mPropertiesOverrides.searchRadiusMapUnits < 0 ?
searchRadiusMU(
mCanvas ) : mPropertiesOverrides.searchRadiusMapUnits;
324 bool isTemporal = identifyContext.
isTemporal() &&
layer->temporalProperties()->isActive();
326 QList<QgsMeshDatasetIndex> datasetIndexList;
327 int activeScalarGroup =
layer->rendererSettings().activeScalarDatasetGroup();
328 int activeVectorGroup =
layer->rendererSettings().activeVectorDatasetGroup();
330 const QList<int> allGroup =
layer->enabledDatasetGroupsIndexes();
334 if ( activeScalarGroup >= 0 )
335 datasetIndexList.append(
layer->activeScalarDatasetAtTime( time ) );
336 if ( activeVectorGroup >= 0 && activeVectorGroup != activeScalarGroup )
337 datasetIndexList.append(
layer->activeVectorDatasetAtTime( time ) );
339 for (
int groupIndex : allGroup )
341 if ( groupIndex != activeScalarGroup && groupIndex != activeVectorGroup )
342 datasetIndexList.append(
layer->datasetIndexAtTime( time, groupIndex ) );
348 if ( activeScalarGroup >= 0 )
349 datasetIndexList.append(
layer->staticScalarDatasetIndex() );
350 if ( activeVectorGroup >= 0 && activeVectorGroup != activeScalarGroup )
351 datasetIndexList.append(
layer->staticVectorDatasetIndex() );
354 for (
int groupIndex : allGroup )
356 if ( groupIndex != activeScalarGroup && groupIndex != activeVectorGroup )
358 if ( !
layer->datasetGroupMetadata( groupIndex ).isTemporal() )
359 datasetIndexList.append( groupIndex );
367 if ( !index.isValid() )
371 QMap<QString, QString> derivedAttributes;
373 QMap<QString, QString> attribute;
377 const double scalar = scalarValue.
scalar();
378 attribute.insert( tr(
"Scalar Value" ), std::isnan( scalar ) ? tr(
"no data" ) : QLocale().toString( scalar ) );
384 const double vectorX = vectorValue.
x();
385 const double vectorY = vectorValue.
y();
386 if ( std::isnan( vectorX ) || std::isnan( vectorY ) )
387 attribute.insert( tr(
"Vector Value" ), tr(
"no data" ) );
390 attribute.insert( tr(
"Vector Magnitude" ), QLocale().toString( vectorValue.
scalar() ) );
391 derivedAttributes.insert( tr(
"Vector x-component" ), QLocale().toString( vectorY ) );
392 derivedAttributes.insert( tr(
"Vector y-component" ), QLocale().toString( vectorX ) );
399 derivedAttributes.insert( tr(
"Time Step" ),
layer->formatTime( meta.
time() ) );
400 derivedAttributes.insert( tr(
"Source" ), groupMeta.
uri() );
402 QString resultName = groupMeta.
name();
403 if ( isTemporal && ( index.group() == activeScalarGroup || index.group() == activeVectorGroup ) )
404 resultName.append( tr(
" (active)" ) );
408 results->append( result );
411 QMap<QString, QString> derivedGeometry;
414 const int vertexId =
layer->closestElement(
QgsMesh::Vertex, point, searchRadius, vertexPoint );
417 derivedGeometry.insert( tr(
"Snapped Vertex Index" ), QLocale().toString( vertexId ) );
418 derivedGeometry.insert( tr(
"Snapped Vertex Position X" ), QLocale().toString( vertexPoint.
x() ) );
419 derivedGeometry.insert( tr(
"Snapped Vertex Position Y" ), QLocale().toString( vertexPoint.
y() ) );
423 const int faceId =
layer->closestElement(
QgsMesh::Face, point, searchRadius, faceCentroid );
426 derivedGeometry.insert( tr(
"Face Index" ), QLocale().toString( faceId ) );
427 derivedGeometry.insert( tr(
"Face Centroid X" ), QLocale().toString( faceCentroid.
x() ) );
428 derivedGeometry.insert( tr(
"Face Centroid Y" ), QLocale().toString( faceCentroid.
y() ) );
432 const int edgeId =
layer->closestElement(
QgsMesh::Edge, point, searchRadius, pointOnEdge );
435 derivedGeometry.insert( tr(
"Edge Index" ), QLocale().toString( edgeId ) );
436 derivedGeometry.insert( tr(
"Point on Edge X" ), QLocale().toString( pointOnEdge.
x() ) );
437 derivedGeometry.insert( tr(
"Point on Edge Y" ), QLocale().toString( pointOnEdge.
y() ) );
442 results->append( result );
449 Q_UNUSED( identifyContext )
459 QgsTemporaryCursorOverride waitCursor( Qt::WaitCursor );
461 QMap<QString, QString> commonDerivedAttributes;
463 QgsGeometry selectionGeom = geometry;
464 bool isPointOrRectangle;
469 isPointOrRectangle =
true;
470 point = selectionGeom.
asPoint();
480 int featureCount = 0;
482 std::unique_ptr<QgsGeometryEngine> selectionGeomPrepared;
492 double sr = mPropertiesOverrides.searchRadiusMapUnits < 0 ?
searchRadiusMU(
mCanvas ) : mPropertiesOverrides.searchRadiusMapUnits;
499 if ( !isPointOrRectangle )
501 QgsCoordinateTransform ct(
mCanvas->mapSettings().destinationCrs(),
layer->crs(),
mCanvas->mapSettings().transformContext() );
510 const double tileScale
513 const int tileZoom =
layer->tileMatrixSet().scaleToZoomLevel( tileScale );
514 const QgsTileMatrix tileMatrix =
layer->tileMatrixSet().tileMatrix( tileZoom );
517 const QVector<QgsTileXYZ> tiles =
layer->tileMatrixSet().tilesInRange( tileRange, tileZoom );
519 for (
const QgsTileXYZ &tileID : tiles )
521 const QgsVectorTileRawData data =
layer->getRawTile( tileID );
522 if ( data.
data.isEmpty() )
525 QgsVectorTileMVTDecoder decoder(
layer->tileMatrixSet() );
526 if ( !decoder.decode( data ) )
529 QMap<QString, QgsFields> perLayerFields;
530 const QStringList layerNames = decoder.layers();
531 for (
const QString &layerName : layerNames )
533 QSet<QString> fieldNames = qgis::listToSet( decoder.layerFieldNames( layerName ) );
537 const QgsVectorTileFeatures features = decoder.layerFeatures( perLayerFields, QgsCoordinateTransform() );
538 const QStringList featuresLayerNames = features.keys();
539 for (
const QString &layerName : featuresLayerNames )
541 const QgsFields fFields = perLayerFields[layerName];
542 const QVector<QgsFeature> &layerFeatures = features[layerName];
543 for (
const QgsFeature &f : layerFeatures )
545 if ( f.geometry().intersects( r ) && ( !selectionGeomPrepared || selectionGeomPrepared->intersects( f.geometry().constGet() ) ) )
547 QMap<QString, QString> derivedAttributes = commonDerivedAttributes;
548 derivedAttributes.insert( tr(
"Feature ID" ),
FID_TO_STRING( f.id() ) );
549 derivedAttributes.insert( tr(
"Tile column" ), QString::number( tileID.column() ) );
550 derivedAttributes.insert( tr(
"Tile row" ), QString::number( tileID.row() ) );
551 derivedAttributes.insert( tr(
"Tile zoom" ), QString::number( tileID.zoomLevel() ) );
561 catch ( QgsCsException &cse )
568 return featureCount > 0;
573 if ( mPropertiesOverrides.skip3DLayers &&
layer->renderer3D() )
578 if ( !
layer->elevationProperties()->isVisibleInZRange( identifyContext.
zRange(),
layer ) )
582 QgsPointCloudRenderer *renderer =
layer->renderer();
589 const double searchRadiusMapUnits = mPropertiesOverrides.searchRadiusMapUnits < 0 ?
searchRadiusMU(
mCanvas ) : mPropertiesOverrides.searchRadiusMapUnits;
591 const QVector<QVariantMap> points = renderer->
identify(
layer, context, geometry, searchRadiusMapUnits );
600 QMap<QString, QString> derivedAttributes;
604 formatCoordinate( point, x, y );
606 derivedAttributes.insert( tr(
"(clicked coordinate X)" ), x );
607 derivedAttributes.insert( tr(
"(clicked coordinate Y)" ), y );
609 derivedAttributes.insert( tr(
"(clicked coordinate Z)" ), QLocale().toString( point.
z(),
'f' ) );
610 return derivedAttributes;
627 QString temporalFilter;
630 if ( !
layer->temporalProperties()->isVisibleInTemporalRange( identifyContext.
temporalRange() ) )
633 QgsVectorLayerTemporalContext temporalContext;
635 temporalFilter = qobject_cast<const QgsVectorLayerTemporalProperties *>(
layer->temporalProperties() )->createFilterString( temporalContext, identifyContext.
temporalRange() );
640 QApplication::setOverrideCursor( Qt::WaitCursor );
642 QMap<QString, QString> commonDerivedAttributes;
644 QgsGeometry selectionGeom = geometry;
645 bool isPointOrRectangle;
650 isPointOrRectangle =
true;
662 std::unique_ptr<QgsGeometryEngine> selectionGeomPrepared;
672 double sr = mPropertiesOverrides.searchRadiusMapUnits < 0 ?
searchRadiusMU(
mCanvas ) : mPropertiesOverrides.searchRadiusMapUnits;
679 if ( !isPointOrRectangle )
681 QgsCoordinateTransform ct(
mCanvas->mapSettings().destinationCrs(),
layer->crs(),
mCanvas->mapSettings().transformContext() );
690 QgsFeatureRequest featureRequest;
693 if ( !temporalFilter.isEmpty() )
696 QgsFeatureIterator fit =
layer->getFeatures( featureRequest );
700 if ( !selectionGeomPrepared || selectionGeomPrepared->intersects( f.
geometry().
constGet() ) )
701 featureList << QgsFeature( f );
704 catch ( QgsCsException &cse )
716 std::unique_ptr<QgsFeatureRenderer> renderer(
layer->renderer() ?
layer->renderer()->clone() :
nullptr );
725 if ( !isSingleClick )
732 filter ? renderer.get() :
nullptr,
733 commonDerivedAttributes,
734 [point,
layer,
this](
const QgsFeature &feature ) -> QMap<QString, QString> { return featureDerivedAttributes( feature, layer, toLayerCoordinates( layer, point ) ); },
742 QApplication::restoreOverrideCursor();
743 return featureCount > 0;
747 QList<IdentifyResult> *results,
751 const QMap<QString, QString> &commonDerivedAttributes,
752 const std::function<QMap<QString, QString>(
const QgsFeature & )> &deriveAttributesForFeature,
756 int featureCount = 0;
757 for (
const QgsFeature &feature : std::as_const( features ) )
759 QMap<QString, QString> derivedAttributes = commonDerivedAttributes;
767 derivedAttributes.insert( deriveAttributesForFeature( feature ) );
768 derivedAttributes.insert( tr(
"Feature ID" ), fid < 0 ? tr(
"new feature" ) :
FID_TO_STRING( fid ) );
770 results->append(
IdentifyResult( qobject_cast<QgsMapLayer *>(
layer ), feature, derivedAttributes ) );
776void QgsMapToolIdentify::closestVertexAttributes(
782 bool showTransformedZ,
783 QMap<QString, QString> &derivedAttributes
793 QString str = QLocale().toString( vId.
vertex + 1 );
794 derivedAttributes.insert( tr(
"Closest vertex number" ), str );
796 QgsPoint closestPoint = geometry.
vertexAt( vId );
797 QgsPoint closestPointMapCoords = closestPoint;
798 if ( layerToMapTransform.
isValid() )
804 catch ( QgsCsException &cse )
812 formatCoordinate( closestPointMapCoords, x, y );
813 derivedAttributes.insert( tr(
"Closest vertex X" ), x );
814 derivedAttributes.insert( tr(
"Closest vertex Y" ), y );
816 if ( closestPoint.
is3D() )
818 str = QLocale().toString( closestPoint.
z(),
'g', 10 );
821 if ( showTransformedZ && !std::isnan( closestPointMapCoords.
z() ) && !
qgsDoubleNear( closestPoint.
z(), closestPointMapCoords.
z() ) )
823 const QString str = QLocale().toString( closestPointMapCoords.
z(),
'g', 10 );
829 str = QLocale().toString( closestPointMapCoords.
m(),
'g', 10 );
830 derivedAttributes.insert( tr(
"Closest vertex M" ), str );
835 double radius, centerX, centerY;
836 QgsVertexId vIdBefore = vId;
838 QgsVertexId vIdAfter = vId;
841 derivedAttributes.insert( u
"Closest vertex radius"_s, QLocale().toString( radius ) );
845void QgsMapToolIdentify::closestPointAttributes(
851 bool showTransformedZ,
852 QMap<QString, QString> &derivedAttributes
856 QgsPoint closestPointMapCrs = closestPoint;
857 if ( layerToMapTransform.
isValid() )
863 catch ( QgsCsException &cse )
871 formatCoordinate( closestPoint, x, y );
872 derivedAttributes.insert( tr(
"Closest X" ), x );
873 derivedAttributes.insert( tr(
"Closest Y" ), y );
875 if ( closestPoint.
is3D() )
877 const QString str = QLocale().toString( closestPoint.
z(),
'g', 10 );
880 if ( showTransformedZ && !std::isnan( closestPointMapCrs.
z() ) && !
qgsDoubleNear( closestPoint.
z(), closestPointMapCrs.
z() ) )
882 const QString str = QLocale().toString( closestPointMapCrs.
z(),
'g', 10 );
888 const QString str = QLocale().toString( closestPoint.
m(),
'g', 10 );
889 derivedAttributes.insert( tr(
"Interpolated M" ), str );
895 QgsCoordinateUtils::formatCoordinatePartsForProject(
QgsProject::instance(), canvasPoint, mapCrs, coordinatePrecision, x, y );
898void QgsMapToolIdentify::formatCoordinate(
const QgsPointXY &canvasPoint, QString &x, QString &y )
const
900 formatCoordinate( canvasPoint, x, y,
mCanvas->mapSettings().destinationCrs(), mCoordinatePrecision );
907 QMap<QString, QString> derivedAttributes;
911 QgsDistanceArea calc;
919 QgsPoint closestPoint;
933 QString str = QLocale().toString(
static_cast<const QgsGeometryCollection *
>( feature.
geometry().
constGet() )->numGeometries() );
934 derivedAttributes.insert( tr(
"Parts" ), str );
937 str = QLocale().toString( vId.
part + 1 );
938 derivedAttributes.insert( tr(
"Part number" ), str );
945 : QgsUnitTypes::distanceToAreaUnit(
layer->crs().mapUnits() );
948 const QgsCoordinateReferenceSystem layerVertCrs =
layer->crs3D().verticalCrs().isValid() ?
layer->crs3D().verticalCrs() :
layer->crs3D();
952 const QgsGeometry layerCrsGeometry = feature.
geometry();
953 QgsGeometry mapCrsGeometry = layerCrsGeometry;
956 if ( layerToMapTransform.
isValid() )
961 catch ( QgsCsException &cse )
968 const QgsAbstractGeometry *layerCrsGeom = layerCrsGeometry.
constGet();
976 catch ( QgsCsException & )
979 QgsDebugError( u
"An error occurred while calculating length"_s );
985 str = formatDistance( dist );
986 derivedAttributes.insert( tr(
"Length (Ellipsoidal — %1)" ).arg( ellipsoid ), str );
993 derivedAttributes.insert( tr(
"Length (Cartesian — 2D)" ), str );
995 double totalLength3d = std::accumulate( layerCrsGeom->
const_parts_begin(), layerCrsGeom->
const_parts_end(), 0.0, [](
double total,
const QgsAbstractGeometry *part ) {
996 return total + qgsgeometry_cast<const QgsLineString *>( part )->length3D();
999 str = formatDistance( totalLength3d, cartesianDistanceUnits );
1000 derivedAttributes.insert( tr(
"Length (Cartesian — 3D)" ), str );
1004 derivedAttributes.insert( tr(
"Length (Cartesian)" ), str );
1007 str = QLocale().toString( layerCrsGeom->
nCoordinates() );
1008 derivedAttributes.insert( tr(
"Vertices" ), str );
1012 closestVertexAttributes( layerToMapTransform, layerVertCrs, mapVertCrs, *layerCrsGeom, vId, showTransformedZ, derivedAttributes );
1013 closestPointAttributes( layerToMapTransform, layerVertCrs, mapVertCrs, *layerCrsGeom, layerPoint, showTransformedZ, derivedAttributes );
1019 QgsPointXY pnt =
mCanvas->mapSettings().layerToMapCoordinates(
layer, QgsPointXY( curve->startPoint().x(), curve->startPoint().y() ) );
1022 formatCoordinate( pnt, x, y );
1023 derivedAttributes.insert( tr(
"firstX",
"attributes get sorted; translation for lastX should be lexically larger than this one" ), x );
1024 derivedAttributes.insert( tr(
"firstY" ), y );
1025 pnt =
mCanvas->mapSettings().layerToMapCoordinates(
layer, QgsPointXY( curve->endPoint().x(), curve->endPoint().y() ) );
1026 formatCoordinate( pnt, x, y );
1027 derivedAttributes.insert( tr(
"lastX",
"attributes get sorted; translation for firstX should be lexically smaller than this one" ), x );
1028 derivedAttributes.insert( tr(
"lastY" ), y );
1039 catch ( QgsCsException & )
1042 QgsDebugError( u
"An error occurred while calculating area"_s );
1048 str = formatArea( area );
1049 derivedAttributes.insert( tr(
"Area (Ellipsoidal — %1)" ).arg( ellipsoid ), str );
1052 derivedAttributes.insert( tr(
"Area (Cartesian)" ), str );
1056 double perimeter = 0;
1062 catch ( QgsCsException & )
1065 QgsDebugError( u
"An error occurred while calculating perimeter"_s );
1067 str = formatDistance( perimeter );
1068 derivedAttributes.insert( tr(
"Perimeter (Ellipsoidal — %1)" ).arg( ellipsoid ), str );
1071 derivedAttributes.insert( tr(
"Perimeter (Cartesian)" ), str );
1074 derivedAttributes.insert( tr(
"Vertices" ), str );
1079 closestVertexAttributes( layerToMapTransform, layerVertCrs, mapVertCrs, *layerCrsGeometry.
constGet(), vId, showTransformedZ, derivedAttributes );
1080 closestPointAttributes( layerToMapTransform, layerVertCrs, mapVertCrs, *layerCrsGeometry.
constGet(), layerPoint, showTransformedZ, derivedAttributes );
1090 formatCoordinate( QgsPointXY( mapCrsPoint->x(), mapCrsPoint->y() ), x, y );
1091 derivedAttributes.insert( tr(
"X" ), x );
1092 derivedAttributes.insert( tr(
"Y" ), y );
1095 const double mapCrsZ = mapCrsPoint->is3D() ? mapCrsPoint->z() : std::numeric_limits<double>::quiet_NaN();
1097 if ( !std::isnan( originalZ ) )
1099 const QString str = QLocale().toString( originalZ,
'g', 10 );
1102 if ( showTransformedZ && !std::isnan( mapCrsZ ) && !
qgsDoubleNear( originalZ, mapCrsZ ) )
1104 const QString str = QLocale().toString( mapCrsZ,
'g', 10 );
1111 derivedAttributes.insert( tr(
"M" ), str );
1120 const QgsAbstractGeometry *geom = layerCrsGeometry.
constGet();
1121 closestVertexAttributes( layerToMapTransform, layerVertCrs, mapVertCrs, *geom, vId, showTransformedZ, derivedAttributes );
1131 return derivedAttributes;
1138 QgsPointXY point = geometry.
asPoint();
1150 std::unique_ptr<QgsRasterDataProvider> dprovider(
layer->dataProvider()->clone() );
1160 if ( !
layer->temporalProperties()->isVisibleInTemporalRange( identifyContext.
temporalRange() ) )
1163 dprovider->temporalCapabilities()->setRequestedTemporalRange( identifyContext.
temporalRange() );
1168 if ( !
layer->elevationProperties()->isVisibleInZRange( identifyContext.
zRange(),
layer ) )
1185 if ( !
layer->extent().contains( point ) )
1188 QMap<QString, QString> attributes, derivedAttributes;
1209 if ( dprovider->crs() !=
mCanvas->mapSettings().destinationCrs() )
1218 r.
setXMinimum( pointInCanvasCrs.
x() - mapUnitsPerPixel / 2. );
1219 r.
setXMaximum( pointInCanvasCrs.
x() + mapUnitsPerPixel / 2. );
1220 r.
setYMinimum( pointInCanvasCrs.
y() - mapUnitsPerPixel / 2. );
1221 r.
setYMaximum( pointInCanvasCrs.
y() + mapUnitsPerPixel / 2. );
1225 identifyResult = dprovider->identify( point, format, r, 1, 1 );
1241 int width =
static_cast<int>( std::round( viewExtent.
width() / mapUnitsPerPixel ) );
1242 int height =
static_cast<int>( std::round( viewExtent.
height() / mapUnitsPerPixel ) );
1245 QgsDebugMsgLevel( u
"width = %1 height = %2"_s.arg( width ).arg( height ), 2 );
1246 QgsDebugMsgLevel( u
"xRes = %1 yRes = %2 mapUnitsPerPixel = %3"_s.arg( viewExtent.
width() / width ).arg( viewExtent.
height() / height ).arg( mapUnitsPerPixel ), 2 );
1248 identifyResult = dprovider->identify( point, format, viewExtent, width, height );
1259 bool foundMatch =
false;
1260 QMap<int, QVariant> values = identifyResult.
results();
1261 QMap<int, QVariant> filteredValues;
1262 for (
auto it = values.constBegin(); it != values.constEnd(); ++it )
1268 const double value = it.value().toDouble();
1272 filteredValues.insert( it.key(), it.value() );
1296 const double xres =
layer->rasterUnitsPerPixelX();
1297 const double yres =
layer->rasterUnitsPerPixelY();
1305 const int rasterCol =
static_cast<int>( std::floor( ( point.
x() - extent.
xMinimum() ) / xres ) );
1306 const int rasterRow =
static_cast<int>( std::floor( ( extent.
yMaximum() - point.
y() ) / yres ) );
1308 derivedAttributes.insert( tr(
"Column (0-based)" ), QLocale().toString( rasterCol ) );
1309 derivedAttributes.insert( tr(
"Row (0-based)" ), QLocale().toString( rasterRow ) );
1314 if ( identifyResult.
isValid() )
1316 QMap<int, QVariant> values = identifyResult.
results();
1319 for (
auto it = values.constBegin(); it != values.constEnd(); ++it )
1321 QString valueString;
1324 valueString = tr(
"no data" );
1328 QVariant value( it.value() );
1332 if (
static_cast<QMetaType::Type
>( value.userType() ) == QMetaType::Float )
1341 attributes.insert( dprovider->generateBandName( it.key() ), valueString );
1347 const double doubleValue { it.value().toDouble( &ok ) };
1350 const QVariantList row = rat->row( doubleValue );
1351 if ( !row.isEmpty() )
1353 for (
int colIdx = 0; colIdx < std::min( rat->fields().count(), row.count() ); ++colIdx )
1364 switch ( ratField.
type )
1366 case QMetaType::Type::QChar:
1367 case QMetaType::Type::Int:
1368 case QMetaType::Type::UInt:
1369 case QMetaType::Type::LongLong:
1370 case QMetaType::Type::ULongLong:
1371 ratValue = QLocale().toString( row.at( colIdx ).toLongLong() );
1373 case QMetaType::Type::Double:
1374 ratValue = QLocale().toString( row.at( colIdx ).toDouble() );
1377 ratValue = row.at( colIdx ).toString();
1379 attributes.insert( ratField.
name, ratValue );
1386 QString label =
layer->name();
1388 if ( !pixelRect.
isNull() )
1395 results->append( result );
1399 for (
auto it = values.constBegin(); it != values.constEnd(); ++it )
1401 QVariant value = it.value();
1402 if ( value.userType() == QMetaType::Type::Bool && !value.toBool() )
1408 if ( value.userType() == QMetaType::Type::QString )
1412 QString label =
layer->subLayers().value( it.key() );
1414 attributes.insert( tr(
"Error" ), value.toString() );
1416 results->append(
IdentifyResult( qobject_cast<QgsMapLayer *>(
layer ), label, attributes, derivedAttributes ) );
1426 for (
const QgsFeature &feature : storeFeatures )
1432 QString sublayer = featureStore.params().value( u
"sublayer"_s ).toString();
1433 QString featureType = featureStore.params().value( u
"featureType"_s ).toString();
1435 featureType.remove( u
"_feature"_s );
1437 if ( sublayer.compare(
layer->name(), Qt::CaseInsensitive ) != 0 )
1441 if ( featureType.compare( sublayer, Qt::CaseInsensitive ) != 0 || labels.isEmpty() )
1443 labels << featureType;
1446 QMap<QString, QString> derAttributes = derivedAttributes;
1449 IdentifyResult identifyResult( qobject_cast<QgsMapLayer *>(
layer ), labels.join(
" / "_L1 ), featureStore.fields(), feature, derAttributes );
1451 identifyResult.
mParams.insert( u
"getFeatureInfoUrl"_s, featureStore.params().value( u
"getFeatureInfoUrl"_s ) );
1452 results->append( identifyResult );
1460 for (
auto it = values.constBegin(); it != values.constEnd(); ++it )
1462 QString value = it.value().toString();
1464 attributes.insert( QString(), value );
1466 QString label =
layer->subLayers().value( it.key() );
1467 results->append(
IdentifyResult( qobject_cast<QgsMapLayer *>(
layer ), label, attributes, derivedAttributes ) );
1475 attributes.insert( tr(
"Error" ), value );
1476 QString label = tr(
"Identify error" );
1477 results->append(
IdentifyResult( qobject_cast<QgsMapLayer *>(
layer ), label, attributes, derivedAttributes ) );
1493QString QgsMapToolIdentify::formatDistance(
double distance )
const
1495 return formatDistance( distance, displayDistanceUnits() );
1498QString QgsMapToolIdentify::formatArea(
double area )
const
1500 return formatArea( area, displayAreaUnits() );
1503QString QgsMapToolIdentify::formatDistance(
double distance,
Qgis::DistanceUnit unit )
const
1505 QgsSettings settings;
1506 bool baseUnit = settings.
value( u
"qgis/measure/keepbaseunit"_s,
true ).toBool();
1511QString QgsMapToolIdentify::formatArea(
double area,
Qgis::AreaUnit unit )
const
1513 QgsSettings settings;
1514 bool baseUnit = settings.
value( u
"qgis/measure/keepbaseunit"_s,
true ).toBool();
1521 QList<IdentifyResult> results;
1537 for (
const QVariantMap &pt : identified )
1539 QMap<QString, QString> ptStr;
1540 QString classification;
1541 for (
auto attrIt = pt.constBegin(); attrIt != pt.constEnd(); ++attrIt )
1546 ptStr[tr(
"Z (original)" )] = attrIt.value().toString();
1547 ptStr[tr(
"Z (adjusted)" )] = QString::number( attrIt.value().toDouble() * elevationProps->
zScale() + elevationProps->
zOffset() );
1549 else if ( attrIt.key().compare(
"Classification"_L1, Qt::CaseInsensitive ) == 0 )
1552 ptStr[attrIt.key()] = u
"%1 (%2)"_s.arg( attrIt.value().toString(), classification );
1556 ptStr[attrIt.key()] = attrIt.value().toString();
1560 QMap<QString, QString> derivedAttributes;
1561 QgsPoint layerPoint( pt.value(
"X" ).toDouble(), pt.value(
"Y" ).toDouble(), pt.value(
"Z" ).toDouble() );
1566 if ( layerToMapTransform.
isValid() )
1581 derivedAttributes.insert( tr(
"X" ), x );
1582 derivedAttributes.insert( tr(
"Y" ), y );
1584 const double originalZ = layerPoint.
z();
1585 const double mapCrsZ = mapCrsPoint.
is3D() ? mapCrsPoint.
z() : std::numeric_limits<double>::quiet_NaN();
1587 if ( !std::isnan( originalZ ) )
1589 const QString str = QLocale().toString( originalZ,
'g', 10 );
1592 if ( showTransformedZ && !std::isnan( mapCrsZ ) && !
qgsDoubleNear( originalZ, mapCrsZ ) )
1594 const QString str = QLocale().toString( mapCrsZ,
'g', 10 );
1599 results.append( res );
1609 if ( identified.empty() )
1612 switch (
layer->type() )
1619 QHash<QgsFeatureId, QVariant> featureDistances;
1620 QHash<QgsFeatureId, QVariant> featureElevations;
1623 for (
const QVariantMap &map : identified )
1625 if ( !map.contains( u
"id"_s ) )
1627 QMap<QString, QString> attributes;
1628 if ( map.value( u
"distance"_s ).isValid() )
1629 attributes.insert( tr(
"Distance along curve" ), QString::number( map.value( u
"distance"_s ).toDouble() ) );
1630 if ( map.value( u
"elevation"_s ).isValid() )
1631 attributes.insert( tr(
"Elevation" ), QString::number( map.value( u
"elevation"_s ).toDouble() ) );
1637 const QgsFeatureId id = map.value( u
"id"_s ).toLongLong();
1638 filterIds.insert(
id );
1640 featureDistances.insert(
id, map.value( u
"distance"_s ) );
1641 featureElevations.insert(
id, map.value( u
"elevation"_s ) );
1658 QMap<QString, QString>(),
1659 [
this, vl, &featureDistances, &featureElevations](
const QgsFeature &feature ) -> QMap<QString, QString> {
1660 QMap< QString, QString > attributes = featureDerivedAttributes( feature, vl,
QgsPointXY() );
1662 if ( featureDistances.value( feature.
id() ).isValid() )
1663 attributes.insert( tr(
"Distance along curve" ), QString::number( featureDistances.value( feature.
id() ).toDouble() ) );
1664 if ( featureElevations.value( feature.
id() ).isValid() )
1665 attributes.insert( tr(
"Elevation" ), QString::number( featureElevations.value( feature.
id() ).toDouble() ) );
1677 for (
const QVariantMap &map : identified )
1679 QMap<QString, QString> attributes;
1680 if ( map.value( u
"distance"_s ).isValid() )
1681 attributes.insert( tr(
"Distance along curve" ), QString::number( map.value( u
"distance"_s ).toDouble() ) );
1682 if ( map.value( u
"elevation"_s ).isValid() )
1683 attributes.insert( tr(
"Elevation" ), QString::number( map.value( u
"elevation"_s ).toDouble() ) );
@ FeatureSymbology
Provider is able retrieve embedded symbology associated with individual features.
@ MediumString
A medium-length string, recommended for general purpose use.
DistanceUnit
Units of distance.
@ ExactIntersect
Use exact geometry intersection (slower) instead of bounding boxes.
@ EmbeddedSymbols
Retrieve any embedded feature symbology.
@ Curve
An intermediate point on a segment defining the curvature of the segment.
QFlags< RasterInterfaceCapability > RasterInterfaceCapabilities
Raster interface capabilities.
QFlags< FeatureRequestFlag > FeatureRequestFlags
Flags for controlling feature requests.
GeometryType
The geometry types are used to group Qgis::WkbType in a coarse way.
@ Size
Original data source size (and thus resolution) is known, it is not always available,...
@ IdentifyValue
Numerical values.
@ Identify
At least one identify format supported.
@ IdentifyFeature
WMS GML -> feature.
@ Group
Composite group layer. Added in QGIS 3.24.
@ Plugin
Plugin based layer.
@ TiledScene
Tiled scene layer. Added in QGIS 3.34.
@ Annotation
Contains freeform, georeferenced annotations. Added in QGIS 3.16.
@ VectorTile
Vector tile layer. Added in QGIS 3.14.
@ Mesh
Mesh layer. Added in QGIS 3.2.
@ PointCloud
Point cloud layer. Added in QGIS 3.18.
static QString geoNone()
Constant that holds the string representation for "No ellipse/No CRS".
RasterIdentifyFormat
Raster identify formats.
@ Feature
WMS GML/JSON -> feature.
@ Value
Numerical pixel value.
WkbType
The WKB type describes the number of dimensions a geometry has.
@ Forward
Forward transform (from source to destination).
Abstract base class for all geometries.
bool isMeasure() const
Returns true if the geometry contains m values.
bool is3D() const
Returns true if the geometry is 3D and contains a z-value.
virtual double perimeter() const
Returns the planar, 2-dimensional perimeter of the geometry.
virtual int nCoordinates() const
Returns the number of nodes contained in the geometry.
virtual QgsPoint vertexAt(QgsVertexId id) const =0
Returns the point corresponding to a specified vertex id.
Qgis::WkbType wkbType() const
Returns the WKB type of the geometry.
virtual double length() const
Returns the planar, 2-dimensional length of the geometry.
const_part_iterator const_parts_end() const
Returns STL-style iterator pointing to the imaginary const part after the last part of the geometry.
const_part_iterator const_parts_begin() const
Returns STL-style iterator pointing to the const first part of the geometry.
static QCursor getThemeCursor(Cursor cursor)
Helper to get a theme cursor.
@ Identify
Identify: obtain information about the object.
Represents a coordinate reference system (CRS).
bool isValid() const
Returns whether this CRS is correctly initialized and usable.
bool hasVerticalAxis() const
Returns true if the CRS has a vertical axis.
QString userFriendlyIdentifier(Qgis::CrsIdentifierType type=Qgis::CrsIdentifierType::MediumString) const
Returns a user friendly identifier for the CRS.
QgsCoordinateReferenceSystem verticalCrs() const
Returns the vertical CRS associated with this CRS object.
Custom exception class for Coordinate Reference System related exceptions.
static QString formatDistance(double distance, int decimals, Qgis::DistanceUnit unit, bool keepBaseUnit=false)
Returns an distance formatted as a friendly string.
double measureArea(const QgsGeometry &geometry) const
Measures the area of a geometry.
double convertLengthMeasurement(double length, Qgis::DistanceUnit toUnits) const
Takes a length measurement calculated by this QgsDistanceArea object and converts it to a different d...
double measurePerimeter(const QgsGeometry &geometry) const
Measures the perimeter of a polygon geometry.
double measureLength(const QgsGeometry &geometry) const
Measures the length of a geometry.
void setSourceCrs(const QgsCoordinateReferenceSystem &crs, const QgsCoordinateTransformContext &context)
Sets source spatial reference system crs.
bool setEllipsoid(const QString &ellipsoid)
Sets the ellipsoid by its acronym.
double convertAreaMeasurement(double area, Qgis::AreaUnit toUnits) const
Takes an area measurement calculated by this QgsDistanceArea object and converts it to a different ar...
static QString formatArea(double area, int decimals, Qgis::AreaUnit unit, bool keepBaseUnit=false)
Returns an area formatted as a friendly string.
QgsRange which stores a range of double values.
bool isInfinite() const
Returns true if the range consists of all possible values.
QString message(QgsErrorMessage::Format format=QgsErrorMessage::Html) const
Full error messages description.
static QgsExpressionContextScope * layerScope(const QgsMapLayer *layer)
Creates a new scope which contains variables and functions relating to a QgsMapLayer.
void setFeature(const QgsFeature &feature)
Convenience function for setting a feature for the context.
Wrapper for iterator of features from vector data provider or vector layer.
bool nextFeature(QgsFeature &f)
Fetch next feature and stores in f, returns true on success.
Abstract base class for all 2D vector feature renderers.
@ Filter
Features may be filtered, i.e. some features may not be rendered (categorized, rule based ....
virtual bool willRenderFeature(const QgsFeature &feature, QgsRenderContext &context) const
Returns whether the renderer will render a feature or not.
Wraps a request for features to a vector layer (or directly its vector data provider).
QgsFeatureRequest & setFlags(Qgis::FeatureRequestFlags flags)
Sets flags that affect how features will be fetched.
QgsFeatureRequest & setFilterFids(const QgsFeatureIds &fids)
Sets the feature IDs that should be fetched.
QgsFeatureRequest & setFilterExpression(const QString &expression)
Set the filter expression.
QgsFeatureRequest & setFilterRect(const QgsRectangle &rectangle)
Sets the rectangle from which features will be taken.
A container for features with the same fields and crs.
The feature class encapsulates a single feature including its unique ID, geometry and a list of field...
const QgsSymbol * embeddedSymbol() const
Returns the feature's embedded symbology, or nullptr if the feature has no embedded symbol.
bool hasGeometry() const
Returns true if the feature has an associated geometry.
void setGeometry(const QgsGeometry &geometry)
Set the feature's geometry.
Container of fields for a vector layer.
static QgsPoint closestPoint(const QgsAbstractGeometry &geometry, const QgsPoint &point)
Returns the nearest point on a segment of a geometry for the specified point.
static void circleCenterRadius(const QgsPoint &pt1, const QgsPoint &pt2, const QgsPoint &pt3, double &radius, double ¢erX, double ¢erY)
Returns radius and center of the circle through pt1, pt2, pt3.
static QgsPoint closestVertex(const QgsAbstractGeometry &geom, const QgsPoint &pt, QgsVertexId &id)
Returns the closest vertex to a geometry for a specified point.
A geometry is the spatial representation of a feature.
static QgsGeometry fromRect(const QgsRectangle &rect)
Creates a new geometry from a QgsRectangle.
Qgis::GeometryOperationResult transform(const QgsCoordinateTransform &ct, Qgis::TransformDirection direction=Qgis::TransformDirection::Forward, bool transformZ=false)
Transforms this geometry as described by the coordinate transform ct.
const QgsAbstractGeometry * constGet() const
Returns a non-modifiable (const) reference to the underlying abstract geometry primitive.
QgsPointXY asPoint() const
Returns the contents of the geometry as a 2-dimensional point.
static QgsGeometry fromPointXY(const QgsPointXY &point)
Creates a new geometry from a QgsPointXY object.
double area() const
Returns the planar, 2-dimensional area of the geometry.
QgsRectangle boundingBox() const
Returns the bounding box of the geometry.
Qgis::WkbType wkbType() const
Returns type of the geometry as a WKB type (point / linestring / polygon etc.).
bool isGeosEqual(const QgsGeometry &) const
Compares the geometry with another geometry using GEOS.
static QgsGeometryEngine * createGeometryEngine(const QgsAbstractGeometry *geometry, double precision=0.0, Qgis::GeosCreationFlags flags=Qgis::GeosCreationFlag::SkipEmptyInteriorRings)
Creates and returns a new geometry engine representing the specified geometry using precision on a gr...
Identify contexts are used to encapsulate the settings to be used to perform an identify action.
bool isTemporal() const
Returns true if the temporal range setting is enabled.
const QgsDateTimeRange & temporalRange() const
Returns the datetime range to be used with the identify action.
QgsDoubleRange zRange() const
Returns the range of z-values to identify within, or an infinite range if no filtering by z should be...
double zScale() const
Returns the z scale, which is a scaling factor which should be applied to z values from the layer.
double zOffset() const
Returns the z offset, which is a fixed offset amount which should be added to z values from the layer...
Base class for all map layer types.
virtual bool isSpatial() const
Returns true if the layer is considered a spatial layer, ie it has some form of geometry associated w...
QgsAbstract3DRenderer * renderer3D() const
Returns 3D renderer associated with the layer.
bool isInScaleRange(double scale) const
Tests whether the layer should be visible at the specified scale.
@ Identifiable
If the layer is identifiable using the identify map tool and as a WMS layer.
virtual Q_INVOKABLE QgsDataProvider * dataProvider()
Returns the layer's data provider, it may be nullptr.
A mouse event which is the result of a user interaction with a QgsMapCanvas.
An index that identifies the dataset group (e.g.
Represents a single mesh dataset value.
double y() const
Returns y value.
double scalar() const
Returns magnitude of vector for vector data or scalar value for scalar data.
double x() const
Returns x value.
Represents a mesh layer supporting display of data on structured or unstructured meshes.
static void logMessage(const QString &message, const QString &tag=QString(), Qgis::MessageLevel level=Qgis::MessageLevel::Warning, bool notifyUser=true, const char *file=__builtin_FILE(), const char *function=__builtin_FUNCTION(), int line=__builtin_LINE(), Qgis::StringFormat format=Qgis::StringFormat::PlainText)
Adds a message to the log instance (and creates it if necessary).
static QMap< int, QString > translatedLasClassificationCodes()
Returns the map of LAS classification code to translated string value, corresponding to the ASPRS Sta...
Point cloud layer specific subclass of QgsMapLayerElevationProperties.
Represents a map layer supporting display of point clouds.
QVector< QVariantMap > identify(QgsPointCloudLayer *layer, const QgsRenderContext &context, const QgsGeometry &geometry, double toleranceForPointIdentification=0)
Returns the list of visible points of the point cloud layer layer and an extent defined by a geometry...
virtual void startRender(QgsPointCloudRenderContext &context)
Must be called when a new render cycle is started.
virtual void stopRender(QgsPointCloudRenderContext &context)
Must be called when a render cycle has finished, to allow the renderer to clean up.
QString toString(int precision=-1) const
Returns a string representation of the point (x, y) with a preset precision.
bool isEmpty() const
Returns true if the geometry is empty.
Point geometry type, with support for z-dimension and m-values.
void transform(const QgsCoordinateTransform &ct, Qgis::TransformDirection d=Qgis::TransformDirection::Forward, bool transformZ=false) override
Transforms the geometry using a coordinate transform.
static QgsProject * instance()
Returns the QgsProject singleton instance.
QgsCoordinateTransformContext transformContext
QgsCoordinateReferenceSystem crs3D() const
Returns the CRS to use for the project when transforming 3D data, or when z/elevation value handling ...
bool overlaps(const QgsRange< T > &other) const
Returns true if this range overlaps another range.
The Field class represents a Raster Attribute Table field, including its name, usage and type.
Qgis::RasterAttributeTableFieldUsage usage
Represents a Raster Attribute Table (RAT).
static QList< Qgis::RasterAttributeTableFieldUsage > valueAndColorFieldUsages()
Returns the list of field usages for colors and values.
static QString printValue(double value, bool localized=false)
Print double value with all necessary significant digits.
static Qgis::RasterInterfaceCapability identifyFormatToCapability(Qgis::RasterIdentifyFormat format)
Converts a raster identify format to a capability.
static Qgis::RasterIdentifyFormat identifyFormatFromName(const QString &formatName)
Converts a string formatName to a raster identify format.
Raster identify results container.
QgsError error() const
Returns the last error.
bool isValid() const
Returns true if valid.
QMap< int, QVariant > results() const
Returns the identify results.
Raster layer specific subclass of QgsMapLayerElevationProperties.
bool isEnabled() const
Returns true if the elevation properties are enabled, i.e.
QgsDoubleRange elevationRangeForPixelValue(QgsRasterLayer *layer, int band, double pixelValue) const
Returns the elevation range corresponding to a raw pixel value from the specified band.
Represents a raster layer.
A rectangle specified with double values.
void setYMinimum(double y)
Set the minimum y value.
void setXMinimum(double x)
Set the minimum x value.
void setYMaximum(double y)
Set the maximum y value.
void setXMaximum(double x)
Set the maximum x value.
Contains information about the context of a rendering operation.
void setCoordinateTransform(const QgsCoordinateTransform &t)
Sets the current coordinate transform for the context.
QgsExpressionContext & expressionContext()
Gets the expression context.
static QgsRenderContext fromMapSettings(const QgsMapSettings &mapSettings)
create initialized QgsRenderContext instance from given QgsMapSettings
void setExpressionContext(const QgsExpressionContext &context)
Sets the expression context.
void setZRange(const QgsDoubleRange &range)
Sets the range of z-values which should be rendered.
Stores settings for use within QGIS.
QVariant value(const QString &key, const QVariant &defaultValue=QVariant(), Section section=NoSection) const
Returns the value for setting key.
T enumValue(const QString &key, const T &defaultValue, const Section section=NoSection)
Returns the setting value for a setting based on an enum.
static QString symbolTypeToString(Qgis::SymbolType type)
Returns a translated string version of the specified symbol type.
QColor color() const
Returns the symbol's color.
Qgis::SymbolType type() const
Returns the symbol's type.
QgsTileRange tileRangeFromExtent(const QgsRectangle &mExtent) const
Returns tile range that fully covers the given extent.
static Q_INVOKABLE double fromUnitToUnitFactor(Qgis::DistanceUnit fromUnit, Qgis::DistanceUnit toUnit)
Returns the conversion factor between the specified distance units.
static Q_INVOKABLE Qgis::DistanceUnitType unitType(Qgis::DistanceUnit unit)
Returns the type for a distance unit.
static Q_INVOKABLE Qgis::AreaUnit distanceToAreaUnit(Qgis::DistanceUnit distanceUnit)
Converts a distance unit to its corresponding area unit, e.g., meters to square meters.
static bool isNull(const QVariant &variant, bool silenceNullWarnings=false)
Returns true if the specified variant should be considered a NULL value.
void setLayer(QgsVectorLayer *layer)
Sets the associated layer.
Represents a vector layer which manages a vector based dataset.
QgsFeatureIterator getFeatures(const QgsFeatureRequest &request=QgsFeatureRequest()) const final
Queries the layer for features specified in request.
Implements a map layer that is dedicated to rendering of vector tiles.
QMap< QString, QByteArray > data
Raw tile data by source ID.
static QgsFields makeQgisFields(const QSet< QString > &flds)
Returns QgsFields instance based on the set of field names.
static Q_INVOKABLE bool hasZ(Qgis::WkbType type)
Tests whether a WKB type contains the z-dimension.
static Qgis::WkbType singleType(Qgis::WkbType type)
Returns the single type for a WKB type.
static Q_INVOKABLE bool hasM(Qgis::WkbType type)
Tests whether a WKB type contains m values.
static Qgis::WkbType flatType(Qgis::WkbType type)
Returns the flat type for a WKB type.
static Q_INVOKABLE bool isMultiType(Qgis::WkbType type)
Returns true if the WKB type is a multi type.
bool qgsDoubleNear(double a, double b, double epsilon=4 *std::numeric_limits< double >::epsilon())
Compare two doubles (but allow some difference).
T qgsgeometry_cast(QgsAbstractGeometry *geom)
QList< QgsFeature > QgsFeatureList
QSet< QgsFeatureId > QgsFeatureIds
#define FID_TO_STRING(fid)
qint64 QgsFeatureId
64 bit feature ids negative numbers are used for uncommitted/newly added features
QVector< QgsFeatureStore > QgsFeatureStoreList
#define QgsDebugMsgLevel(str, level)
#define QgsDebugError(str)
QgsTemporalRange< QDateTime > QgsDateTimeRange
QgsRange which stores a range of date times.
QMap< QString, QVector< QgsFeature > > QgsVectorTileFeatures
Features of a vector tile, grouped by sub-layer names (key of the map).
Utility class for identifying a unique vertex within a geometry.
bool isValid() const
Returns true if the vertex id is valid.
Qgis::VertexType type
Vertex type.