Qual é a melhor maneira de fazer geocodificação reversa com o PostGIS?

13

Existe uma maneira de fazer geocodificação reversa com o PostGIS? Há muita informação na Web, mas achei muito confusa ...

Importei dados osm para o meu próprio Postgres com o banco de dados PostGIS. Agora eu quero fazer geocodificação e reverter a geocodificação com meu banco de dados. Não sei se existem alguns procedimentos armazenados ou um projeto em algum lugar que cuida do meu problema.

O próximo passo que eu quero fazer é criar um serviço da Web que possa lidar com esse tipo de solicitação, mas essa é outra questão.

Joaquín M
fonte
Existem alguns resultados quando você pesquisa neste site por geocodificação reversa. Uma resposta que se destaca é este sobre os serviços que fornecem.
dassouki
Sua pergunta é um pouco vaga. Existe algum problema em particular? Ou você precisa de ajuda com a abordagem geral para reverter a geocodificação?
Sean
Já tentei usar o Nominatim, mas tive problemas ao usar a saída "gazetteer". Ele lança uma "falha de segmentação" cada vez que importo os dados do osm.
Joaquín M

Respostas:

14

Finalmente, entendo a maneira de fazer geocode e inverter geocode com meu banco de dados PostGIS. Eu fiz um procedimento armazenado que encontra tipos de geometria que estão próximos de um ponto. Este procedimento armazenado usa a função de distância para obter os pontos mais próximos. Depois disso, criei uma API RESTful que chama esse procedimento armazenado para resolver as solicitações de geocodificação reversa.

Corrija-me se estiver errado, mas entendi que o projeto Nominatim cria uma API para bancos de dados que foram importados do OSM. Portanto, você não precisa criar nenhum procedimento armazenado para geocodificação reversa e geocodificação. Além disso, você não precisa fazer nenhum serviço da web para resolver as solicitações pela web.

Espero que isso ajude alguém.

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
fonte
Podemos ver o procedimento?
Canisrufus
Claro: 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

O geocoder PostGIS 2.0 tiger possui um geocoder reverso utilizando dados Tiger. O geocoder será instalado corretamente no PostGIS 1.5 8.4+ ou superior.

Se você estiver nos EUA, pode ser o mais fácil de usar, pois está tudo empacotado como funções plpgsql.

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

LR1234567
fonte
Obrigado. Eu não precisava de informações dos EUA para geocódigo reverso. Agora entendi como o geocódigo reverso funciona com os bancos de dados PostGIS. Muito obrigado.
Joaquín M