← Retour aux issues

A propos des requêtes overpass

publié le , mis à jour
Avatar Codeberg de etienneJretienneJr

Ticket en mode wiki pour décrire où et comment sont réalisées les requêtes overpass utilisées par cartes.app

Envoi des requêtes

La fonction resilientOverpassFetch(query) dans /app/overpassFetcher.ts gère l'envoir d'une requête à une instance overpass :

  • une requête est envoyée à l'instance d'osm-fr
  • si échec ou si pas de réponse dans les 8s, une nouvelle requête est envoyée sur l'instance overpass-api.de

Elle est utilisée dans les fichiers suivants :

  • app/osmRequest.ts pour récupérer les infos d'1 élément OSM, éventuellement augmenté => FAIT
  • app/effects/fetchOverpassRequest.ts
  • app/itinerary/useFetchDrawBikeParkings.ts pour trouver les parking vélo
  • components/osm/combinedOsmFeaturesRequest.ts
  • components/placeSearch/detectCodePostal.ts

Récupération des tags et géométrie d'1 élément OSM

Dans le fichier app/osmRequest.ts sont présentes différentes fonctions qui permettent de récupérer les infos d'1 élément OSM, et de les augmenter.

La fonction osmElementRequest(type, id, ...) permet de récupérer les tags et la géométrie d'un élément OSM. Cette requête est très rapide (200 à 300 ms).

  • si c'est un node avec le tag addr:housenumber mais pas le tag addr:street, on utilise fetchAssociatedStreet(element) pour lancer une 2e requête qui cherche la relation associatedStreet contenant ce node. Cette requête prend environ 1000 ms. On augmente l'élément avec le nom de la rue addr:street, et aussi un name en combinant housenumber street.
  • si c'est un way avec le tag highway, on utilise fetchStreet(element) pour lancer une 2e requête qui cherche soit la relation associatedStreet, soit par proximité (requête overpass avec around) tous les morceaux de la rue qui portent le même nom. Cette requête prend 1 à 2 secondes (?). On augmente ainsi la géométrie de la rue.
    • 🐛bug : cette requête est lancée 2 fois : à investiguer.

Une fois l'élément obtenu, on l'augmente avec la fonction extendOverpassElement(element) qui :

  • construit un GeoJSON grâce à la fonction buildGeojsonFromOverpassElement
    • 📝 todo : handle multipolygon relations #1298
  • ajoute l'osmCode
  • ajoute un centre
    • après avoir récupéré le admin_centre si c'est une relation boundary
  1. Avatar Codeberg de etienneJretienneJr

    Je note ici en vrac des discussion qui ont eu lieu sur le canal matrix dédié il y a quelques jours

    • D'un côté Christian a augmenté le nb de coeurs à 24, et a restreint l'accès aux seuls gens autorisés.
    • D'une autre côté Maël a monté une instance overpass interne pour soulager l'instance osm-fr

    1er problème : la requête des meta pose problème car est très lente, voir discussion ici sur repo github.

    2e pb, identifié par Christian :

    C'est quand même pas pensé trop optimisé tout ça... fcgiwrap qui lance sans arrêt des interpreter à chaque requête, donc besoin de sans arrêt recréer des contextes, de rouvrir des fichiers ...

    J'ai l'impression qu'on a un bon gros main, qui prend la requête en stdin et crache la réponse en stdout... donc faudrait encapsuler ça dans une boucle qui prendrait les requêtes qui arrivnet une à une pour les executer mais sans reportir de zéro à chaque fois.

    le repo original est https://github.com/drolbr/Overpass-API avec la version docker https://github.com/wiktorn/Overpass-API

    mais il y a 2 forks avec des optimisations très intéressantes, dont qui résolvent ces 2 problèmes

    voir aussi discussion ici sur le forum community


✏️ Participer à la discussion