Projet

Général

Profil

Development #21558

opengis: rajouter le geocodage inverse

Ajouté par Serghei Mihai il y a environ 6 ans. Mis à jour il y a plus de 5 ans.

Statut:
Fermé
Priorité:
Normal
Assigné à:
Version cible:
-
Début:
31 janvier 2018
Echéance:
% réalisé:

0%

Temps estimé:
Patch proposed:
Oui
Planning:

Description

GeoServer ne possède pas d'API de geocodage inverse.
Une façon de l'implementer en utilisant l'API existante est d'utiliser le filtre DWithin du flux WFS auquel un point, à travers ses coordonnées, ainsi que le rayon de recherche est spécifié.

Les coordonées du point devraient être converties eventuellement au système de projection utilisé dans la base derrière.

Le retour devrait se faire au format de la BAN.

Un exemple d'appel vers un WFS: https://sigmetropole.lametro.fr/geoserver/wfs?cql_filter=DWITHIN(the_geom,Point(1914042.4729 4224665.1955),10,meters)&service=wfs&request=GetFeature&typeName=ref_ban_metro&version=2.0.0&outputformat=json


Fichiers


Demandes liées

Lié à Passerelle - Development #21763: developper un connecteur pour le geocodage inverse pour GrenobleRejeté09 février 2018

Actions
Lié à Passerelle - Development #20826: opengis : pouvoir préciser la projection "préférée" du serveurFermé20 décembre 2017

Actions
Lié à w.c.s. - Development #22218: géocodage: pouvoir spécifier des urls différentes pour le géocodage et géocodage inverseFermé01 mars 2018

Actions

Révisions associées

Révision 7336d6f5 (diff)
Ajouté par Serghei Mihai il y a environ 6 ans

opengis: add reverse geocoding based on WFS (#21558)

Historique

#2

Mis à jour par Serghei Mihai il y a environ 6 ans

Ici je pense partir sur le même principe que les loaders des formats des fichiers dans le connecteur famille générique.
Si un format est choisi, le endpoint reverse va utilier le loader pour résoudre les coordonées, sinon ça ne retourne rien.

#3

Mis à jour par Frédéric Péters il y a environ 6 ans

Uh ? Un format de quoi ?

#4

Mis à jour par Frédéric Péters il y a environ 6 ans

Le retour devrait se faire au format de la BAN.

Le format pour le géocodage est celui de nominatim.

#5

Mis à jour par Serghei Mihai il y a environ 6 ans

Frédéric Péters a écrit :

Uh ? Un format de quoi ?

Un format ou loader: ça serait un module qui s'occuperait à faire la requete vers GeoServer, avec conversion des coordonées au système utilisé dans la base derrière et retourner les données au format nominatim.

#6

Mis à jour par Frédéric Péters il y a environ 6 ans

On est dans un connecteur standard interrogeant des services compatibles opengis, on n'a pas besoin de couche d'abstraction.

Qu'on puisse préciser la projection "préférée" à utiliser par le serveur, bien sûr, ça peut être paramètre. (il y a même d'ailleurs un ticket… #20826).

#7

Mis à jour par Serghei Mihai il y a environ 6 ans

Tout à fait d'accord, sauf que la couche intérrogée (typeName) peut nommer les attributs différemment et pour les formater nominatim il faut un post traitement un peu "spécifique".

#8

Mis à jour par Frédéric Péters il y a environ 6 ans

Franchement hostile; on doit arriver à discuter avec les équipes SIG pour obtenir quelque chose qu'on puisse interroger de manière standard. Sinon on passe par la BAN ou OSM.

Ou alors faire ça dans un autre connecteur dans contrib auquel je ne m'intéresserai pas.

#9

Mis à jour par Serghei Mihai il y a environ 6 ans

  • Statut changé de Nouveau à Rejeté

Frédéric Péters a écrit :

Franchement hostile; on doit arriver à discuter avec les équipes SIG pour obtenir quelque chose qu'on puisse interroger de manière standard. Sinon on passe par la BAN ou OSM.

Les équipes SIG ne peuvent me proposer rien d'autre comme webservice que les flux de geoserver. Il m'ont donné quelques pistes pour faire le geocodage inverse à travers ce flux. Les standarts et tout ça, il s'en fichent.

Ou alors faire ça dans un autre connecteur dans contrib auquel je ne m'intéresserai pas.

Je vais faire un connecteur à part.

#10

Mis à jour par Benjamin Dauvergne il y a environ 6 ans

  • Lié à Development #21763: developper un connecteur pour le geocodage inverse pour Grenoble ajouté
#11

Mis à jour par Frédéric Péters il y a environ 6 ans

Pour revenir quand même sur ce ticket, des pistes évitant du code spécifique à Grenoble (ni dans ce connecteur ni dans un autre) :

  • ajouter au connecteur un paramétrage des noms des propriétés à utiliser
  • tirer cette information de paramètres à l'URL (cela nécessiterait l'ajout côté w.c.s. de la possibilité de paramétrer ça)
  • avoir des séries de possibilités (ex: attributes = {'road': ['road', 'street', 'rue', 'voie', 'nom_rue', 'nom_voie'], 'city': ['city', 'city_name', 'ville', 'commune', 'nom_ville', 'nom_commune'] ...})

~~

À côté de ça, attention, côté wcs il est attendu que le service "nominatim" puisse faire géocodage et géocodage inversé, faire uniquement le géocodage inversé ça cassera l'action de géocodage.

#12

Mis à jour par Serghei Mihai il y a environ 6 ans

Ok, donc on partirait sur l'usage de la méthode DWITHIN disponible dans le flux WFS. En plus des paramètres que tu mentionnes il faudrait rajouter un champ pour spécifier le rayon de recherche.
Il manque également #20826, je prend.

#13

Mis à jour par Serghei Mihai il y a environ 6 ans

  • Lié à Development #20826: opengis : pouvoir préciser la projection "préférée" du serveur ajouté
#14

Mis à jour par Frédéric Péters il y a environ 6 ans

  • Statut changé de Rejeté à En cours

Si on revient ici, ne le marquons plus comme rejeté.

#15

Mis à jour par Serghei Mihai il y a environ 6 ans

  • Assigné à mis à Serghei Mihai

Je pars sur l'idée qui me semble la plus simple: rajouter un champ de type JSONFIeld dans lequel on renseigne le mapping entre les attributs du flux WFS et ceux de la BAN, genre:

{
  "house_number": [
    "numero" 
  ], 
  "city": [
    "nom_commune" 
  ], 
  "post_code": [
    "code_post" 
  ], 
  "road": [
    "nom_voie" 
  ]
}

#16

Mis à jour par Frédéric Péters il y a environ 6 ans

D'accord c'était cité dans "ajouter au connecteur un paramétrage des noms des propriétés à utiliser" mais quand même, à chaque fois qu'on demande du paramétrage en json dans un ui, je pleure.

#17

Mis à jour par Serghei Mihai il y a environ 6 ans

Ok, alors un champ text pour chaque attribut: road, housenumber, etc avec une liste de propriétés à chercher dans les données retournées.

#18

Mis à jour par Frédéric Péters il y a environ 6 ans

tirer cette information de paramètres à l'URL (cela nécessiterait l'ajout côté w.c.s. de la possibilité de paramétrer ça)
avoir des séries de possibilités (ex: attributes = {'road': ['road', 'street', 'rue', 'voie', 'nom_rue', 'nom_voie'], 'city': ['city', 'city_name', 'ville', 'commune', 'nom_ville', 'nom_commune'] ...})

Elles puent ces propositions ?

#19

Mis à jour par Serghei Mihai il y a environ 6 ans

Non, mais ça m'embête de devoir faire des devs dans wcs pour passer des paramètres à un webservice pour lui indiquer comment formater les données. Ce paramètrage doit rester dans passerelle, imo.

#20

Mis à jour par Frédéric Péters il y a environ 6 ans

Et :

avoir des séries de possibilités (ex: attributes = {'road': ['road', 'street', 'rue', 'voie', 'nom_rue', 'nom_voie'], 'city': ['city', 'city_name', 'ville', 'commune', 'nom_ville', 'nom_commune'] ...})

#21

Mis à jour par Serghei Mihai il y a environ 6 ans

Oui, et c'est possibilités je les vois définies dans le connecteur, si c'est pas un jsonfield, alors un attribut du connecteur pour chaque attribut nécessaire pour le service de geocodage.

#22

Mis à jour par Frédéric Péters il y a environ 6 ans

Oui, et c'est possibilités je les vois définies dans le connecteur, si c'est pas un jsonfield, alors un attribut du connecteur pour chaque attribut nécessaire pour le service de geocodage.

Et au contraire, plutôt que demander une configuration à l'usager (dans un textarea avec du json ou du csv dedans), cette approche était la mise en dur dans le connecteur d'une série de possibilités, comme on a pu avoir dans auquotidien quelque chose de cet ordre :

...
                ('streetAddress', ('streetAddress', 'address', 'adresse', 'street',)),
                ('street', ('streetAddress', 'address', 'adresse', 'street',)),
                ('postalCode', ('postalCode', 'codepostal', 'cp',)),
                ('telephoneNumber', ('telephoneNumber', 'telephonefixe', 'telephone',)),
...

L'idée étant que ça juste marche.

#24

Mis à jour par Frédéric Péters il y a environ 6 ans

result['address'] = {'country': 'France'}

Pas fan; je préférerais que ça soit l'appelant qui décide quoi faire sur une valeur manquante. (mais bon)

  1. return first found point

Plus fondamental, plutôt retourner le point le plus proche que celui qui par hasard va se trouver en premier.

#25

Mis à jour par Serghei Mihai il y a environ 6 ans

Frédéric Péters a écrit :

Pas fan; je préférerais que ça soit l'appelant qui décide quoi faire sur une valeur manquante. (mais bon)

Ok. Donc si on peut spécifier dans la requete genre: ?country=France pour qu'elle soit utilisée comme valeur de l'attribut.
Au passage, recherche du pays dans le geojson.

Plus fondamental, plutôt retourner le point le plus proche que celui qui par hasard va se trouver en premier.

Ok.

#26

Mis à jour par Frédéric Péters il y a environ 6 ans

Ok. Donc si on peut spécifier dans la requete genre: ?country=France pour qu'elle soit utilisée comme valeur de l'attribut.

Non, déjà noté plus haut aujourd'hui on ne peut pas ajouter de paramètres. (mais pourquoi vouloir le pays ?)

Aussi, par rapport à une utilisation dans w.c.s., déjà noté également, ça va foirer d'avoir géocodage inversé mais pas géocodage, si on veut deux services différents, là aussi ça va demander patch w.c.s.

#27

Mis à jour par Serghei Mihai il y a environ 6 ans

Frédéric Péters a écrit :

Non, déjà noté plus haut aujourd'hui on ne peut pas ajouter de paramètres. (mais pourquoi vouloir le pays ?)

Ok, laissons l'appelant décider d'une valeur manquante. Je bloquais sur le pays car mon geojson de test ne le contient pas, mais oublions.

Aussi, par rapport à une utilisation dans w.c.s., déjà noté également, ça va foirer d'avoir géocodage inversé mais pas géocodage, si on veut deux services différents, là aussi ça va demander patch w.c.s.

Ça me parait plus complexe en effet d'implementer le géocodage, car c'est pas évident de matcher la chaîne de recherche que ça soit uniquement la voie, le numéro et la voie, ou numéro, voie, ville, sur différents attributs du geojson.

Je fais le ticket pour patcher wcs.

#28

Mis à jour par Serghei Mihai il y a environ 6 ans

  • Lié à Development #22218: géocodage: pouvoir spécifier des urls différentes pour le géocodage et géocodage inverse ajouté
#29

Mis à jour par Serghei Mihai il y a environ 6 ans

Patch à jour avec le calcul correct du point le plus proche.

#30

Mis à jour par Emmanuel Cazenave il y a environ 6 ans

Pas réussi à appliquer ton patch.

Ça retourne None si tu ne trouves pas de closest_feature, je ne sais pas ce que ça va donner comme réponse pour l'appelant du connecteur, ie peut être être plus explicite (voir même raiser une API error, parce que pour l'appelant, un service de géocodage inverse qui renvoie rien, ça fait un peu erreur quand même), je te laisse voir.

Il m'a fallu un moment pour comprendre le bloc ci-dessous, donc peut-être l'encapsuler dans une fonction avec un joli nom (ce qui te permettra de la tester) ou au moins mettre un commentaire.

min_delta = None
        for feature in response.json().get('features'):
            if not feature['geometry']['type'] == 'Point':
                continue  # skip unknown
            lon_diff = abs(float(lon) - float(feature['geometry']['coordinates'][0]))
            lat_diff = abs(float(lat) - float(feature['geometry']['coordinates'][1]))
            delta = math.sqrt(lon_diff * lon_diff + lat_diff * lat_diff)
            if min_delta is None:
                min_delta = delta
            if delta <= min_delta:
                closest_feature = feature

Tu gères pas du tout les erreurs éventuelles que peux te renvoyer le service pointé par wfs_service_url, à mon avis il faut au moins utiliser response.raise_for_status ou un truc comme ça et l'encapsuler dans une APIError.

#31

Mis à jour par Serghei Mihai il y a environ 6 ans

Emmanuel Cazenave a écrit :

Pas réussi à appliquer ton patch.

Ça retourne None si tu ne trouves pas de closest_feature, je ne sais pas ce que ça va donner comme réponse pour l'appelant du connecteur, ie peut être être plus explicite (voir même raiser une API error, parce que pour l'appelant, un service de géocodage inverse qui renvoie rien, ça fait un peu erreur quand même), je te laisse voir.

Ça fonctionne de la même façon que nominatim. Quand il n'y a pas de données, on renvoie null (le None en json).

Il m'a fallu un moment pour comprendre le bloc ci-dessous, donc peut-être l'encapsuler dans une fonction avec un joli nom (ce qui te permettra de la tester) ou au moins mettre un commentaire.

Tu veux dire le calcul de l'hypothenuse ? Je préfère rajouter un commentaire au dessus des 3 lignes.

Tu gères pas du tout les erreurs éventuelles que peux te renvoyer le service pointé par wfs_service_url, à mon avis il faut au moins utiliser response.raise_for_status ou un truc comme ça et l'encapsuler dans une APIError.

Effectivement il manque le check du statut, je vais rajouter ça.

#32

Mis à jour par Frédéric Péters il y a environ 6 ans

Ça fonctionne de la même façon que nominatim. Quand il n'y a pas de données, on renvoie null (le None en json).

En l'espèce nominatim semble plutôt répondre "{"error":"Unable to geocode"}". ex : https://nominatim.openstreetmap.org/reverse.php?format=json&lat=22.26895268313282&lon=-18.632978796958927&zoom=18 (je n'ai pas trouvé d'autre endroit que le milieu de l'océan pour un tel résultat).

#33

Mis à jour par Serghei Mihai il y a environ 6 ans

Je me suis embrouillé avec notre connecteur base_adresse dont le endpoint reverse ne retourne rien quand il ne trouve pas l'adresse.

#35

Mis à jour par Emmanuel Cazenave il y a environ 6 ans

ack

#36

Mis à jour par Serghei Mihai il y a environ 6 ans

  • Statut changé de En cours à Résolu (à déployer)
commit 7336d6f5dd51c7a35bf8acaa5d77633a697a18a6 (origin/master, origin/HEAD)
Author: Serghei Mihai <smihai@entrouvert.com>
Date:   Wed Jan 31 17:35:02 2018 +0100

    opengis: add reverse geocoding based on WFS (#21558)
#37

Mis à jour par Benjamin Dauvergne il y a plus de 5 ans

  • Statut changé de Résolu (à déployer) à Fermé

Formats disponibles : Atom PDF