¿Cuál es la mejor manera de hacer geocodificación inversa con PostGIS?

13

¿Hay alguna manera de hacer geocodificación inversa con PostGIS? Hay mucha información en la Web, pero me pareció muy confusa ...

He importado datos osm en mi propio Postgres con la base de datos PostGIS. Ahora quiero hacer geocodificación y geocodificación inversa con mi base de datos. No sé si hay algunos procedimientos almacenados o un proyecto en algún lugar que se ocupe de mi problema.

El siguiente paso que quiero hacer es hacer un servicio web que pueda manejar este tipo de solicitudes, pero esa es otra pregunta.

Joaquín M
fuente
Hay algunos resultados cuando busca en este sitio geocodificación inversa. Una respuesta que se destaca es esta sobre los servicios que la brindan.
dassouki
Tu pregunta es un poco vaga. ¿Hay algún problema particular que tengas? ¿O necesita ayuda con el enfoque general para la geocodificación inversa?
Sean
Ya he intentado usar Nominatim, pero tuve problemas para usar la salida "gazetteer". Lanza un "error de segmentación" cada vez que importo los datos del osm.
Joaquín M

Respuestas:

14

Finalmente, entiendo la manera de hacer geocodificación y geocodificación inversa con mi base de datos PostGIS. Hice un procedimiento almacenado que encuentra tipos de geometría que están cerca de un punto. Este procedimiento almacenado utiliza la función de distancia para obtener los puntos más cercanos. Después de eso, he creado una API RESTful que llama a este procedimiento almacenado para resolver las solicitudes de geocodificación inversa.

Corríjame si me equivoco, pero he entendido que el proyecto Nominatim crea una API para bases de datos que se han importado de OSM. Por lo tanto, no tiene que crear ningún procedimiento almacenado para geocodificación y geocodificación inversa. Además, no tiene que realizar ningún servicio web para resolver las solicitudes a través de la web.

Espero que esto ayude a alguien.

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
fuente
¿Podemos ver el procedimiento?
canisrufus
Por supuesto: 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

El geocodificador de tigre PostGIS 2.0 tiene un geocodificador inverso que utiliza datos de Tiger. El geocodificador se instalará bien en PostGIS 1.5 8.4+ o superior.

Si se encuentra en los EE. UU., Podría ser el más fácil de usar, ya que está empaquetado como funciones plpgsql.

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

LR1234567
fuente
Gracias. No necesitaba información de EE. UU. Para el geocodificación inversa. Ahora entiendo cómo funciona el geocodificación inversa con las bases de datos PostGIS. Muchas gracias.
Joaquín M