воскресенье, 22 марта 2020 г.

IT заметки. Загружаем OpenStreetMap в MS SQL Server.

Проект OpenStreetMap (OSM) существует с 2004 года, но длительное время качество данных по России в нем было низким, что не позволяло применять их в серьезных проектах. В последние 5 лет ситуация улучшилась, появилось больше порядка, удалось загрузить данные с Росреестра. В РФ OSM используются в государственных сервисах, для чего базу по России  оперативно исправляют. Данные у OSM бесплатные, гео базу и обновления можно скачивать и обрабатывать по своему усмотрению.

OSM позволяет скачать данные в трех форматах shape, osm, pbf.
- shape - распространенный в геосистемах формат, для его конвертации есть утилита shape2sql.
- osm - формат на основе xml с ним можно работать напрямую из MS SQL.
- pbf - сжатый OSM для его обработки есть osm2sql.
Скачать файлы можно из нескольких источников:
- openstreetmap.org - просто вырезав небольшой кусок с карты.
planet.openstreetmap.org - всю базу OSM или изменение.
download.geofabrik.de - отдельно по континентам, странам и федеральным округам (для РФ).
Перед загрузкой сразу надо готовиться к большому объему данных. К примеру, файл с данными по Центрального федерального округа(ЦФО) в сжатом pbf занимает 600 Мбайт, в несжатом - несколько ГБ, а размер базы на сервере 28 Гб. Файл pbf  с данными по РФ составляет 2,7 Гб. Поэтому бесплатный MS SQL Server Express не подойдет даже для загрузки данных ЦФО. Надо ставить бесплатный для разработчиков MS SQL Developer или любой из платных. При установке так же надо запастись местом на диске. Свободного места должно быть в 2-3 раза больше базы. Сначала потребуется память на INSERT, при ее выполнении сервер загружает все отобранные для вставки данные в память, когда она заполнится, то в tempdb, а затем записывает эти данные в таблицу. Так же потребуется место на создание индексов. 
Из-за большого объема данных вариант разбора файла OSM как XML средствами MS SQL лучше не использовать, а воспользоваться утилитой osm2sql.
Утилита osm2sql написана на C# (WPF), но не поддерживается уже 6 лет. Зато ее исходники  можно скачать с Github. Это решает две задачи:
- Не требуется искать и устанавливать на Windows 10 старый .net framework 3.5, а можно перекомпилировать исходники.
- Можно в исходниках понять причины ошибок, возникающих при ее работе, и адаптировать код под свою конфигурацию MS SQL Server.
Алгоритм работы программы можно найти в файле TaskRunner.cs. Важно знать несколько моментов:
- На втором этапе в базу должны быть добавлены CLR процедуры. Для того, чтобы это было выполнено программа должна запускаться с компьютера, где стоит сервер и вы должны иметь административные права на SQL Server и в системе.
- Только несколько подпрограмм работают с загружаемым с сайта OSM файлом. Это : загрузка узлов, путей, отношений и формирование справочника тэгов. Геоданные на этом этапе загружаются только в таблицу Node, в остальные только связи и справочники.
- Геоданные в таблицах Relation и Way формируются на основании информации в таблицах RelationCreation и WayCreation.
- В комментариях файла SQLCommands.sql можно найти пример получения информации о городах, регионах и дорог на основании данных из базы OSM, но в этих примерах выбрана не вся информация.
- Загрузка, создание ключей, путей и взаимосвязей требует времени. На i7 7700HQ 2800 MHz с ОЗУ 12 GB, SSD 500 GB (система, MS SQL tempdb и логи) и HD 1TB (база) процедура занимает более 4 часов.

PS Этот материал пролежал в черновиках около 2-х лет. Стирать жалко. Может кому пригодится.

Комментариев нет:

Отправить комментарий