Построить растр с широтой и высотой вместо широты и долготы - PullRequest
0 голосов
/ 03 октября 2019

Я использую R, и у меня есть некоторые проблемы, чтобы решить эту проблему: у меня есть 2 растра (того же региона, того же разрешения, того же экстента, тех же crs):

Растр A: (широта, долгота, значения_A)

class      : RasterLayer
dimensions : 832, 541, 450112  (nrow, ncol, ncell)
resolution : 0.008333333, 0.008333333  (x, y)
extent     : -122.2458, -117.7375, 35.0625, 41.99583  (xmin, xmax, ymin, ymax)
crs        : +proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs
names      : values_A
values     : -753.4842, 0  (min, max)

Растр B: (широта, долгота, высота)

class      : RasterLayer
dimensions : 832, 541, 450112  (nrow, ncol, ncell)
resolution : 0.008333333, 0.008333333  (x, y)
extent     : -122.2458, -117.7375, 35.0625, 41.99583  (xmin, xmax, ymin, ymax)
crs        : +proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs
names      : dem
values     : 40, 4176  (min, max)

Затем необходимо получить графикрастр A как функция высоты и широты (x = высота, y = широта и значения пикселей = values_A).

Кроме того, может потребоваться агрегировать пиксели с одинаковой широтой и одинаковой высотойнапример со средней функцией.

Есть ли у вас какие-либо предложения о том, как решить эту проблему с помощью R?

Спасибо!

Ответы [ 2 ]

0 голосов
/ 04 октября 2019

Вы можете настроить пример данных следующим образом

library(raster)
A <- B <- raster(nrow=83, ncol=54, ext=extent(-122.2458, -117.7375, 35.0625, 41.99583))
values(A) <- rep(1:nrow(A), ncol(A))
values(B) <- 1:ncell(B)

И вот решение

x <- cbind(elevation=values(B), latitude=yFromRow(B, 1:nrow(B)), values(A))
r <- rasterFromXYZ(x)

Или с некоторыми существующими данными

B <- getData("alt", country='CHE')
A <- init(B, "y")
x <- na.omit(cbind(elevation=values(B), latitude=yFromRow(B, 1:nrow(B)), A=values(A)))

Вы, вероятно,хочу сделать некоторое округление

x[,1] <- round(x[,1], -2)
x[,2] <- round(x[,2], 1)

r <- rasterFromXYZ(x)
plot(r, asp=NA)
0 голосов
/ 03 октября 2019

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

df.values <- data.frame(lat = seq(44, 45, 0.01),
                        long = seq(90, 91, 0.01),
                        value_A = round(rnorm(n = 101,
                                              mean = 10,
                                              sd = 5),
                                        0)
                        )

df.elevate <- data.frame(lat = seq(44, 45, 0.01),
                         long = seq(90, 91, 0.01),
                         elevation = round(rnorm(n = 101,
                                                 mean = 200,
                                                 sd = 50),
                                           0)
                         )

Следующие шаги будут выполнены с использованием функций, найденных впакет dplyr. Поэтому установите его, если вы этого еще не сделали, а затем загрузите его в свою среду следующим образом:

library(dplyr)

Похоже, вы хотите взять эти два отдельных набора данных и объединить их, чтобы вы могли манипулировать ими ипоказать их вместе. Поскольку оба набора данных имеют значения (высоту и значение_А), собранные на уровне широты и долготы, они будут вашими переменными объединения. Если вы новичок в такого рода манипулировании данными, документация для dplyr очень полезна: (https://dplyr.tidyverse.org/reference/join.html).

df.join <- left_join(df.values, df.elevate, by = c("lat", "long"))

Что касается получения суммарного значения (например, среднего) для каждой уникальной пары высот и широты, попробуйте сгруппированное резюме. Это снова из dplyr, но я сделал это "аккуратно", используя каналы. Если вы не проданы на каналах, я рекомендую вам проверить эту статью: (https://www.datacamp.com/community/tutorials/pipe-r-tutorial)

df.smooth <- df.join %>%
    group_by(lat, elevation) %>%
    summarise(mean_A = mean(value_A, na.rm = T))

Используя это, вы можете изменить тип сводной статистики, который вы хотите, изменив функцию внутри суммирования. Например, вы можете принять только самое высокое значение.

df.smooth <- df.join %>%
    group_by(lat, elevation) %>%
    summarise(mean_A = max(value_A, na.rm = T))

Еслиу вас есть другие вопросы, прокомментируйте этот ответ.

...