R 从具有不同x、y分辨率的内核平滑创建光栅文件

R 从具有不同x、y分辨率的内核平滑创建光栅文件,r,gis,raster,kernel-density,r-raster,R,Gis,Raster,Kernel Density,R Raster,我有一组GPS数据,我正在尝试使用“kernsmooth”包中的bkde2d对其进行内核平滑。我在“ks”包中使用了Hpi带宽估计器来确定我的带宽,但是,当我运行内核平滑并将结果列表转换为光栅时,结果产品似乎具有不同的x、y分辨率,因此无法导出为ascii。当作为GRD文件导出时,也不可能将此光栅读入GIS工具,因为它似乎已损坏,可能是由于分辨率不同 下面是我运行的一些示例代码。我的数据以UTM30、WGS84的格式显示: bnd=Hpi(x=cbind(GPS$lon, GPS$lat)) c

我有一组GPS数据,我正在尝试使用“kernsmooth”包中的bkde2d对其进行内核平滑。我在“ks”包中使用了Hpi带宽估计器来确定我的带宽,但是,当我运行内核平滑并将结果列表转换为光栅时,结果产品似乎具有不同的x、y分辨率,因此无法导出为ascii。当作为GRD文件导出时,也不可能将此光栅读入GIS工具,因为它似乎已损坏,可能是由于分辨率不同

下面是我运行的一些示例代码。我的数据以UTM30、WGS84的格式显示:

bnd=Hpi(x=cbind(GPS$lon, GPS$lat))
coord <- cbind(GPS$lon, GPS$lat)

est <- bkde2D(coord, bandwidth=bnd, gridsize = c(4000L, 4000L))

est.raster = raster(list(x=est$x1,y=est$x2,z=est$fhat))
projection(est.raster) <- CRS("+proj=utm +ellps=WGS84 +datum=WGS84 +zone=30 +north +units=km")`
xmin(est.raster) <- min(GPS$lon)
xmax(est.raster) <- max(GPS$lon)
ymin(est.raster) <- min(GPS$lat)
ymax(est.raster) <- max(GPS$lat)

writeRaster(est.raster, "kerntest", format='ascii')
但是,当我尝试导出它时,会收到错误消息:

Error in .startAsciiWriting(x, filename, ...) : 
  x has unequal horizontal and vertical resolutions. Such data cannot be stored in arc-ascii format

我的问题是为什么我的分辨率不同,我应该如何解决这个问题?

您可以将光栅重新采样为具有相同x和y分辨率的新光栅。这样可能会丢失一些信息。或者,您可以确保bkde2D中的gridsize将平均分割x和y范围

est.raster <- raster::resample(est.raster, raster(ext=extent(c(415.2883, 544.9796, 6371.946, 6492.398)),resolution=0.03,crs=projection(est.raster))

est.raster您的示例存在几个问题(包括我们无法复制它!)。应该是这样的:

class       : RasterLayer 
dimensions  : 4000, 4000, 1.6e+07  (nrow, ncol, ncell)
resolution  : 0.03242282, 0.03011303  (x, y)
extent      : 415.2883, 544.9796, 6371.946, 6492.398  (xmin, xmax, ymin, ymax)
coord. ref. : +proj=utm +ellps=WGS84 +datum=WGS84 +zone=30 +units=km +towgs84=0,0,0 
data source : in memory
names       : layer 
values      : 0, 0.005935748  (min, max)
library(ks)
library(KernSmooth)
library(raster)

set.seed(0)
GPS <- data.frame(lon=runif(100), lat=runif(100)*2)
#bnd <- Hpi(GPS)
est <- bkde2D(GPS, bandwidth=0.1, gridsize = c(400L, 400L))

names(est) <- c('x', 'y', 'z')
est.raster <- raster(est)
# do not change the extent! 
projection(est.raster) <- "+proj=utm +zone=30 +north +units=km +datum=WGS84"

writeRaster(est.raster, "kerntest", format='ascii')
您还可以使用
range.x

est <- bkde2D(GPS, bandwidth=0.1, gridsize = c(400L, 800L), range.x=list(c(1/800,1-1/800), c(1/800,2-1/800)))

names(est) <- c('x', 'y', 'z')
est.raster <- raster(est)
projection(est.raster) <- "+proj=utm +zone=30 +north +units=km +datum=WGS84"

writeRaster(est.raster, "kerntest", format='ascii')
est
est <- bkde2D(GPS, bandwidth=0.1, gridsize = c(400L, 800L), range.x=list(c(1/800,1-1/800), c(1/800,2-1/800)))

names(est) <- c('x', 'y', 'z')
est.raster <- raster(est)
projection(est.raster) <- "+proj=utm +zone=30 +north +units=km +datum=WGS84"

writeRaster(est.raster, "kerntest", format='ascii')