使用不同的x,y分辨率从内核平滑创建光栅文件

时间:2016-03-02 16:21:57

标签: r gis raster kernel-density r-raster

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

以下是我运行的一些示例代码。我的数据预测为UTM30,WGS84:

Import-Csv "csvfile" |
 select-object -property * |
  out-gridview -OutputMode Single -Title 'Select a row' |
  ForEach-Object {
   $foldername,$driveLetter,$destinationDirectory = $_.Name,$_.location,$_.folder
  }

生成的栅格图层如下所示:

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')

但是当我尝试导出它时,我收到错误消息:

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)

我的问题是为什么我的决议有所不同,我该如何解决这个问题?

2 个答案:

答案 0 :(得分:2)

您可以将栅格重新采样为具有相同x和y分辨率的新栅格。您可能会以这种方式丢失一些信息。或者,您可以确保bkde2D中的网格化将平均划分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))

答案 1 :(得分:1)

您的示例有几个问题(包括我们无法重现它!)。它应该是这样的:

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')

这个对象没有错。但是您选择使用的文件格式无法保存这些数据。使用其他格式!例如:

writeRaster(est.raster, "kerntest.tif")

您还可以尝试使用range.x

强制bkde2D生成包含方形单元格的栅格
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')