Алгоритм обчислення покриття + перекриття з набору дуг


10

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

Скажімо, я знаю, що ширина розкиду становить 30м, тобто вантажівка може розкидати добрива на 15м з будь-якої сторони транспортного засобу.

Я хочу створити набір багатокутників, на яких видно:
1) Загальна площа, яка отримала добриво
2) Площі перекриття, тобто там, де два окремі проходи були занадто близько один від одного, так що деякі частини ферми отримували вдвічі більше правильної "дози" "добрив.

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

Якщо це актуально, я використовую TatukGIS VCL DK, але я дійсно шукаю алгоритм, а не конкретне рішення.

Деякі роз’яснення у відповідь на дискусію до цих пір:

1) Я не можу покластися на векторні дані, що мають якісь конкретні метадані (наприклад, журнали GPS або швидкість поширення). Я дозволяю користувачеві вибрати шар і вказати ширину розвороту, після чого звіт запускається.

2) Мета звіту - показати користувача, наскільки «кваліфікованим» був оператор транспортного засобу, де «кваліфікований» означає «досягнуте найвищого покриття з найменшим перекриттям».

3) Мені зручніше у векторній землі, ніж растровій, тому я віддаю перевагу векторним рішенням.

Дякую,

Даррен.


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

Відповіді:


3

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

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

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


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

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

2

Немає рішення, але деякі входи:

Ця проблема схожа на проблему виявлення коалесценції лінії при узагальненні карти . Це трапляється, коли великий великий стиль наноситься на синусну лінію (символ самостійно перекривається):

введіть тут опис зображення

Цей документ, стор. 176-180 (французькою мовою ... вибачте) дає алгоритми для виявлення таких самопересічних частин. Принцип полягає у тому, як запропоновано scw , використовувати один бічний буфер кожного сегмента, що складається з сегмента плюс 0, 1 або 2 дуги кола. JTS містить реалізацію цього єдиного бічного буфера, який може бути корисним.


Чому ви стурбовані виявленням власних перехресть? І чому ви пропонуєте буфери "односторонні"? Жоден із них не здається проблематичним.
whuber

Мета - виявити, де вантажівка кілька разів поширює добриво, тобто там, де ділянка розкидання самопересікається.
липень

2

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

Дані про час будуть доступні в GPS-записі про рух ходу трактора. Схили (пройдена відстань, поділена на час, що минув) оцінять швидкість у кожній точці. Крім того, можна (як наближення) припускати постійну швидкість всередині поля і меншу швидкість в межах розумного внутрішнього буфера кордону поля.

Растрове представлення може вирішити ці проблеми. Розподіліть шлях трактора. Це встановлює для всіх комірок, не перекреслених трактором, значення NoData (або до нуля). Якби трактор рухався зі стандартною постійною швидкістю, досить було б поставити постійне значення у кожну з комірок даних. Наприклад, якби трактор рухався з подвійною швидкістю, (імовірно) його норма подачі скоротиться вдвічі, і це можна представити вдвічі в значенні комірок.

Загалом, значення, яке потрібно розмістити в будь-якій комірці, - це норма застосування на одиницю площі . Якщо трактор рівномірно розкидає х кг добрива за секунду до 15 м з кожного боку під час руху зі швидкістю y м / сек, то він розкидається x / y Kg / sec / [m / sec] / (2 * 15 м) = х / (30 у ) кг / м ^ 2 добрива. Таким чином, x / (30 y ) - це значення, яке потрібно поставити в кожну клітинку. x задано, а y обчислюється з даних GPS.

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

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


1
+1 здається, якби у вас був інструмент, який дозволив ядру (представляє трактор) рухатися по трасі (замість кожного рядка), ця проблема була б більш керованою.
Кірк Куйкендалл

@Kirk Не потрібно дотримуватися шляху чи рядків чи будь-якого іншого з ядром. Важливо оцінити зміну точки зору, яка супроводжує фокусну суму: замість того, щоб дивитися на проблему як на розповсюдження матеріалу з контуру точок, розгляньте це як один з обчислень, скільки матеріалу накопичується в кожній точці поля . Очевидно, це та сама проблема з тим же рішенням. Підхід до рухомого ядра (та запропоновані підходи до буферизації) займають першу точку зору; фокусна сума, друга. Але інструмент фокусної суми доступний; розрахунок рухомого ядра не є.
whuber

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

@dbruning Цей підхід, мабуть, не вимагає відомих швидкостей / швидкостей розповсюдження; вона просто дозволяє їх (+ точніша модель реальності), якщо у вас є. Однак також потрібно зажадати деяке порогове значення комірки + підрахунок, щоб отримати необхідні показники (загальне покриття площі; площа перекриття) із системи, і там також змішані компроміси з точністю.
Дан С.

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

2

Я не впевнений на 100% у протоколі StackExchange, тому я публікую це як відповідь на моє запитання. Це відповідь, яку я все-таки використав.

Основний алгоритм:
1. Розбийте будь-яку геометрію шару на сегменти не довше 1/2 ширини розвороту.
2. Для кожного сегмента:
- Створіть "буфер прокатки", оглянувшись назад по формі, і буферуйте всі попередні сегменти, де сукупна довжина цих сегментів менша за ширину розвороту (радіус буфера = 1/2 ширини поширення)
- Створіть "буфер наступного сегмента" просто наступного сегмента (радіус буфера = 1/2 ширини поширення)
- відняти "буфер прокатки" від "буфера наступного сегмента", щоб отримати "новий буфер"
- приєднайтеся до всього "нового буфера" багатокутників разом, щоб отримати один багатокутник на форму.

По суті це дозволяє водію транспортного засобу розкидача робити повороти під прямим кутом (або ширше) без штрафу перекриття, але якщо вони повернуть занадто різко назад, щоб вони поширилися над «старою землею», ми починаємо отримувати перекриття.

Перекривається синім кольором

Спіраль виглядає так, як я хочу, щоб це:

спіраль

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.