Saya ingin menghitung sudut antara dua garis di mana mereka berpotongan di PostGIS.
Titik awal untuk perhitungan sudut dalam PostGIS tampaknya ST_Azimuth - tetapi itu mengambil poin sebagai input. Pikiran pertama saya adalah mengambil titik akhir dari garis yang berpotongan dan melakukan perhitungan Azimuth pada mereka. Itu tidak cukup baik, karena sebagian besar fitur garis tidak lurus, dan saya tertarik pada sudut di persimpangan. Jadi yang saya hasilkan adalah operasi bersarang yang melewati langkah-langkah berikut:
- Identifikasi semua persimpangan antara dua tabel fitur garis.
- Buat penyangga yang sangat kecil di sekitar titik persimpangan
- Identifikasi titik-titik di mana fitur garis memotong eksterior penyangga (mengambil titik pertama jika ada lebih dari satu - Saya benar-benar hanya tertarik pada apakah sudutnya mendekati 0, 90 atau 180 derajat)
- Hitung ST_Azimuth untuk dua poin itu.
SQL lengkapnya agak panjang untuk dikirim di sini, tapi saya sudah mengatasinya di sini jika Anda tertarik. (Ngomong-ngomong, apakah ada cara yang lebih baik daripada membawa semua ladang ke bawah pernyataan WITH?)
Hasilnya tidak terlihat benar, jadi saya jelas melakukan sesuatu yang salah:
EDIT Saya redid perhitungan dalam EPSG: 3785 dan hasilnya sedikit berbeda tetapi masih tidak benar:
Pertanyaan saya adalah di mana kelemahan dalam proses ini. Apakah saya salah memahami apa yang dilakukan oleh ST_Azimuth? Apakah ada masalah CRS? Sesuatu yang lain sama sekali? Atau mungkin ada cara yang jauh lebih sederhana untuk melakukan ini?
Jawaban:
Saya memiliki pencerahan. Itu agak biasa. Saya meninggalkan satu informasi penting untuk PostGIS untuk menghitung sudut yang tepat.
Yang saya hitung adalah sudut antara hanya dua titik yang memotong eksterior penyangga kecil. Untuk menghitung sudut persimpangan, saya perlu menghitung kedua sudut antara kedua titik di bagian luar buffer dan titik persimpangan dari dua fitur garis dan kurangi.
Saya memperbarui SQL lengkap , tapi inilah yang menonjol:
sumber
ST_IntersectionAngle(...
?Baru-baru ini saya harus menghitung hal yang sama, tetapi memutuskan pendekatan yang lebih sederhana dan lebih cepat.
Untuk menemukan poin tambahan untuk perhitungan azimuth, saya hanya memeriksa permyriad panjang di belakang persimpangan (atau setelah dalam kasus yang jarang terjadi pada awal baris) menggunakan ST_Line_Locate_Point dan ST_Line_Interpolate_Point :
Permyriad bersifat arbitrer dan untuk hasil yang lebih konsisten akan lebih baik menggunakan offset absolut. Misalnya, periksa 20m sebelumnya, Anda akan mengubah 0,0001 ke
20/ST_Length(line1)
dan20/ST_Length(line2)
masing - masing.sumber