Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 创建具有相同范围的多个密度贴图_R_Kernel Density_Tmap_Extent - Fatal编程技术网

R 创建具有相同范围的多个密度贴图

R 创建具有相同范围的多个密度贴图,r,kernel-density,tmap,extent,R,Kernel Density,Tmap,Extent,我正在尝试使用tmaptools包中的smooth\u map功能从点创建密度贴图(光栅)。我想为我的数据框(df)中变量(var)的每个因子级别创建一个光栅。所有光栅的范围都应该相同,由一个shapefile(study\u area)给出。我想将它们堆叠起来,然后使用levelplot进行打印 但是,该函数返回的所有光栅的范围略有不同。我不知道如何创建具有相同范围的密度贴图。代码如下: library(tmaptools) library(rgdal) library(sf) librar

我正在尝试使用
tmaptools
包中的
smooth\u map
功能从点创建密度贴图(光栅)。我想为我的数据框(
df
)中变量(
var
)的每个因子级别创建一个光栅。所有光栅的范围都应该相同,由一个shapefile(
study\u area
)给出。我想将它们堆叠起来,然后使用
levelplot
进行打印

但是,该函数返回的所有光栅的范围略有不同。我不知道如何创建具有相同范围的密度贴图。代码如下:

library(tmaptools) 
library(rgdal)
library(sf)
library(raster)

##reproducible example of dataframe
df<-setNames(data.frame(matrix(ncol = 3, nrow = 7)), c("longitude", "latitude", "var"))

df$longitude<-c(-53.30002, -50.47749, -55.85561, -57.88447, -55.83864, -58.84610, -57.49215)
df$latitude<-c(-13.037530,  -13.023480, -13.416200, -13.659120, -12.758670, -13.114460, -14.622520)
df$var<-c("A", "A", "A", "A", "B", "B", "B")

## convert var to factor
df$var<-as.factor(df$var)

##read shapefile of Mato Grosso, Brazil 
## shapefile can be downloaded from e.g. https://geo.nyu.edu/catalog/stanford-vw409fv3488
study_area<-readOGR("shape_MT.shp", layer="shape_MT") #will load the shapefile 

#create empty stack
s <- stack()

#loop over factor levels
for (i in levels(df$var)) { 
  a<-subset(df, df$var==i)
  my.sf.point <- st_as_sf(x = a, coords = c("longitude", "latitude"),crs = "+proj=longlat  +datum=WGS84 +ellps=WGS84 +towgs84=0,0,0")
  density_map <- smooth_map(my.sf.point, cover = study_area) 
  r<-density_map$raster
  print(extent(r))
  s <- stack(s,r)
}
库(tmaptools)
图书馆(rgdal)
图书馆(sf)
图书馆(光栅)
##数据帧的可再现示例

df也许这对你有用:

## convert var to factor
df$var<-as.factor(df$var)

## read shapefile of Mato Grosso, Brazil 
## shapefile can be downloaded from e.g. https://geo.nyu.edu/catalog/stanford-vw409fv3488
study_area<-readOGR("....", layer="...") 

你能添加一个数据样本来复制吗?@Ben添加了一个可复制的示例。这主要是因为两个光栅数据之间的单元分辨率不同,这在某种程度上也会影响范围(单元不是平方的)。你只需要在叠加之前对它们重新采样。如果这是你想要的,很容易修复!另外,作为一个建议,
+longlat
作为
crs
并不是内核密度的最佳选择。@Majid您认为什么是crs?我试着使用UTM,但我的研究领域包括不止一个UTM zonethank you,这真的很有帮助,解决了问题!
crs.laea <- CRS("+proj=aea +lat_1=-5 +lat_2=-42 +lat_0=-32 +lon_0=-60 +x_0=0 +y_0=0 +ellps=aust_SA +units=m +no_defs")
study_area <- spTransform(study_area, CRS = crs.laea)

#create empty stack
s <- list()

#loop over factor levels
for (i in levels(df$var)) { 
  a<-subset(df, df$var==i)
  my.sf.point <- st_as_sf(x = a, coords = c("longitude", "latitude"), crs = "+proj=longlat +ellps=aust_SA +no_defs")

  #reprojecting to ESRI:102033 South_America_Albers_Equal_Area_Conic
  my.sf.point <- st_transform(my.sf.point, 102033)
  density_map <- smooth_map(my.sf.point, cover = study_area, nrow = 514, ncol = 510) 
  r<-density_map$raster

  extent(r) <- c(-175916.2, 1048374, 1610251, 2845008) # extent of the study area
  plot(r)

  s[[i]] <- r
}

s[["A"]] <- resample(s[["A"]],s[["B"]],method='bilinear')

stack(s)