ฉันจะค้นหาแบบใกล้ชิดกับ Postgis ได้อย่างไร


9

ฉันดาวน์โหลดฐานข้อมูล Geonames (เมือง 1,000) และเขียนโปรแกรม Ruby ขนาดเล็กเพื่อนำเข้ามาในตารางของฉัน ( geo_cities) geogจากนั้นผมก็เพิ่มคอลัมน์ภูมิศาสตร์ที่เรียกว่า

จากนั้นฉันแปลงหมายเลข lat / lon ทั้งหมดลงในคอลัมน์ geog โดยใช้:

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

สิ่งที่ดูดี ตอนนี้สิ่งที่ฉันต้องการจะทำคือค้นหาเมืองทั้งหมดที่อยู่ภายใน 100 ไมล์จากปราก

ดังนั้นฉันจะได้รับปรากเช่น:

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

ฉันยังคงเรียนรู้ GIS และ Postgres ดังนั้นใครบางคนสามารถช่วยฉันด้วยแบบสอบถามง่ายๆ

คำตอบ:


13

ขั้นแรกตรวจสอบให้แน่ใจว่าคุณมีดัชนีในคอลัมน์ภูมิศาสตร์ของคุณ มันจะเพิ่มความเร็วในการค้นหาเชิงพื้นที่:

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

จากนั้นคุณสามารถใช้ST_D ภายใน (ด้วยการแปลงจากไมล์เป็นเมตร) ในข้อความค้นหาที่เข้าร่วมด้วยตนเอง:

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);

ถ้าคุณอยู่ในตลาดสำหรับหนังสือที่ดีให้ตรวจสอบPostGIS ในการดำเนินการ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.