lat long
7.16 124.21
8.6 123.35
8.43 124.28
8.15 125.08
考虑这些坐标,这些坐标对应于测量降雨数据的气象站。
R中gstat包的介绍使用了meuse数据集。在本教程的某些时候:https://rpubs.com/nabilabd/118172,这些人使用了" meuse.grid"在这行代码中:
data("meuse.grid")
我没有这样的文件,我不知道如何创建它,我可以使用这些坐标创建一个吗?或者至少向我指出讨论如何为自定义区域创建自定义网格的材料(即不使用GADM的管理边界)。
可能措辞错误,甚至不知道这个问题是否对R精明的人有意义。不过,我很乐意听到一些方向,或者至少是提示。非常感谢!
R的总瘤和统计数据。
编辑:请参阅我发布的教程看起来的样本网格,这是我想做的事情。
编辑2:这种方法是否可行? https://rstudio-pubs-static.s3.amazonaws.com/46259_d328295794034414944deea60552a942.html
答案 0 :(得分:9)
我将分享我为克里金创建网格的方法。可能有更高效或更优雅的方式来完成相同的任务,但我希望这将是一个促进一些讨论的开始。
原始海报每10个像素考虑1公里,但这可能太多了。我将创建一个单元格大小等于1 km * 1 km的网格。另外,原始海报没有指明网格的原点,所以我会花一些时间来确定一个好的起点。我还假设球形墨卡托投影坐标系是投影的合适选择。这是Google Map或Open Street Maps的常见投影。
我将使用以下软件包。 sp
,rgdal
和raster
包为空间分析提供了许多有用的功能。 leaflet
和mapview
是用于快速探索空间数据可视化的软件包。
# Load packages
library(sp)
library(rgdal)
library(raster)
library(leaflet)
library(mapview)
我创建了一个交互式地图来检查四个站的位置。因为原始海报提供了这四个站的纬度和经度,所以我可以使用纬度/经度投影创建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
函数将创建交互式地图。我们可以使用此映射来确定哪些适合网格的原点。
在检查地图后,我确定原点可以是经度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
现在我需要确定可以覆盖所有四个点和克里金法所需区域的网格范围,这取决于单元格大小和单元格数量。以下代码根据信息设置范围。我已经确定单元尺寸为1 km * 1 km,但我需要试验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)
我多次重复这个过程。最后,我确定x和y方向的单元格数分别为250
和200
。
现在我已经创建了一个具有适当范围的栅格图层。我可以先将此栅格保存为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
,可用于克里金法。
这是确定合适网格的迭代过程。在整个过程中,用户可以根据分析需要更改投影,原点,单元格大小或单元格数。
答案 1 :(得分:4)
如果您将研究区域作为多边形导入,导入为SpatialPolygons
,则可以使用包栅格对其进行栅格化,或使用sp::spsample
使用采样类型regular
对其进行采样
如果没有这样的多边形,可以使用expand.grid
创建定期分布在矩形长/纬度区域上的点,使用seq
生成一系列long和lat值。 / p>
答案 2 :(得分:3)
@yzw和@Edzer为创建常规矩形网格带来了好处,但有时需要在定义的多边形上创建不规则网格,通常用于克里金法< /强>
这是一个记录稀少的主题。 One good answer can be found here。我用以下代码扩展它:
考虑内置的meuse数据集。 meuse.grid
是一个不规则形状的网格。 我们如何为我们独特的研究区域制作像meuse.grid这样的网格?
library(sp)
data(meuse.grid)
ggplot(data = meuse.grid)+geom_point(aes(x=x, y=y))
想象一个形状不规则的SpatialPolygon
或SpatialPolygonsDataFrame
,称为spdf
。首先在其上构建一个规则的矩形网格,然后通过不规则形状的多边形对该规则网格中的点进行子集化。
SpatialPolygonsDataFrame
grd <- makegrid(spdf, n = 100)
colnames(grd) <- c('x','y')
SpatialPoints
并按多边形对这些点进行子集化。grd_pts <- SpatialPoints(coords = grd,
proj4string=CRS(proj4string(spdf)))
# find all points in `grd_pts` that fall within `spdf`
grd_pts_in <- grd_pts[spdf, ]
# transform grd_pts_in back into a data frame
gdf <- as.data.frame(coordinates(grd_pts_in))
ggplot(gdf) +
geom_point(aes(x=x,y=y))