Найти в Дзене
Хроники Георга

Dynamo и OpenStreetMap

Оглавление

Тема открытых ресурсов не является чем-то новым, она скорее становится актуальней время от времени, особенно в нынешнее время изоляции как от программных решений, так и от некоторых веб-сервисов по предоставлению данных.

Международный проект OpenStretMap последовал ограничениям пользователям из России больше номинально, ограничив прогрузку карт из сетей государственных организаций и ещё ряда мер, не направленных на запрет доступа к свои ресурсам. Хоть в реальной деятельности использовать эти данные ввиду их сомнительной точности не представляется возможным, они находят применение для концептуальной части (как приближенная информация об окружающей застройке). Их использованию в такой ограниченной части и будет посвящен дальнейший разговор.

1. Импорт OSM данных

В общем случае, возможностей для импорта OSM данных несколько. Сюда относят и Overpass API, и стандартное OSM API и ряд других сервисов. Есть также возможность программного импорта через веб-интерфейс OSM-файла на ограниченную площадь, что и использовалось мной.

Стандартный *.osm файл имеет XML-разметку и примитивное дерево зависимостей элементов. Подробнее можно почитать о нем в официальной справке.

Программное чтение XML-файла я реализовал при помощи знакомого Xml.Linq в C# .

Чему стоит уделить внимание - так это элементам типа "мультигеометрия", так как в CAD-среде отсутствует понятие групп объектов с параметрами. Вместо группы получается набор одиночных объектов с атрибутами группы.

2. Ранние существовавшие пакеты и библиотеки

В среде Dynamo есть как минимум 2 больших пакета по работе с OSM - это DynaMaps и Elk. Elk также предлагает и работу с рельефом. Признаться честно, я ими не пользовался, впридачу они не такие прозрачные.

3. Особенности реализации приложений для работы с пространственными данными

Важная особенность, которая свойственна геопространственным данным - это необходимость их конвертации в иные системы координат. Базово, данные в OSM лежат в системе координат EPSG:4326 в то время как мир CAD (САПР) живет в мире плоских метрических систем координат и необходима конвертация данных из одной систем в другую.

Для этой цели пару месяцев назад я взялся изучать библиотеку PROJ:

GDAL PROJ - готовим библиотеку к использованию в САПРах. Обновление базы определений
Хроники Георга24 мая 2022

На базе использования этой библиотеки я написал небольшой dynamo-пакет "dyn_proj_library" (исходный код здесь), который будет использоваться для преобразования полученных OSM-координат в метрическую СК.

4. Реализация библиотеки для работы с OSM

Исходный код приведен здесь. Логика заключается в скачивании файла osm используя api.openstreetmap.org и 2 пользовательские координаты (левого нижнего угла и правого верхнего) и его обработки - а именно составлению трех списков (точек, линий, полигонов) с атрибутами и геометрией.

Загрузка данных и выгрузка отработанных списков
Загрузка данных и выгрузка отработанных списков

Вернее, в роли геометрии выступает не геометрия dynamo, а строго-числовые массивы (чтобы в окне предпросмотра он не прорисовывал геометрию). Реализация через числовые массивы сделана для того, чтобы Dynamo не ругался на близкорасположенную геометрию (т.к. геометрия будучи в географической СК будет очень близкорасположенной с порядком различия координат 10^-5 м.

Вид геометрии (район г. Роттердам, Нидерланды) - не пугайтесь что долгота близка к нулю
Вид геометрии (район г. Роттердам, Нидерланды) - не пугайтесь что долгота близка к нулю

Следующим звеном выступает класс для пересчета координат (в нашем случае это dynamo-пакет "dyn_proj_library").

Пересчет координат
Пересчет координат

Так как библиотека, перечитывающая координаты, реализована через DllImport из C++ библиотеки, которая в свою очередь задействует логику C-библиотеки PROJ, есть некоторая потеря в скорости (т.к. память после каждого расчета также очищается).

Опциональная ступень - это дополнительный пересчет точек используя "глобальный сдвиг" (логика, свойственная Revit с его точками съемки и базовой точкой). Масштаб там тоже есть.

Дополнительный пересчет точек с возможным масштабированием (для учета единиц измерения)
Дополнительный пересчет точек с возможным масштабированием (для учета единиц измерения)

Так как OSM-данные могут быть интерпретированы по разному в зависимости от атрибутики, то в идеальном случае для каждой ситуации писать свою логику выборки - в данном случае, для зданий я сделал Solid путем выдавливания контура на высоту атрибутивного значения height.

Выборка зданий и выдавливание их в Solid
Выборка зданий и выдавливание их в Solid
Результат в среде предпросмотра Dynamo
Результат в среде предпросмотра Dynamo

Другие классы и типы данных я сделаю потом.

Сам скрипт вы можете скачать отсюда, файл "loading_Rotterdam.dyn".

5. Особенности применения упомянутых динамо-пакетов

  • используя подобные данные, даже с учетом перепроецирования, необходимо учитывать конечную среду их использования (Revit, Civil3D, Renga (?)), так как от этого зависит необходимость использования дополнительного пересчета координат (подстановки в группу нодов Reproject point (см. выше) параметры базовой точки Revit или Renga;
  • типы геометрии, в которые вырождаются данные можно настраивать под себя, так как мои ноды возвращают примитивную геометрию;
  • так как в РФ и в СНГ используются неофициальные системы координат, которых может не быть в составе библиотеки для пересчета, её можно дополнить новым кодом - см. инструкции здесь. Я перенес в эту библиотеку все те, что шли как пакет адаптации к Civil3D, но обновлять планирую и в будущем.

Не пропускайте публикации, подписывайтесь на Telegram-канал с тизерами статей.

#proj #dynamo #coordinates #bim #osm #open street map #gis