我是地理空间数据的新手,我正在尝试将带有lat/lon和值的.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
raster
包中的方法rasterFromXYZ
似乎应该满足我的需要,但我收到了以下警告
> 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]
数据加载不正确。如您所见,r
中windspeed
的最大值为2151.701,但该值实际上位于.csv文件的exposed_pop
列中。
> 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值,那么这个警告的原因是什么?我如何正确加载这个数据?
对于再现性,这里是看起来有问题的数据子集(给出相同的警告并为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"))
谢谢!
您发现了一个错误(在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])