我将分享我的方法来创建 kriging 网格。可能有更有效或更优雅的方式来完成相同的任务,但我希望这将是一个开始,促进一些讨论。
原始贴主考虑了每 10 个像素为 1 公里,但这可能太多了。我将创建一个单元格大小为 1 公里 * 1 公里 的网格。此外,原始贴主没有指定网格的起点,所以我将花一些时间确定一个好的起始点。我还假设采用 球面墨卡托 投影坐标系是投影的适当选择。这是 Google 地图或 Open Street Maps 的常见投影。
1. 载入包
我将使用以下包。 sp
、rgdal
和 raster
是提供许多有用的空间分析功能的包。 leaflet
和 mapview
是用于快速探索可视化空间数据的包。
library(sp)
library(rgdal)
library(raster)
library(leaflet)
library(mapview)
2. 探索性可视化:站点位置
我创建了一个交互式地图来检查这四个站点的位置。由于原始海报提供了这四个站点的纬度和经度,我可以使用纬度/经度投影创建一个SpatialPointsDataFrame
。请注意,EPSG代码用于纬度/经度投影是4326
。要了解有关EPSG代码的更多信息,请参见此教程(https://www.nceas.ucsb.edu/~frazier/RSpatialGuides/OverviewCoordinateReferenceSystems.pdf)。
station <- data.frame(lat = c(7.16, 8.6, 8.43, 8.15),
long = c(124.21, 123.35, 124.28, 125.08),
station = 1:4)
coordinates(station) <- ~long + lat
proj4string(station) <- CRS("+init=epsg:4326")
mapview(station)
mapview
函数将创建一个交互式地图。我们可以使用该地图来确定 网格起点可能适合什么位置。
3. 确定起点
检查地图后,我决定起点可能在经度 123
和纬度 7
左下角。现在我需要找到在球形墨卡托投影下表示相同点的坐标。
ori <- SpatialPoints(cbind(123, 7), proj4string = CRS("+init=epsg:4326"))
ori_t <- spTransform(ori, CRSobj = CRS("+init=epsg:3857"))
我首先根据起点的纬度和经度创建了一个SpatialPoints
对象。之后,我使用spTransform
进行投影转换。现在ori_t
对象是使用球形墨卡托投影的原点。请注意,球形墨卡托的EPSG代码为3857
。
要查看坐标值,我们可以使用如下的coordinates
函数。
coordinates(ori_t)
coords.x1 coords.x2
[1,] 13692297 781182.2
4. 确定网格的范围
现在我需要决定能够覆盖所有四个点和克里金插值所需区域的网格范围,这取决于单元格大小和单元格数量。以下代码根据信息设置了范围。我决定单元格大小为1公里*1公里,但需要尝试找出适合x和y方向的单元格数量。
# The origin has been rounded to the nearest 100
x_ori <- round(coordinates(ori_t)[1, 1]/100) * 100
y_ori <- round(coordinates(ori_t)[1, 2]/100) * 100
# Define how many cells for x and y axis
x_cell <- 250
y_cell <- 200
# Define the resolution to be 1000 meters
cell_size <- 1000
# Create the extent
ext <- extent(x_ori, x_ori + (x_cell * cell_size), y_ori, y_ori + (y_cell * cell_size))
根据我创建的范围,我可以创建一个所有数字都等于0
的栅格图层。然后我可以再次使用mapview
函数来查看栅格和四个站点是否匹配良好。
ras <- raster(ext)
res(ras) <- c(cell_size, cell_size)
ras[] <- 0
projection(ras) <- CRS("+init=epsg:3857")
mapview(station) + mapview(ras)
我重复了这个过程好几次。最终我决定在x和y方向上分别使用 250
和 200
个单元格。
5. 创建空间网格
现在我已经创建了一个适当范围的光栅图层。我可以先将此光栅图层保存为 GeoTiff 以备将来使用。
writeRaster(ras, filename = "ras.tif", format="GTiff")
最后,为了使用 gstat
包中的克里金函数,我需要将栅格转换为 SpatialPixels
。
# Convert to spatial pixel
st_grid <- rasterToPoints(ras, spatial = TRUE)
gridded(st_grid) <- TRUE
st_grid <- as(st_grid, "SpatialPixels")
st_grid
是一个 SpatialPixels
,可用于克里金插值。
这是一个迭代的过程来确定适当的格网。在整个过程中,用户可以根据其分析需求更改投影、起点、单元格大小或单元格数量。