Pages: 1
- Sujet précédent - Automatisation de la typologie des modification de l'historique d'OSM - Sujet suivant
#1 Tue 22 June 2021 14:44
- BALDE
- Participant occasionnel
- Date d'inscription: 31 Oct 2020
- Messages: 11
Automatisation de la typologie des modification de l'historique d'OSM
Bonjour,
J'essaye en ce moment d'automatiser sous PostgreSQL le processus de typologie de l'historique des modification des données importés dans OpenStreetMap. La typologie de ces données se fait à l'aide du champs tags, lat(latitude) et lon(longitude). Le champ tags permet de voir les changements et ajouts et suppressions de tags réalisés entre les versions d'un même objet (nb: un objet peut avoir jusqu'à 8 versions). Quant aux champs lat et lon, ils permettent de détecter les changements de position d'un objet, et cela par la différence de coordonnées entre les versions du même objet.
Pour faire cette typologie, j'ai d'abord découpé le champ tags en plusieurs champs afin de mieux repérer les changements.
En revanche, je ne sais pas trop comment faire une fonction qui parcours ma table ligne par ligne en comparant les tags mais aussi les latitudes ou longitudes de chaque versions d'un objet à celle précédente et mettre dans mon champs typemodif "enrichissement" pour les ajouts de tags, "modification valeur" pour les modifications de valeur à l'intérieur d'un tags, "suppression" pour les suppressions, "deplacement" pour le changement de coordonnées d'un même objet, "enrichissement et modification valeur" lors qu'on observe à la fois un ou des enrichissement(s) et une modification de valeur et "enrichissement et deplacement" lors qu'il y a ajout de tag(s) et modification de coordonnées.
La structure de ma table (histpolice_donneevectimport) est comme suit :
-osm_id : identifiant de l'objet
- vnode : versions de modification de l'objet
- tags mais découper en 20 champs (1 tag par champ et par version) :
- lat : latitude
- lon : longitude
- typemodif : type de modification (mais vide pour le moment)
Je souhaiterais savoir si quelqu'un a déjà fait ce type de traitement ou a une idée sur la façon de procéder ?
Merci d'avance
Dernière modification par BALDE (Tue 22 June 2021 16:02)
Hors ligne
#2 Tue 22 June 2021 15:53
- tumasgiu
- Membre
- Lieu: Ajaccio
- Date d'inscription: 5 Jul 2010
- Messages: 1149
Re: Automatisation de la typologie des modification de l'historique d'OSM
Salut,
au lieu de découper le champs tags, j'opterais pour une colonne de données semi structurées,
style json ou hstore. De cette manière si jamais de nouveaux tags apparaissent, vous n'aurez
pas a rajouter de nouvelles colonnes.
Je découperais ma colonne modif en deux colonnes booléennes par contre : modif_pos et modif_tags
La requête donnerait quelque chose comme çà
Code:
INSERT INTO histpolice_donneevectimport SELECT osm_id, vnode+1, d.lat <> l.lat OR d.lon <> l.lon, EXISTS( SELECT 1 FROM each(d.tags) AS a NATURAL LEFT JOIN each(l.tags) AS b WHERE COALESCE(a.value <> b.value, TRUE) ) FROM osm_data d CROSS JOIN LATERAL (SELECT * FROM histpolice_donneevectimport h WHERE d.osm_id = d.osm_id ORDER BY vnode DESC LIMIT 1 ) AS l
Je ne garantis pas les performances sur un gros dataset par contre...
Dernière modification par tumasgiu (Tue 22 June 2021 16:03)
Hors ligne
#3 Tue 22 June 2021 16:51
- n314
- Participant assidu
- Date d'inscription: 6 Sep 2005
- Messages: 704
Re: Automatisation de la typologie des modification de l'historique d'OSM
Vous connaissez https://heigit.org/big-spatial-data-ana … en/ohsome/ je suppose ? Qui ne répond pas à votre besoin ?
Hors ligne
#4 Tue 22 June 2021 16:52
- Nicolas Ribot
- Membre
- Lieu: Toulouse
- Date d'inscription: 9 Sep 2005
- Messages: 1549
Re: Automatisation de la typologie des modification de l'historique d'OSM
Oh nice !
Hors ligne
#5 Wed 23 June 2021 10:51
- BALDE
- Participant occasionnel
- Date d'inscription: 31 Oct 2020
- Messages: 11
Re: Automatisation de la typologie des modification de l'historique d'OSM
Bonjour,
Merci pour vos retours !
Je vais essayer d'explorer vos suggestions. Quant à Ohsome, je l'ai consulté mais je n'ai pas trouver grand chose par rapport aux tâches que je souhaite réaliser.
Hors ligne
#6 Wed 23 June 2021 17:26
- BALDE
- Participant occasionnel
- Date d'inscription: 31 Oct 2020
- Messages: 11
Re: Automatisation de la typologie des modification de l'historique d'OSM
Je viens de tester le programme qui marche mais sans le INSERT INTO c'est à dire à partir du select. En effet, ce programme renvoie hormis les champs de la table de d (osm_id, tags, vnode, lat, lon) trois autres champs. Les deux premiers champs ajoutés ont le même nom (?column?) mais le premier est de type integer (numéro de la version où il y a un changement si j'ai bien compris) alors que les deuxième et troisième sont de type booléen. Les résultats de ces deux dernières colonnes sont soit vrai (True), soit faux (False). J'arrive donc toujours pas à faire ma typologie des modification à travers ce résultat.
Voici ci-dessous mon script :
Code:
INSERT INTO testhist_police SELECT d.osm_id, d.vnode, d.tags, d.lat, d.lon, d.vnode+1, d.lat <> l.lat OR d.lon <> l.lon, EXISTS( SELECT 1 FROM each(d.tags) AS a NATURAL LEFT JOIN each(l.tags) AS b WHERE COALESCE(a.value <> b.value, TRUE) ) FROM histpolice_donneevectimport d CROSS JOIN LATERAL (SELECT * FROM testhist_police h WHERE d.osm_id = d.osm_id ORDER BY vnode DESC LIMIT 1 ) AS l
Y aurait-il un moyen d'améliorer mon script afin d'obtenir une des deux typologies de modification que j'ai réalisées manuellement sous Excel (cf. fichier ci-joint) ?
Dernière modification par BALDE (Wed 23 June 2021 17:59)
Hors ligne
#7 Thu 24 June 2021 09:31
- tumasgiu
- Membre
- Lieu: Ajaccio
- Date d'inscription: 5 Jul 2010
- Messages: 1149
Re: Automatisation de la typologie des modification de l'historique d'OSM
Voici la requête modifiée qui prends en compte votre besoin de vraiment détailler
les différences entre les tags (plus corrections de coquilles).
J'ai tout de même conservé des types booleens pour votre typologie, je pense
que cela est plus pertinent car plus simple à manipuler.
Si vous tenez à avoir une représentation textuelle, vous pouvez créer une vue qui exploitera cette table
et utiliser ces champs booléens dans une expression CASE.
Code:
SELECT d.osm_id, d.vnode, d.tags, d.lat, d.lon, d.vnode+1, d.lat <> l.lat OR d.lon <> l.lon AS deplacement, EXISTS( SELECT 1 FROM each(d.tags) AS a JOIN each(l.tags) AS b USING (key) WHERE a.value <> b.value ) AS modifications_tags, EXISTS( SELECT 1 FROM each(d.tags) AS a LEFT JOIN each(l.tags) AS b USING (key) WHERE b.value IS NULL ) AS enrichissement_tags, EXISTS( SELECT 1 FROM each(d.tags) AS a RIGHT JOIN each(l.tags) AS b USING (key) WHERE a.value IS NULL ) AS suppression_tags FROM histpolice_donneevectimport d CROSS JOIN LATERAL (SELECT * FROM testhist_police h WHERE d.osm_id = h.osm_id ORDER BY vnode DESC LIMIT 1 ) AS l
La clause INSERT ne marchera que quand votre table testhist_police contiendra les mêmes colonnes que la clause SELECT.
Dernière modification par tumasgiu (Thu 24 June 2021 09:45)
Hors ligne
#8 Thu 24 June 2021 11:31
- BALDE
- Participant occasionnel
- Date d'inscription: 31 Oct 2020
- Messages: 11
Re: Automatisation de la typologie des modification de l'historique d'OSM
Parfait, c'est ce dont j'avais besoin !
Je vous remercie pour cette immense aide.
Dernière modification par BALDE (Thu 24 June 2021 11:38)
Hors ligne
#9 Thu 24 June 2021 20:26
- tumasgiu
- Membre
- Lieu: Ajaccio
- Date d'inscription: 5 Jul 2010
- Messages: 1149
Re: Automatisation de la typologie des modification de l'historique d'OSM
ultime coquille, les noms des deux dernieres expressions sont à inverser :
Code:
SELECT d.osm_id, d.vnode, d.tags, d.lat, d.lon, d.vnode+1, d.lat <> l.lat OR d.lon <> l.lon AS deplacement, EXISTS( SELECT 1 FROM each(d.tags) AS a JOIN each(l.tags) AS b USING (key) WHERE a.value <> b.value ) AS modifications_tags, EXISTS( SELECT 1 FROM each(d.tags) AS a LEFT JOIN each(l.tags) AS b USING (key) WHERE b.value IS NULL ) AS suppressions_tags, EXISTS( SELECT 1 FROM each(d.tags) AS a RIGHT JOIN each(l.tags) AS b USING (key) WHERE a.value IS NULL ) AS enrichissement_tags FROM histpolice_donneevectimport d CROSS JOIN LATERAL (SELECT * FROM testhist_police h WHERE d.osm_id = h.osm_id ORDER BY vnode DESC LIMIT 1 ) AS l
Hors ligne
#10 Tue 29 June 2021 12:08
- BALDE
- Participant occasionnel
- Date d'inscription: 31 Oct 2020
- Messages: 11
Re: Automatisation de la typologie des modification de l'historique d'OSM
Oui, Je m'en suis rendu compte en vérifiant les résultats.
Merci pour la remarque !
Hors ligne
#11 Fri 02 July 2021 12:32
- BALDE
- Participant occasionnel
- Date d'inscription: 31 Oct 2020
- Messages: 11
Re: Automatisation de la typologie des modification de l'historique d'OSM
Bonjour Tumasgiu,
Est-il possible de réaliser ce traitement sur une seule table ? J'ai toujours des erreurs dans mes résultats. En effet, j'ai quelques objets détectés comme étant des enrichissements, déplacements, modifications ou suppressions alors qu'ils ne le sont pas. Par exemple entre la première et deuxième version du premier objet, ça me met enrichissement_tags = true alors que c'est une suppression (cf. capture d'écran).
Je me suis dit qu'il y a peut-être un problème de correspondance entre les deux tables or que c'est la même table qui est dupliquée et ordonnée en fonction de l'osm_id et du vnode.
Merci d'avance
Dernière modification par BALDE (Fri 02 July 2021 12:35)
Hors ligne
#12 Fri 02 July 2021 17:17
- tumasgiu
- Membre
- Lieu: Ajaccio
- Date d'inscription: 5 Jul 2010
- Messages: 1149
Re: Automatisation de la typologie des modification de l'historique d'OSM
Oui en principe c'est faisable, mais je ne cerne pas très bien votre cas d'utilisation.
Pourriez vous poster la requête que vous executez ?
Hors ligne
#13 Sun 04 July 2021 16:04
- BALDE
- Participant occasionnel
- Date d'inscription: 31 Oct 2020
- Messages: 11
Re: Automatisation de la typologie des modification de l'historique d'OSM
Voici ci-dessous, la requête complète
Code:
CREATE TABLE typomodifpolice AS ( SELECT d.osm_id, d.vnode, d.tags, d.lat, d.lon, d.vnode+1 AS v_next, d.lat <> l.lat OR d.lon <> l.lon and d.osm_id = l.osm_id AS deplacement, EXISTS( SELECT 1 FROM each(d.tags) AS a JOIN each(l.tags) AS b USING (key) WHERE a.value <> b.value ) AS modifications_tags, EXISTS( SELECT 1 FROM each(d.tags) AS a LEFT JOIN each(l.tags) AS b USING (key) WHERE b.value IS NULL ) AS suppressions_tags, EXISTS( SELECT 1 FROM each(d.tags) AS a RIGHT JOIN each(l.tags) AS b USING (key) WHERE a.value IS NULL ) AS enrichissement_tags FROM histpolice_donneevectimport d CROSS JOIN LATERAL (SELECT * FROM testhist_police h WHERE d.osm_id = h.osm_id ORDER BY osm_id, vnode DESC LIMIT 1 ) AS l) -- Création du champ de typologie ALTER TABLE typomodifpolice ADD COLUMN typologie VARCHAR (100) -- Remplissage du champ créé UPDATE typomodifpolice SET typologie = ( CASE WHEN enrichissement_tags = 'true' THEN 'enrichissment' WHEN enrichissement_tags = 'true' AND deplacement = 'true' THEN 'enrichissment_deplacement' WHEN deplacement = 'true' THEN 'deplacement' WHEN modifications_tags = 'true' THEN 'modification valeur' WHEN suppressions_tags = 'true' THEN 'suppression' WHEN suppressions_tags = 'true' AND enrichissement_tags = 'true' THEN 'enrichissement_suppressions' ELSE 'Pas de modification' END)
.
Hors ligne
#14 Mon 05 July 2021 15:06
- BALDE
- Participant occasionnel
- Date d'inscription: 31 Oct 2020
- Messages: 11
Re: Automatisation de la typologie des modification de l'historique d'OSM
Bonjour @tumasgiu,
J'ai finalement résolu le problème avec l'aide de mon maître de stage.
Merci beaucoup pour ton assistance !
Cordialement
Dernière modification par BALDE (Mon 05 July 2021 15:06)
Hors ligne
#15 Mon 05 July 2021 19:26
- tumasgiu
- Membre
- Lieu: Ajaccio
- Date d'inscription: 5 Jul 2010
- Messages: 1149
Re: Automatisation de la typologie des modification de l'historique d'OSM
Super, si vous pouvez poster la solution ici, çà serait génial
Hors ligne
#16 Tue 06 July 2021 11:12
- BALDE
- Participant occasionnel
- Date d'inscription: 31 Oct 2020
- Messages: 11
Re: Automatisation de la typologie des modification de l'historique d'OSM
voici la solution :
Code:
DROP TABLE IF EXISTS typomodifpolice; CREATE TABLE typomodifpolice AS ( SELECT d.osm_id, d.vnode, d.tags, d.geom_hist,--d.lat, d.lon, d.vnode+1 AS v_next, CASE WHEN ST_Equals(d.geom_hist, l.geom_hist) THEN 'no geom change' ELSE 'geom change' end as change_geom, EXISTS(SELECT 1 FROM each(d.tags) AS a JOIN each(l.tags) AS b USING (key) WHERE a.value <> b.value) AS modification_tags, EXISTS(SELECT 1 FROM each(d.tags) AS a LEFT JOIN each(l.tags) AS b USING (key) WHERE b.value IS NULL) AS enrichissement_tags, EXISTS(SELECT 1 FROM each(d.tags) AS a RIGHT JOIN each(l.tags) AS b USING (key) WHERE a.value IS NULL) AS suppression_tags FROM histpolice_donneevectimport d CROSS JOIN LATERAL ( SELECT * FROM histpolice_donneevectimport h WHERE d.osm_id = h.osm_id and d.vnode=h.vnode+1 LIMIT 1) AS l) --on insère la version initiale de l'objet car la requête précedente donne que les versions après la version initiale; INSERT INTO typomodifpolice SELECT osm_id, vnode, tags, geom_hist, vnode+1, 'first version', false, false, false FROM histpolice_donneevectimport where vnode=1;
Hors ligne
#17 Tue 06 July 2021 16:55
- tumasgiu
- Membre
- Lieu: Ajaccio
- Date d'inscription: 5 Jul 2010
- Messages: 1149
Re: Automatisation de la typologie des modification de l'historique d'OSM
Merci !
Hors ligne
Pages: 1
- Sujet précédent - Automatisation de la typologie des modification de l'historique d'OSM - Sujet suivant