PostGIS ile kesişen çizgilere katılın


15

Bu neredeyse sormaktan utanç duyduğum bir şey ama hayatım boyunca işe yaramayacak gibi gözükmüyorum.

Segmentleri olan bir yol katmanım var, her segmentin bir Road IDve bir segmenti var type.

Tüm segmentleri bir araya getirmek istiyorum, her biri Road IDiçin bir linestringe ancak sadece aynı olduklarında typeve dokunulduğunda (tüm çizgiler birbirine yapıştı).

resim açıklamasını buraya girin

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

Yanıtlar:


11

Aşağıdaki kod birkaç nedenden dolayı seçilen cevap biraz daha temiz bir çözüm olduğuna inanıyorum. İlk olarak tablo birleştirmeleri gerekli değildir ve bu nedenle sokak özelliklerinin her biri için 'ON' maddesine bir ek gerekli değildir ve ikincisi, yukarıdaki metodoloji, aynı öznitelik değerlerinin tümü, oysa ST_Dump bu çözümde bu sorunla ilgilenir.

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

Geometrim her iki sorguda da
birleşmiyor

@Luffydude daha fazla bilgi vermek ister misiniz? Çalıştığınız geometrinin birleştirilmesi mümkün olacak şekilde hizalanmamış olması mümkündür
Grant Humphries

Bu yol kimliği dayalı bir yol veri kümesini birleştirmek benim için güzel çalıştı. Bu, boşlukları güzel bir şekilde ele aldı (boşluk bölümlerinde çizgi yok). Ben OP değilim, ama bu harika bir cevap. Bu kabul edilen cevap olmalı. Teşekkürler.
jbalk

Bu en iyi cevap!
aborruso

6

Bu işe yarıyor gibi görünüyor

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

Sadece tükürmek, ama birkaç çözüm daha düşünebilirim. Daha iyi ya da daha kötü olduklarını bilmiyorum, sadece başkaları olduklarını.

İlk olarak, sadece birkaç yol türü varsa, türüne göre yazabilirsiniz:

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);

Ayrıca, bir sürü tür varsa, FOR_T döngüsünde değişken olarak Road_Type ile yukarıdakilerin çoğunu kullanabilirsiniz.

Son düşüncem, tüm geometrileri birleştirmeyi ve ardından ST_Line_Substring işleviyle ( Link-Link ) yol türlerini çağırmayı içeriyordu, ancak bu hiç işe yaramayacak.

Onunla iyi şanslar, Rob

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.