Quelle est la meilleure façon de faire du géocodage inversé avec PostGIS?

13

Existe-t-il un moyen de faire du géocodage inversé avec PostGIS? Il y a beaucoup d'informations sur le Web, mais je les ai trouvées très déroutantes ...

J'ai importé des données osm dans ma propre base de données Postgres avec PostGIS. Maintenant, je veux faire du géocodage et du géocodage inversé avec ma base de données. Je ne sais pas s'il existe des procédures stockées ou un projet quelque part qui prend en charge mon problème.

La prochaine étape que je veux faire est de créer un service Web qui peut gérer ce type de demandes, mais c'est une autre question.

Joaquín M
la source
Il y a quelques résultats lorsque vous effectuez une recherche sur ce site pour le géocodage inversé. Une réponse qui se démarque est celle-ci sur les services qui la fournissent.
dassouki
Votre question est un peu vague. Y a-t-il un problème particulier que vous rencontrez? Ou avez-vous besoin d'aide pour l'approche générale du géocodage inversé?
Sean
J'ai déjà essayé d'utiliser Nominatim, mais j'ai eu des problèmes avec la sortie "Gazetteer". Il lance un "défaut de segmentation" chaque fois que j'importe les données osm.
Joaquín M

Réponses:

14

Enfin, je comprends la façon de faire du géocodage et du géocodage inversé avec ma base de données PostGIS. J'ai créé une procédure stockée qui trouve des types de géométrie proches d'un point. Cette procédure stockée utilise la fonction de distance pour obtenir les points les plus proches. Après cela, j'ai créé une API RESTful qui appelle cette procédure stockée pour résoudre les demandes de géocodage inversé.

Corrigez-moi si je me trompe, mais j'ai compris que le projet Nominatim crée une API pour les bases de données importées d'OSM. Vous n'avez donc pas à créer de procédure stockée pour le géocodage inverse et le géocodage. De plus, vous n'avez pas à effectuer de service Web pour résoudre les demandes via le Web.

J'espère que cela aide quelqu'un.

CREATE OR REPLACE FUNCTION reverse_geocode (lat double precision, lon double precision)
RETURNS text AS 
$BODY$ 
declare  point geometry;  rec record;  geocode text; 
begin  
    point := geomfromtext('POINT('||lat||' '||lon||')', 4326);  
    select name, distance(way, point) as dist  
    into rec  from mapserverdb_point  
    order by dist asc limit 1;  
    geocode := rec.name;  
    return geocode; 
end; 
$BODY$   
LANGUAGE plpgsql; 
Joaquín M
la source
Pouvons-nous voir la procédure?
canisrufus
Bien sûr: CREATE OR REPLACE FUNCTION reverse_geocode(lat double precision, lon double precision) RETURNS text AS $BODY$ declare point geometry; rec record; geocode text; begin point := geomfromtext('POINT('||lat||' '||lon||')', 4326); select name, distance(way, point) as dist into rec from mapserverdb_point order by dist asc limit 1; geocode := rec.name; return geocode; end; $BODY$ LANGUAGE plpgsql;
Joaquín M
4

Le géocodeur de tigre PostGIS 2.0 possède un géocodeur inversé utilisant les données de Tiger. Le géocodeur s'installera correctement sur PostGIS 1.5 8.4+ ou supérieur.

Si vous êtes aux États-Unis, c'est peut-être le plus facile à utiliser car il est tout empaqueté en tant que fonctions plpgsql.

http://www.postgis.org/documentation/manual-svn/Extras.html#Tiger_Geocoder http://www.postgis.org/documentation/manual-svn/Reverse_Geocode.html

LR1234567
la source
Merci. Je n'avais pas besoin d'informations américaines pour le géocodage inversé. Maintenant, j'ai compris le fonctionnement du géocodage inversé avec les bases de données PostGIS. Merci beaucoup.
Joaquín M