PostGIS ile ters coğrafi kodlama yapmanın en iyi yolu nedir?


13

PostGIS ile ters coğrafi kodlama yapmanın bir yolu var mı? Web'de çok fazla bilgi var ama çok kafa karıştırıcı buldum ...

PostGIS veritabanıyla osm verilerini kendi Postgres'ime aktardım. Şimdi veritabanımla coğrafi kodlama ve ters coğrafi kodlama yapmak istiyorum. Bazı Saklı Yordamlar veya sorunumla ilgilenen bir yerde bir proje olup olmadığını bilmiyorum.

Yapmak istediğim bir sonraki adım, bu tür istekleri karşılayabilecek bir web hizmeti yapmak, ancak bu başka bir soru.


Bu sitede ters coğrafi kodlama için arama yaptığınızda birkaç sonuç vardır . Göze çarpan bir cevaptır bu bunu sağlamak hizmetleri hakkında.
dassouki

Sorunuz biraz belirsiz. Yaşadığınız belirli bir sorun var mı? Veya ters coğrafi kodlamaya genel yaklaşım konusunda yardıma mı ihtiyacınız var?
Sean

Nominatim'i kullanmayı denedim, ancak "gazetteer" çıktısını kullanırken sorunlar yaşadım. Osm verilerini her aktarışımda bir "Segmentasyon hatası" atar.
Joaquín M

Yanıtlar:


14

Son olarak, PostGIS veritabanımla coğrafi kod ve ters coğrafi kod yapmanın yolunu anlıyorum. Bir noktaya yakın geometri türlerini bulan saklı bir prosedür yaptım. Bu saklı yordam en yakın noktaları almak için distance işlevini kullanır. Bundan sonra, ters coğrafi kodlama isteklerini çözmek için bu saklı yordamı çağıran bir RESTful API oluşturduk.

Yanlışsam beni düzeltin, ancak Nominatim projesinin OSM'den içe aktarılan veritabanları için bir API oluşturduğunu anladım. Dolayısıyla, ters coğrafi kodlama ve coğrafi kodlama için herhangi bir saklı yordam oluşturmanız gerekmez. Ayrıca, istekleri web üzerinden çözmek için herhangi bir web hizmeti yapmanız gerekmez.

Umarım bu birine yardımcı olur.

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; 

Prosedürü görebilir miyiz?
canisrufus

Tabii ki: 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

PostGIS 2.0 tiger geocoder, Tiger verilerini kullanan bir ters geocoder'a sahiptir. Coğrafi kodlayıcı PostGIS 1.5 8.4+ veya daha üst bir sürüme iyi bir şekilde yüklenecektir.

ABD'deyseniz, hepsi plpgsql işlevleri olarak paketlendiğinden kullanımı en kolay olabilir.

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


Teşekkürler. Ters coğrafi kod için ABD bilgisine ihtiyacım yoktu. Şimdi ters geocode PostGIS veritabanları ile çalışma şeklini anladım. Çok teşekkürler.
Joaquín M
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.