Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Conversation

@Gaetanbrl
Copy link
Member

@Gaetanbrl Gaetanbrl commented Jan 9, 2023

contribution de l'INRAE - Agrocampus via JDev

Issue #627

Description

Cette première contribution permet d'intégrer la notion de sensorthings relativement à l'OGC :
https://www.ogc.org/standards/sensorthings

Cette contribution permet d'utiliser des couches type "sensorthings".

La configuration possibles est la suivante :

            <layer
                id="lora"
                type="sensorthings"
                name="API Lora"
                visible="true"
                legendurl="false"
                queryable="true"
                url="https://api.geosas.fr/lora/v1.0"
                infopanel="bottom-panel"
                style="sensorPoint"
                top="200"
                defaultSensor="ETP"
                selector="id,description"
                datastreamsfilter="name,id"
                multidatastreamsfilter="name,description,id,unitOfMeasurements">
                <template url="demo/sensorLora.mst"></template>
            </layer>

Le parcours utilisateur est le suivant :

  1. Clic sur une entité géographique (nommée thing qui peut être vue comme un capteur positionné sur un toit par exemple) liée à des informations (nommées datastreams) du type humidité, vent, température etc...

  2. Dans la légende, un custom control affiche la liste des DataStreams disponibles (par défaut le premier est coché)

  3. Le template s'affiche avec le contenu souhaité sur le ou les streams sélectionnés (graphique, tableau, etc.)

Description technique

La contribution contient 2 fichiers à intégrer dans le coeur mviewer :

  • un fichier contenant une classe SensorFeature qui permet de créer un objet avec des méthodes spécifiques
  • un fichier sensorThings qui est une librairie permettant de créer une couche vectorielle à partir d'une URL de service SensorThings

Les modifications dans le coeurs contiennent notamment :

  • L'utilisation des templates string (syntax JS) pour les templates du fichier templates.js. Ce qui facilite la lecture et la modification des templates

https://github.com/mviewer/mviewer/pull/725/files#diff-145371087f78fe03e294a49a849231dc5dace008d0b6fdfc5e56ad13910056a3

  • dans js/info.js, Le remplacement du système de multi-requêtage mviewer via JQuery par Promise.all (la fonction _queryMap devient une fonction asynchrone donc le résultat peut être attendu si besoin (via await) )

https://github.com/mviewer/mviewer/pull/725/files#diff-ab469724549a1dafc6a8860c0ddd7a323d62d1bfcd4ced2cf35c6ed4b501c11eL694

  • L'ajout de la configuration nécessaire dans js/configuration.js

https://github.com/mviewer/mviewer/pull/725/files#diff-10d6e62c846b22d2126cac364b63c3f2b96b1725136f66c386f12fa518e99869R781

  • Ajout des styles par défaut à la création de la couche sensorthing dans js/featurestyles.js

https://github.com/mviewer/mviewer/pull/725/files#diff-9d30c1f9e8c74f11b275feff1fd1e3ffc53c514ba8af919cce7d4fe1322480cfR134

  • Ajout d'un control dans la légende par défaut pour le type de couche sensorthing

https://github.com/mviewer/mviewer/pull/725/files#diff-145371087f78fe03e294a49a849231dc5dace008d0b6fdfc5e56ad13910056a3R177-R191

Reste à faire

  • revue
  • tests
  • prise en compte du dernier commentaire
  • Ouverture de la légende au clic
  • Quelques commentaires en plus dans le code
  • Doc
  • viewer et templates d'exemple

@hsquividant
Copy link

@Gaetanbrl 👍

@Gaetanbrl Gaetanbrl requested a review from spelhate January 12, 2023 10:44
@Gaetanbrl
Copy link
Member Author

@hsquividant prêt pour revue -test / merge.

@hsquividant
Copy link

Merci @Gaetanbrl !
Retour sur ces derniers commit :

  • Bug : Le paramètre de config "top" s'applique bien aux objets géographiques mais ne s'applique plus aux observations. Ca fonctionnait dans la version n-1. A priori ça re-fonctionne en remplaçant la ligne 168 de sensorFeature.js par :
    this.config.top ? ?$top=${this.config.top} : ""
    Idem à la ligne 178 pour les multidatastreams.
  • Bug : Quand plusieurs Things sont superposées, rien ne s'affiche. C'est le cas pour le service Lora de Rennes Métropôle dont nous avons actualisé les coordonnées géo.
  • Evolution : La légende s'ouvre bien à la sélection d'une Thing, par contre la fonction de scrolling dans la liste des datastreams n'est pas encore opérationnelle ou développée. Utile quand le nombre de datastreams ratachés à une Thing est important. ex : https://geosas.fr/mviewer-test/?config=/apps/brgm/brgm.xml
  • Evolution : Pour éviter d'avoir à créer un template spécifique pour chaque service ST, il serait utile d'en créer un générique (ex: sensor.mst) intégrant un layer.id générique (ex: sensor ou sensorthings).

@Gaetanbrl
Copy link
Member Author

Merci pour les tests @hsquividant , quand tu parles de la version n-1, tu veux dire à quelle date que je me repère ?

@Gaetanbrl
Copy link
Member Author

@hsquividant je viens de tester :

Avec GeoSAS, si on clic sur 2 features c'est un peu long mais on a bien les 2 résultats.

Avec LORA j'ai une erreur dans la console, aucune feature ne fonctionne.

@Gaetanbrl
Copy link
Member Author

Il semble que ce cas de test ne soit pas encore connu :

  • Avoir plusieurs features de nom de MultiDatastreams différents (Lora ST1_25, Lora ST1_50, Lora ST1_75) à une même coordonnées
  • Clic sur la coordonnées

@hsquividant je ne sais pas quoi afficher dans le custom control et dans le template pour ces types de données (MultiDatastream) qui sont complètements différents des Datastreams.

@Gaetanbrl
Copy link
Member Author

J'ai trouvé pourquoi on ne voit rien et ajouté un correctif :

Lorsqu'on a plusieurs MultiDatastream, on charge dans le custom control un seul des multidatastream retourné. Donc quand on charge le panel, on a pour notre exemple uniquement une seule feature qui contient des données pour le stream sélectionné (ex: Lora ST1_75).
Les autres features n'ayant pas d'observation pour ce stream, j'avais une erreur non gérée dans le template (bug mineur donc).

Le problème actuel est qu'on ne peut pas choisir un autre des multidatastream parmis les features cliquées aux même coordonnées (parmis notre exemple Lora ST1_25, Lora ST1_50, Lora ST1_75).

Il faudrait donc avoir ce comportement pour les MultiDatastreams :

  1. clic sur la coordonnées
  2. Récupérer les observations
  3. Lister les noms des multidasatreams
  4. Charger la liste des noms dans le custom control
  5. Afficher la fiche info > seule une des 3 features aura un graphique selon le stream sélectionné par défaut
  6. cliquer sur un autre stream
  7. recharger le panel > seule une des 3 features aura un graphique selon le stream sélectionné

@Gaetanbrl
Copy link
Member Author

Gaetanbrl commented Jan 13, 2023

Vu avec @hsquividant en évolution :

  • Utiliser ObservedProperties d'un stream pour afficher la liste du custom control et le vrai nom :

https://sensorthings-wq.brgm-rec.fr/FROST-Server/v1.0/Datastreams(8862231)/ObservedProperty
https://api.geosas.fr/lora/v1.0/MultiDatastreams(1)/ObservedProperties

Pour chaque :

  • Clic sur le thing
  • Parcourir les streams
  • pour chaque streams - Appeler les ObservedProperties (via les requêtes au-dessus) - peupler la liste
  • Avoir une liste de valeurs unique des ObservedProperties
  • Peupler le custom control avec les valeurs uniques

Attention : la base doit être bien peuplées pour avoir des noms différents et pertinent pour l'utilisateur

@Gaetanbrl Gaetanbrl added the In progress Work in progress label Jan 13, 2023
@Gaetanbrl Gaetanbrl removed the request for review from spelhate January 13, 2023 10:04
@hsquividant hsquividant mentioned this pull request May 2, 2023
@Gaetanbrl
Copy link
Member Author

Rebase

PR alignée sur la branche develop.

@Gaetanbrl
Copy link
Member Author

Gaetanbrl commented Aug 10, 2023

Utiliser ObservedProperties d'un stream pour afficher la liste du custom control et le vrai nom :
Attention : la base doit être bien peuplées pour avoir des noms différents et pertinent pour l'utilisateur

La dernière phrase est encore d'actualité.

Avec le service agri4cast ou geosas LORA, je reproduis bien facilement un cas où la liste des noms uniques est inférieur aux streams récupérés.

Exemple avec GEOSAS et des Datastreams

Je clique sur un objet (things) représenté par un carreau de la couche afin d'obtenir les informations :

https://api.geosas.fr/agri4cast/v1.0/Locations(33)/Things?$select=id,description&$expand=Datastreams($select=name,id),MultiDatastreams($select=name,description,id,unitOfMeasurements)

Jusque là on avait dans la PR actuelle 8 noms différents pour les DataStreams :

image

En appliquant la méthode du dernier commentaire, on réalise 1 requête ObserverdProperty par stream afin d'avoir le nom avec par exemple pour la temperature min (stream id 251), cette requête qui nous donne le nom "temperature" :

https://api.geosas.fr/agri4cast/v1.0/Datastreams(251)/ObservedProperty

Mais il s'avère que pour ce service, les noms ne sont pas uniques car pour cette location, les streams fournissents une liste de noms uniques suivants (on aura supprimé les valeurs en doublons pour générer cette liste) :

['temperature', 'wind velocity', 'vapour pressure', 'precipitation', 'ETP', 'global radiation']

On voit donc que les 3 temperatures ont le même nom "temperature" pour la partie ObservedProperty.

A voir maintenant pour les MultiDataStreams.

Exemple avec MultiDataStreams LORA

Les locations sont les suivants (12 entités) :
https://api.geosas.fr/lora/v1.0/Locations?$top=200

Si on test l'iot.id 11 pour obtenir les streams avec cette requête :

https://api.geosas.fr/lora/v1.0/Things(11)/MultiDatastreams

On obtiendra 1 seul MultiDatastreams de 3 unités de mesure :

image

Pour obtenir les noms, j'appel les ObservedProperties :

https://api.geosas.fr/lora/v1.0/MultiDatastreams(11)/ObservedProperties

J'obtiens les noms Battery et Temperature.
Donc on a 2 noms pour le (ST4_75) pour 3 unités de mesure différentes vu ici :

https://api.geosas.fr/lora/v1.0/Things(11)/MultiDatastreams

image

En l'état pour ce service de multidatastream, on aura seulement 2 noms à rajouter dans le custom control mais 3 types de données. Cette méthode d'appel avec les observedProperties (nom d'ailleurs différent entre datastreams et multidatastreams) me semble donc cohérente seulement avec des données bien saisie en base (c'est à dire 1 dataset du chart = 1 unité de mesure = 1 observedProperty par unité de mesure cliquable dans le custom control comme pour les datastreams).

@hsquividant est-ce correct et est-ce la bonne méthode ?

@tlinrae
Copy link

tlinrae commented Aug 16, 2023

Cette méthode d'appel avec les observedProperties (nom d'ailleurs différent entre datastreams et multidatastreams) me semble >donc cohérente seulement avec des données bien saisie en base (c'est à dire 1 dataset du chart = 1 unité de mesure = 1 >observedProperty par unité de mesure cliquable dans le custom control comme pour les datastreams).

Pour https://api.geosas.fr/agri4cast/v1.0/ l'observedProperty temperature correspond effectivement à 3 datastreams par thing, il faudra dans ce cas pouvoir mettre dans le plot les trois datastreams si on reste sur l'idée d'@hsquividant.

Une requête de ce type permettra de trouver les bons datastreams (mais ne marche pas sur api.geosas.fr) :
https://geosas.fr/FROST-agri4cast/v1.0/Things(50)/Datastreams?$filter=ObservedProperty/name eq 'temperature'
Un autre exemple : https://sensorthings-wq.brgm-rec.fr/FROST-Server/v1.0/Things(3011)/Datastreams?$filter=ObservedProperty/name eq 'Zinc'
dans cette thing on observe du Zinc (observedProperty) mais avec des origines différentes et chaque datastream correspond a une forme.

Pour les multidatastreams lora n'est pas un bon exemple il ne respecte pas le standard.
https://api.geosas.fr/lora/v1.0/MultiDatastreams(11)/ObservedProperties est une erreur : normalement il y a autant d'observedProperty que de stream et l'ordre des observedProperties doit être le même que celui des streams (tout comme l'ordre des unitOfMeasurements).
Par contre il est possible de rencontrer le même cas de figure que la température d'agri4cast :
multidatastreams [mean,mini,maxi], observedproperties [temperature,temperature,temperature]

Par ailleurs, les observations également ne sont pas standard sur https://api.geosas.fr/lora/v1.0 :
"result": { "Temperature": 2.6, "humidity": 13.592, "Battery": null }
doit être sous cette forme (l'ordre des streams permet de ce repérer) :
"result": [ 2.6, 13.592, "null" ]

Je ne connais pas d'autres services qui proposent des multidatastreams pour que tu puisses faire des tests, quand j'ai le temps je vais en créer un.

@Gaetanbrl
Copy link
Member Author

Retour de @tom @hsquividant :

On a trouvé un bug dans la partie sensorthing  du mviewer liée au MultiDatastream. Dans le cas où il n'y a pas de MutliDatastream (c'est une option non obligatoire du standard) : le serveur ne renvoie pas cette clé dans le json de réponse et le mviewer ce bloque (le script /js/sensorthings.js).

 
exemple d'un service sans MultiDatastream :
https://api.geosas.fr/bosco/v1.0/Locations(224)/Things?$select=id,name,description&$expand=Datastreams($select=name,description,id,unitOfMeasurement),MultiDatastreams($select=name,description,id,unitOfMeasurements)
exemple d'un service avec MultiDatastreams :
 https://frost.geosas.fr/bosco/v1.0/Locations(224)/Things?$select=id,name,description&$expand=Datastreams($select=name,description,id,unitOfMeasurement),MultiDatastreams($select=name,description,id,unitOfMeasurements)

@Gaetanbrl
Copy link
Member Author

Suite aux derniers retours du de décembre 2023je propose de :

  • créer une issue pour le multidatastream
  • corriger les conflits
  • merger cette PR
  • Corriger l'issue ensuite pour le multidatastream

@hsquividant est-ce que cela te convient ? On aura ainsi une première partie fonctionnelle et native dans le mviewer

@Gaetanbrl
Copy link
Member Author

la PR a été mise à jour sur la base de la branche develop (latest > v3.10.0)

@Gaetanbrl Gaetanbrl merged commit 259f374 into mviewer:develop Mar 28, 2024
@lecault lecault added this to the 3.11 milestone Mar 29, 2024
@Gaetanbrl Gaetanbrl deleted the 627-3.9.1 branch January 22, 2025 08:56
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

In progress Work in progress

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants