GeoJSON — Python + Grasshopper.
Как записать любой Mesh файл в GeoJSON при помощи Python в Grasshopper и опубликовать его в картографическом сервисе Mapbox?

К чему вообще вся это история с GeoJSON, Python и Grasshopper? Не стоит ли обратиться к традиционным пакетам типа QGIS, ArcGIS? Сразу отвечу: конечно стоит, GIS программы не заменимы (я сам активно, например, применяю QGIS). Но так как я архитектор, то вижу возможность несколько более подходящей связки для архитекторов между картографированием и CAD программой для проектирования.

Я задумал сделать такой инструмент, который поможет быстро деконструировать Mesh объекты в GeoJSON для публикации в картографическом сервисе Mapbox. Причём сохранить GeoJSON со всеми нужными параметрами, типа высоты Mesh объекта, цвета, высоты положения его над горизонтальной плоскостью, его различные дополнительные атрибуты и так далее.

В чём удобство делать это через Rhino / Grasshopper и Python? Rhino это известная и популярная CAD система с высокоточным моделированием, а плагин Grasshopper позволяет создавать сложные алгоритмы для автоматизации моделирования. Здесь есть мощные инструменты для создания 2-х и 3-х мерных объектов, которые отсутствуют в аналогичных программах. При помощи этих инструментов можно отрисовывать элементы карты быстро, удобно и точно. В Grasshopper можно генерировать целые застройки и затем при помощи mesh геометрии отправлять в Mapbox для публикации и презентации в Web пространстве с меньшей зависимостью от носителей, форматов и программ.
Что такое GeoJSON?
Инструментом, при помощи которого мы будем передавать геометрию в Mapbox будет формат GeoJSON (в англоязычной среде говорят как "Джеоджейсон", в русскоязычном варианте я произношу как "Геоджейсон").
И так, давайте посмотрим что из себя представляет формат GeoJSON, при помощи которого мы хотим закодировать данные о 3-х и 2-х мерных объектах. По сути это тот же JSON (Java Script Object Notation), но с добавленными проекционными координатами Земли. Объекты GeoJSON имеют конкретную пространственную привязку к Земле. Формат может содержать в себе несколько видов данных:
1) Точки;
2) Линии;
3) Полигоны;
4) Мультиполигоны;
5) Текстовые и иные данные, в том числе обязательно координаты.
К слову координаты мы будем использовать в проекционной системе WGS1984.
A GeoJSON FeatureCollection:

   {
       "type": "FeatureCollection",
       "features": [{
           "type": "Feature",
           "geometry": {
               "type": "Point",
               "coordinates": [102.0, 0.5]
           },
           "properties": {
               "prop0": "value0"
           }
       }, {
           "type": "Feature",
           "geometry": {
               "type": "LineString",
               "coordinates": [
                   [102.0, 0.0],
                   [103.0, 1.0],
                   [104.0, 0.0],
                   [105.0, 1.0]
               ]
           },
           "properties": {
               "prop0": "value0",
               "prop1": 0.0
           }
       }, {
           "type": "Feature",
           "geometry": {
               "type": "Polygon",
               "coordinates": [
                   [
                       [100.0, 0.0],
                       [101.0, 0.0],
                       [101.0, 1.0],
                       [100.0, 1.0],
                       [100.0, 0.0]
                   ]
               ]
           },
           "properties": {
               "prop0": "value0",
               "prop1": {
                   "this": "that"
               }
           }
       }]
   }
Подробное изложение о формате GeoJSON можно прочитать в статье сайта Data tracker. Рекомендую.

Проверить файл GeoJSON очень удобно можно на специальном сайте geojson.io. Просто вставьте данные GeoJSON в редактор справа. Если что-то не работает, он подсветит ошибку и подскажет где она.

В Mapbox условимся понимать под параметром height и baseHeight то, что показано на изображении ниже. Высота блока, поднятого над землёй, будет разностью между height и baseHeigth (впрочем высота объекта нас не будет интересовать). Эти параметры height и baseHeight необходимо выбрать из модели для каждого блока индивидуально.
В данном примере используется сортировка при помощи анонимной функции lambda. Она позволяет в одну строку написать то, что могло бы размещаться на 4-5 строках. Как видно код можно реализовать всего лишь в 3 шага.

Оцените этот урок и помогите тем самым сделать его лучше.
Контакты
Время работы
  • Понедельник - пятница
  • с 10 до 19 часов
Подпишитесь на еженедельную рассылку
© 2022 SKY ARCH SCHOOL
ИП Аюпов АМ. Все права защищены