Каков наилучший способ сделать обратное геокодирование с PostGIS?

13

Есть ли способ сделать обратное геокодирование с PostGIS? В Интернете много информации, но я нашел ее очень запутанной ...

Я импортировал данные osm в свою собственную базу данных Postgres с PostGIS. Теперь я хочу сделать геокодирование и обратное геокодирование с моей базой данных. Я не знаю, есть ли какие-то хранимые процедуры или проект, который решает мою проблему.

Следующий шаг, который я хочу сделать, - создать веб-сервис, который может обрабатывать такие запросы, но это другой вопрос.

Хоакин М
источник
Есть несколько результатов при поиске на этом сайте для обратного геокодирования. Один ответ , который выделяется, это одна об услугах , которые обеспечивают его.
Дассуки
Ваш вопрос немного расплывчатый. Есть ли у вас особая проблема? Или вам нужна помощь с общим подходом к обратному геокодированию?
Шон
Я уже пытался использовать Nominatim, но у меня были проблемы с использованием вывода "gazetteer". Он выдает «Ошибка сегментации» каждый раз, когда я импортирую данные osm.
Хоакин М

Ответы:

14

Наконец, я понимаю способ сделать геокод и обратный геокод с моей базой данных PostGIS. Я сделал хранимую процедуру, которая находит типы геометрии, которые находятся рядом с точкой. Эта хранимая процедура использует функцию расстояния для получения ближайших точек. После этого я создал RESTful API, который вызывает эту хранимую процедуру для разрешения обратных запросов геокодирования.

Поправьте меня, если я ошибаюсь, но я понял, что проект Nominatim создает API для баз данных, которые были импортированы из OSM. Таким образом, вам не нужно создавать какие-либо хранимые процедуры для обратного геокодирования и геокодирования. Также вам не нужно создавать какие-либо веб-сервисы для разрешения запросов через Интернет.

Надеюсь, это кому-нибудь поможет.

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; 
Хоакин М
источник
Можем ли мы увидеть процедуру?
canisrufus
Конечно: 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;
Хоакин М
4

PostGIS 2.0 tiger geocoder имеет обратный геокодер, использующий данные Tiger. Геокодер будет хорошо установлен на PostGIS 1.5 8.4+ или выше.

Если вы находитесь в США, это может быть самым простым в использовании, поскольку все это упаковано как функции plpgsql.

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

LR1234567
источник
Благодарю. Мне не нужна информация США для обратного геокода. Теперь я понимаю, как обратный геокод работает с базами данных PostGIS. Большое спасибо.
Хоакин М