Создание гексагональных карт из геопространственных полигонов

Python

Этот проект на Python автоматизирует создание гексогональных карт из любых геопространственных полигонов *.

Пример:

Создание гексагональных карт из геопространственных полигонов

* Этот код не был тщательно протестирован. Пожалуйста, не стесняйтесь вносить свой вклад, предлагать улучшения или дайте мне знать, где в вашем применении этого кода есть ошибки, чтобы я мог сделать его лучше..

Проект на github

Алгоритм работы следующий:

  1. Считываем полигональный слой используя GeoPandas, создаем GeoDataFrame (т.е. GDF).
  2. Вычисляем центр для каждого полигона в GDF.
  3. Обобщаем геометрию полигонов, создав выпуклые оболочки.
  4. Создаем другую GDF с размытой геометрией краев. Это создаси единый полигональный объект, представляющий обобщенный контур входного объекта. Позже это будет использовано при создании шестиугольников.
  5. Добавьте геометрию центроида к обобщенному контуру.
  6. Вычислите минимальный ограничивающий прямоугольник, чтобы определить начальную точку создания шестиугольника.
  7. Создаем базовый шестиугольник в левом нижнем углу.
  8. Копируем этот шестиугольник, смещая его в направлениях X и Y так, чтобы он образовывал бесшовную шестиугольную сетку.
  9. Сохраняйте только те шестиугольники, центр тяжести которых находится в пределах обобщенного контура объектов.
  10. Если количество созданных шестиугольников не равно количеству полигонов во входных данных, измените размер шестиугольников и повторите попытку.
  11. Конечный продукт может быть выведен в любой геопространственный формат (Shapefile, GeoJSON, и т.д.).
Содержание
  1. Первоначальная настройка проекта
  2. Импортируем библиотеки
  3. Определите переменные для входных данных, имена полей и т.д.
  4. Первая группа — это имена полей (т.е. атрибуты), которые будут добавлены к входным данным (т.е. GeoPandas GeoDataFrames).
  5. Вторая группа специфична для входных данных. Это:
  6. Убедитесь, что путь к файлу является правильным
  7. Определите функцию для считывания геопространственного файла в GeoDataFrame
  8. Считываем геопространственный файл в GeoDataFrame, сортировка по admin_name/code, удаляем ненужные поля
  9. Определите полезные функции и запустите их.
  10. Создавайте геометрию для последующего пространственного сравнения
  11. Создайте обобщенную ограничивающую геометрию, чтобы позже убедиться, что шестиугольники соответствуют форме входных данных
  12. Отображение административных районов и центроидов
  13. Отображение выпуклых оболочек и ограничивающей геометрии
  14. Функции для получения некоторой базовой информации об объеме данных
  15. Функции, которые фактически создают шестиугольники
  16. Функция: displace_vertex
  17. Функция: build hexagon
  18. Функция: tesselate_hexagons_translate
  19. Функция: iterate_size
  20. Функция: verify_count
  21. Вызов функций для создания шестиугольников
  22. Установите входные параметры
  23. Отображение двух версий шестиугольных карт
  24. Снова отобразите две версии карт шестиугольников с перечисленными параметрами и заполненными шестиугольниками для проверки наличия пустот
  25. Отобразите первую шестиугольную карту с номерами плиток
  26. Функции для вычисления расстояния между центроидом (например, центроидом страны) и центроидами шестиугольников и административных районов
  27. Сопоставьте шестиугольные плитки и имена районов
  28. Отображение имен шестиугольников
  29. Другая забавная карта, которую можно распечатать и присвоить названия от руки
  30. Вывод шестиугольников в формат ГИС

Первоначальная настройка проекта

Импортируем библиотеки

Определите переменные для входных данных, имена полей и т.д.

Первая группа — это имена полей (т.е. атрибуты), которые будут добавлены к входным данным (т.е. GeoPandas GeoDataFrames).

  • Их не нужно менять

Вторая группа специфична для входных данных. Это:

  • Данные из файлов (shapefile, geojson, и т.д.).
  • Имя атрибута, содержащее административные имена или коды.
  • Имена атрибутов, от которых не следует избавляться во входных данных (для минимизации размера данных).
  • Код EPSG, если он у вас есть. Если вы его не укажете, данные будут считываться с любой существующей пространственной привязки.

Убедитесь, что путь к файлу является правильным

Определите функцию для считывания геопространственного файла в GeoDataFrame

  • При этом будет предпринята попытка перепроектировать файл в указанную вами пространственную привязку EPSG
  • Если повторное проектирование завершится неудачей, по умолчанию будет использоваться пространственная привязка, определенная во входных данных

Считываем геопространственный файл в GeoDataFrame, сортировка по admin_name/code, удаляем ненужные поля

Определите полезные функции и запустите их.

Создавайте геометрию для последующего пространственного сравнения

  • Добавьте геометрию центроида к каждому многоугольнику

Создайте обобщенную ограничивающую геометрию, чтобы позже убедиться, что шестиугольники соответствуют форме входных данных

  • Создайте геометрию выпуклой оболочки (т.е. минимальную ограничивающую геометрию)
  • Сведите геометрию выпуклой оболочки к одному многоугольнику

Отображение административных районов и центроидов

Создание гексагональных карт из геопространственных полигонов

Отображение выпуклых оболочек и ограничивающей геометрии

 

Создание гексагональных карт из геопространственных полигонов

Функции для получения некоторой базовой информации об объеме данных

 

Функции, которые фактически создают шестиугольники

Функция: displace_vertex

  • Эта функция перемещает точку на заданное расстояние и угол.
  • 6 точек создают вершины для шестиугольника.

Функция: build hexagon

  • Эта функция вызывает displace_vertex 5 раз, чтобы создать 5 точек в дополнение к начальной точке
  • Затем соединяет эти вершины, чтобы создать многоугольник

Функция: tesselate_hexagons_translate

  • Эта функция использует отдельный шестиугольник, созданный ранее, копирует его и переводит (т.е. сдвигает) в направлении x, создавая строку.
  • Когда строка завершена, она начинается с исходного шестиугольника и перемещает его в направлениях x и y, чтобы создать первый шестиугольник в следующем ряду.
  • Это повторяется до тех пор, пока оба измерения x и y не будут заполнены шестиугольниками.

Функция: iterate_size

  • Эта функция итеративно изменяет (уменьшает) размер шестиугольников до тех пор, пока количество созданных шестиугольников не будет соответствовать или станет меньше количества административных областей во входных данных

Функция: verify_count

  • Это простая функция для вывода инструкции, указывающей, является ли количество созданных шестиугольников правильным или их слишком мало.
  • Если их слишком мало, пользователю предлагается изменить некоторые параметры

Вызов функций для создания шестиугольников


Установите входные параметры

  • flat_side*: Определяет ориентацию шестиугольников.
    • ‘up’ означает, что шестиугольники будут иметь плоские стороны вверх и вниз
    • ‘side’ означает, что шестиугольники будут иметь плоские стороны справа и слева
  • xofac*: коэффициент смещения x — определяет смещение в направлении x для начального шестиугольника
  • yofac*: коэффициент смещения по оси y — определяет смещение в направлении y для начального шестиугольника
  • lfac: коэффициент длины — определяет размер первого шестиугольника путем деления ширины экстента на lfac
  • ifac: коэффициент масштабирования — значение, умноженное на длину шестиугольника для итеративного увеличения / уменьшения его размера до тех пор, пока не будет создано нужное количество шестиугольников.

*В этом примере создаются две версии шестиугольных карт. Вы можете создать больше, создав дополнительные *flat_sidexofac, и yofac переменные, затем дополнительно вызовите iterate_size **

Отображение двух версий шестиугольных карт

Создание гексагональных карт из геопространственных полигонов

Снова отобразите две версии карт шестиугольников с перечисленными параметрами и заполненными шестиугольниками для проверки наличия пустот

Создание гексагональных карт из геопространственных полигонов

Отобразите первую шестиугольную карту с номерами плиток

  • Последние два числа = номер столбца
  • Первые 1-2 числа = номер строки

Создание гексагональных карт из геопространственных полигонов

Функции для вычисления расстояния между центроидом (например, центроидом страны) и центроидами шестиугольников и административных районов

  • Это позволяет нам ранжировать и упорядочивать шестиугольные плитки и административные полигоны, чтобы присваивать имена районов шестиугольникам

Сопоставьте шестиугольные плитки и имена районов

Используются два метода

  • admin-distance-to-centroid
  • tile-distance-to-centroid prioritization

Отображение имен шестиугольников

Другая забавная карта, которую можно распечатать и присвоить названия от руки

Создание гексагональных карт из геопространственных полигонов

 

Вывод шестиугольников в формат ГИС

 

Добавить комментарий