Apa cara terbaik untuk melakukan geocoding terbalik dengan PostGIS?

13

Apakah ada cara untuk melakukan geocoding terbalik dengan PostGIS? Ada banyak informasi di Web tetapi saya merasa sangat membingungkan ...

Saya telah mengimpor data osm ke Postgres saya sendiri dengan database PostGIS. Sekarang saya ingin membuat geocoding dan membalikkan geocoding dengan database saya. Saya tidak tahu apakah ada beberapa Prosedur Tersimpan, atau proyek di suatu tempat yang menangani masalah saya.

Langkah selanjutnya yang ingin saya lakukan adalah membuat layanan web yang dapat menangani permintaan semacam ini, tetapi itu adalah pertanyaan lain.

Joaquín M
sumber
Ada beberapa hasil ketika Anda mencari di situs ini untuk geocoding terbalik. Satu jawaban yang menonjol adalah yang ini tentang layanan yang menyediakannya.
dassouki
Pertanyaan Anda agak kabur. Apakah Anda mengalami masalah tertentu? Atau apakah Anda memerlukan bantuan dengan pendekatan umum untuk membalik geocoding?
Sean
Saya sudah mencoba menggunakan Nominatim, tetapi saya mengalami masalah menggunakan output "gazetteer". Ia melempar "Segmentasi fault" setiap kali saya mengimpor data osm.
Joaquín M

Jawaban:

14

Akhirnya, saya mengerti cara melakukan geocode dan membalikkan geocode dengan database PostGIS saya. Saya membuat prosedur tersimpan yang menemukan jenis geometri yang dekat dengan suatu titik. Prosedur tersimpan ini menggunakan fungsi jarak untuk mendapatkan titik terdekat. Setelah itu, saya membuat API RESTful yang memanggil prosedur tersimpan ini untuk menyelesaikan permintaan geocoding terbalik.

Perbaiki saya jika saya salah, tetapi saya mengerti bahwa proyek Nominatim membuat API untuk database yang telah diimpor dari OSM. Jadi, Anda tidak harus membuat prosedur tersimpan untuk membalik geocoding dan geocoding. Anda juga tidak perlu membuat layanan web apa pun untuk menyelesaikan permintaan melalui web.

Semoga ini bisa membantu seseorang.

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
sumber
Bisakah kita melihat prosedurnya?
canisrufus
Tentu saja: 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 memiliki geocoder terbalik yang memanfaatkan data Tiger. Geocoder akan menginstal dengan baik pada PostGIS 1.5 8.4+ atau lebih tinggi.

Jika Anda berada di AS, mungkin yang paling mudah digunakan karena semuanya dikemas sebagai fungsi plpgsql.

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

LR1234567
sumber
Terima kasih. Saya tidak memerlukan informasi AS untuk geocode terbalik. Sekarang saya mengerti cara membalikkan geocode bekerja dengan database PostGIS. Terima kasih banyak.
Joaquín M