Cách tốt nhất để thực hiện mã hóa địa lý ngược với PostGIS là gì?


13

Có cách nào để thực hiện mã hóa địa lý ngược với PostGIS không? Có rất nhiều thông tin trên Web nhưng tôi thấy nó rất khó hiểu ...

Tôi đã nhập dữ liệu osm vào Postgres của riêng mình với cơ sở dữ liệu PostGIS. Bây giờ tôi muốn thực hiện mã hóa địa lý và mã hóa địa lý ngược với cơ sở dữ liệu của mình. Tôi không biết nếu có một số Thủ tục được lưu trữ, hoặc một dự án ở đâu đó quan tâm đến vấn đề của tôi.

Bước tiếp theo mà tôi muốn làm là tạo một dịch vụ web có thể xử lý loại yêu cầu này, nhưng đó là một câu hỏi khác.


Có một vài kết quả khi bạn tìm kiếm trên trang web này để mã hóa địa lý ngược. Một câu trả lời nổi bật là câu trả lời này về các dịch vụ cung cấp nó.
dassouki

Câu hỏi của bạn hơi mơ hồ. Có vấn đề cụ thể nào bạn gặp phải không? Hay bạn cần giúp đỡ với cách tiếp cận chung để mã hóa địa lý?
Sean

Tôi đã thử sử dụng Nominatim, nhưng tôi gặp vấn đề khi sử dụng đầu ra "gazetteer". Nó ném một "lỗi phân đoạn" mỗi lần tôi nhập dữ liệu osm.
Joaquín M

Câu trả lời:


14

Cuối cùng, tôi hiểu cách thực hiện mã địa lý và đảo ngược mã địa lý với cơ sở dữ liệu PostGIS của tôi. Tôi đã thực hiện một thủ tục được lưu trữ để tìm các loại hình học gần một điểm. Thủ tục lưu trữ này sử dụng hàm khoảng cách để lấy các điểm gần nhất. Sau đó, tôi đã tạo một API RESTful gọi thủ tục được lưu trữ này để giải quyết các yêu cầu mã hóa địa lý ngược.

Sửa lỗi cho tôi nếu tôi sai, nhưng tôi đã hiểu rằng dự án Nominatim tạo ra API cho cơ sở dữ liệu đã được nhập từ OSM. Vì vậy, bạn không phải tạo bất kỳ thủ tục được lưu trữ nào cho mã hóa địa lý và mã hóa địa lý. Ngoài ra, bạn không phải thực hiện bất kỳ dịch vụ web nào để giải quyết các yêu cầu thông qua web.

Hy vọng điều này sẽ giúp được ai đó.

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; 

Chúng ta có thể xem các thủ tục?
canisrufus

Tất nhiên: 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

Bộ mã hóa địa lý hổ PostGIS 2.0 có bộ mã hóa địa lý ngược sử dụng dữ liệu Tiger. Trình mã hóa địa lý sẽ cài đặt tốt trên PostGIS 1.5 8.4 trở lên.

Nếu bạn ở Mỹ, có thể dễ sử dụng nhất vì tất cả được đóng gói dưới dạng các hàm plpgsql.

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


Cảm ơn. Tôi không cần thông tin của Hoa Kỳ cho mã địa lý đảo ngược. Bây giờ tôi đã hiểu cách hoạt động của mã địa lý ngược với cơ sở dữ liệu PostGIS. Cảm ơn rất nhiều.
Joaquín M
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.