Який ефективний спосіб виявити дорожні розв’язки на карті?


14

Я можу отримувати карти з будь-якого джерела для свого проекту, і для алгоритму C ++, який я створюю, алгоритм обов'язково повинен знати, де розташовані вузли доріг (вузли, де зустрічається більше двох відрізків дороги). Крім того, на багатьох картах, які я отримую, є подолання та недоопрацювання доріг (тобто дороги неправильно з'єднані). Один із способів виправити проблему - «очистити» дорожню мережу за допомогою Autocad. У мене є такі питання:

  1. Чи є ефективний спосіб (будь-яке програмне забезпечення, яке може це зробити?) Отримати свою карту у форматі GML, який містить інформацію про дорожні розв’язки на карті? (можливо, є тег GML, який говорить, що певний вузол є переходом)
  2. Чи є якийсь інший спосіб «очистити» дорожню мережу?

Колеги запропонували FME, але це стосується написання сценаріїв, і ми не впевнені в тому, чи буде сценарій достатньо гнучким для задоволення всіх карт. Єдиний інший спосіб виявити розв’язки - це застосувати грубу силу і знайти, які ділянки дороги мають загальні вузли. Чи допоможе ArcGIS? (не використовував, але чув про це) Я впевнений, що має бути кращий спосіб ...


2
Чи потрібно знаходити дороги, що перетинаються самостійно? Як слід обробляти вироджені геометрії (полілінії, де всі вершини збігаються, таким чином, мають нульову довжину). Як слід обробляти збігаються лінії, де перетин є лінійним відрізком, а не просто точкою?
Кірк Куйкендалл

@Kirk: Я трохи шокований ситуаціями, про які ви згадали. Я новачок у ГІС і навіть не знав, що такі можливості існують. 1. Для перехрестя самостійного потрібно кілька сегментів. Якщо це не проліт, я вважав би ці перехрестя перехрестями. 2. Я навіть не в змозі уявити, що таке вироджена геометрія, тому я не знаю, що відповісти. 3. Лінії, що зустрічаються, повинні розглядатися як дві окремі дороги, тому що я припускаю, що вони були б і в реальному житті.
Nav

Відповіді:


9

Якщо у вас є дороги в просторовій формі, наприклад, Shapefile, ви можете завантажити їх у PostGIS і автоматично встановити такі, що використовують SQL-запит. Я робив це раніше - оператор SQL призначений для пошуку для кожної дороги тих, які перетинаються географічно, та створення вузлової точки для кожного перетину.

Я спробую це очистити пізніше, але ось основний потік, який ви можете взяти ...

for line in road_layer_lines:
    ilines = get_intersecting_objects(line)
    for iline in ilines:
        road_junctions.extend(get_intersection(line, iline))

Функції ST_ * - це те, що робить цю роботу в PostGIS

  • ST_Envelope : захоплює обмежувальне поле заданої геометрії - це використовується для прискорення роботи алгоритму. Можна звузити географічний пошук за допомогою обмежувальних полів у швидкому, але менш точному проході, а потім просканувати результати за допомогою фактичної геометрії.
  • ST_Intersects : визначає, чи перетинаються дві геометрії
  • ST_Intersection : Повертає перетин двох геометрій

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

SELECT id, the_geom FROM road_lines
SELECT roads.id FROM road_lines roads WHERE ST_Intersects(roads.the_geom, my_geom)
SELECT ST_Intersection(roads.the_geom, my_geom) FROM road_lines roads WHERE roads.id = my_id

Просто обмін: ще одна база даних, яку я натрапила, це така - < oracle.com/technetwork/database/berkeleydb/overview/index.html >. Мабуть, запити дуже швидкі, тому що запити доступні як бібліотеки, які можна вбудувати в додаток.
Nav

1
@ dmsnell- Можливо, ви можете навести приклад типу запиту SQL, який використовується для виконання цього завдання?
RyanKDalton

11

Ви можете аналізувати полілінії дивовижними способами, використовуючи буфери. Зазвичай це малоефективно - буфери створюють багато додаткових вершин, але (а) це методика, доступна у багатьох ГІС (на основі векторних чи растрових), і (б) вона іноді може виробляти інформацію, яку інакше важко отримати.

У цьому випадку буферизація дороги невеликою кількістю, а потім буферизація за від’ємником тієї самої кількості залишає невеликі «острови» навколо всіх вигинів та навколо усіх перехресть. Це легко довести геометрично.

Ось приклад 10-метрового буфера (сірий) та буфера -10 м (світло-червоний) на карті шириною 650 м:

Фігура 1

Тепер перетинайте оригінальний полілінійний шар із цими острівними багатокутниками, об’єднуйте сегменти за ідентифікатором острова та рахуйте шматки:

Малюнок 2

Світло-жовті сегменти позначають високоякісні шматки, а темно-сині сегменти позначають малочисельні. У такий спосіб ми (a) знайшли всі вигини та перехрестя (включаючи самоперехрестя) та біля стиків (див. Крайній лівий, де два відрізки не зовсім відповідають)) та (б) диференціювали вигини від перехресть. Ми можемо знайти майже стики, вибравши острови, які містять два або більше з’єднаних сегментів: вигини містять лише з'єднані сегменти.

Через симетрію буферності центроїди островів перетину є точками перетину.

Один прекрасний аспект цього стилю аналізу полягає в тому, що йому не важливо, як представлена ​​основна полілінія: це може бути одна особливість, це може бути одна особливість для кожного сегмента рядка або щось середнє.


6

Так, ви могли це зробити з FME точно. Є багато "трансформаторів", які працюють з очищенням, перехрестями та топологією; Я б спробував трансформатор TopologyBuilder в цьому випадку.

Будь-який сценарій робиться у графічному середовищі, тому це зробити дуже просто.

Ви завжди можете отримати пробну версію з www.safe.com

(Розкриття: Марк Ірландія, він же FME Evangelist, Safe Software Inc.)


Я другий це. FME чудово підходить для цієї конкретної проблеми, як перетворення з AutoCAD на GML, так і топологічного очищення. Він може бути надзвичайно універсальним у своєму застосуванні.
blord-castillo


-1

Мережевий аналітик Arcgis, якого ви можете отримати за допомогою безкоштовної пробної версії, робить це менше ніж за 10 секунд і лише за кілька кліків.


-1

Процес можна здійснити в ArcGIS за допомогою мережевого аналітика.

У ArcGIS також є інший спосіб: ви можете пройти наступні етапи: "Arctoolbox" → "Інструменти управління даними" → "особливості" → "функції вершин до точок" і там ви можете робити все, що вам потрібно.

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