terra::расстояние сообщает только расстояние до растровых ячеек NA

#r #r-raster #terra

#r #r-растр #земля

Вопрос:

Я пытаюсь использовать terra::distance так, как я бы использовал raster::distanceFromPoints . Однако terra::distance сообщает только расстояние от точки(точек) до ячеек NA. Является ли это предполагаемым результатом? Я включаю пример кода в свой обходной путь.

Растровый график с точкой для вычисления расстояния

график или растр с диагональными ячейками NA и точкой 50,50

Участок земли::расстояние до точки

terra::растр расстояния, показывающий расстояние, рассчитанное только для ячеек NA

Желаемый результат

обходной путь для получения значений расстояния с помощью terra::расстояние

 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)   

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