计算空间网格的每个网格单元内的采样点总数。
我想制作一个网格并计算每个网格单元中采样点的总数。我创建了一个随机生成的数据和网格,并尝试使用sf和raster包来计算网格单元内的记录数,并且使用了之前类似的SO问题,但没有成功。我也研究了提取功能。我对空间分析还很陌生。
library(sf)
library(raster)
library(tidyverse)
library(mapview)
library(mapedit)
#Trial with sf package
# load some spatial data. Administrative Boundary
#https://stackoverflow.com/questions/41787313/how-to-create-a-grid-of- spatial-points
aut <- getData('GADM', country = 'aut', level = 0)
aut <- st_as_sf(aut)
#Try with polygons
grid <- aut %>%
st_make_grid(cellsize = 0.5, what = "polygons") %>%
st_intersection(aut)
#fake data
lat<-runif(1000, 46.5, 48.5)
lon<-runif(1000, 13,16)
pos<-data.frame(lat,lon)
ggplot() +
geom_sf(data = aut) +
geom_sf(data = grid)+
geom_point(data=pos, aes(lon, lat))
#how to count number of records within each cell?
########################################
#Trial with raster package
#https://stackoverflow.com/questions/32889531/r-how-can-i-count-how- many-points-are-in-each-cell-of-my-grid
r<-raster(xmn=13, ymn=46.5, xmx=16, ymx=48.5, res=0.5)
r[] <- 0
#How do I use the pos data here
xy <- spsample(as(extent(r), 'SpatialPolygons'), 100, 'random')
tab <- table(cellFromXY(r, xy))
r[as.numeric(names(tab))] <- tab
plot(r)
points(xy, pch=20)
d <- data.frame(coordinates(r), count=r[])
我想获得一个包含采样点数量的表格。
答案 0 :(得分:1)
尝试
ggplot(pos, aes(x = lon, y=lat)) +
geom_bin2d(binwidth = 2) +
stat_bin_2d(aes(label=stat(count)), binwidth=2, geom="text", position="identity") +
scale_fill_gradient(low = "white", high = "red")
答案 1 :(得分:1)
计算lengths
的{{1}}(注意:不是st_intersects
)会为您提供每个网格单元中包含的点向量:
st_intersection
如果您随后希望将其作为library(sf)
library(raster)
library(tidyverse)
library(mapview)
library(mapedit)
#Trial with sf package
# load some spatial data. Administrative Boundary
#https://stackoverflow.com/questions/41787313/how-to-create-a-grid-of- spatial-points
aut <- getData('GADM', country = 'aut', level = 0)
aut <- st_as_sf(aut)
#Try with polygons
grid <- aut %>%
st_make_grid(cellsize = 0.5, what = "polygons") %>%
st_intersection(aut)
#fake data
lat<-runif(1000, 46.5, 48.5)
lon<-runif(1000, 13,16)
pos<-data.frame(lat,lon)
pos = st_as_sf(pos, coords = c("lon", "lat"), crs = 4326)
tab = st_intersects(grid, pos)
lengths(tab)
[1] 0 0 0 0 4 24 23 34 23 13 14 0 0 0 0 0 0 0 3 38 40 48 46 47 33 0 0 0 0 0 0 0
[33] 0 35 48 51 35 38 44 0 0 0 0 44 43 41 53 44 32 0 0 0 0 8 8 10 12 7 0 0 0 0 0
对象绑定到网格,则可以执行以下操作:
sf
答案 2 :(得分:1)
示例数据
library(raster)
aut <- getData('GADM', country = 'aut', level = 0)
r <- raster(aut, res=0.5)
lat <- runif(1000, 46.5, 48.5)
lon <- runif(1000, 13,16)
# note that you should use (lon, lat), in that order!
pos <- data.frame(lon, lat)
解决方案
r <- rasterize(pos, r, fun="count")
plot(r)
要获取表格,您可以
x <- rasterToPoints(r)
z <- cbind(cell=cellFromXY(r, x[,1:2]), value=x[,3])
head(z)
# cell value
#[1,] 22 4
#[2,] 23 45
#[3,] 24 36
#[4,] 25 52
#[5,] 26 35
#[6,] 27 38
或者,或者,na.omit(cbind(1:ncell(r), values(r)))