2015-03-06 5 views
2

При извлечении значений растра вдоль SpatialLine в R, как связать эти значения с фактическим расстоянием вдоль этой линии?R-растровое извлечение вдоль SpatialLine: связать извлеченные значения с фактическим расстоянием

Предположим, я хочу, чтобы извлечь значение R логотипа вдоль следующей строки:

library(raster) 
r <- raster(system.file("external/rlogo.grd", package="raster")) 
x=c(5, 95) 
y=c(20, 50) 
line = SpatialLines(list(Lines(Line(cbind(x,y)), ID="a"))) 
plot(r) 
plot(line, add=TRUE) 

Rlogo

я могу извлечь значения и сюжет их - но как заменить значения х (1:length(vals) ниже) на фактическое расстояние (начиная, например, на 0 с левой стороны линии)?

vals <- extract(r, line)[[1]] 
plot(1:length(vals), vals, type='o') 

Rlogo_vals

Я мог бы объединить экстракцию клеток с xyFromCell, чтобы получить координаты извлеченных клеток, как было предложено here, но мне не понятно, как идти дальше.

ответ

0

Я не уверен, что вы точно спрашиваете, но если вы ищете расстояния между самой левой координатой отрезка линии и центрами ячеек, через которые проходит линия, то вы можете найти расстояния, подобные этому :

x <- extract(r, l, cellnumbers=TRUE)[[1]] 
xy <- xyFromCell(r, x[,1]) # get cell coordinates where the line passes 
start <- xy[which.min(xy[,1]),] # leftmost coordinate of the line 
d <- apply(xy, 1, function(x, start) sqrt(sum((x-start)^2)), start=start) # find distances between the line segment start and the cells 
plot(1:length(d), d, type='o') 
+0

Благодаря @jvj. Предполагая, что извлеченные значения связаны с самой линией, я больше рассматривал расстояния на самой линии (я знаю, что это не совсем правильно, а также зависит от метода, используемого для извлечения, но не должно быть слишком большим проблема, если разрешение сетки велико по сравнению с длиной линии). Интуитивно я больше думал о расстоянии между самой левой координатой линии и проекциями * центров клеток на линии (я полагаю, это легко существует в другом месте в «R»), но, возможно, в более эффективном/строгий/встроенный способ ... – ztl

+0

BTW @jvj, не является ли ваш 'start' выше фактически НЕ (или, скорее всего, нет, кроме случаев, когда линия проходит через центр ячейки) на линии? Кроме того, 'start' не гарантируется, как определено как самая левая * и * самая низкая ячейка, не так ли? Или я где-то ошибаюсь? – ztl

+0

Чтобы получить дистанции на самой линии, вы можете использовать геосферу :: dist2Line – RobertH

0

Вот решение (частично на основе @ jvj входов Input) через попытку вычислить ортогональные проекции центров ячеек, предусмотренных raster::extract на линии, а затем вычислить расстояние вдоль линии.

(Это R-новички сценарий, скорее всего, легко улучшаемый, но, кажется, работает (и, конечно, только для растров с проекционными уважая расстояния))

vals <- extract(r, line, cellnumbers=TRUE)[[1]] 
cellsxy <- xyFromCell(r, vals[,1]) # coordinates of intersected cells (likely not ON the line) 
linexy = spsample(line, 1000, "regular") # get the line as points 
linexy <- matrix(cbind(linexy$x, linexy$y), ncol=2) # easier than Spatial object for later 
orthoproj <- c() # to store the orthogonal projections of cells centres on the line 
for (i in 1:nrow(cellsxy)) { 
    xypt = cellsxy[i,] 
    min.index <- which.min(spDistsN1(linexy, xypt)) 
    orthopt <- linexy[min.index, ] # orthogonal projections = smaller distance 
    orthoproj <- c(orthoproj, c(orthopt[1], orthopt[2])) 
} 
orthoproj <- matrix(orthoproj, ncol=2, byrow=T) 
orthoproj <- data.frame(x=orthoproj[,1], y=orthoproj[,2]) 
orthoproj <- orthoproj[order(orthoproj[,1]),] # reorder with increasing distance 
orthoproj <- data.frame(x=orthoproj$x, y=orthoproj$y) 
start <- linexy[which.min(linexy[,1]),] # leftmost coordinate of the line 
dists <- apply(orthoproj, 1, 
       function(xy, start) sqrt(sum((xy-start)^2)), 
       start=start) # distances between 'start' and the orthogonal projections 

plot(dists, rev(vals[,2]), type='o') # !! beware: order of 'vals' and 'dists' 
        # depending on the order in which cellnumbers are returned 
        # in raster::extract and the shape of your line !! 

Rlogo_extractedValuesAlongLineWithDistance

 Смежные вопросы

  • Нет связанных вопросов^_^