QGIS API Documentation 3.39.0-Master (bca3cdb6021)
Loading...
Searching...
No Matches
qgssensorthingsdataitems.cpp
Go to the documentation of this file.
1/***************************************************************************
2 qgssensorthingsdataitems.cpp
3 ---------------------
4 begin : December 2023
5 copyright : (C) 2023 by Nyall Dawson
6 email : nyall dot dawson at gmail dot com
7 ***************************************************************************
8 * *
9 * This program is free software; you can redistribute it and/or modify *
10 * it under the terms of the GNU General Public License as published by *
11 * the Free Software Foundation; either version 2 of the License, or *
12 * (at your option) any later version. *
13 * *
14 ***************************************************************************/
16#include "qgsprovidermetadata.h"
20#include "qgsdataprovider.h"
21#include "qgsproviderregistry.h"
22
24
25//
26// QgsSensorThingsRootItem
27//
28
29QgsSensorThingsRootItem::QgsSensorThingsRootItem( QgsDataItem *parent, QString name, QString path )
30 : QgsConnectionsRootItem( parent, name, path, QStringLiteral( "sensorthings" ) )
31{
32 mCapabilities |= Qgis::BrowserItemCapability::Fast;
33 mIconName = QStringLiteral( "mIconSensorThings.svg" );
34 populate();
35}
36
37QVector<QgsDataItem *> QgsSensorThingsRootItem::createChildren()
38{
39 QVector<QgsDataItem *> connections;
40 const auto connectionList = QgsSensorThingsProviderConnection::connectionList();
41 for ( const QString &connName : connectionList )
42 {
43 QgsDataItem *conn = new QgsSensorThingsConnectionItem( this, connName, mPath + '/' + connName );
44 connections.append( conn );
45 }
46 return connections;
47}
48
49//
50// QgsSensorThingsConnectionItem
51//
52
53QgsSensorThingsConnectionItem::QgsSensorThingsConnectionItem( QgsDataItem *parent, const QString &name, const QString &path )
54 : QgsDataCollectionItem( parent, name, path, QStringLiteral( "sensorthings" ) )
55 , mConnName( name )
56{
57 mIconName = QStringLiteral( "mIconConnect.svg" );
59 populate();
60
61
62}
63
64bool QgsSensorThingsConnectionItem::equal( const QgsDataItem *other )
65{
66 const QgsSensorThingsConnectionItem *o = qobject_cast<const QgsSensorThingsConnectionItem *>( other );
67 return ( type() == other->type() && o && mPath == o->mPath && mName == o->mName );
68}
69
70QVector<QgsDataItem *> QgsSensorThingsConnectionItem::createChildren()
71{
72 QVector<QgsDataItem *> children;
73
75 const QString uri = QgsSensorThingsProviderConnection::encodedLayerUri( connectionData );
76 const QVariantMap connectionUriParts = QgsProviderRegistry::instance()->decodeUri(
77 QgsSensorThingsProvider::SENSORTHINGS_PROVIDER_KEY, uri );
78
79 for ( Qgis::SensorThingsEntity entity :
80 {
90 } )
91 {
92 QVariantMap entityUriParts = connectionUriParts;
93 entityUriParts.insert( QStringLiteral( "entity" ), qgsEnumValueToKey( entity ) );
94
96 {
97 children.append( new QgsSensorThingsEntityContainerItem( this,
99 mPath + '/' + qgsEnumValueToKey( entity ),
100 entityUriParts, entity, mConnName ) );
101 }
102 else
103 {
104 children.append( new QgsSensorThingsLayerEntityItem( this,
106 mPath + '/' + qgsEnumValueToKey( entity ),
107 entityUriParts,
108 QgsSensorThingsProvider::SENSORTHINGS_PROVIDER_KEY,
109 Qgis::BrowserLayerType::TableLayer, entity, mConnName ) );
110 }
111 }
112
113 return children;
114}
115
116
117//
118// QgsSensorThingsEntityContainerItem
119//
120
121QgsSensorThingsEntityContainerItem::QgsSensorThingsEntityContainerItem( QgsDataItem *parent, const QString &name, const QString &path, const QVariantMap &entityUriParts, Qgis::SensorThingsEntity entityType, const QString &connectionName )
122 : QgsDataCollectionItem( parent, name, path, QStringLiteral( "sensorthings" ) )
123 , mEntityUriParts( entityUriParts )
124 , mEntityType( entityType )
125 , mConnectionName( connectionName )
126{
128 populate();
129}
130
131bool QgsSensorThingsEntityContainerItem::equal( const QgsDataItem *other )
132{
133 const QgsSensorThingsEntityContainerItem *o = qobject_cast<const QgsSensorThingsEntityContainerItem *>( other );
134 return ( type() == other->type() && o && mPath == o->mPath && mName == o->mName );
135}
136
137QVector<QgsDataItem *> QgsSensorThingsEntityContainerItem::createChildren()
138{
139 QVector<QgsDataItem *> children;
140
141 int sortKey = 1;
142 QList< Qgis::WkbType > compatibleTypes;
143 // we always expose "no geometry" types for these, even though they have a restricted fixed type
144 // according to the spec. This is because not all services respect the mandated geometry types!
145 switch ( QgsSensorThingsUtils::geometryTypeForEntity( mEntityType ) )
146 {
149 break;
152 break;
155 break;
158 break;
160 compatibleTypes << Qgis::WkbType::NoGeometry;;
161 }
162
163 for ( const Qgis::WkbType wkbType : std::as_const( compatibleTypes ) )
164 {
165 QVariantMap geometryUriParts = mEntityUriParts;
166 QString name;
168 switch ( wkbType )
169 {
171 geometryUriParts.insert( QStringLiteral( "geometryType" ), QStringLiteral( "point" ) );
172 name = tr( "Points" );
174 break;
176 geometryUriParts.insert( QStringLiteral( "geometryType" ), QStringLiteral( "multipoint" ) );
177 name = tr( "MultiPoints" );
179 break;
181 geometryUriParts.insert( QStringLiteral( "geometryType" ), QStringLiteral( "line" ) );
182 name = tr( "Lines" );
184 break;
186 geometryUriParts.insert( QStringLiteral( "geometryType" ), QStringLiteral( "polygon" ) );
187 name = tr( "Polygons" );
189 break;
191 geometryUriParts.remove( QStringLiteral( "geometryType" ) );
192 name = tr( "No Geometry" );
194 break;
195 default:
196 break;
197 }
198 children.append( new QgsSensorThingsLayerEntityItem( this,
199 name,
200 mPath + '/' + name,
201 geometryUriParts,
202 QgsSensorThingsProvider::SENSORTHINGS_PROVIDER_KEY,
203 layerType, mEntityType, mConnectionName ) );
204 children.last()->setSortKey( sortKey++ );
205 }
206
207 return children;
208}
209
210//
211// QgsSensorThingsLayerEntityItem
212//
213
214QgsSensorThingsLayerEntityItem::QgsSensorThingsLayerEntityItem( QgsDataItem *parent, const QString &name, const QString &path,
215 const QVariantMap &uriParts, const QString &provider, Qgis::BrowserLayerType type, Qgis::SensorThingsEntity entityType, const QString &connectionName )
216 : QgsLayerItem( parent, name, path,
217 QgsProviderRegistry::instance()->encodeUri( QgsSensorThingsProvider::SENSORTHINGS_PROVIDER_KEY, uriParts ),
218 type, provider )
219 , mUriParts( uriParts )
220 , mEntityType( entityType )
221 , mConnectionName( connectionName )
222{
224}
225
226QString QgsSensorThingsLayerEntityItem::layerName() const
227{
228 QString baseName;
230 {
231 const QString geometryType = mUriParts.value( QStringLiteral( "geometryType" ) ).toString();
232 QString geometryNamePart;
233 if ( geometryType.compare( QLatin1String( "point" ), Qt::CaseInsensitive ) == 0 ||
234 geometryType.compare( QLatin1String( "multipoint" ), Qt::CaseInsensitive ) == 0 )
235 {
236 geometryNamePart = tr( "Points" );
237 }
238 else if ( geometryType.compare( QLatin1String( "line" ), Qt::CaseInsensitive ) == 0 )
239 {
240 geometryNamePart = tr( "Lines" );
241 }
242 else if ( geometryType.compare( QLatin1String( "polygon" ), Qt::CaseInsensitive ) == 0 )
243 {
244 geometryNamePart = tr( "Polygons" );
245 }
246
247 if ( !geometryNamePart.isEmpty() )
248 {
249 baseName = QStringLiteral( "%1 - %2 (%3)" ).arg( mConnectionName,
250 QgsSensorThingsUtils::displayString( mEntityType, true ),
251 geometryNamePart );
252 }
253 else
254 {
255 baseName = QStringLiteral( "%1 - %2" ).arg( mConnectionName,
256 QgsSensorThingsUtils::displayString( mEntityType, true ) );
257 }
258 }
259 else
260 {
261 baseName = QStringLiteral( "%1 - %2" ).arg( mConnectionName,
262 QgsSensorThingsUtils::displayString( mEntityType, true ) );
263 }
264
265 return baseName;
266}
267
268//
269// QgsSensorThingsDataItemProvider
270//
271
272QString QgsSensorThingsDataItemProvider::name()
273{
274 return QStringLiteral( "SensorThings" );
275}
276
277QString QgsSensorThingsDataItemProvider::dataProviderKey() const
278{
279 return QStringLiteral( "sensorthings" );
280}
281
282Qgis::DataItemProviderCapabilities QgsSensorThingsDataItemProvider::capabilities() const
283{
285}
286
287QgsDataItem *QgsSensorThingsDataItemProvider::createDataItem( const QString &path, QgsDataItem *parentItem )
288{
289 if ( path.isEmpty() )
290 return new QgsSensorThingsRootItem( parentItem, QObject::tr( "SensorThings" ), QStringLiteral( "sensorthings:" ) );
291
292 return nullptr;
293}
294
296
@ NetworkSources
Network/internet source.
@ Populated
Children created.
@ Collapse
The collapse/expand status for this items children should be ignored in order to avoid undesired netw...
@ Fast
CreateChildren() is fast enough to be run in main thread when refreshing items, most root items (wms,...
QFlags< DataItemProviderCapability > DataItemProviderCapabilities
Capabilities for data item providers.
Definition qgis.h:926
SensorThingsEntity
OGC SensorThings API entity types.
Definition qgis.h:5517
@ Sensor
A Sensor is an instrument that observes a property or phenomenon with the goal of producing an estima...
@ MultiDatastream
A MultiDatastream groups a collection of Observations and the Observations in a MultiDatastream have ...
@ ObservedProperty
An ObservedProperty specifies the phenomenon of an Observation.
@ FeatureOfInterest
In the context of the Internet of Things, many Observations’ FeatureOfInterest can be the Location of...
@ Datastream
A Datastream groups a collection of Observations measuring the same ObservedProperty and produced by ...
@ Observation
An Observation is the act of measuring or otherwise determining the value of a property.
@ Location
A Location entity locates the Thing or the Things it associated with. A Thing’s Location entity is de...
@ Thing
A Thing is an object of the physical world (physical things) or the information world (virtual things...
@ HistoricalLocation
A Thing’s HistoricalLocation entity set provides the times of the current (i.e., last known) and prev...
@ Polygon
Polygons.
@ Unknown
Unknown types.
@ Null
No geometry.
BrowserLayerType
Browser item layer types.
Definition qgis.h:935
@ Point
Vector point layer.
@ Line
Vector line layer.
@ Polygon
Vector polygon layer.
@ TableLayer
Vector non-spatial layer.
WkbType
The WKB type describes the number of dimensions a geometry has.
Definition qgis.h:256
@ MultiPoint
MultiPoint.
@ MultiPolygon
MultiPolygon.
@ NoGeometry
No geometry.
@ MultiLineString
MultiLineString.
A Collection that represents a root group of connections from a single data provider.
A Collection: logical collection of layers or subcollections, e.g.
Base class for all items in the model.
Definition qgsdataitem.h:46
Qgis::BrowserItemType type() const
Item that represents a layer that can be opened with one of the providers.
A registry / canonical manager of data providers.
QVariantMap decodeUri(const QString &providerKey, const QString &uri)
Breaks a provider data source URI into its component paths (e.g.
static QgsProviderRegistry * instance(const QString &pluginPath=QString())
Means of accessing canonical single instance.
static QString encodedLayerUri(const Data &data)
Returns connection data encoded as a string containing a URI for a SensorThings vector data provider.
static QStringList connectionList()
Returns a list of the stored connection names.
static Data connection(const QString &name)
Returns connection details for the stored connection with the specified name.
static Qgis::GeometryType geometryTypeForEntity(Qgis::SensorThingsEntity type)
Returns the geometry type for if the specified entity type.
static QString displayString(Qgis::SensorThingsEntity type, bool plural=false)
Converts a Qgis::SensorThingsEntity type to a user-friendly translated string.
static bool entityTypeHasGeometry(Qgis::SensorThingsEntity type)
Returns true if the specified entity type can have geometry attached.
QString qgsEnumValueToKey(const T &value, bool *returnOk=nullptr)
Returns the value for the given key of an enum.
Definition qgis.h:6074
Represents decoded data of a SensorThings connection.