Більше

Буфер з точки або багатокутника з інформацією з растру

Буфер з точки або багатокутника з інформацією з растру


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

Це дозволить створити неоднорідні буфери на основі екологічної інформації, а не встановлювати довільний буфер навколо багатокутника.

set.seed (8354) r <-raster (матриця (ncol = 5, nrow = 5, abs (кругла (rnorm (25,5,5), 0)))) e <- протяжність (c (0,5, 0,5)) протяжність (r) <- e графік (r) точок (2.5,2.5, cex = 3, pch = 19)

Нижче на зображеннях зображено початковий растр і растр, «буферизований» до значень, що дорівнюють 10. Намір рухатися назовні від центральної комірки у всіх 8 напрямках, підсумовуючи значення у міру прогресу. При досягненні 10 буфер встановлюється до такої міри, якщо значення перевищує 10, поточна комірка обмежує екстент.

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

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

Значення вихідного растру

Зовнішнє підсумовування, що визначає обсяг буфера


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

Функція побудови матриці сусідства з центром у даній точці.

## '@param n розмір матриці околиць 3,5,7,… nmatrix <- функція (n) {## n має бути непарною і> 1 м <- матриця (1, n, n) m [стеля (довжина (м) / 2)] <- 0 м} ## сусідів, що підсумовують до 10 для даної суми точок0 <- 0 початок0 <- 3, а (сума0 <10) {## витягують усі значення в околицях, включаючи центральні клітинки <- сусідні (r, cellFromXY (r, pt), напрямки = nmatrix (start0), include = TRUE) [, "до"] змінні значення <- r [клітинки] ## тестова сума значень ## (можна рандомізувати порядок тут або встановити конкретний порядок тестування) # print (cumsum (adjvalues)) sum0 <- sum (adjvalues) ## приріст розміру сусідства start0 <- start0 + 2}

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

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

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