ฉันจะคำนวณการแบกระหว่างสองจุดใน PostGIS ได้อย่างไร


19

ฉันจะค้นหาตำแหน่งระหว่างสองจุดใน PostGIS ได้อย่างไร

โปรดระบุในคำตอบของคุณไม่ว่าจะเป็นวิธีการผลิตตลับลูกปืนบนทรงกลมหรือตลับลูกปืนระนาบ

คำตอบ:


21

ใช้ ST_Azimuth

แบริ่งระนาบสามารถคำนวณได้โดยใช้ST_Azimuth:

SELECT ST_Azimuth(ST_MakePoint(1,2), 
           ST_MakePoint(3,4))/(2*pi())*360 as degAz,
       ST_Azimuth(ST_MakePoint(3,4), 
           ST_MakePoint(1,2))/(2*pi())*360 As degAzrev

degaz   degazrev
------  ---------
45      225

สำหรับราบราบ (การอ้างอิงกลุ่มผู้ใช้ potgis ):

ฟังก์ชัน azimuth ของ PostGIS ดูเหมือนว่าจะใช้ฟังก์ชัน arctan แบบง่าย ๆ เพื่อตรวจสอบ azimuth หากคุณแปลงพิกัดของคุณเป็นระบบพิกัดที่ฉายแล้วเรียกใช้แบบสอบถามผลลัพธ์ของคุณจะใกล้เคียงกับผลลัพธ์ของไซต์ FCC มากขึ้น
นี่คือการแปลงอย่างรวดเร็วเป็น UTM Zone 31:

select degrees(azimuth(
'POINT(634714.442133176 5802006.052402816)',
'POINT(634731.2410598891 5801981.648284801)'
));

ซึ่งให้ค่ามุมราบของ 145.457858825445 คะแนนที่อยู่ตรงกลางของโซน UTM หรือการฉายภาพที่เหมาะสมกว่าจะให้ผลลัพธ์ที่ดีกว่า

การใช้ฟังก์ชั่นตรีโกณมิติและ ST_distance_sphere

นี่เป็นวิธีแก้ปัญหาที่ฉันเลือกเมื่อฉันต้องจัดการกับปัญหานี้ส่วนใหญ่ด้วยเหตุผลดั้งเดิม (ฉันมีฟังก์ชั่น Python ซึ่งคำนวณค่าแอซิมัท) ก่อนอื่นเราต้องหาฟังก์ชั่นที่จะบอกระยะห่างที่แน่นอนระหว่างสองจุด การอ้างอิงคู่มือ postgis :

ST_distance_sphere (จุด, จุด) ส่งกลับระยะเชิงเส้นเป็นเมตรระหว่างจุดละติจูด / ลองจิจูดสองจุด ใช้โลกทรงกลมและรัศมี 6370986 เมตร เร็วกว่า distance_spheroid () แต่แม่นยำน้อยกว่า ดำเนินการเฉพาะสำหรับคะแนน

วัดระยะทางลองจิจูดและละติจูดระหว่างจุดต่าง ๆ และใช้arctanฟังก์ชั่นเพื่อดึงมุม


ผมจะพยายามโพสต์รหัสหลามในภายหลังและบางทีอาจจะทำการเปรียบเทียบระหว่างวิธีการ - หากฉันสามารถหารหัสเดิมว่า ...
อดัม Matan

คุณช่วยอธิบายให้ชัดเจนว่าคุณไปจากระยะไกลไปยังมุมด้วยได้atanอย่างไร? ตรีโกณมิติของฉันมันมืดครึ้มเล็กน้อย ...
fmark

11

สำหรับทุกคนที่เจอคำถามนี้ในขณะนี้ - PostGIS สนับสนุน ST_Azimuth ทางภูมิศาสตร์ (spheroid) ตั้งแต่ 2.0.0

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