Bagaimana saya bisa mengubah polyline menjadi titik setiap n meter di PostGIS?

14

Pertanyaan hampir sama dengan ini , tetapi saya perlu menggunakan PostGIS.

Saya memiliki sejumlah polyline, dan ingin mengubah bentuknya menjadi titik setiap n meter di sepanjang garis ini.

sunting: Terima kasih banyak untuk Stefan. Kueri terakhir saya agak berbeda, mungkin karena versi PostGIS (1.5) yang lebih lama, tetapi pada akhirnya saya mendapatkan apa yang dibutuhkan. Poin digabungkan ke dalam peta panas kepadatan jalan. masukkan deskripsi gambar di sini

culebrón
sumber

Jawaban:

17

Kueri ini harus melakukan trik:

WITH line AS 
    (SELECT
        your_polylinestring_id,
        (ST_Dump(geom)).geom AS geom
    FROM your_polylinestring_table),
linemeasure AS
    (SELECT
        ST_AddMeasure(line.geom, 0, ST_Length(line.geom)) AS linem,
        generate_series(0, ST_Length(line.geom)::int, 10) AS i
    FROM line),
geometries AS (
    SELECT
        i,
        (ST_Dump(ST_GeometryN(ST_LocateAlong(linem, i), 1))).geom AS geom 
    FROM linemeasure)

SELECT
    i,
    ST_SetSRID(ST_MakePoint(ST_X(geom), ST_Y(geom)), 31468) AS geom
FROM geometries
  1. Pada awalnya Anda memilih linestrings yang berbeda dari kolom polylinestring Anda ST_Dump

  2. Maka Anda harus mendefinisikan elemen ukur dengan ST_AddMeasure, dimulai dengan 0 (mulai dari linestring) dan akhir linestring (sama dengan panjang linestring). Generate_seriesmembuat serangkaian pengukuran ini pada langkah 10. Di sini Anda dapat mendefinisikan "n metres"(dalam contoh ini 10 meter). The inilai dimulai lagi untuk setiap LineString.

  3. Dengan ST_LocateAlongdan ST_GeometryNAnda membuat titik geometri multidimensi.

  4. Akhirnya Anda harus mengekstraksi nilai X dan Y dari geometri ini dan membuat titik darinya.

Hasilnya bisa seperti ini: masukkan deskripsi gambar di sini

EDIT

Agar adil, saya ingin menambahkan informasi ini: Gagasan dan kueri dalam jawaban ini diekstraksi dari kueri yang saya gunakan untuk membuat garis drape dari DEM di PostGIS. Implementasi yang sangat baik dari ini dijelaskan dalam artikel ini dari Mathieu Leplatre.

Stefan
sumber
Bisakah Anda mengklarifikasi, b / c Saya tidak terbiasa dengan konstruksi SQL ini: di mana WITH line ASdigunakan? Saya tidak melihat 'garis' di tempat lain.
culebrón
2
@ culebrón The WITH Querymenyediakan penggunaan tabel sementara untuk permintaan yang lebih besar. Berikut ini beberapa informasi: postgresql.org/docs/8.4/static/queries-with.html . linedigunakan di subquery berikutnya linemeasure. Data yang dipilih dalam subquery ini didasarkan pada pilihan yang dibuat dalam linesubquery. Mereka dibangun di atas satu sama lain. Harapan itu membantu!
Stefan
Di PostGIS lebih tua dari 2.0 fungsinya adalah st_locate_along_measure.
culebrón