#r #r-raster #terra
#r #r-растр #земля
Вопрос:
Я пытаюсь использовать terra::distance
так, как я бы использовал raster::distanceFromPoints
. Однако terra::distance
сообщает только расстояние от точки(точек) до ячеек NA. Является ли это предполагаемым результатом? Я включаю пример кода в свой обходной путь.
Растровый график с точкой для вычисления расстояния
Участок земли::расстояние до точки
Желаемый результат
r lt;- terra::rast(ncols=10, nrows=10) valR lt;- rep(1, length = 100) valR[c(1,12,23,34,45,56,67,78,89,100)] lt;- NA terra::values(r) lt;- valR xp lt;- c(50) yp lt;- c(50) xyp lt;- cbind(xp, yp) vecP lt;- terra::vect(xyp) terra::plot(r) terra::plot(vecP, add=T) rDist lt;- terra::distance(r, vecP) terra::plot(rDist) #only NA cells have the distance value # WORKAROUND r1 = r*0 r1[is.na(r1)] lt;- 100 r1[r1lt;1] lt;- NA r1Dist lt;- terra::distance(r1, vecP) terra::plot(r1Dist) #################### # using raster::distanceFromPoints #################### rR lt;- raster::raster(ncols=10, nrows=10) raster::values(rR) lt;- valR raster::plot(rR) rRDist lt;- raster::distanceFromPoints(rR, xyp) rRDist lt;- raster::mask(rRDist, rR) raster::plot(rRDist)
Комментарии:
1. Из прочитанного
?distance
я понял , что это больше похоже на ошибку, чем на предполагаемое поведение (похоже, он использует метод, когда отсутствует y). Надеюсь, @Robertijmans увидит это и прольет немного света. Я думаю, что ваш обходной путь будет продолжать вас до тех пор, пока не будет лучшего ответа.2. Я не вижу этой проблемы в версии для разработчиков. Ты можешь попробовать?
install.packages('terra', repos='https://rspatial.r-universe.dev')
3. Версия разработки работает для меня.
Ответ №1:
Я проверил это, используя расстояние до разветвителя линий, а не точек. Похоже, это работает так, как и ожидалось. Я предполагаю, что, возможно, это еще не было реализовано по пунктам.
Итак, еще один обходной путь, который вы могли бы использовать, — это вычислить расстояние до линий нулевой длины (которые в основном эквивалентны точкам).:
x1 lt;- rbind(c(50,50), c(50,50)) colnames(x1) lt;- c('x', 'y') lns lt;- vect(x1, "lines") rDist lt;- distance(r, lns) plot(rDist)