rasterFromXYZ Предупреждение: длина данных не является кратной или кратной количеству строк - PullRequest
0 голосов
/ 04 августа 2020

Я новичок в работе с геопространственными данными, и я пытаюсь загрузить набор данных .csv с широтой и долготой и значениями в виде многослойного растрового файла. Вот как выглядят данные

> df
# A tibble: 1,323 x 6
   ISO     LAT   LON exposed_assets exposed_pop windspeed
   <chr> <dbl> <dbl>          <dbl>       <dbl>     <dbl>
 1 MEX    15.7 -97.1             0         0         34.9
 2 MEX    15.7 -97            2152.        8.62      34.0
 3 MEX    15.8 -97.3             0         0         35.2
 4 MEX    15.8 -97.2        352191.      167.        34.4
etc

Кажется, метод rasterFromXYZ из пакета raster должен делать то, что мне нужно, однако я получаю следующее предупреждение

> r = rasterFromXYZ(df[-1])
Warning message:
In matrix(values, nrow = ncell(x), ncol = nlayers(x)) :
  data length [22263] is not a sub-multiple or multiple of the number of rows [7425]

И данные загружаются некорректно. Как видите, максимальное значение windspeed в r составляет 2151,701, однако это значение фактически было в столбце exposed_pop файла .csv.

> r
class      : RasterBrick 
dimensions : 99, 75, 7425, 3  (nrow, ncol, ncell, nlayers)
resolution : 0.1, 0.1  (x, y)
extent     : 15.65, 23.15, -106.85, -96.95  (xmin, xmax, ymin, ymax)
crs        : NA 
source     : memory
names      : exposed_assets,  exposed_pop,    windspeed 
min values :         0.0000,       0.0000,      34.0037 
max values :   66472940.491,    47620.445,     2151.701

Я проверил, что были в кадре данных нет дубликатов или значений NA, так что может быть причиной этого предупреждения и как я могу правильно загрузить эти данные?

Для воспроизводимости, вот подмножество данных, которые кажутся проблемными: c ( дает такое же предупреждение и загружает неправильные значения для windspeed)

> dput(df[1110:1135,-1])
structure(list(LAT = c(21.9, 21.9, 21.9, 21.9, 21.9, 21.9, 21.9, 
21.9, 21.9, 21.9, 21.9, 21.9, 21.9, 21.9, 21.9, 21.9, 21.9, 21.9, 
21.9, 21.9, 21.9, 21.9, 22, 22, 22, 22), LON = c(-106.7, -106.6, 
-106, -105.9, -105.8, -105.7, -105.6, -105.5, -105.4, -105.3, 
-105.2, -105.1, -105, -104.9, -104.8, -104.7, -104.6, -104.5, 
-104.4, -104.3, -104.2, -104.1, -106, -105.9, -105.8, -105.7), 
    exposed_assets = c(0, 0, 0, 0, 0, 222972.894088, 2463194.45998, 
    5177821.32741, 6713738.64112, 17980448.5808, 13707489.7546, 
    14975480.4695, 7773565.02961, 3224217.43413, 7403629.83371, 
    7066001.45019, 4229731.31557, 3810642.16981, 3705484.76291, 
    2861531.43593, 4994856.14058, 6330653.64562, 0, 0, 0, 509998.137351
    ), exposed_pop = c(0, 0, 0, 0, 0, 27.9003314972, 325.891448975, 
    777.652648926, 1305.87854004, 5254.45507812, 2812.10693359, 
    3389.27685547, 1154.47375488, 161.85168457, 824.549377441, 
    700.931152344, 248.07270813, 198.266082764, 178.928314209, 
    108.784866333, 324.559875488, 484.665252686, 0, 0, 0, 54.7332305908
    ), windspeed = c(58.305871031, 61.2305201929, 75.1606977525, 
    75.6692450358, 75.2585164937, 73.9301376648, 71.8375101982, 
    69.2120544391, 66.2811279675, 63.2245023136, 60.1662838419, 
    57.183936863, 54.3213107924, 51.6000196116, 49.0277997888, 
    46.604147059, 44.3239358955, 42.1796684768, 40.1628344475, 
    38.264709033, 36.4768026702, 34.7910975464, 70.3395670652, 
    70.6504099539, 70.2394850598, 69.1322960305)), row.names = c(NA, 
-26L), class = c("tbl_df", "tbl", "data.frame"))

Спасибо!

1 Ответ

0 голосов
/ 04 августа 2020

Вы обнаружили ошибку (исправлена ​​сейчас в разрабатываемой версии на github). Но есть простое решение

x = structure(list(LAT = c(21.9, 21.9, 21.9, 21.9, 21.9, 21.9, 21.9, 
21.9, 21.9, 21.9, 21.9, 21.9, 21.9, 21.9, 21.9, 21.9, 21.9, 21.9, 
21.9, 21.9, 21.9, 21.9, 22, 22, 22, 22), LON = c(-106.7, -106.6, 
-106, -105.9, -105.8, -105.7, -105.6, -105.5, -105.4, -105.3, 
-105.2, -105.1, -105, -104.9, -104.8, -104.7, -104.6, -104.5, 
-104.4, -104.3, -104.2, -104.1, -106, -105.9, -105.8, -105.7), 
    exposed_assets = c(0, 0, 0, 0, 0, 222972.894088, 2463194.45998, 
    5177821.32741, 6713738.64112, 17980448.5808, 13707489.7546, 
    14975480.4695, 7773565.02961, 3224217.43413, 7403629.83371, 
    7066001.45019, 4229731.31557, 3810642.16981, 3705484.76291, 
    2861531.43593, 4994856.14058, 6330653.64562, 0, 0, 0, 509998.137351
    ), exposed_pop = c(0, 0, 0, 0, 0, 27.9003314972, 325.891448975, 
    777.652648926, 1305.87854004, 5254.45507812, 2812.10693359, 
    3389.27685547, 1154.47375488, 161.85168457, 824.549377441, 
    700.931152344, 248.07270813, 198.266082764, 178.928314209, 
    108.784866333, 324.559875488, 484.665252686, 0, 0, 0, 54.7332305908
    ), windspeed = c(58.305871031, 61.2305201929, 75.1606977525, 
    75.6692450358, 75.2585164937, 73.9301376648, 71.8375101982, 
    69.2120544391, 66.2811279675, 63.2245023136, 60.1662838419, 
    57.183936863, 54.3213107924, 51.6000196116, 49.0277997888, 
    46.604147059, 44.3239358955, 42.1796684768, 40.1628344475, 
    38.264709033, 36.4768026702, 34.7910975464, 70.3395670652, 
    70.6504099539, 70.2394850598, 69.1322960305)), row.names = c(NA, 
-26L), class = c("tbl_df", "tbl", "data.frame"))

Сначала поправьте данные. Порядок всегда lon, lat !

y <- x[,c(2:1,3:5)]

И теперь он работает

r <- rasterFromXYZ(y)

Обходной путь, который также работает для данных с неправильным порядком, и, возможно, вам это понадобится для вашего полного набора данных, будет

y <- data.frame(y)
rr <- rasterFromXYZ(y[,1:2])
rr <- rasterize(y[,1:2], rr, field=y[,3:5])
...