Jaki jest najlepszy sposób na odwrotne geokodowanie w PostGIS?

13

Czy istnieje sposób odwrotnego geokodowania w PostGIS? W sieci jest wiele informacji, ale uważam, że są bardzo mylące ...

Zaimportowałem dane OSM do własnej Postgres z bazą danych PostGIS. Teraz chcę wykonać geokodowanie i odwrotne geokodowanie w mojej bazie danych. Nie wiem, czy istnieją jakieś Procedury składowane lub projekt, który zajmuje się moim problemem.

Następnym krokiem, który chcę zrobić, jest stworzenie usługi internetowej, która może obsłużyć tego rodzaju żądania, ale to kolejne pytanie.

Joaquín M.
źródło
Istnieje kilka wyników podczas wyszukiwania w tej witrynie w poszukiwaniu odwrotnego geokodowania. Jedną z wyróżniających się odpowiedzi jest ta dotycząca usług, które ją zapewniają.
dassouki,
Twoje pytanie jest trochę niejasne. Czy masz jakiś szczególny problem? A może potrzebujesz pomocy w ogólnym podejściu do odwrotnego geokodowania?
Sean
Próbowałem już używać Nominatim, ale miałem problemy z wyjściem „gazetteer”. Za każdym razem, gdy importuję dane osm, generuje „błąd segmentacji”.
Joaquín M,

Odpowiedzi:

14

Wreszcie rozumiem sposób wykonywania geokodu i odwrotnego w mojej bazie danych PostGIS. Zrobiłem procedurę składowaną, która znajduje typy geometrii, które są w pobliżu punktu. Ta procedura składowana wykorzystuje funkcję odległości, aby uzyskać najbliższe punkty. Następnie utworzyłem interfejs API RESTful, który wywołuje tę procedurę składowaną w celu rozwiązania żądania odwrotnego geokodowania.

Popraw mnie, jeśli się mylę, ale zrozumiałem, że projekt Nominatim tworzy interfejs API dla baz danych, które zostały zaimportowane z OSM. Więc nie musisz tworzyć żadnej procedury składowanej dla odwrotnego geokodowania i geokodowania. Nie musisz też robić żadnej usługi internetowej, aby rozwiązać żądania za pośrednictwem sieci.

Mam nadzieję, że to komuś pomoże.

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.
źródło
Czy możemy zobaczyć procedurę?
canisrufus
Oczywiście: 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

Geokoder tygrysa PostGIS 2.0 posiada geokoder odwrotny wykorzystujący dane Tiger. Geokoder zainstaluje się poprawnie na PostGIS 1.5 8.4+ lub nowszym.

Jeśli jesteś w USA, może być najłatwiejszy w użyciu, ponieważ wszystko jest spakowane jako funkcje plpgsql.

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

LR1234567
źródło
Dzięki. Nie potrzebowałem informacji z USA dla odwrotnego geokodu. Teraz rozumiem, w jaki sposób odwrotny geokod działa z bazami danych PostGIS. Wielkie dzięki.
Joaquín M