Làm cách nào để thực hiện tìm kiếm gần với Postgis?


9

Tôi đã tải xuống cơ sở dữ liệu Geonames (city1000) và viết một chương trình Ruby nhỏ để nhập chúng vào bảng của tôi ( geo_cities). Sau đó tôi thêm cột địa lý gọi là geog.

Sau đó, tôi đã chuyển đổi tất cả các số lat / lon thành cột geog bằng cách sử dụng:

update public.geo_cities set geog = st_GeogFromText('SRID=4326;POINT(' || longitude || ' ' || latitude || ')');

Mọi thứ đang tốt Bây giờ những gì tôi muốn làm là tìm thấy tất cả các thành phố trong vòng 100 dặm của Prague.

Vì vậy, tôi có thể có được Prague như:

select * from geo_cities where asciiname = 'Prague' and countrycode = 'CZ';

Tôi vẫn đang học GIS và Postgres vì ​​vậy ai đó có thể giúp tôi với truy vấn đơn giản không?

Câu trả lời:


13

Trước tiên, hãy chắc chắn rằng bạn có một chỉ mục trên cột địa lý của bạn. Nó sẽ tăng tốc các tìm kiếm không gian:

CREATE INDEX geo_cities_geog_idx ON geo_cities USING GIST geog;
VACUUM ANALYZE geo_cities(geog);

Sau đó, bạn có thể sử dụng ST_DWithin (với chuyển đổi từ dặm đến mét) trên một truy vấn tự tham gia:

SELECT gc.*, ST_Distance(gc.geog, pt.geog)/1609.344 AS distance_miles
FROM geo_cities gc, geo_cities pt
WHERE pt.asciiname = 'Prague' and pt.countrycode = 'CZ'
  AND ST_DWithin(gc.geog, pt.geog, 160934.4)
ORDER BY ST_Distance(gc.geog, pt.geog);

Nếu bạn đang ở trong thị trường cho một cuốn sách hay, hãy xem PostGIS in Action .

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.