Моделювання розширення особливостей багатокутника


13

У мене є те, що я сподіваюся, буде цікавим питанням. Я працюю над завданням для вступу до курсу GIS, який використовує деякі дані розливу нафтової затоки для введення загальних методів просторового аналізу, заснованих на векторному (буфери, накладки тощо). У мене є клас функції багатокутника, що відповідає межі розливу нафти Deepwater Horizon в даний день, і я імітую її розширення буферами.

Це робить завдання проілюструвати концепцію, але, безумовно, не дає реалістичних результатів. Мене змусило задуматися над тим, як це можна зробити таким чином, щоб забезпечити менш рівномірні результати, імітуючи / підробляючи ефект струмів, що направляють масло в різних напрямках, коли воно розширюється.

У загальному сенсі я шукаю робочий процес, який би виконав наступне з урахуванням функції введення багатокутника:

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

Будь-яке рішення в реальному світі має включати моделювання океанічних течій, динаміку рідини тощо, що виходить далеко за рамки того, що я намагаюся зробити (хоча рішення, що включають це, безумовно, вітаються і було б цікаво побачити), але ідея викликала мою цікавість до основної просторової проблеми, і мені цікаво, які рішення є там. Маю на увазі одне рішення, але хотілося б почути, які рішення можуть мати інші.

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


2
Є цікаві та інноваційні рішення, але мене турбує неявна передумова, що така вправа взагалі має щось спільне з розливом нафти. Кількість залученої наукової інформації не більше, ніж доступна філософу, що дивиться на пупок. Звичайно, цікаво розкидати полігони навколо - я пам’ятаю, чуючи повтор ESRI, в якому описував це для моделювання вогню з ArcView 2 ще у 96 році, - але як ви виправдовуєте те, що цей процес є не що завгодно, а може бути оманливим?
whuber

1
@whuber - Я не стверджую, що результати будуть будь-якими, крім випадкових. Довільний результат - це те, чого я активно шукаю у питанні. Ви маєте рацію, що результати не будуть подібні до реального світу. Це частина причини, чому я назвав це питання так, як це робив (на відміну від "Моделювання розширення розливу нафти"). Мене цікавить аспект обчислювальної геометрії / методології ГІС, а не його застосування в будь-якій конкретній області. Частина розливу нафти стала просто поштовхом до роздумів про цікаву просторову проблему. Спробую і уточнити це у питанні.
Джеймс М

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

Спасибі. Я був стурбований тим, що вражаючі студенти, побачивши прикольну графічну демонстрацію розширюваних полігонів разом із деякою згадкою про «розлив нафти», можуть некритично сприйняти перше як реалістичне зображення останнього.
whuber

Відповіді:


7

Привіт

Ось, я думаю, це трохи цікавий спосіб зробити це в PostGIS. Я думаю, що це може бути розширено, тому розширення слідує за деякими рядками, що представляють струм Але зараз він просто розширюється в одну сторону.

Він повторюється в 50 разів, і за кожну ітерацію дістається багатокутник з останньої ітерації, переміщує його, перетворює на буфери (спрощує його, щоб зробити речі більш гладкими) та з'єднав його з опуклою. Я думав, що опуклий дав кращий результат, ніж об'єднання його.

Таким чином, результат стає на 50 полігонів все більшим і більшим. Кожен більший багатокутник повністю перекриває всі менші багатокутники.

Щоб побачити результат, ви можете спробувати його на веб-сайті http://postgisonline.org/map.php

Просто скопіюйте sql-код нижче та натисніть "map1"

З РЕКУРСИВНИМ t (the_geom, n) AS (SELECT 'POLYGON ((10 10,8 13, 10 15, 12 14, 15 15, 16 12, 15 10, 10 10))' :: геометрія AS_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), 1), 0,1), the_geom, 1,3, 2,1,1,1), 1), 0,1 ;

Якщо ви хочете просто побачити багатокутник від 30-ї ітерації, ви можете додати
обмеження 1 зсуву 30
між t і крапкою з комою.

для генерації цих 50 багатокутників використовується близько 50 мс, тому слід розширити модель без особливого очікування.

З повагою Ніклас

Це було навіть приємніше, я думаю:

З РЕКУРСИВНИМ t (the_geom, n) AS (SELECT 'POLYGON ((10 10,8 13, 10 15, 12 14, 15 15, 16 12, 15 10, 10 10))' :: геометрія AS_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,21 n), 0,1), the_geom)) ВИБІРТИ the_geom З t

імітуючи розширення, повертаючи вправо


Це акуратне рішення та ще одне нагадування про те, що мені потрібно знайти час, щоб почати дізнаватися про ГІС у контексті просторової бази даних. Це хороший приклад того, чому такий сайт працює. Я не тільки знаходжу рішення, яке зовсім інше, ніж те, що я мав на увазі, але я знаходжу новий ресурс як бонус.
Джеймс М

Так, є багато позитивів з просторовим sql. Наведений вище запит читати трохи складніше, ніж зазвичай, через рекурсивну частину. Існує багато чудових ресурсів, які допомагають розпочати роботу.
Nicklas Avén

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.