Membuat garis dari poin menggunakan PostGIS?


10

Saya memiliki tabel PostGIS dengan data posisi banyak kendaraan dan ingin membuat garis dari titik-titik ini.

Data dapat dipilih berdasarkan id kendaraan dan dipesan dengan cap waktu tetapi bagaimana cara membuat garis dari hasilnya?

Yang saya butuhkan pada dasarnya adalah satu segmen garis dari titik 1 ke titik 2, menyelesaikan garis dan kemudian lagi dari titik 2 ke titik 3. Tentu saja semua itu dalam pertimbangan id kendaraan.

Yang terakhir diperlukan karena saya ingin menghitung arah dan kecepatan kendaraan dari satu titik ke titik berikutnya.


1
Fungsi ST_MakeLine () akan melakukan ini, setelah Anda mengelompokkan GROUP BY vehicle_id dan ORDER BY timestamp. Lihat: postgis.refractions.net/docs/ST_MakeLine.html
Micha

Baiklah, saya hanya mencobanya dan mengeluarkan pernyataan berikut: SELECT ais_data.mmsi, ST_MakeLine(ais_data.geom) AS newgeom INTO ais_lines FROM (SELECT * FROM ais_data ORDER BY ais_data.mmsi, ais_data.bs_ts ASC) AS ais_data GROUP BY ais_data.mmsi;Itu akan memberi saya jejak setiap kendaraan, dan tidak persis apa yang saya butuhkan. Bagaimana cara memberitahu ST_MakeLine () untuk membuat garis dari titik 1 ke titik 2, menyelesaikan garis dan memulai yang baru dari titik 2 ke titik 3 ...?
Thomas Becker

Apa itu "titik 1", "titik 2", "titik 3"? Bagaimana Anda mengenalinya?
Micha

Saya pikir mengenali mereka melalui pemesanan cap waktu ... ORDER BY ais_data.bs_ts- apakah mungkin? Jadi, poin 1, poin 2 dan sebagainya pada dasarnya adalah informasi titik yang diberikan di setiap baris sebagai hasil dari pernyataan Select.
Thomas Becker

Anda dapat dalam langkah pertama menghasilkan satu baris per kendaraan dan setelah menghasilkan simpul dari baris ini menggunakan tips dari mailing list postgis postgis.17.x6.nabble.com/...
ThomasG77

Jawaban:


12

Ini dapat dilakukan dalam beberapa cara, menggunakan self-joins atau subqueries yang berkorelasi tetapi menggunakan fungsi window mungkin adalah cara termudah.

Fungsi lead()mengembalikan nilai yang ada di depan dalam partisi yang diberikan dan partisi kami(PARTITION BY <vehicle_id> ORDER BY <timestamp>)

Kueri ini memberi kita nomor kendaraan, posisi titik di partisi (yang sama dengan posisi garis yang dimulai dengan itu) dan dua geometri yang akan membuat garis. Tentu saja mengembalikan NULL geom2 untuk poin terakhir sehingga kita perlu memeriksa itu di kueri luar.

SELECT mmsi, num, ST_MAKELINE(geom,geom2) FROM (
  SELECT mmsi, row_number() OVER w AS num, geom, lead(geom) OVER w AS geom2
  FROM ais_data WINDOW w AS (PARTITION BY mmsi ORDER BY bs_ts) ) as q
WHERE geom2 IS NOT NULL;
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.