Дорожня мережа OpenStreetMap

Один із головних параметрів картки – це інформативність. Грубо кажучи, це те, скільки інформації можна рахувати з карти на власні очі. На докладному масштабі все виглядає просто: місця на екрані багато і потрібно малювати все, що цікаво користувачеві (є у нас у файлі даних). Хоча тут залишається важливе завдання — визначити, що ж йому цікаво. На оглядових масштабах все складніше: даних занадто багато і треба вибрати ті, що підвищать інформативність та наочність карти. При цьому карту не можна перевантажувати. Якщо відобразити все, то вона стане нечитаною. А придатних для відображення на оглядовому масштабі без попередньої обробки видів цікавих об'єктів користувачу практично немає!

У цій статті хочу торкнутися одного з важливих компонентів інформативності оглядового масштабу — дорожньої мережі.

доріг
Сутність у тому, що потрібно відобразити красиву дорожню мережу на оглядових масштабах карти. Це робиться для того, щоб картка не здавалася порожньою. На покупних даних це завдання успішно вирішується стилями. Коли всі дані надходять від одного постачальника, вони однорідні і можна просто описати, які дороги потрібно малювати на яких масштабах. Але OpenStreetMap не такий. Карта, яка заповнюється користувачами з усього світу, таїть у собі безліч відмінностей та регіональних особливостей у методах картування. На оглядових масштабах ці відмінності видно особливо очевидно. Через них не вдається намалювати зв'язкову та гарну мережу доріг поверх карти.

Якщо на вихідні дані покластися не можна, то потрібно вигадати власний механізм для визначення дорожньої мережі, що зв'язує держави. Про нього й йтиметься.

Для позначення доріг в OpenStreetMap використовується тег highway. Він може набувати значень motorway , trunk ,primary, secondary, residental, service та інші. Докладніше про тег можна почитати у Wiki проекту.

Тегом motorway позначають магістралі. У Москві їм відзначені платні траси («Дон», М-11, нова Ленінградка) та деякі вильотні магістралі (Сімферопольське шосе). Однак цим тегом не відзначено МКАД і більшість вильотних магістралей. У Польщі всього пара трас має тег motorway. Причому одна з них – це об'їзд міста. У Європі та США цей тег більш поширений і утворює зв'язкову дорожню мережу, але багато доріг із США закінчуються на кордоні з Канадою. Все це унеможливлює використання одного тегу motorway .

доріг
Дороги, відмічені тегом motorway

Наступний за важливістю доріг – тег trunk. Їм відзначені «найважливіші дороги, які не є motorway». З урахуванням цього тега у Москві з'являються МКАД і Бетонка, також відзначено більшість вильотних магістралей. А у Польщі відзначились лише кілька додаткових об'їздів міст. Європейська дорожня мережа втратила цілісність. Тут багато об'їздів позначено як highway=trunk. У США таких доріг небагато, і вони майже губляться у розвиненій мережі доріг motorway.

У результаті на карті не виходить єдина дорожня мережа. У різних містах однаковими тегами позначають різні за якістю дороги. Найчастіше «вагоміші» теги позначають крихітні ділянки об'їздів міст. Так як вся магістраль не відзначена цими тегами, дорога «повисає» у повітрі, що виглядає некрасиво. А сама проблема не нова. Осмери стикаються з нею давно, тільки віз і нині там.

Метод розрахунку

Отже, завдання намалювати дороги на оглядовому масштабі. Причому всі дороги намалювати не можна, оскільки карта відразу стане нечитаною. Виходить, що треба піднімати лише «головні». Головність доріг можнавизначати по-різному, я вибрав шлях, при якому оцінюю важливість дороги по тому, наскільки вона бере участь у побудові маршруту з пункту А до пункту B. Для цього я будую маршрути та перевіряю, якими шляхами ці маршрути пройшли.

Щоб визначити, які дороги беруть участь у прокладці маршрутів, я використовував OSRM. Щоправда, для цього його довелося дещо модифікувати. Основну роль грає спеціальний плагін для сервера, який замість точок маршруту виводить послідовність wayID , якими проходить маршрут. Вихідний код цього плагіна можна знайти у нашому репозиторії.

Перша спроба: з'єднуємо дорогами усі столиці

Як перший експеримент я взяв усі столиці на землі (точки міст з тегом capital=yes) і побудував дороги «кожен з кожним». На оглядовий масштаб я підняв усі дороги, які хоча б раз використовувалися під час прокладання маршрутів. В результаті у мене вийшла єдина мережа, яка добре покрила Європу та навіть західну частину України. Але тут знову проявила себе регіональна різниця в звичаях картографування OSM. В Україні тегом capital=yes відзначаються всі міста, які є адміністративними центрами областей, наприклад Тула. А ось у США тегом capital відзначено лише місто Вашингтон. В результаті дорожня мережа, що вийшла, в США мізерна і проходить вся вздовж східного узбережжя. Непокритим залишився і Сибір.

мережа

openstreetmap

Друга спроба

Якщо столиць мало, а після фільтрації їх ще менше, то додамо в побудову звичайні міста. Але їх багато, як і доріг між ними, тому треба взяти лише ті міста, які дозволять збудувати дорожню мережу. Для вибірки я мав два критерії: населення міста і близькість до вже відібраних пунктів. Параметр близькості дозволяє відфільтровувати міста,які розташовані поряд. Нові дороги між ними виглядатимуть погано на оглядових масштабах. Облік чисельності населення (де він є) дозволить малювати дороги до найбільших міст.

На прикладі України вийшло, що в європейській частині у нас багато міст відзначено тегом capital і всі інші міста відсіялися. А ось Якутію населено набагато менше. Щоб намалювати тут хоч щось, алгоритм піднімає на оглядову карту селище Депутатське з 2831 мешканцем та дорогу до нього. Але оскільки таких міст на карті помітно більше, я проводжу від них дороги лише до кількох найближчих міст. Це дозволяє зменшити кількість звернень до роутера та спростити самі запити.

міст

Ось що в результаті у мене вийшло:

доріг