48 , mTransformContext( options.transformContext )
64void QgsVectorTileLayer::setDataSourcePrivate(
const QString &dataSource,
const QString &baseName,
const QString &,
const QgsDataProvider::ProviderOptions &, QgsDataProvider::ReadFlags )
70 mDataProvider.reset();
75bool QgsVectorTileLayer::loadDataSource()
84 mSourceType = dsUri.param( QStringLiteral(
"type" ) );
85 mSourcePath = dsUri.param( QStringLiteral(
"url" ) );
86 if ( mSourceType == QLatin1String(
"xyz" ) && dsUri.param( QStringLiteral(
"serviceType" ) ) == QLatin1String(
"arcgis" ) )
88 if ( !setupArcgisVectorTileServiceConnection( mSourcePath, dsUri ) )
91 else if ( mSourceType == QLatin1String(
"xyz" ) )
95 QgsDebugMsg( QStringLiteral(
"Invalid format of URL for XYZ source: " ) + mSourcePath );
101 if ( dsUri.hasParam( QStringLiteral(
"zmin" ) ) )
102 zMin = dsUri.param( QStringLiteral(
"zmin" ) ).toInt();
105 if ( dsUri.hasParam( QStringLiteral(
"zmax" ) ) )
106 zMax = dsUri.param( QStringLiteral(
"zmax" ) ).toInt();
109 setExtent(
QgsRectangle( -20037508.3427892, -20037508.3427892, 20037508.3427892, 20037508.3427892 ) );
111 else if ( mSourceType == QLatin1String(
"mbtiles" ) )
114 if ( !reader.open() )
116 QgsDebugMsg( QStringLiteral(
"failed to open MBTiles file: " ) + mSourcePath );
120 const QString format = reader.metadataValue( QStringLiteral(
"format" ) );
121 if ( format != QLatin1String(
"pbf" ) )
123 QgsDebugMsg( QStringLiteral(
"Cannot open MBTiles for vector tiles. Format = " ) + format );
127 QgsDebugMsgLevel( QStringLiteral(
"name: " ) + reader.metadataValue( QStringLiteral(
"name" ) ), 2 );
128 bool minZoomOk, maxZoomOk;
129 const int minZoom = reader.metadataValue( QStringLiteral(
"minzoom" ) ).toInt( &minZoomOk );
130 const int maxZoom = reader.metadataValue( QStringLiteral(
"maxzoom" ) ).toInt( &maxZoomOk );
140 ct.setBallparkTransformsAreAppropriate(
true );
141 r = ct.transformBoundingBox( r );
144 else if ( mSourceType == QLatin1String(
"vtpk" ) )
147 if ( !reader.open() )
149 QgsDebugMsg( QStringLiteral(
"failed to open VTPK file: " ) + mSourcePath );
153 const QVariantMap
metadata = reader.metadata();
154 const QString format =
metadata.value( QStringLiteral(
"tileInfo" ) ).toMap().value( QStringLiteral(
"format" ) ).toString();
155 if ( format != QLatin1String(
"pbf" ) )
157 QgsDebugMsg( QStringLiteral(
"Cannot open VTPK for vector tiles. Format = " ) + format );
161 mMatrixSet = reader.matrixSet();
167 QgsDebugMsg( QStringLiteral(
"Unknown source type: " ) + mSourceType );
172 const QgsDataProvider::ReadFlags
flags;
173 mDataProvider.reset(
new QgsVectorTileDataProvider( providerOptions,
flags ) );
179bool QgsVectorTileLayer::setupArcgisVectorTileServiceConnection(
const QString &uri,
const QgsDataSourceUri &dataSourceUri )
183 QString tileServiceUri = uri;
184 QUrl url( tileServiceUri );
188 query.addQueryItem( QStringLiteral(
"f" ), QStringLiteral(
"pjson" ) );
189 url.setQuery( query );
191 QNetworkRequest request = QNetworkRequest( url );
196 switch ( networkRequest.get( request ) )
208 const QByteArray raw = content.
content();
212 const QJsonDocument doc = QJsonDocument::fromJson( raw, &err );
218 mArcgisLayerConfiguration = doc.object().toVariantMap();
219 if ( mArcgisLayerConfiguration.contains( QStringLiteral(
"error" ) ) )
224 if ( !mArcgisLayerConfiguration.value( QStringLiteral(
"tiles" ) ).
isValid() )
227 const QString sourceUri = mArcgisLayerConfiguration.value( QStringLiteral(
"sources" ) ).toMap().value( QStringLiteral(
"esri" ) ).toMap().value( QStringLiteral(
"url" ) ).toString();
228 if ( !sourceUri.isEmpty() )
230 QUrl url( sourceUri );
234 query.addQueryItem( QStringLiteral(
"f" ), QStringLiteral(
"pjson" ) );
235 url.setQuery( query );
237 QNetworkRequest request = QNetworkRequest( url );
242 switch ( networkRequest.get( request ) )
254 const QByteArray raw = content.
content();
258 const QJsonDocument doc = QJsonDocument::fromJson( raw, &err );
264 tileServiceUri = sourceUri;
267 mArcgisStyleConfiguration = mArcgisLayerConfiguration;
268 mArcgisLayerConfiguration = doc.object().toVariantMap();
269 if ( mArcgisLayerConfiguration.contains( QStringLiteral(
"error" ) ) )
276 mSourcePath = tileServiceUri +
'/' + mArcgisLayerConfiguration.value( QStringLiteral(
"tiles" ) ).toList().value( 0 ).toString();
279 QgsDebugMsg( QStringLiteral(
"Invalid format of URL for XYZ source: " ) + mSourcePath );
283 mArcgisLayerConfiguration.insert( QStringLiteral(
"serviceUri" ), tileServiceUri );
290 if ( dataSourceUri.
hasParam( QStringLiteral(
"zmin" ) ) )
293 if ( dataSourceUri.
hasParam( QStringLiteral(
"zmax" ) ) )
296 const QVariantMap fullExtent = mArcgisLayerConfiguration.value( QStringLiteral(
"fullExtent" ) ).toMap();
297 if ( !fullExtent.isEmpty() )
300 fullExtent.value( QStringLiteral(
"xmin" ) ).toDouble(),
301 fullExtent.value( QStringLiteral(
"ymin" ) ).toDouble(),
302 fullExtent.value( QStringLiteral(
"xmax" ) ).toDouble(),
303 fullExtent.value( QStringLiteral(
"ymax" ) ).toDouble()
310 setExtent( extentTransform.transformBoundingBox( fullExtentRect ) );
314 QgsDebugMsg( QStringLiteral(
"Could not transform layer fullExtent to layer CRS" ) );
323 setExtent( extentTransform.transformBoundingBox(
QgsRectangle( -20037508.3427892, -20037508.3427892, 20037508.3427892, 20037508.3427892 ) ) );
327 QgsDebugMsg( QStringLiteral(
"Could not transform layer extent to layer CRS" ) );
351 return mDataProvider.get();
358 return mDataProvider.get();
374 const QDomElement matrixSetElement = layerNode.firstChildElement( QStringLiteral(
"matrixSet" ) );
375 if ( !matrixSetElement.isNull() )
377 mMatrixSet.
readXml( matrixSetElement, context );
393 QDomElement mapLayerNode = layerNode.toElement();
396 mapLayerNode.appendChild( mMatrixSet.
writeXml( doc, context ) );
401 QDomElement provider = doc.createElement( QStringLiteral(
"provider" ) );
402 const QDomText providerText = doc.createTextNode(
providerType() );
403 provider.appendChild( providerText );
404 mapLayerNode.appendChild( provider );
417 const QDomElement elem = node.toElement();
421 const QDomElement elemRenderer = elem.firstChildElement( QStringLiteral(
"renderer" ) );
422 if ( elemRenderer.isNull() )
424 errorMessage = tr(
"Missing <renderer> tag" );
427 const QString rendererType = elemRenderer.attribute( QStringLiteral(
"type" ) );
432 if ( rendererType == QLatin1String(
"basic" ) )
436 errorMessage = tr(
"Unknown renderer type: " ) + rendererType;
440 r->
readXml( elemRenderer, context );
444 if ( categories.testFlag(
Labeling ) )
447 const QDomElement elemLabeling = elem.firstChildElement( QStringLiteral(
"labeling" ) );
448 if ( !elemLabeling.isNull() )
450 const QString labelingType = elemLabeling.attribute( QStringLiteral(
"type" ) );
452 if ( labelingType == QLatin1String(
"basic" ) )
456 errorMessage = tr(
"Unknown labeling type: " ) + rendererType;
470 const QDomNode blendModeNode = node.namedItem( QStringLiteral(
"blendMode" ) );
471 if ( !blendModeNode.isNull() )
473 const QDomElement e = blendModeNode.toElement();
481 const QDomNode layerOpacityNode = node.namedItem( QStringLiteral(
"layerOpacity" ) );
482 if ( !layerOpacityNode.isNull() )
484 const QDomElement e = layerOpacityNode.toElement();
496 Q_UNUSED( errorMessage )
497 QDomElement elem = node.toElement();
503 QDomElement elemRenderer = doc.createElement( QStringLiteral(
"renderer" ) );
504 elemRenderer.setAttribute( QStringLiteral(
"type" ), mRenderer->type() );
507 mRenderer->writeXml( elemRenderer, context );
509 elem.appendChild( elemRenderer );
512 if ( mLabeling && categories.testFlag(
Labeling ) )
514 QDomElement elemLabeling = doc.createElement( QStringLiteral(
"labeling" ) );
515 elemLabeling.setAttribute( QStringLiteral(
"type" ), mLabeling->type() );
516 mLabeling->writeXml( elemLabeling, context );
517 elem.appendChild( elemLabeling );
523 QDomElement blendModeElem = doc.createElement( QStringLiteral(
"blendMode" ) );
525 blendModeElem.appendChild( blendModeText );
526 node.appendChild( blendModeElem );
532 QDomElement layerOpacityElem = doc.createElement( QStringLiteral(
"layerOpacity" ) );
533 const QDomText layerOpacityText = doc.createTextNode( QString::number(
opacity() ) );
534 layerOpacityElem.appendChild( layerOpacityText );
535 node.appendChild( layerOpacityElem );
557 QStringList warnings;
566 Qgis::MapLayerProperties res;
567 if ( mSourceType == QLatin1String(
"xyz" ) )
584 return loadDefaultStyleAndSubLayersPrivate(
error, warnings,
nullptr );
591 return loadDefaultStyleAndSubLayersPrivate(
error, warnings, &
subLayers );
594bool QgsVectorTileLayer::loadDefaultStyleAndSubLayersPrivate( QString &error, QStringList &warnings, QList<QgsMapLayer *> *subLayers )
601 QVariantMap styleDefinition;
604 if ( !dsUri.param( QStringLiteral(
"styleUrl" ) ).isEmpty() )
606 styleUrl = dsUri.param( QStringLiteral(
"styleUrl" ) );
608 else if ( mSourceType == QLatin1String(
"xyz" ) && dsUri.param( QStringLiteral(
"serviceType" ) ) == QLatin1String(
"arcgis" ) )
611 styleUrl = mArcgisLayerConfiguration.value( QStringLiteral(
"serviceUri" ) ).toString()
612 +
'/' + mArcgisLayerConfiguration.value( QStringLiteral(
"defaultStyles" ) ).toString();
615 if ( mSourceType == QLatin1String(
"vtpk" ) )
618 if ( !reader.open() )
620 QgsDebugMsg( QStringLiteral(
"failed to open VTPK file: " ) + mSourcePath );
624 styleDefinition = reader.styleDefinition();
626 const QVariantMap spriteDefinition = reader.spriteDefinition();
627 if ( !spriteDefinition.isEmpty() )
629 const QImage spriteImage = reader.spriteImage();
630 context.
setSprites( spriteImage, spriteDefinition );
633 else if ( !mArcgisStyleConfiguration.isEmpty() || !styleUrl.isEmpty() )
635 if ( !mArcgisStyleConfiguration.isEmpty() )
637 styleDefinition = mArcgisStyleConfiguration;
641 QNetworkRequest request = QNetworkRequest( QUrl( styleUrl ) );
646 switch ( networkRequest.
get( request ) )
654 error = QObject::tr(
"Error retrieving default style" );
662 if ( styleDefinition.contains( QStringLiteral(
"sprite" ) ) )
665 QString spriteUriBase;
666 if ( styleDefinition.value( QStringLiteral(
"sprite" ) ).toString().startsWith( QLatin1String(
"http" ) ) )
668 spriteUriBase = styleDefinition.value( QStringLiteral(
"sprite" ) ).toString();
672 spriteUriBase = styleUrl +
'/' + styleDefinition.value( QStringLiteral(
"sprite" ) ).toString();
675 for (
int resolution = 2; resolution > 0; resolution-- )
677 QUrl spriteUrl = QUrl( spriteUriBase );
678 spriteUrl.setPath( spriteUrl.path() + QStringLiteral(
"%1.json" ).arg( resolution > 1 ? QStringLiteral(
"@%1x" ).arg( resolution ) : QString() ) );
679 QNetworkRequest request = QNetworkRequest( spriteUrl );
682 switch ( networkRequest.get( request ) )
690 QUrl spriteUrl = QUrl( spriteUriBase );
691 spriteUrl.setPath( spriteUrl.path() + QStringLiteral(
"%1.png" ).arg( resolution > 1 ? QStringLiteral(
"@%1x" ).arg( resolution ) : QString() ) );
692 QNetworkRequest request = QNetworkRequest( spriteUrl );
695 switch ( networkRequest.get( request ) )
700 const QImage spriteImage( QImage::fromData( imageContent.
content() ) );
701 context.
setSprites( spriteImage, spriteDefinition );
726 if ( !styleDefinition.isEmpty() )
755 bool resultFlag =
false;
767 if ( mSourceType == QLatin1String(
"xyz" ) && dsUri.param( QStringLiteral(
"serviceType" ) ) == QLatin1String(
"arcgis" ) )
771 metadata.
setIdentifier( mArcgisLayerConfiguration.value( QStringLiteral(
"serviceUri" ) ).toString() );
772 const QString parentIdentifier = mArcgisLayerConfiguration.value( QStringLiteral(
"serviceItemId" ) ).toString();
773 if ( !parentIdentifier.isEmpty() )
778 metadata.
setTitle( mArcgisLayerConfiguration.value( QStringLiteral(
"name" ) ).toString() );
779 const QString copyright = mArcgisLayerConfiguration.value( QStringLiteral(
"copyrightText" ) ).toString();
780 if ( !copyright.isEmpty() )
789 else if ( mSourceType == QLatin1String(
"vtpk" ) )
792 if ( !reader.
open() )
794 QgsDebugMsg( QStringLiteral(
"failed to open VTPK file: " ) + mSourcePath );
834 QString info = QStringLiteral(
"<html><head></head>\n<body>\n" );
838 info += QStringLiteral(
"<h1>" ) + tr(
"Information from provider" ) + QStringLiteral(
"</h1>\n<hr>\n" ) %
839 QStringLiteral(
"<table class=\"list-view\">\n" );
841 info += QStringLiteral(
"<tr><td class=\"highlight\">" ) % tr(
"Source type" ) % QStringLiteral(
"</td><td>" ) %
sourceType() % QStringLiteral(
"</td></tr>\n" );
843 info += QStringLiteral(
"<tr><td class=\"highlight\">" ) % tr(
"Zoom levels" ) % QStringLiteral(
"</td><td>" ) % QStringLiteral(
"%1 - %2" ).arg(
sourceMinZoom() ).arg(
sourceMaxZoom() ) % QStringLiteral(
"</td></tr>\n" );
845 info += QLatin1String(
"</table>\n<br>" );
851 info += QStringLiteral(
"<h1>" ) % tr(
"Identification" ) % QStringLiteral(
"</h1>\n<hr>\n" ) %
852 htmlFormatter.identificationSectionHtml() %
853 QStringLiteral(
"<br>\n" ) %
856 QStringLiteral(
"<h1>" ) % tr(
"Extent" ) % QStringLiteral(
"</h1>\n<hr>\n" ) %
857 htmlFormatter.extentSectionHtml( ) %
858 QStringLiteral(
"<br>\n" ) %
861 QStringLiteral(
"<h1>" ) % tr(
"Access" ) % QStringLiteral(
"</h1>\n<hr>\n" ) %
862 htmlFormatter.accessSectionHtml( ) %
863 QStringLiteral(
"<br>\n" ) %
867 QStringLiteral(
"<h1>" ) % tr(
"Contacts" ) % QStringLiteral(
"</h1>\n<hr>\n" ) %
868 htmlFormatter.contactsSectionHtml( ) %
869 QStringLiteral(
"<br><br>\n" ) %
872 QStringLiteral(
"<h1>" ) % tr(
"References" ) % QStringLiteral(
"</h1>\n<hr>\n" ) %
873 htmlFormatter.linksSectionHtml( ) %
874 QStringLiteral(
"<br>\n" ) %
877 QStringLiteral(
"<h1>" ) % tr(
"History" ) % QStringLiteral(
"</h1>\n<hr>\n" ) %
878 htmlFormatter.historySectionHtml( ) %
879 QStringLiteral(
"<br>\n" ) %
881 QStringLiteral(
"\n</body>\n</html>\n" );
898 if ( rawTiles.isEmpty() )
900 return rawTiles.first().data;
907 mRenderer.reset( r );
915 return mRenderer.get();
930 return mLabeling.get();
937 QList< QgsFeature > res;
938 res.reserve( mSelectedFeatures.size() );
939 for (
auto it = mSelectedFeatures.begin(); it != mSelectedFeatures.end(); ++it )
940 res.append( it.value() );
949 return mSelectedFeatures.size();
962 QSet< QgsFeatureId > prevSelection;
963 prevSelection.reserve( mSelectedFeatures.size() );
964 for (
auto it = mSelectedFeatures.begin(); it != mSelectedFeatures.end(); ++it )
965 prevSelection.insert( it.key() );
972 mSelectedFeatures.clear();
983 bool isPointOrRectangle;
985 bool isSinglePoint = selectionGeom.
type() == Qgis::GeometryType::Point;
988 isPointOrRectangle =
true;
989 point = selectionGeom.
asPoint();
998 auto addDerivedFields = [](
QgsFeature & feature,
const int tileZoom,
const QString & layer )
1001 fields.
append(
QgsField( QStringLiteral(
"tile_zoom" ), QVariant::Int ) );
1002 fields.
append(
QgsField( QStringLiteral(
"tile_layer" ), QVariant::String ) );
1004 attributes << tileZoom << layer;
1009 std::unique_ptr<QgsGeometryEngine> selectionGeomPrepared;
1010 QList< QgsFeature > singleSelectCandidates;
1013 if ( isSinglePoint )
1038 for (
int row = tileRange.
startRow(); row <= tileRange.
endRow(); ++row )
1044 if ( data.isEmpty() )
1048 if ( !decoder.
decode( tileID, data ) )
1051 QMap<QString, QgsFields> perLayerFields;
1052 const QStringList layerNames = decoder.
layers();
1053 for (
const QString &layerName : layerNames )
1055 QSet<QString> fieldNames = qgis::listToSet( decoder.
layerFieldNames( layerName ) );
1060 const QStringList featuresLayerNames = features.keys();
1061 for (
const QString &layerName : featuresLayerNames )
1063 const QgsFields fFields = perLayerFields[layerName];
1064 const QVector<QgsFeature> &layerFeatures = features[layerName];
1067 if ( renderContext && mRenderer && !mRenderer->willRenderFeature( f, tileZoom, layerName, *renderContext ) )
1070 if ( f.geometry().intersects( r ) )
1072 bool selectFeature =
true;
1073 if ( selectionGeomPrepared )
1075 switch ( relationship )
1078 selectFeature = selectionGeomPrepared->intersects( f.geometry().constGet() );
1081 selectFeature = selectionGeomPrepared->contains( f.geometry().constGet() );
1086 if ( selectFeature )
1089 addDerivedFields( derivedFeature, tileZoom, layerName );
1091 singleSelectCandidates << derivedFeature;
1093 mSelectedFeatures.insert( derivedFeature.
id(), derivedFeature );
1108 for (
auto it = mSelectedFeatures.begin(); it != mSelectedFeatures.end(); )
1110 bool matchesGeometry =
false;
1111 if ( selectionGeomPrepared )
1113 switch ( relationship )
1116 matchesGeometry = selectionGeomPrepared->intersects( it->geometry().constGet() );
1119 matchesGeometry = selectionGeomPrepared->contains( it->geometry().constGet() );
1125 switch ( relationship )
1128 matchesGeometry = it->geometry().intersects( r );
1131 matchesGeometry = r.
contains( it->geometry().boundingBox() );
1138 singleSelectCandidates << it.value();
1148 it = mSelectedFeatures.erase( it );
1164 double smallestArea = std::numeric_limits< double >::max();
1165 double smallestLength = std::numeric_limits< double >::max();
1166 for (
const QgsFeature &candidate : std::as_const( singleSelectCandidates ) )
1168 if ( !mSelectedFeatures.contains( candidate.id() ) )
1171 switch ( candidate.geometry().type() )
1173 case Qgis::GeometryType::Point:
1174 bestCandidate = candidate;
1176 case Qgis::GeometryType::Line:
1179 if ( length < smallestLength && bestCandidate.
geometry().
type() != Qgis::GeometryType::Point )
1181 bestCandidate = candidate;
1182 smallestLength = length;
1186 case Qgis::GeometryType::Polygon:
1189 if ( area < smallestArea && bestCandidate.
geometry().
type() != Qgis::GeometryType::Point && bestCandidate.
geometry().
type() != Qgis::GeometryType::Line )
1191 bestCandidate = candidate;
1192 smallestArea = area;
1196 case Qgis::GeometryType::Unknown:
1197 case Qgis::GeometryType::Null:
1203 if ( !bestCandidate.
isValid() )
1206 double smallestArea = std::numeric_limits< double >::max();
1207 double smallestLength = std::numeric_limits< double >::max();
1208 for (
const QgsFeature &candidate : std::as_const( singleSelectCandidates ) )
1210 switch ( candidate.geometry().type() )
1212 case Qgis::GeometryType::Point:
1213 bestCandidate = candidate;
1215 case Qgis::GeometryType::Line:
1218 if ( length < smallestLength && bestCandidate.
geometry().
type() != Qgis::GeometryType::Point )
1220 bestCandidate = candidate;
1221 smallestLength = length;
1225 case Qgis::GeometryType::Polygon:
1228 if ( area < smallestArea && bestCandidate.
geometry().
type() != Qgis::GeometryType::Point && bestCandidate.
geometry().
type() != Qgis::GeometryType::Line )
1230 bestCandidate = candidate;
1231 smallestArea = area;
1235 case Qgis::GeometryType::Unknown:
1236 case Qgis::GeometryType::Null:
1244 if ( prevSelection.contains( bestCandidate.
id() ) )
1245 mSelectedFeatures.remove( bestCandidate.
id() );
1247 mSelectedFeatures.insert( bestCandidate.
id(), bestCandidate );
1255 mSelectedFeatures.insert( bestCandidate.
id(), bestCandidate );
1260 if ( mSelectedFeatures.contains( bestCandidate.
id() ) )
1262 mSelectedFeatures.clear();
1263 mSelectedFeatures.insert( bestCandidate.
id(), bestCandidate );
1267 mSelectedFeatures.clear();
1274 mSelectedFeatures.remove( bestCandidate.
id() );
1281 QSet< QgsFeatureId > newSelection;
1282 newSelection.reserve( mSelectedFeatures.size() );
1283 for (
auto it = mSelectedFeatures.begin(); it != mSelectedFeatures.end(); ++it )
1284 newSelection.insert( it.key() );
1287 if ( prevSelection != newSelection )
1295 if ( mSelectedFeatures.empty() )
1298 mSelectedFeatures.clear();
1307QgsVectorTileDataProvider::QgsVectorTileDataProvider(
1308 const ProviderOptions &options,
1309 QgsDataProvider::ReadFlags flags )
1320QString QgsVectorTileDataProvider::name()
const
1324 return QStringLiteral(
"vectortile" );
1327QString QgsVectorTileDataProvider::description()
const
1341bool QgsVectorTileDataProvider::isValid()
const
1348bool QgsVectorTileDataProvider::renderInPreview(
const PreviewContext &context )
1355 return context.lastRenderingTimeMs <= 1000;
The Qgis class provides global constants for use throughout the application.
@ IsBasemapLayer
Layer is considered a 'basemap' layer, and certain properties of the layer should be ignored when cal...
BlendMode
Blending modes defining the available composition modes that can be used when painting.
@ ToggleSelection
Enables a "toggle" selection mode, where previously selected matching features will be deselected and...
@ SingleFeatureSelection
Select only a single feature, picking the "best" match for the selection geometry.
SelectGeometryRelationship
Geometry relationship test to apply for selecting features.
@ Within
Select where features are within the reference geometry.
@ Intersect
Select where features intersect the reference geometry.
SelectBehavior
Specifies how a selection should be applied.
@ SetSelection
Set selection, removing any existing selection.
@ AddToSelection
Add selection to current selection.
@ IntersectSelection
Modify current selection to include only select features which match.
@ RemoveFromSelection
Remove from current selection.
static QgsCoordinateReferenceSystem convertSpatialReference(const QVariantMap &spatialReferenceMap)
Converts a spatial reference JSON definition to a QgsCoordinateReferenceSystem value.
A thread safe class for performing blocking (sync) network requests, with full support for QGIS proxy...
ErrorCode get(QNetworkRequest &request, bool forceRefresh=false, QgsFeedback *feedback=nullptr)
Performs a "get" operation on the specified request.
@ NetworkError
A network error occurred.
@ ServerExceptionError
An exception was raised by the server.
@ NoError
No error was encountered.
@ TimeoutError
Timeout was reached before a reply was received.
QgsNetworkReplyContent reply() const
Returns the content of the network reply, after a get(), post(), head() or put() request has been mad...
This class represents a coordinate reference system (CRS).
Contains information about the context in which a coordinate transform is executed.
Custom exception class for Coordinate Reference System related exceptions.
Abstract base class for spatial data provider implementations.
Class for storing the component parts of a RDBMS data source URI (e.g.
bool hasParam(const QString &key) const
Returns true if a parameter with the specified key exists.
void setEncodedUri(const QByteArray &uri)
Sets the complete encoded uri.
QgsHttpHeaders httpHeaders() const
Returns http headers.
QString param(const QString &key) const
Returns a generic parameter value corresponding to the specified key.
QString authConfigId() const
Returns any associated authentication configuration ID stored in the URI.
The feature class encapsulates a single feature including its unique ID, geometry and a list of field...
void setAttributes(const QgsAttributes &attrs)
Sets the feature's attributes.
void setFields(const QgsFields &fields, bool initAttributes=false)
Assigns a field map with the feature to allow attribute access by attribute name.
bool isValid() const
Returns the validity of this feature.
Encapsulate a field in an attribute table or data source.
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)
A geometry is the spatial representation of a feature.
const QgsAbstractGeometry * constGet() const SIP_HOLDGIL
Returns a non-modifiable (const) reference to the underlying abstract geometry primitive.
double length() const
Returns the planar, 2-dimensional length of geometry.
static QgsGeometry fromRect(const QgsRectangle &rect) SIP_HOLDGIL
Creates a new geometry from a QgsRectangle.
QgsPointXY asPoint() const
Returns the contents of the geometry as a 2-dimensional point.
double area() const
Returns the planar, 2-dimensional area of the geometry.
static QgsGeometryEngine * createGeometryEngine(const QgsAbstractGeometry *geometry)
Creates and returns a new geometry engine representing the specified geometry.
QgsRectangle boundingBox() const
Returns the bounding box of the geometry.
bool isGeosEqual(const QgsGeometry &) const
Compares the geometry with another geometry using GEOS.
static QVariant parseJson(const std::string &jsonString)
Converts JSON jsonString to a QVariant, in case of parsing error an invalid QVariant is returned and ...
Context for a MapBox GL style conversion operation.
void setTargetUnit(Qgis::RenderUnit targetUnit)
Sets the target unit type.
void setPixelSizeConversionFactor(double sizeConversionFactor)
Sets the pixel size conversion factor, used to scale the original pixel sizes when converting styles.
void setSprites(const QImage &image, const QVariantMap &definitions)
Sets the sprite image and definitions JSON to use during conversion.
QVariantMap spriteDefinitions() const
Returns the sprite definitions to use during conversion.
Handles conversion of MapBox GL styles to QGIS vector tile renderers and labeling settings.
QgsVectorTileRenderer * renderer() const
Returns a new instance of a vector tile renderer representing the converted style,...
QgsVectorTileLabeling * labeling() const
Returns a new instance of a vector tile labeling representing the converted style,...
Result convert(const QVariantMap &style, QgsMapBoxGlStyleConversionContext *context=nullptr)
Converts a JSON style map, and returns the resultant status of the conversion.
QList< QgsMapLayer * > createSubLayers() const
Returns a list of new map layers corresponding to sublayers of the style, e.g.
@ Success
Conversion was successful.
QString errorMessage() const
Returns a descriptive error message if an error was encountered during the style conversion,...
QStringList warnings() const
Returns a list of user-friendly warnings generated during the conversion, e.g.
static QString typeToString(Qgis::LayerType type)
Converts a map layer type to a string value.
Base class for utility classes that encapsulate information necessary for rendering of map layers.
Base class for all map layer types.
void readStyleManager(const QDomNode &layerNode)
Read style manager's configuration (if any). To be called by subclasses.
bool isInScaleRange(double scale) const
Tests whether the layer should be visible at the specified scale.
void writeStyleManager(QDomNode &layerNode, QDomDocument &doc) const
Write style manager's configuration (if exists). To be called by subclasses.
QString source() const
Returns the source for the layer.
QString providerType() const
Returns the provider type (provider key) for this layer.
void setBlendMode(QPainter::CompositionMode blendMode)
Set the blending mode used for rendering a layer.
QgsMapLayer::LayerFlags flags() const
Returns the flags for this layer.
QgsCoordinateReferenceSystem crs
virtual QString loadDefaultStyle(bool &resultFlag)
Retrieve the default style for this layer if one exists (either as a .qml file on disk or as a record...
QString mLayerName
Name of the layer - used for display.
void triggerRepaint(bool deferredUpdate=false)
Will advise the map canvas (and any other interested party) that this layer requires to be repainted.
QString crsHtmlMetadata() const
Returns a HTML fragment containing the layer's CRS metadata, for use in the htmlMetadata() method.
QgsLayerMetadata metadata
QPainter::CompositionMode blendMode() const
Returns the current blending mode for a layer.
virtual void setOpacity(double opacity)
Sets the opacity for the layer, where opacity is a value between 0 (totally transparent) and 1....
virtual void setMetadata(const QgsLayerMetadata &metadata)
Sets the layer's metadata store.
QString mProviderKey
Data provider key (name of the data provider)
QgsCoordinateTransformContext transformContext() const
Returns the layer data provider coordinate transform context or a default transform context if the la...
virtual QgsError error() const
Gets current status error.
virtual QStringList subLayers() const
Returns the sublayers of this layer.
virtual void setExtent(const QgsRectangle &rect)
Sets the extent.
QString mDataSource
Data source description string, varies by layer type.
virtual QString loadDefaultMetadata(bool &resultFlag)
Retrieve the default metadata for this layer if one exists (either as a .qmd file on disk or as a rec...
void setValid(bool valid)
Sets whether layer is valid or not.
void readCommonStyle(const QDomElement &layerElement, const QgsReadWriteContext &context, StyleCategories categories=AllStyleCategories)
Read style data common to all layer types.
@ Rendering
Rendering: scale visibility, simplify method, opacity.
QString generalHtmlMetadata() const
Returns an HTML fragment containing general metadata information, for use in the htmlMetadata() metho...
void writeCommonStyle(QDomElement &layerElement, QDomDocument &document, const QgsReadWriteContext &context, StyleCategories categories=AllStyleCategories) const
Write style data common to all layer types.
void invalidateWgs84Extent()
Invalidates the WGS84 extent.
void setCrs(const QgsCoordinateReferenceSystem &srs, bool emitSignal=true)
Sets layer's spatial reference system.
Utility class for reading and writing MBTiles files (which are SQLite3 databases).
Encapsulates a network reply within a container which is inexpensive to copy and safe to pass between...
QByteArray content() const
Returns the reply content.
static Qgis::BlendMode getBlendModeEnum(QPainter::CompositionMode blendMode)
Returns a BlendMode corresponding to a QPainter::CompositionMode.
static QPainter::CompositionMode getCompositionMode(Qgis::BlendMode blendMode)
Returns a QPainter::CompositionMode corresponding to a BlendMode.
A class to represent a 2D point.
QString absoluteToRelativeUri(const QString &providerKey, const QString &uri, const QgsReadWriteContext &context) const
Converts absolute path(s) to relative path(s) in the given provider-specific URI.
static QgsProviderRegistry * instance(const QString &pluginPath=QString())
Means of accessing canonical single instance.
QString relativeToAbsoluteUri(const QString &providerKey, const QString &uri, const QgsReadWriteContext &context) const
Converts relative path(s) to absolute path(s) in the given provider-specific URI.
The class is used as a container of context for various read/write operations on other objects.
A rectangle specified with double values.
bool contains(const QgsRectangle &rect) const SIP_HOLDGIL
Returns true when rectangle contains other rectangle.
Contains information about the context of a rendering operation.
Encapsulates the context of a layer selection operation.
double scale() const
Returns the map scale at which the selection should occur.
virtual QDomElement writeXml(QDomDocument &document, const QgsReadWriteContext &context) const
Writes the set to an XML element.
QgsCoordinateReferenceSystem crs() const
Returns the coordinate reference system associated with the tiles.
int minimumZoom() const
Returns the minimum zoom level for tiles present in the set.
int scaleToZoomLevel(double scale) const
Finds the best fitting (integer) zoom level given a map scale denominator.
int maximumZoom() const
Returns the maximum zoom level for tiles present in the set.
QgsTileMatrix tileMatrix(int zoom) const
Returns the tile matrix corresponding to the specified zoom.
virtual bool readXml(const QDomElement &element, QgsReadWriteContext &context)
Reads the set from an XML element.
void dropMatricesOutsideZoomRange(int minimumZoom, int maximumZoom)
Deletes any existing matrices which fall outside the zoom range specified by minimumZoom to maximumZo...
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.
int endColumn() const
Returns index of the last column in the range.
int endRow() const
Returns index of the last row in the range.
int startRow() const
Returns index of the first row in the range.
int startColumn() const
Returns index of the first column in the range.
Stores coordinates of a tile in a tile matrix set.
int zoomLevel() const
Returns tile's zoom level (Z)
int column() const
Returns tile's column index (X)
int row() const
Returns tile's row index (Y)
Basic labeling configuration for vector tile layers.
The default vector tile renderer implementation.
static QList< QgsVectorTileBasicRendererStyle > simpleStyleWithRandomColors()
Returns a list of styles to render all layers, using random colors.
Base class for labeling configuration classes for vector tile layers.
virtual void readXml(const QDomElement &elem, const QgsReadWriteContext &context)=0
Reads labeling properties from given XML element.
This class provides map rendering functionality for vector tile layers.
Implements a map layer that is dedicated to rendering of vector tiles.
QgsVectorTileLayer(const QString &path=QString(), const QString &baseName=QString(), const QgsVectorTileLayer::LayerOptions &options=QgsVectorTileLayer::LayerOptions())
Constructs a new vector tile layer.
QByteArray getRawTile(QgsTileXYZ tileID)
Fetches raw tile data for the give tile coordinates.
bool readXml(const QDomNode &layerNode, QgsReadWriteContext &context) override
Called by readLayerXML(), used by children to read state specific to them from project files.
bool writeSymbology(QDomNode &node, QDomDocument &doc, QString &errorMessage, const QgsReadWriteContext &context, StyleCategories categories=AllStyleCategories) const override
Write the style for the layer into the document provided.
void setRenderer(QgsVectorTileRenderer *r)
Sets renderer for the map layer.
bool loadDefaultStyleAndSubLayers(QString &error, QStringList &warnings, QList< QgsMapLayer * > &subLayers)
Loads the default style for the layer, and returns true if the style was successfully loaded.
QString decodedSource(const QString &source, const QString &provider, const QgsReadWriteContext &context) const FINAL
Called by readLayerXML(), used by derived classes to decode provider's specific data source from proj...
QString sourceType() const
Returns type of the data source.
bool writeXml(QDomNode &layerNode, QDomDocument &doc, const QgsReadWriteContext &context) const override
Called by writeLayerXML(), used by children to write state specific to them to project files.
void selectByGeometry(const QgsGeometry &geometry, const QgsSelectionContext &context, Qgis::SelectBehavior behavior=Qgis::SelectBehavior::SetSelection, Qgis::SelectGeometryRelationship relationship=Qgis::SelectGeometryRelationship::Intersect, Qgis::SelectionFlags flags=Qgis::SelectionFlags(), QgsRenderContext *renderContext=nullptr)
Selects features found within the search geometry (in layer's coordinates).
void setLabeling(QgsVectorTileLabeling *labeling)
Sets labeling for the map layer.
QList< QgsFeature > selectedFeatures() const
Returns the list of features currently selected in the layer.
QgsVectorTileLabeling * labeling() const
Returns currently assigned labeling.
~QgsVectorTileLayer() override
bool readSymbology(const QDomNode &node, QString &errorMessage, QgsReadWriteContext &context, StyleCategories categories=AllStyleCategories) override
Read the symbology for the current layer from the DOM node supplied.
int sourceMinZoom() const
Returns minimum zoom level at which source has any valid tiles (negative = unconstrained)
QgsMapLayerRenderer * createMapRenderer(QgsRenderContext &rendererContext) override
Returns new instance of QgsMapLayerRenderer that will be used for rendering of given context.
QString loadDefaultStyle(bool &resultFlag) override
Retrieve the default style for this layer if one exists (either as a .qml file on disk or as a record...
Qgis::MapLayerProperties properties() const override
Returns the map layer properties of this layer.
QString htmlMetadata() const override
Obtain a formatted HTML string containing assorted metadata for this layer.
QString encodedSource(const QString &source, const QgsReadWriteContext &context) const FINAL
Called by writeLayerXML(), used by derived classes to encode provider's specific data source to proje...
int sourceMaxZoom() const
Returns maximum zoom level at which source has any valid tiles (negative = unconstrained)
QgsVectorTileRenderer * renderer() const
Returns currently assigned renderer.
void removeSelection()
Clear selection.
QgsDataProvider * dataProvider() override
Returns the layer's data provider, it may be nullptr.
QString loadDefaultMetadata(bool &resultFlag) override
Retrieve the default metadata for this layer if one exists (either as a .qmd file on disk or as a rec...
void setTransformContext(const QgsCoordinateTransformContext &transformContext) override
Sets the coordinate transform context to transformContext.
QgsVectorTileMatrixSet & tileMatrixSet()
Returns the vector tile matrix set.
void selectionChanged()
Emitted whenever the selected features in the layer are changed.
QgsVectorTileLayer * clone() const override
Returns a new instance equivalent to this one except for the id which is still unique.
int selectedFeatureCount() const
Returns the number of features that are selected in this layer.
static QList< QgsVectorTileRawData > blockingFetchTileRawData(const QString &sourceType, const QString &sourcePath, const QgsTileMatrix &tileMatrix, const QPointF &viewCenter, const QgsTileRange &range, const QString &authid, const QgsHttpHeaders &headers, QgsFeedback *feedback=nullptr)
Returns raw tile data for the specified range of tiles. Blocks the caller until all tiles are fetched...
This class is responsible for decoding raw tile data written with Mapbox Vector Tiles encoding.
QStringList layerFieldNames(const QString &layerName) const
Returns a list of all field names in a tile. It can only be called after a successful decode()
QStringList layers() const
Returns a list of sub-layer names in a tile. It can only be called after a successful decode()
QgsVectorTileFeatures layerFeatures(const QMap< QString, QgsFields > &perLayerFields, const QgsCoordinateTransform &ct, const QSet< QString > *layerSubset=nullptr) const
Returns decoded features grouped by sub-layers.
bool decode(QgsTileXYZ tileID, const QByteArray &rawTileData)
Tries to decode raw tile data, returns true on success.
bool fromEsriJson(const QVariantMap &json)
Initializes the tile structure settings from an ESRI REST VectorTileService json map.
static QgsVectorTileMatrixSet fromWebMercator(int minimumZoom=0, int maximumZoom=14)
Returns a vector tile structure corresponding to the standard web mercator/GoogleCRS84Quad setup.
Abstract base class for all vector tile renderer implementations.
virtual void readXml(const QDomElement &elem, const QgsReadWriteContext &context)=0
Reads renderer's properties from given XML element.
static bool checkXYZUrlTemplate(const QString &url)
Checks whether the URL template string is correct (contains {x}, {y} / {-y}, {z} placeholders)
static QgsFields makeQgisFields(const QSet< QString > &flds)
Returns QgsFields instance based on the set of field names.
Utility class for reading and writing ESRI VTPK files.
QgsLayerMetadata layerMetadata() const
Reads layer metadata from the VTPK file.
bool open()
Tries to open the file, returns true on success.
#define QgsDebugMsgLevel(str, level)
#define QgsSetRequestInitiatorClass(request, _class)
#define QGIS_PROTECT_QOBJECT_THREAD_ACCESS
QMap< QString, QVector< QgsFeature > > QgsVectorTileFeatures
Features of a vector tile, grouped by sub-layer names (key of the map)
const QgsCoordinateReferenceSystem & crs
Setting options for creating vector data providers.
Setting options for loading vector tile layers.