Saya baru saja mulai bekerja dengan database spasial dan saya ingin menulis query SQL (PostGIS) untuk generalisasi otomatis trek-GPS mentah (dengan frekuensi pelacakan tetap). Hal pertama yang saya wokring adalah kueri yang mengidentifikasi titik macet dalam bentuk kueri seperti "x titik dalam jarak y meter" untuk menggantikan titik awan besar dengan titik yang representatif. Saya sudah sadar untuk mengambil poin dalam jarak tertentu dan menghitung yang terputus. Pada gambar di bawah ini orang dapat melihat trek contoh mentah (titik hitam kecil) dan pusat-pusat titik bentak sebagai lingkaran berwarna (ukuran = jumlah titik bentak).
CREATE table simplified AS
SELECT count(raw.geom)::integer AS count, st_centroid(st_collect(raw.geom)) AS center
FROM raw
GROUP BY st_snaptogrid(raw.geom, 500, 0.5)
ORDER BY count(raw.geom) DESC;
Saya akan cukup puas dengan solusi ini, tetapi ada masalah waktu: Pencitraan trek sebagai trek sehari penuh di kota orang dapat kembali ke tempat-tempat yang sudah dikunjungi sebelumnya. Dalam contoh saya, lingkaran biru tua melambangkan rumah orang yang ia kunjungi dua kali tetapi pertanyaan saya tentu saja mengabaikannya.
Dalam hal ini, kueri canggih hanya mengumpulkan poin dengan cap waktu berdekatan (atau id), sehingga akan menghasilkan dua poin representatif di sini. Gagasan pertama saya adalah modifikasi kueri saya ke versi 3d (waktu sebagai dimensi ketiga), tetapi tampaknya tidak berfungsi.
Adakah yang punya saran untuk saya? Saya harap pertanyaan saya jelas.
Terima kasih untuk ide garisnya. Saya menyadari untuk membuat dan menyederhanakan linestring seperti yang dapat Anda lihat pada tangkapan layar di bawah ini (titik adalah poin asli). Apa yang masih saya butuhkan adalah menentukan tempat istirahat (> x poin dalam radius <x meter), idealnya sebagai satu titik dengan waktu kedatangan dan waktu berangkat ... ada ide lain?
Jawaban:
Jika Anda benar-benar membutuhkan semua poin untuk visualisasi, maka Anda dapat membuat garis dan st_simplify (yang merupakan implementasi Douglas Peucker) akan melakukan pekerjaan dengan cukup baik.
Dalam beberapa kasus Anda bahkan tidak perlu menyimpan semua poin, sehingga Anda bisa melakukan pemfilteran sebelum menyimpan data poin, misalnya ketika subjek tidak bergerak, jangan menyimpannya. Anda dapat menerapkan DouglasPeucker atau beberapa filter dasar lainnya sebelum menambahkan poin ke DB. Juga beberapa penyedia GPS (seperti Android Location API) dapat melakukan penyaringan awal berdasarkan waktu dan jarak minimum secara otomatis. Dalam beberapa kasus, Anda membuat menyimpan data duplikat: difilter untuk visualisasi cepat dan log lengkap untuk arsip. Penyimpanan polos cukup murah saat ini.
sumber
Sementara itu, saya menemukan solusi untuk masalah saya:
Pertama, saya menentukan "tipe jarak" untuk setiap titik. Jika titik lebih dekat sebagai x meter ke titik berikutnya, itu ditentukan sebagai "berhenti", atau "bergerak". Kemudian, saya memulai fungsi jendela seperti ini:
Tabel yang dihasilkan terlihat sebagai berikut:
Langkah sederhana berikutnya mengelompokkan titik "berhenti", mengidentifikasi titik pusat dari kelompok titik ini, dan mengambil cap waktu minimum dan maksimum sebagai waktu kedatangan dan berangkat.
sumber