Имитация расширения возможностей многоугольника


13

У меня есть то, что я надеюсь, будет интересным вопросом. Я работаю над заданием для введения в курс ГИС, в котором используются некоторые данные о разливе нефти в Заливе для представления общих векторных методов пространственного анализа (буферы, наложения и т. Д.). У меня есть класс объектов полигонов, который содержит границы разлив нефти Deepwater Horizon в определенный день, и я имитирую его расширение буферами.

Он иллюстрирует концепцию, но, конечно, не дает реалистичных результатов. Это заставило меня задуматься о том, как это можно сделать таким образом, чтобы получить менее однородные результаты, имитируя / симулируя эффект токов, направляющих нефть в различных направлениях по мере ее расширения.

В общем, я ищу рабочий процесс, который бы выполнял следующее заданное свойство многоугольника ввода:

  • Создайте новый многоугольник, который будет больше оригинала на указанную площадь (например, на 10 кв. Км) или, возможно, на определенный коэффициент (например, на 5%)
  • Новая функция многоугольника будет иметь произвольную форму с оговоркой, что ...
  • Новая функция многоугольника будет содержать исходную функцию многоугольника (этот момент не является нарушением условий сделки, но было бы неплохо иметь его)

Любое реальное решение должно включать моделирование океанских течений, гидродинамику и тому подобное, что выходит далеко за рамки того, что я пытаюсь сделать (хотя решения, включающие это, безусловно, приветствуются и было бы интересно увидеть), но эта идея пробудила мое любопытство по поводу лежащей в основе пространственной проблемы, и мне любопытно, какие есть решения. У меня есть одно решение, но я хотел бы услышать, какие решения могут быть у других.

Я работаю в мире ESRI, но решения, которые включают другие пакеты / платформы, безусловно, приветствуются (хотя я не могу их протестировать). Общие алгоритмы, псевдокод и код также хороши.


2
Существуют интересные и инновационные решения, но я обеспокоен скрытой предпосылкой, что подобные учения будут иметь какое-либо отношение к разливам нефти. Количество научной информации не более чем доступно философу, пристально смотрящему на его пупок. Конечно, интересно распространять многоугольники - я помню, как один из представителей ESRI описывал это для моделирования огня с помощью ArcView 2 еще в 1996 году, - но как вы оправдываете, что этот процесс не является произвольным и может вводить в заблуждение?
whuber

1
@whuber - Я не утверждаю, что результаты будут произвольными. Произвольный результат - это то, что я активно ищу в этом вопросе. Вы правы, что результаты не будут иметь никакого сходства с реальным миром. Это одна из причин, почему я назвал вопрос так же, как и я (в отличие от «Имитация разлива нефти»). Меня интересует аспект вычислительной геометрии / методологии ГИС, а не ее применение в какой-либо конкретной области. Часть разлива нефти была просто стимулом для размышления об интересной пространственной проблеме. Я постараюсь уточнить это в вопросе.
Джеймс М

Забыл упомянуть: в задании есть вопрос, задающий студентам вопрос о том, почему использование буфера таким способом - плохой выбор, если вы пытаетесь отразить реальность. Так что, если кто-то обеспокоен тем, что я пытаюсь выдать это за реалистичность, не переживайте :)
Джеймс М

Благодарю. Я был обеспокоен тем, что впечатлительные студенты, увидев классную графическую демонстрацию расширения полигонов вместе с некоторым упоминанием о "разливе нефти", могут некритически принять первое как реалистичное представление последнего.
whuber

Ответы:


7

алло

Здесь я думаю, что это немного забавный способ сделать это в PostGIS. Я думаю, что это может быть расширено, поэтому расширение следует некоторой линейной строке, представляющей текущее. Но сейчас он просто расширяется в одном направлении.

Он повторяется 50 раз и для каждой итерации берет многоугольник из последней итерации, перемещает его, буферизует его (упрощает, чтобы заставить вещи работать более мягко) и объединяет его с выпуклой оболочкой. Я думал, что выпуклый корпус дал хороший результат, чем объединение его.

В результате 50 полигонов становятся все больше и больше. Каждый больший полигон полностью перекрывает все меньшие полигоны.

Чтобы увидеть результат, вы можете попробовать его на http://postgisonline.org/map.php

Просто скопируйте приведенный ниже sql-код и нажмите «map1»

С RECURSIVE t (the_geom, n) AS (ВЫБЕРИТЕ «ПОЛИГОН ((10 10,8 13, 10 15, 12 14, 15 15, 16 12, 15 10, 10 10))» :: геометрия AS the_geom, 1 как n UNION ALL SELECT ST_Convexhull (ST_Collect (ST_Simplify (ST_Buffer (ST_Transscale (the_geom, 1.3, 2.7,1,1), 1), 0.1), the_geom)), n + 1 как n ОТ t, ГДЕ n <50) ВЫБРАТЬ_geom ОТ ;

Если вы хотите просто увидеть многоугольник из 30-й итерации, вы можете добавить
смещение 30 предела 1
между точкой t и точкой с запятой в конце

генерация этих 50 полигонов занимает около 50 мс, так что должна быть возможность расширить модель без особого ожидания.

С уважением Никлас

Этот был еще лучше, я думаю:

С RECURSIVE t (the_geom, n) AS (ВЫБЕРИТЕ «ПОЛИГОН ((10 10,8 13, 10 15, 12 14, 15 15, 16 12, 15 10, 10 10))» :: геометрия AS the_geom, 1 как n UNION ALL SELECT st_convexhull (ST_collect (ST_Simplify (ST_Buffer (ST_Transscale (the_geom, 1.1 * n, 15,1,1), 0.2 * n), 0.1), the_geom)), n + 1 как n ОТ t ГДЕ n <50) ВЫБЕРИТЕ the_geom ОТ t

имитируя расширение, поворачивая направо


Это аккуратное решение и еще одно напоминание о том, что мне нужно найти время, чтобы начать изучать ГИС в контексте пространственной базы данных. Это хороший пример того, почему такой сайт работает. Я не только нахожу решение, которое полностью отличается от того, что я имел в виду, но я нахожу новый ресурс в качестве бонуса.
Джеймс М

Да, есть много posibilites с пространственным sql. Вышеупомянутый запрос немного сложнее, чем обычно, из-за рекурсивной части. Есть много отличных источников, чтобы помочь начать.
Никлас Авен

3

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

Тем не менее, я думаю, что это интересный вопрос, и может быть весело для студентов. Еще один способ взглянуть на проблему - представить ее как растровое явление, в котором плотность нефти измеряется в каждой ячейке. Оттуда вы можете использовать модель, которая учитывает ансиотропию, такую ​​как r.spread( документация ), для моделирования скорости роста, возможно, включая искусственные потоки, чтобы «направлять» спред. Вы также можете сделать что-то с различными видами фокусных операций в ArcGIS, используя неправильные формы, чтобы обойти проблемы линейной буферизации.


2

Я думаю, что у меня возникнет соблазн получить векторные объекты, представляющие токи, и использовать их в качестве управляющих векторов в операции деформации. Ключом будет правильное масштабирование векторов, чтобы имитировать спред одного дня.

Я согласен с Энди В., что опускание границы в точки может быть необходимым условием. Вам также может понадобиться увеличить количество баллов, чтобы получить точный результат.

Боюсь, я не знаю, как ты деформируешься в мире ESRI. Я знаю, что расширение Data Interop сделает это, но я предполагаю, что должен быть либо встроенный метод, либо расширение специально для такого рода вещей.


1

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

Если вы хотите строго работать с полигонами, я бы разделил вашу границу на заранее определенное количество точек. Используя эти точки, я бы представил ваши симуляции со стохастическими элементами в отношении направления расширения и расстояния расширения (в пределах заранее определенных разумных границ), повторяя эти шаги столько раз, сколько необходимо. Затем заново создайте выпуклую оболочку всех точек на основе новых местоположений (если вы хотите, чтобы это всегда включало предыдущий многоугольник, вам придется ограничить расширение наружу). Для вводного курса по ГИС я бы, вероятно, просто визуализировал несколько различных возможных итераций с учетом этих стохастических элементов.

Также немного отличающийся подход, я думаю, визуализация масла как агентов в симуляции может быть довольно крутой. Например, для каждой сырой барреля разлитой нефти создайте новый агент, затем добавьте те же стохастические элементы, как я говорил ранее. Вы можете либо визуализировать распространение агентов по всему заливу во времени, либо визуализировать плотность нефти во времени.

Это звучит как действительно крутой проект, и выкладывайте фотографии, когда вы закончите.


0

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

  1. Растеризовать полигон в двоичный растр.
  2. Создайте растр, превышающий результаты 1, со случайно расположенными значениями 0 и 1. Распределение значений 0 и 1 будет соответствовать количеству, которое необходимо развернуть многоугольнику. Так что если полигон нужно расширить на 5 кв. чтобы достичь цели, было бы 5 кв. стоит 1 кл.
  3. Объединение результатов (1) и (2).
  4. Удалите все ячейки из результата (3), которые не смежны с исходным растеризованным многоугольником.
  5. Введите результаты (4) в (2) вместо исходного растеризованного многоугольника и повторяйте, пока количество (1) ячеек не совпадет с целевой областью.

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.