Meledak MULTILINESTRING ke dalam segmen individu di PostGIS 1.5


10

Saya punya MULTILINESTRINGdi PostGIS yang terdiri dari beberapa LINESTRING. Mempertimbangkan setiap LINESTRINGuntuk memiliki satu set POINT's

P 1 , P 2 , ... P N

membentuk segmen garis

L 1 , L 2 , ... L N-1

di mana L X adalah segmen garis yang menghubungkan P X ke P X + 1 .

Menggunakan PostGIS 1.5 bagaimana saya bisa meledakkan ke MULTILINESTRINGdalam segmen garis individual masing-masing LINESTRING?

Jawaban:


11

Dua pilihan muncul di benak. Jika Anda menginginkan spesifik LINESTRINGmaka Anda dapat menggunakan ST_NumGeometries () dan ST_GeometryN () . Atau, jika Anda menginginkan semua sub-geometri, ST_Dump () adalah cara yang harus dilakukan.

Setelah benar-benar membaca pertanyaan, Anda perlu melakukan sesuatu yang mirip dengan posting ini dari daftar postgis-pengguna :

SELECT ST_AsText( ST_MakeLine(sp,ep) )
FROM
-- extract the endpoints for every 2-point line segment for each linestring
(SELECT
  ST_PointN(geom, generate_series(1, ST_NPoints(geom)-1)) as sp,
  ST_PointN(geom, generate_series(2, ST_NPoints(geom)  )) as ep
FROM
   -- extract the individual linestrings
  (SELECT (ST_Dump(ST_Boundary(geom))).geom
   FROM mypolygontable
   -- eliminate 0 length linestring 
    where st_x(st_startpoint(geom))<> st_x(st_endpoint(geom))
   ) AS linestrings
) AS segments;

Saya membaca jawaban Anda sebagai cara mendapatkan LINESTRINGdari MULTILINESTRING. Tetapi saya ingin melangkah lebih dalam, saya ingin segmen garis individual, yang ketika digabungkan membentuk segmen mana LINESTRINGyang lagi, ketika digabungkan, membentuk yang asli MULTILINESTRING. Apakah itu masuk akal?
Chau

1
Ah! Ya, sekarang saya sudah minum kopi, saya bisa melihat itu yang Anda tulis ...
MerseyViking

1
Saya tidak mengerti karena saya tidak minum kopi;)
Chau

Tambahan Anda berfungsi dengan baik, jadi terima kasih banyak!
Chau
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.