Opened 4 years ago

Last modified 4 years ago

#704 new enhancement

Signalements indoor avancés

Reported by: PanierAvide Owned by: frodrigo
Priority: minor Component: osmose-backend
Keywords: indoor level buildingpart room corridor door Cc: jocelyn.jaubert@…

Description

Bonjour,

Les premières analyses sur la carto intérieure ont déjà permis le rendu de données "cachées" (et vont permettre d'en faire émerger d'autres), ce qui est un pas en avant vers des données uniformisées. Voici quelques nouvelles suggestions de signalements indoor pour Osmose, à voir toujours si c'est pertinent :

  • door=* sans tag level=* ni repeat_on=* ni dans une relation type=level (Voir http://overpass-turbo.eu/s/acA )
    • Proposer d'ajouter le tag level=* ou repeat_on=* ou suggérer d'ajouter à une relation type=level
  • De la même manière, les chemins piétons en intérieur (highway=corridor, (highway=footway + indoor=yes) ) sans tag level=* ni repeat_on=* ni dans une relation type=level (Voir http://overpass-turbo.eu/s/acB ).
    • Proposer d'ajouter level=* ou repeat_on=* ou suggérer d'ajouter à une relation type=level
  • Objet buildingpart=* pas dans une relation type=level
    • Si l'objet a un tag level, transformer buildingpart=* en indoor=*
    • Sinon, indiquer qu'il faut l'ajouter à une relation type=level
  • Tag room=yes (Voir http://overpass-turbo.eu/s/acK )
    • Proposer de qualifier room plus précisément (en fonction des tags si c'est possible, proposer room=shop si il y a shop=* par exemple)
    • Ou supprimer si possède un indoor=room ou buildingpart=room et pas possible de qualifier en détail

Merci d'avance.

Change History (19)

comment:1 follow-up: Changed 4 years ago by PanierAvide

Une autre analyse pas vraiment indoor, mais qui ressort du fait de l'orthographe : les tags room=<int> sur tout ce qui est hôtel/chambre d'hôtes/..., qui en fait devraient être des rooms=<int> (Voir http://overpass-turbo.eu/s/acR ).

comment:2 in reply to: ↑ 1 Changed 4 years ago by frodrigo

Replying to PanierAvide:

Une autre analyse pas vraiment indoor, mais qui ressort du fait de l'orthographe : les tags room=<int> sur tout ce qui est hôtel/chambre d'hôtes/..., qui en fait devraient être des rooms=<int> (Voir http://overpass-turbo.eu/s/acR ).

Pour les analyses très simple comme ici, il existe un façon générique de les faire, il faut compléter cette page :
http://wiki.openstreetmap.org/wiki/User:FrViPofm/TagwatchCleaner

comment:3 Changed 4 years ago by PanierAvide

D'accord, je viens de rajouter ça.

comment:4 Changed 4 years ago by PanierAvide

Encore des suggestions d'analyses (pour plus tard bien sûr, c'est surtout pour qu'elles soient listées quelque part) :

  • indoor=* sans level=* mais dans une relation type=level
    • Changer indoor en buildingpart
  • indoor=* et buildingpart=* sur le même objet (Voir http://overpass-turbo.eu/s/afp )
    • Si level=* et pas dans une relation type=level :
      • Si indoor=yes, supprimer indoor et changer la clé buildingpart en indoor
      • Sinon, supprimer buildingpart
    • Si dans relation type=level et pas de level=*, supprimer indoor
      • Si buildingpart=yes, supprimer buildingpart et changer la clé indoor en buildingpart
      • Sinon, supprimer indoor
    • Si dans relation type=level et avec level=*, supprimer l'un ou l'autre (ou laisser les deux ?)

comment:5 in reply to: ↑ description ; follow-up: Changed 4 years ago by frodrigo

Pour commencer on peut ignore les relations type=level ?

Replying to PanierAvide:

  • door=* sans tag level=* ni repeat_on=*
    • Proposer d'ajouter le tag level=* ou repeat_on=*

Si on fait ça va signaler 90% des door.

Si c'est à déprécier, passer par la page wiki des deprecated

comment:6 follow-up: Changed 4 years ago by frodrigo

Tu penses pouvoir proposer des requêtes SQL sur base osmosis pour detected ces choses ?

comment:7 in reply to: ↑ 5 Changed 4 years ago by anonymous

Replying to frodrigo:

Pour commencer on peut ignore les relations type=level ?

On peut, mais tout ce qui est buildingpart=* repose sur ces relations, ça veut dire exclure des analyses une grosse partie des données.

Si on fait ça va signaler 90% des door.

C'est pas faux.

Si c'est à déprécier, passer par la page wiki des deprecated

Le tag en soit n'est pas déprécié (il s'applique toujours aux ways), mais n'est pas applicable aux nœuds (un peu comme un area=yes).

comment:8 in reply to: ↑ 6 ; follow-up: Changed 4 years ago by PanierAvide

Replying to frodrigo:

Tu penses pouvoir proposer des requêtes SQL sur base osmosis pour detected ces choses ?

Je n'ai pas de problème avec le SQL de manière générale, mais j'ai pas trouvé la doc SQL basé sur Osmosis. Tu veux parler de requêtes SQL sur un base importée via Osmosis ?

comment:9 in reply to: ↑ 8 ; follow-up: Changed 4 years ago by frodrigo

Replying to PanierAvide:

Replying to frodrigo:

Tu penses pouvoir proposer des requêtes SQL sur base osmosis pour detected ces choses ?

Je n'ai pas de problème avec le SQL de manière générale, mais j'ai pas trouvé la doc SQL basé sur Osmosis. Tu veux parler de requêtes SQL sur un base importée via Osmosis ?

Oui c'est ça.

comment:10 in reply to: ↑ 9 ; follow-up: Changed 4 years ago by PanierAvide

comment:11 in reply to: ↑ 10 Changed 4 years ago by anonymous

Replying to PanierAvide:

Replying to frodrigo:

Oui c'est ça.

La version simple ou snapshot ?
https://github.com/openstreetmap/osmosis/tree/b18e1e9f6d10d3714ed221d1e5c99122b14e20fa/package/script

pgsnapshot, dans osmose il y a quelques trucs en plus, mais tu ne devrais pas en avoir besoin.
https://github.com/osm-fr/osmose-backend/tree/master/osmosis

comment:12 Changed 4 years ago by PanierAvide

Pour être sûr d'avoir saisi le fonctionnement, sur des analyses simples.

  • room=entrance sur un noeud
    SELECT id
    FROM nodes
    WHERE tags->'room'=="entrance"
    
  • indoor=* et buildingpart=* sur un même objet (à dupliquer pour ways/relations)
    SELECT id
    FROM nodes
    WHERE tags ?& ARRAY['indoor','buildingpart']
    

En supposant que Osmose utilise les ID des objets pour s'y retrouver.

comment:13 Changed 4 years ago by frodrigo

Oui c'est ça. Mais avec les relations ça se complquie.

comment:14 Changed 4 years ago by PanierAvide

Voici les requêtes, non testées (je n'ai pas de base PostgreSQL/OSM sous la main), mais à priori qui devraient faire l'affaire.

  • door=* sans level=* ni repeat_on=* ni dans relation type=level
    SELECT id
    FROM nodes
    WHERE tags ? 'door'
    AND NOT tags ?| ARRAY['level', 'repeat_on']
    AND NOT IN
    (
     SELECT n.id
     FROM nodes n, relations r, relation_members rm
     WHERE n.id=rm.member_id
     AND rm.member_type='N'
     AND r.id=rm.relation_id
     WHERE r.tags->'type'=="level"
    )
    
  • highway=corridor/footway+indoor sans valeur de niveau

Pour les ways

SELECT id
FROM ways
WHERE (
 tags->'highway'=="corridor"
 OR (tags->'highway'=="footway" and tags->'indoor'=="yes")
)
AND NOT tags ?| ARRAY['level', 'repeat_on']
AND NOT IN
(
 SELECT w.id
 FROM ways w, relations r, relation_members rm
 WHERE w.id=rm.member_id
 AND rm.member_type='W'
 AND r.id=rm.relation_id
 WHERE r.tags->'type'=="level"
)

Pour les relations

SELECT id
FROM relations
WHERE (
 tags->'highway'=="corridor"
 OR (tags->'highway'=="footway" and tags->'indoor'=="yes")
)
AND NOT tags ?| ARRAY['level', 'repeat_on']
AND NOT IN
(
 SELECT r_obj.id
 FROM relations r_obj, relations r_rel, relation_members rm
 WHERE r_obj.id=rm.member_id
 AND rm.member_type='R'
 AND r_rel.id=rm.relation_id
 WHERE r_rel.tags->'type'=="level"
)
  • buildingpart=* pas dans une relation type=level

Pour les noeuds

SELECT id
FROM nodes
WHERE tags ? 'buildingpart'
AND NOT IN
(
 SELECT n.id
 FROM nodes n, relations r, relation_members rm
 WHERE n.id=rm.member_id
 AND rm.member_type='N'
 AND r.id=rm.relation_id
 WHERE r.tags->'type'=="level"
)

Pour les ways

SELECT id
FROM ways
WHERE tags ? 'buildingpart'
AND NOT IN
(
 SELECT w.id
 FROM ways w, relations r, relation_members rm
 WHERE w.id=rm.member_id
 AND rm.member_type='W'
 AND r.id=rm.relation_id
 WHERE r.tags->'type'=="level"
)

Pour les relations

SELECT id
FROM relations
WHERE tags ? 'buildingpart'
AND NOT IN
(
 SELECT r_obj.id
 FROM relations r_obj, relations r_rel, relation_members rm
 WHERE r_obj.id=rm.member_id
 AND rm.member_type='R'
 AND r_rel.id=rm.relation_id
 WHERE r_rel.tags->'type'=="level"
)
  • room=yes à qualifier (idem ways/relations)
    SELECT id
    FROM nodes
    WHERE tags->'room'=="yes"
    
  • Indoor=* sans level=* ni repeat_on=* mais dans relation type=level

Pour les noeuds

SELECT id
FROM nodes
WHERE tags ? 'indoor'
AND NOT tags ?| ARRAY['level', 'repeat_on']
AND IN
(
 SELECT n.id
 FROM nodes n, relations r, relation_members rm
 WHERE n.id=rm.member_id
 AND rm.member_type='N'
 AND r.id=rm.relation_id
 WHERE r.tags->'type'=="level"
)

Pour les ways

SELECT id
FROM ways
WHERE tags ? 'indoor'
AND NOT tags ?| ARRAY['level', 'repeat_on']
AND IN
(
 SELECT w.id
 FROM ways w, relations r, relation_members rm
 WHERE w.id=rm.member_id
 AND rm.member_type='W'
 AND r.id=rm.relation_id
 WHERE r.tags->'type'=="level"
)

Pour les relations

SELECT id
FROM relations
WHERE tags ? 'indoor'
AND NOT tags ?| ARRAY['level', 'repeat_on']
AND IN
(
 SELECT r_obj.id
 FROM relations r_obj, relations r_rel, relation_members rm
 WHERE r_obj.id=rm.member_id
 AND rm.member_type='R'
 AND r_rel.id=rm.relation_id
 WHERE r_rel.tags->'type'=="level"
)

comment:15 Changed 4 years ago by frodrigo

Il faut utiliser des jointures les perf ne vont pas être bonne avec ça.

comment:16 Changed 4 years ago by PanierAvide

Un peu comme ça ?

  • door=* sans level=* ni repeat_on=* ni dans relation type=level
    SELECT id
    FROM nodes
    WHERE tags ? 'door'
    AND NOT tags ?| ARRAY['level', 'repeat_on']
    AND NOT IN
    (
     SELECT n.id
     FROM relation_members rm
     JOIN nodes n ON n.id=rm.member_id
     JOIN relations r ON r.id=rm.relation_id
     WHERE rm.member_type='N'
     WHERE r.tags->'type'=="level"
    )
    
  • highway=corridor/footway+indoor sans valeur de niveau

Pour les ways

SELECT id
FROM ways
WHERE (
 tags->'highway'=="corridor"
 OR (tags->'highway'=="footway" and tags->'indoor'=="yes")
)
AND NOT tags ?| ARRAY['level', 'repeat_on']
AND NOT IN
(
 SELECT w.id
 FROM relation_members rm
 JOIN ways w ON w.id=rm.member_id
 JOIN relations r ON r.id=rm.relation_id
 WHERE rm.member_type='W'
 WHERE r.tags->'type'=="level"
)

Pour les relations

SELECT id
FROM relations
WHERE (
 tags->'highway'=="corridor"
 OR (tags->'highway'=="footway" and tags->'indoor'=="yes")
)
AND NOT tags ?| ARRAY['level', 'repeat_on']
AND NOT IN
(
 SELECT r_obj.id
 FROM relation_members rm
 JOIN relations r_obj ON r_obj.id=rm.member_id
 JOIN relations r_rel ON r_rel.id=rm.relation_id
 WHERE rm.member_type='R'
 WHERE r_rel.tags->'type'=="level"
)
  • buildingpart=* pas dans une relation type=level

Pour les noeuds

SELECT id
FROM nodes
WHERE tags ? 'buildingpart'
AND NOT IN
(
 SELECT n.id
 FROM relation_members rm
 JOIN nodes n ON n.id=rm.member_id
 JOIN relations r ON r.id=rm.relation_id
 WHERE rm.member_type='N'
 WHERE r.tags->'type'=="level"
)

Pour les ways

SELECT id
FROM ways
WHERE tags ? 'buildingpart'
AND NOT IN
(
 SELECT w.id
 FROM relation_members rm
 JOIN ways w ON w.id=rm.member_id
 JOIN relations r ON r.id=rm.relation_id
 WHERE rm.member_type='W'
 WHERE r.tags->'type'=="level"
)

Pour les relations

SELECT id
FROM relations
WHERE tags ? 'buildingpart'
AND NOT IN
(
 SELECT r_obj.id
 FROM relation_members rm
 JOIN relations r_obj ON r_obj.id=rm.member_id
 JOIN relations r_rel ON r_rel.id=rm.relation_id
 WHERE rm.member_type='R'
 WHERE r_rel.tags->'type'=="level"
)
  • room=yes à qualifier (idem ways/relations)
    SELECT id
    FROM nodes
    WHERE tags->'room'=="yes"
    
  • Indoor=* sans level=* ni repeat_on=* mais dans relation type=level

Pour les noeuds

SELECT id
FROM nodes
WHERE tags ? 'indoor'
AND NOT tags ?| ARRAY['level', 'repeat_on']
AND IN
(
 SELECT n.id
 FROM relation_members rm
 JOIN nodes n ON n.id=rm.member_id
 JOIN relations r ON r.id=rm.relation_id
 WHERE rm.member_type='N'
 WHERE r.tags->'type'=="level"
)

Pour les ways

SELECT id
FROM ways
WHERE tags ? 'indoor'
AND NOT tags ?| ARRAY['level', 'repeat_on']
AND IN
(
 SELECT w.id
 FROM relation_members rm
 JOIN ways w ON w.id=rm.member_id
 JOIN relations r ON r.id=rm.relation_id
 WHERE rm.member_type='W'
 WHERE r.tags->'type'=="level"
)

Pour les relations

SELECT id
FROM relations
WHERE tags ? 'indoor'
AND NOT tags ?| ARRAY['level', 'repeat_on']
AND IN
(
 SELECT r_obj.id
 FROM relation_members rm
 JOIN relations r_obj ON r_obj.id=rm.member_id
 JOIN relations r_rel ON r_rel.id=rm.relation_id
 WHERE rm.member_type='R'
 WHERE r_rel.tags->'type'=="level"
)

comment:17 Changed 4 years ago by frodrigo

Oui, c'est un bon début. Mais il ne faut pas de select imbriqués. Un seule select par requête.
Je pense que l'on peut de donner accès à une base Osmosis pour faire les tests. On voit ça par mail.

comment:18 Changed 4 years ago by PanierAvide

OK, ce sera effectivement plus simple ;)

comment:19 Changed 4 years ago by frodrigo

  • Cc jocelyn.jaubert@… added
Note: See TracTickets for help on using tickets.