Saya punya banyak data penerbangan dari pilot glider dalam bentuk perbaikan gps dalam interval tetap. Saya ingin menganalisis jalur penerbangan dan mendeteksi awal dan akhir 'keliling' yang akan dilakukan pilot glider ketika dia menemukan termal.
Idealnya, suatu algoritma akan memberi saya titik awal dan akhir pada garis, mendefinisikan satu "lingkaran". Poin-poin ini bisa sama dengan salah satu perbaikan gps dan tidak perlu diinterpolasi.
Saya hanya bisa berjalan di sepanjang jalur penerbangan, memeriksa tingkat belokan dan memiliki beberapa kriteria untuk memutuskan apakah glider berputar atau tidak.
Karena saya menggunakan PostgreSQL dengan ekstensi PostGIS, saya ingin tahu apakah ada pendekatan yang lebih baik untuk masalah ini. Saya sudah memiliki prosedur untuk menghitung sudut dua segmen garis:
CREATE OR REPLACE FUNCTION angle_between(
_p1 GEOMETRY(PointZ,4326),
_p2 GEOMETRY(PointZ,4326),
_p3 GEOMETRY(PointZ,4326)
) RETURNS DECIMAL AS $$
DECLARE
az1 FLOAT;
az3 FLOAT;
BEGIN
az1 = st_azimuth(_p2,_p1);
az3 = st_azimuth(_p2,_p3);
IF az3 > az1 THEN
RETURN (
degrees(az3 - az1)::decimal - 180
);
ELSE
RETURN (
degrees(az3 - az1)::decimal + 180
);
END IF;
END;
$$ LANGUAGE plpgsql;
Seharusnya dimungkinkan untuk mengulang semua segmen garis dan memeriksa, ketika jumlah sudut lebih besar dari 360 atau kurang dari -360 derajat. Lalu saya bisa menggunakan st_centroid untuk mendeteksi pusat lingkaran, jika perlu.
Apakah ada pendekatan yang lebih baik?
Seperti yang diminta, saya mengunggah contoh penerbangan .
sumber
Jawaban:
Saya tidak bisa berhenti memikirkan hal ini ... Saya dapat membuat Prosedur Tersimpan untuk melakukan penghitungan loop. Contoh path berisi 109 loop!
Berikut adalah poin penerbangan yang ditunjukkan dengan loop centroid berwarna merah:
Pada dasarnya, itu berjalan melalui titik-titik dalam urutan mereka ditangkap dan membangun garis saat melewati titik-titik. Ketika garis yang kita bangun membuat sebuah loop (menggunakan ST_BuildArea) maka kita menghitung loop dan mulai membangun garis lagi dari titik itu.
Fungsi ini mengembalikan recordset dari setiap loop yang berisi nomor loop, geometri, titik awal / akhir dan centroid-nya (saya juga membersihkannya sedikit dan membuat nama variabel yang lebih baik):
Ini adalah fungsi sederhana untuk mengembalikan hanya jumlah loop:
sumber
Saya perhatikan bahwa file gpx memiliki cap waktu yang dapat dieksploitasi. Mungkin pendekatan di bawah ini bisa berhasil.
sumber