Соединяйте пересекающиеся линии с PostGIS

15

Это то, о чем мне почти стыдно спрашивать, но я не могу заставить его работать ради своей жизни.

У меня есть слой дороги с сегментами, каждый сегмент имеет Road IDи сегмент type.

Я хотел бы объединить все сегменты вместе, для каждого Road IDв одну линейную линию, но только когда они одинаковы typeи касаются друг друга (все линии соединены вместе).

введите описание изображения здесь

Road ID - Type
   1       L
   1       L
   1       T
   1       L
Натан У
источник

Ответы:

11

Я полагаю, что приведенный ниже код является немного более чистым решением, чем выбранный ответ по нескольким причинам. Во-первых, нет необходимости в объединении таблиц, и, таким образом, дополнение к предложению «ON» не требуется для каждого из атрибутов улицы, а во-вторых, приведенная выше методология может потенциально привести к созданию нескольких линий, если есть несколько несмежных кластеров улиц, которые имеют все одинаковые значения атрибута, тогда как ST_Dump решает эту проблему в этом решении.

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
Грант Хамфрис
источник
Моя геометрия не сливается ни с одним запросом
Luffydude
@Luffydude хотите предоставить больше информации? Возможно, что геометрия, с которой вы работаете, не выровнена так, чтобы ее можно было объединить
Грант Хамфрис,
Это прекрасно сработало для меня, чтобы объединить набор данных дороги на основе идентификатора дороги. Это прекрасно обрабатывало дороги с пропусками (без линий на участках пропусков). Я не OP, но это отличный ответ. Это должен быть принятый ответ. Благодарю.
jbalk
Это лучший ответ!
aborruso
6

Кажется это работает

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

Просто плевок, но я могу придумать несколько других решений. Я не знаю, лучше они или хуже, просто они другие.

Во-первых, если есть только несколько типов дорог, вы можете переходить от типа к типу примерно так:

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

Вы также можете использовать большую часть вышеперечисленного с Road_Type в качестве переменной в цикле FOR, если есть несколько типов.

Моя последняя мысль состояла в том, чтобы объединить все геометрии, а затем вызвать типы дорог с помощью функции ST_Line_Substring ( Link-Link ), но это не сработает вообще.

Удачи с этим, Роб

rec.thegeom
источник