PostGIS ST_Buffer Radius Help


9

ฉันพยายามหาจุดทั้งหมดภายในรัศมีห้าไมล์ของจุดที่กำหนด ฉันมีคำถามเช่นนี้

SELECT * FROM table WHERE ST_Contains(ST_Buffer(geomFromText('POINT(0 0)', 4326), ?), latlon)

ฉันไม่สามารถหาสิ่งที่ฉันใส่?(รัศมี) เพื่อรับห้าไมล์ ทุกอย่างอยู่ใน EPSG 4326 และตามเอกสาร PostGIS (ดีที่สุดที่ฉันบอกได้) รัศมีของฉันควรอยู่ในหน่วยเมตร ถ้าฉันใส่ 12,070.0m (ประมาณ 5 ไมล์) ฉันจะได้ครึ่งทางทั่วประเทศ ไม่มีใครรู้ว่าสิ่งที่ฉันหายไป?


4326 คือ dd (องศาทศนิยม) 12070 เป็นพื้นที่ที่ค่อนข้างใหญ่ (รัศมี) เมื่อมันถูกฉายเป็น Latlon
แบรดเนสซัม

1
ไม่ถูกต้อง - 12 070 เมตร = 7.49995029 ไมล์ดังนั้น 5 ไมล์คือ 8046.72 เมตรดังนั้น (? = 8046.72) - ภูมิศาสตร์หรือเรขาคณิตของข้อมูลของคุณคืออะไร?
Mapperz

คำตอบ:


14

เนื่องจากข้อมูลของคุณไม่ได้ถูกฉายออกมา - มันเป็นจุดบนดาวฤกษ์ - การเรียงลำดับระยะทางเชิงเส้นไม่สมเหตุสมผล ห้าไมล์ที่เส้นศูนย์สูตรเป็นมุมที่เล็กกว่า 5 ไมล์ในวงกลมอาร์กติก แต่โชคดีที่ PostGIS (> = 1.5) มีคำตอบที่คุณต้องการ:

SELECT * FROM table WHERE ST_DWithin(ST_GeogFromText('SRID=4326;POINT(0,0)'), geography(latlon), 12070);

มันมีgeographyประเภทที่ออกแบบมาสำหรับสิ่งนี้ มันคล้ายกับรูปทรงเรขาคณิต แต่เคยใช้เพียง EPSG: 4326 และมีฟังก์ชั่นที่ใช้งานได้น้อยกว่ามาก

ในตัวอย่างด้านบนฉันได้เรียกST_GeogFromText () (นอกจากนี้ยังมีST_GeographyFromText ()และฉันไม่แน่ใจว่ามีความแตกต่าง) ในจุดที่น่าสนใจ (อาจทำงานได้กับ WKT ปกติเนื่องจากพารามิเตอร์ SRID เป็น ซ้ำซ้อน) และโยนคอลัมน์ Latlon เป็นประเภทภูมิศาสตร์ หากคุณกำลังทำสิ่งเหล่านี้จำนวนมากมันจะมีประสิทธิภาพมากกว่าในการสร้างคอลัมน์ทางภูมิศาสตร์ในตารางของคุณและข้ามการแสดงทั้งหมด ในที่สุดST_D ภายใน ()สามารถใช้พารามิเตอร์ทางภูมิศาสตร์และทำสิ่งที่ถูกต้องด้วยระยะทางเชิงเส้น


ฉันขอขอบคุณความช่วยเหลือ ฉันยังค่อนข้างใหม่กับ PostGIS
Nik

4

บางทีคุณอาจต้องการฟังก์ชัน ST_DWinin แทน ดูบันทึกใน st_buffer doc
ST_Buffer

ผู้คนมักทำผิดพลาดในการใช้ฟังก์ชั่นนี้เพื่อพยายามทำการค้นหารัศมี การสร้างบัฟเฟอร์ไปยังการค้นหารัศมีนั้นช้าและไม่มีจุดหมาย ใช้ST_D ภายในแทน

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