Bergabunglah dengan garis berpotongan dengan PostGIS


15

Ini adalah sesuatu yang saya hampir malu untuk bertanya tetapi sepertinya saya tidak bisa membuatnya bekerja untuk kehidupan saya.

Saya memiliki lapisan jalan dengan segmen, setiap segmen memiliki Road ID dan segmen type.

Saya ingin menggabungkan semua segmen bersama, untuk masing-masing Road IDmenjadi satu linestring tetapi hanya ketika mereka sama typedan saling bersentuhan (semua garis digabungkan menjadi satu).

masukkan deskripsi gambar di sini

Road ID - Type
   1       L
   1       L
   1       T
   1       L

Jawaban:


11

Saya percaya kode di bawah ini adalah solusi yang sedikit lebih bersih daripada jawaban yang dipilih karena beberapa alasan. Pertama tidak ada tabel yang diperlukan dan dengan demikian tambahan pada klausa 'ON' tidak diperlukan untuk masing-masing atribut jalan, dan kedua metodologi di atas berpotensi menghasilkan multi-linestrings jika ada beberapa, cluster jalan yang tidak berdekatan yang memiliki semua nilai atribut yang sama, sedangkan ST_Dump menangani masalah itu dalam solusi ini.

SELECT (ST_Dump(geom)).geom AS geom, "road_id", "road_type"
FROM (
    SELECT ST_LineMerge(ST_Union(geom)) AS geom, "road_id", "road_type"
    FROM "RoadCentreLines"
    GROUP BY "road_id", "road_type"
) AS street_union

Geometri saya tidak bergabung dengan salah satu kueri
Luffydude

@Luffydude peduli untuk memberikan info lebih lanjut? Ada kemungkinan bahwa geometri yang Anda kerjakan tidak selaras sehingga dimungkinkan untuk digabung
Grant Humphries

Ini bekerja dengan baik bagi saya untuk menggabungkan dataset jalan berdasarkan id jalan. Ini menangani jalan dengan celah yang indah (tidak ada garis melintasi bagian celah). Saya bukan OP, tapi ini jawaban yang bagus. Ini harus menjadi jawaban yang diterima. Terima kasih.
jbalk

Ini jawaban terbaik!
aborruso

6

Sepertinya ini berhasil

SELECT a."Road_ID",a."Road_Type", ST_LineMerge(ST_Collect(a.the_geom))
FROM "RoadCentreLines" as a 
LEFT JOIN "RoadCentreLines" as b ON 
ST_Touches(a.the_geom,b.the_geom) 
    AND a."Road_Type" = b."Road_Type" 
    AND a."Road_ID" = b."Road_ID"
GROUP BY ST_Touches(a.the_geom,b.the_geom), a."Road_Type", a."Road_ID"

0

Hanya meludah, tetapi saya bisa memikirkan beberapa solusi lain. Saya tidak tahu apakah mereka lebih baik atau lebih buruk, hanya saja mereka yang lain.

Pertama, jika hanya ada beberapa jenis jalan, Anda bisa mengetik jenis demi jenis dengan sesuatu seperti:

WITH type As (SELECT "Road_ID" As id WHERE "Road_Type" = 'type')
SELECT ST_LineMerge (ST_Collect(the_geom))
FROM "RoadCentreLines"
WHERE ST_StartPoint(the_geom) && ST_EndPoint(the_geom) IS TRUE
AND "Road_ID" IN (SELECT id FROM type);

Anda juga bisa menggunakan sebagian besar di atas dengan Road_Type sebagai variabel dalam loop FOR jika ada banyak jenis.

Pikiran terakhir saya melibatkan menggabungkan semua geometri, lalu memanggil tipe jalan dengan fungsi ST_Line_Substring ( Tautan-Tautan ) tetapi itu tidak akan berhasil sama sekali.

Semoga berhasil, Rob

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.