我将分享我为克里金法创建网格的方法。可能有更有效或更优雅的方式来完成相同的任务,但我希望这将是促进一些讨论的开始。
最初的海报是每 10 个像素考虑 1 公里,但这可能太多了。我将创建一个单元格大小等于 1 km * 1 km 的网格。另外,原始海报没有指定网格的原点,所以我会花一些时间来确定一个好的起点。我还假设球形墨卡托投影坐标系是投影的合适选择。这是谷歌地图或开放街道地图的常见投影。
1.加载包
我将使用以下软件包。sp
、rgdal
和raster
are 包为空间分析提供了许多有用的功能。leaflet
并且mapview
是用于快速探索性空间数据可视化的软件包。
# Load packages
library(sp)
library(rgdal)
library(raster)
library(leaflet)
library(mapview)
2. 车站位置的探索性可视化
我创建了一个交互式地图来检查四个站点的位置。因为原始海报提供了这四个站点的经纬度,所以我可以创建一个SpatialPointsDataFrame
带有纬度/经度的投影。请注意,纬度/经度投影的EPSG代码是4326
. 要了解有关 EPSG 代码的更多信息,请参阅本教程 ( https://www.nceas.ucsb.edu/~frazier/RSpatialGuides/OverviewCoordinateReferenceSystems.pdf )。
# Create a data frame showing the **Latitude/Longitude**
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)
# Convert to SpatialPointsDataFrame
coordinates(station) <- ~long + lat
# Set the projection. They were latitude and longitude, so use WGS84 long-lat projection
proj4string(station) <- CRS("+init=epsg:4326")
# View the station location using the mapview function
mapview(station)
该mapview
函数将创建一个交互式地图。我们可以使用这张地图来确定什么可能适合网格的原点。
3.确定产地
检查地图后,我认为原点可能在经度123
和纬度附近7
。该原点将位于网格的左下方。现在我需要在球形墨卡托投影下找到代表同一点的坐标。
# Set the origin
ori <- SpatialPoints(cbind(123, 7), proj4string = CRS("+init=epsg:4326"))
# Convert the projection of ori
# Use EPSG: 3857 (Spherical Mercator)
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
再次使用该功能来查看栅格和四个站点是否匹配良好。
# Initialize a raster layer
ras <- raster(ext)
# Set the resolution to be
res(ras) <- c(cell_size, cell_size)
ras[] <- 0
# Project the raster
projection(ras) <- CRS("+init=epsg:3857")
# Create interactive map
mapview(station) + mapview(ras)
我多次重复这个过程。最后我决定单元格的数量分别是x250
和200
y 方向。
5.创建空间网格
现在我已经创建了一个适当范围的栅格图层。我可以先将此栅格保存为 GeoTiff 以备将来使用。
# Save the raster layer
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
用于克里金法的。
这是确定合适网格的迭代过程。在整个过程中,用户可以根据分析需要更改投影、原点、像元大小或像元数。