Приєднуйтесь до пересічних ліній з 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 дбаєте про надання більше інформації? Можливо, геометрія, з якою ви працюєте, не вирівняна таким чином, що можливо її злиття
Грант Хамфріс

Це прекрасно працювало для мене для об'єднання даних доріг на основі ідентифікатора дороги. Це прекрасно обробляло дороги з прогалинами (жодних ліній через проміжки ділянок). Я не ОП, але це чудова відповідь. Це має бути прийнятою відповіддю. Спасибі.
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 ), але це взагалі не буде працювати.

Пощастило, Роб

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.