OpenStreetMap Planet Overview - версия 2

Oct 10, 2013 23:03

Через почти 4 года после предыдущего Planet Overview решил создать следующую версию.

В кратце, когда нужна карта всей планеты:
- В самолёте можно отслеживать, над чем сейчас пролетаешь. Например, так я сфоткал Брест в 2010.
- При неожиданной поездке в новую страну - не останешься совсем без карты.
- Ну и конечно же функция "ГДЕ ЭТО Я?!"




Основной файл:
1. PlanetOverview_201310.rar - .mp (380М)
Производные:
2. PlanetOverview_201310_toplevels.rar - только верхние 3 уровня (3-5 исходного), .mp и .rus
3. PlanetOverview_201310_split16.rar - разрезка на 16 .mp по 45х90 градусов
4. PlanetOverview_201310_RussaAtlas.zip - атлас для Russa из 16 файлов
Дополнения:
5. PlanetOverview_201310_routable_rr_hw.rar - автодороги и железные дороги с маршрутизацией, .mp (50MB и 25MB)
6. osm2mp_config.rar - настройки osm2mp

На создании новой версии меня сподвигло два новых соображения:
1) Данные из OpenStreetMap можно выкачивать небольшими блоками, а не планетарными запросами. Это позволяет обойти ограничения сервера и обработки.
Минусом явлется дублирование объектов на границе блоков, но это можно обойти.
2) Раз можно обойтись без маршрутизации, я могу сделать атлас для Russa из нескольких файлов, т.е. я не ограничен 16М финальных данных.

Перечень интересующих меня объектов был таким:
- Границы стран
- Населённые пункты от столиц до деревень
- Основные автодороги и железные дороги
- Аэропорты
- Горы, вулканы, реки, озёра, водопады
- Береговая линия, небольшие острова
В процессе также добавились:
- Изобаты глубин
- Рифы
- Шельфовые ледники в Антарктике
- Геолинии - экватор, тропики, полярные круги, перемены даты
- Надписи морей
- Порты
- Объекты Всемирного наследия ЮНЕСКО

1. Масштабы
Самыми плотными данными предполагались деревни. Анализ данных OSM из разных мест планеты показал, что деревни можно отображать на масштабе 2км и меньше (в терминах GPSMapEdit). Таким образом, для .mp файла были заговлены такие машстабы карты:
Level5=10 - >500км - береговая линия, названия континентов
Level4=12 - 121-500км - +названия стран
Level3=14 - 31-120км - +крупные реки, границы стран, крупные города
Level2=16 - 8.1-30км - +границы областей, города, озёра, меньшие реки, мелкие острова
Level1=18 - 2.1-8км - +мелкие города
Level0=20 - <2км - +деревни


2. Водные объекты
В прошлый раз водные объекты выкачать из OSM не удалось вообще, поэтому с них и решено было начать.
Увы, запросами к overpass-api.de вида way[natural=water|wetland] ни блоками 20х20 градусов, ни блоками 5х5 градусов выкачать не удалось.
Блоки были до 700MB данных и многие обрывались по таймауту.
К счастью, на форуме OSM дали наводу на данные Natural Earth, которые опубликованы под Public Domain. Спасибо Zkir за наводку.

3. Natural Earth
Основной задачей было получить водные объекты, но после анализа всех данных из раздела Large scale data (1:10m), были взяты дополнительные данные.
В итоге из Physical были взято:
- Береговая линия - ne_10m_coastline и ne_10m_minor_islands_coastline
- Центровые линии рек и озёр - ne_10m_rivers_lake_centerlines, ne_10m_rivers_europe и ne_10m_rivers_north_america
- Контуры озёр - ne_10m_lakes, ne_10m_lakes_europe и ne_10m_lakes_north_america
- Исторические, пересыхающие и временные озёра - ne_10m_lakes_historic.mp, ne_10m_lakes_pluvial и ne_10m_playas
- Шельфовые ледники в Антарктике - ne_10m_antarctic_ice_shelves_lines и ne_10m_antarctic_ice_shelves_polys
- Надписи географических точек (мысы и острова) - ne_10m_geography_regions_points
- Рифы - ne_10m_reefs
- Геолинии - экватор, тропики, полярные круги и линия перемены даты - ne_10m_geographic_lines
Из Cultural:
- Порты - ne_10m_ports
Железные дороги (ne_10m_railroads) и часовые пояса (ne_10m_time_zones) у меня по каким-то причинам не работают - в GPSMapEdit загружаются не все данные.

Береговая линия была упрощена алгоритмом Рамера-Дугласа-Пекера (программой mp_optimize) с параметрами:
- Эпсилон = 0.01 градуса для зумов 2 и 3
- Эпсилон = 0.1 градуса для зумов 4 и 5

Изобаты были упрощены алгоритмом Рамера-Дугласа-Пекера с эпсилон = 5км (см. функцию OptimizeRouting_bathy в mp_extsimp, K_200 были упрощена с JoinCloseNodes(15))

Линия перемены дат была сдублирована, чтобы была видна на -180 долготы. Полярным кругам и тропикам была задана широта из википедии.

4. Населённые пункты, континенты, страны, регионы, острова
Взяв список выгруженных из OSM данных node[place=*] с прошлого раза, попробовал выкачать.
place=city выкачались планетарным запросом, а вот place=town уже нет. Перешёл на выгрузку блоками 5х5 градусов, благо точечные объекты совсем не страдают от этого. Сразу делал запросы по всем типам:
node[place=town|city|village|hamlet|locality|region|country|island|continent|airport]
Не скачались 10 блоков в Центральной Европе, в основном - в Германии, их порубил до 1х1 градуса.
При обработке выяснилось следующее
- place=locality везде интепретируется по разному, проще его не использовать
- place=airport устарел, объектов не осталось, надо использовать aeroway=aerodrome (см. ниже)
- ещё есть полезный place=sea, его я выкачал отдельным планетарным запросом
- natural=peak кое-где объединено с place=locality и вообще населёнными пунктами, что может создать дублирующие объекты при конвертации

5. Вершины гор и холмов, вулканы, мелкие озёра и болота.
Выкачались одним запросом - node[natural=water|wetland|volcano|peak] к jxapi.openstreetmap.org
С вершинами гор и вулканами возникла проблема их кучкования - высокой плотности в горных местах, приводящей к загромождении карты.
Распределение на уровни по высоте эффекта не дало - высокие горные массивы оказались всё равно слишком плотными, тогда как средние - ещё не видны.
Был разработан алгоритм, выбирающий самые высокие вершины в окрестности - из упорядоченного массива вершин выбираются самые высокие, отстоящие друг от друга не ближе чем:
- 150 км - для 3 зума
- 40 км - для 2 зума
- 10 км - для 1 зума
Все остальные вершины, а также вершины без высоты в метрах - на зум 0.
Алгоритм добавлен в mp_extsimp (см. функцию OptimizeRouting_ele)
Исходный массив вершин с нормальной высотой в метрах (~160000 точек) был предварительно упорядочен по высоте с помощью LibreOffice Calc.

6. Границы государств и областей/штатов
В прошлый раз границы удачно скачались запросом way[admin_level=2|3|4|5].
Сейчас такой запрос не только не сработал в планетарном масштабе, но и не дал всех необходимых данных.
Например, некоторые линии водной границы Мексики не содержат тэга admin_level, т.к. входят в соответствующее relation.
Overpass API по запросу relation[admin_level=2|3|4|5] выдавал только список relation без входящих в них объектов.
Для вытаскивания всех relation был скачал дамп planet-130925.osm.pbf и преобразован в .o5m. Спасибо Zkir за наводку и ребятам за торрент.
Увы, объём данных на выходе оказался слишком большим - 3.5ГБ.
После некоторого размышления, были забракованы admin_level=3 и 5 и было решено вытащить данные пообъектно - по списку от Overpass API.
В итоге это было сделано запросами вида:
http://overpass-api.de/api/interpreter?data=rel(7444);(._;>);out meta;
Спасибо gryphon за наводку.

После конвертации обнаружилось, что многие линии границ нарисованы многократно. Для объединения был использован алгоритм упрощения, переделанный из упрощения дорожного графа. Также было решено удалить из границ областей/штатов все объекты, являющиеся также береговой линией, т.к. в обзорной карте такие линии избыточны.
В целом порядок обработки был такой:
* Удаление линий с тэгом natural=coastline с помощью osmfilter
* Конвертация osm в mp с помощью osm2mp (временно был выставлен level0=26, чтобы не терять точность)
* Слияние и удаление дубликатов в GPSMapEdit, удаление лишних объектов
* Нарезка на блоки 30х90 градусов
* Упрощение в mp_extsimp (функция OptimizeRouting_borders)
* Слияние в GPSMapEdit, проверка связности графа, ручное удаление лишних линий (в основном - снова границы по берегам)
* Сохранение для зумов 0-2 (потом вовзрат level0=20)
* Удаление границ областей/штатов
* Дополнительное упрощение в mp_extsimp (функция OptimizeRouting_borders_top)
* Сохранение для зума 3 (потом вовзрат level0=20)

7. Городская застройка, острова покрупнее.
Данные, скачанные запросами way[place=island|town|city] и relation[place=city] показались ненужными.
Городскую застройку и так видно по плотности дорог и ж/д, а также точке крупного населённого пункта. Детали границ города не особо важны. Острова уже вошли в береговую линию.

8. Основные автодороги.
Сначала были скачаны дороги запросами way[highway=motorway|trunk|motorway_link|trunk_link] блоками 5х5 и 1х1 градусов
После конвертации в mp, было произведено упрощение в mp_extsimp (функция OptimizeRouting_hw) и слияние в GPSMapEdit.
Однако дорожный граф оказался сильно разорван из-за расхождения линий упрощённых дорог на стыках блоков, а также из-за несвязанности графа дорог уровня motorway и trunk в некоторых странах, например, в Польше.

После некоторого раздумья были скачаны дороги вместе с primary и primary_link, спасибо Zkir за совет.
Также в алгоритм упрощения была добавлена обрезка по прямоугольнику (см. функцию OptimizeRouting_hwbbox) и склейка всех прямоугольников после упрощения (см. OptimizeRouting_stitch).
Результат оказался отличным, дорожный граф собрался почти везде.
В том числе удалось повторить самый длинный дорожный маршрут Кейптаун - Магадан длиной 23400 км (22000 км по мнению cloudmade). Можно забраться и дальше, по зимнику до посёлка Черский, 24100 км. Но это не очень честно, не все маршрутизаторы считают зимник дорогой.


Для обзорной карты были взяты дороги без данных для маршрутизации, однако желающие могут скачать не преобразованные данные - PlanetOverview_201310_routable_mainhighways.mp в дополнительном файле (см. выше).

Опосля, как водится, пришла хорошая мысля, что для лучшего склеивания, нужно было скачивать не 5х5 градусов, а чуть-чуть больше, с перекрытием блоков на 2-3 км (по 0.05 градуса с каждой стороны), а после упрощения обрезать до 5х5. В этом случае упрощение в соседних блоках будет существенно более одинаковое и склеить будет проще. В следующий раз так и сделаю.

9. Железные дороги
В прошлой карте не было железных дорог, в этот раз решено было их добавить.
После тестовых скачиваний стало понятно, что в OSM не выделены магистральные линии.
По запросу way[railway=rail] приходит в том числе "лапша" всех веток на вокзалах. А вот usage=main висит далеко не на всех магистралях, особенно в Европе.
Однако подбором параметров был составлен алгоритм (mp_extsimp, функция OptimizeRouting_rr) упрощения геометрии, неплохо справляющийся с "лапшой" без ущерба для геометрии магистральных линий. Данные, скачанные блоками 5х5/1х1 градус, хорошо склеились после упрощения.
После разработки обрезки по bbox для автодорог, ж/д было решено пересклеить - теперь с обрезкой (см. OptimizeRouting_rrbbox). Результат получился более связанным, т.к. точки на границе блоков оказались ближе друг к другу, чем просто точки линий, упрощённых по ДПР.
В частности, по получившемуся жд-графу можно построить маршрут Кадис (Испания) - Хошимин (Вьетнам) или Каньякумари (Индия) - Хошимин. Увы, расстояния GPSMapEdit на таких маршрутах считает криво.


Для обзорной карты были взяты дороги без данных для маршрутизации, однако желающие могут скачать не преобразованные данные - PlanetOverview_201310_routable_mainhighways.mp в дополнительном файле (см. выше). Ж/д там нарисованы типом линии 0x3 - "Прочие загородные дороги", потому как на типе линий ж/д данные для маршрутизации не поддерживаются.

11. Аэропорты
Для аэропортов в OSM предназначен тэг aeroway=aerodrome, однако висеть он может как на точке, так на линии или отношении.
node[aeroway=aerodrome] и relation[aeroway=aerodrome] скачал из базы. Отношения - в два этапа, списком и потом по-объектно.
А вот way[aeroway=aerodrome] не скачалось. В результате их я вытащил из планетного дампа.
После конвертации с помощью osm2mp - были удалены все лишние объекты, кроме точек аэропортов.


12. Водопады
Планетарный запрос node[waterway=waterfall] сработал, объекты были добавлены на карту.
Немного погодя скачал и way[waterway=waterfall], тоже через Overpass API, эти объекты тоже добавлены.

13. Горные хребты
В процессе обработки горных вершин была идея использовать горные хребты для фильтрации вершин.
Однако хребтов нарисовано слишком мало.
Данные были скачаны запросами *[@meta][natural=ridge|arete], решено было их тоже добавить на карту.


14. Достопримечательности
К концу обработки данных возникла идея добавить важные достопримечательности.
Первоначально был выбран набор historic=monument + tourism=attraction|museum
Данные успешно удалось выгрузить только из планетного дампа. Однако точки оказались плотно сгруппированы в городах, перекрывая друг друга до масштабов около 200 м.
Далее были скачаны данные по тэгу heritage=*
Полезными оказались только heritage=1 - объекты Всемирного наследия ЮНЕСКО. Если брать больше, то объекты оказываются слишком плотно друг к другу.
Запрос *[@meta][heritage=1] к overpass-api.de успешно срабатывает, данные были добавлены.

15. Финализация
После слияния всех данных было выполнено удаление дубликатов и упрощение средствами GPSMapEdit.
Затем карта была разрезана на 16 сегментов по 45х90 градусов для конвертации в формат Russa, т.к. при большем размере сегмента данные в 1 файл не утрамбовывались.
Из-за бага в Russa, не отображались сегменты 7 и 15 - содержащие данные с долготой +180 или более. Точки на этой долготе были передвинуты (автозаменой текста) на +179.9, что привело к некоторому искажению карты у границы. Задание долготы +179.99 проблему почему-то не решало.

Итого, использовались следующие инструменты:
- osm2mp 1.03-765 (exe-build)
- GPSMapEdit 2.0.77.1
- osmfilter 1.2S
- osmconvert 0.7T
- mp_extsimp версия от 2013-10-11 (этот commit)
- mp_optimize 2013-10-02
- Notepad++ v5.8.7

В настройках osm2mp файл conv_lowzoom_r.bat - с роутингом, для конвертации дорог.

Обсуждение также возможно на форуме OSM

Актуальность данных OSM: 2013-09-24 - 2013-10-08 (выгружалось примерно в порядке, изложенном выше)
Natural Earth - v2.0.0

UPD 2019-03-16 Добавлена ссылка на google drive, т.к. ge.tt что-то не алё...
UPD 2020-07-05 Ссылки заменены на яндекс.диск

howto, planet, gps, openstreetmap, russa, maps, do_it_myself

Previous post Next post
Up