R中的线密度函数等效于ArcMap中的线密度工具(arcpy)

时间:2018-02-21 21:52:44

标签: r gis raster arcpy arcmap

我需要计算每个单元周围半径范围内折线的单位面积大小。基本上我需要计算500米像素搜索半径内的km / km2道路密度。 ArcMap有一个快速简便的工具来处理这个问题,但我需要一个纯粹的R解决方案。

以下是关于线密度如何工作的链接:http://desktop.arcgis.com/en/arcmap/10.3/tools/spatial-analyst-toolbox/how-line-density-works.htm

这是如何在python(arcpy)脚本中使用它:http://desktop.arcgis.com/en/arcmap/10.3/tools/spatial-analyst-toolbox/line-density.htm

我目前使用raster :: focal函数执行向后方法,计算道路要素中的燃烧密度。然后我将km2 / km2输出转换为km / km2。

#Import libraries
 library(raster)
 library(rgdal)
 library(gdalUtils)

#Read-in an already created raster mask (cells are all set to 0) 
mask <- raster("x://path to raster mask...")
#Make a copy of the mask to burn features in, keeping the original untouched
roads_mask <- file.copy(mask, "x://output path ...//roads.tif")

#Read-in road features (shapefile format)
roads_sldf <- readOGR("x://path to shapefile" , "roads")

#Rasterize spatial lines data frame ie. burn road features into mask
#Where road features get a value of 1, mask extent gets a value of 0
roads_raster <- gdalUtils::gdal_rasterize(src_datasource = roads_sldf, 
                dst_filename = "x://output path ...//roads.tif", b = 1,      
                burn = 1, l = "roads", output_Raster = TRUE)

#Run a 1km circular radius density function (be mindful of edge effects)
weight <- raster::focalWeight(roads_raster,1000,type = "circle")
1km_rdDensity <- raster::focal(roads_raster, weight, fun=sum, filename = '', 
                  na.rm=TRUE, pad=TRUE, NAonly=FALSE, overwrite=TRUE)

#Convert km2/km2 road density to km/km2
#Set up the moving window
weight <- raster::focalWeight(roads_raster,1000,type = "circle")
#Count how many records in each column of the moving window are > 0
columnCount <- apply(weight,2,function(x) sum(x > 0))
#Get the sum of the column count
number_of_cells <- sum(columnCount)
#multiply km2/km2 density by number of cells in the moving window
step1 <- roads_raster * number_of_cells
#Rescale step1 output with respect to cell size(30m) and radius of a circle
final_rdDensity <- (step1*0.03)/3.14159265

#Write out final km/km2 road density raster
writeRaster(final_rdDensity,"X://path to output...", datatype = 'FLT4S', overwrite = TRUE)

经过一些研究后,我想我可能会使用内核函数,但是我不想应用平滑算法......同时输出是一个&#39; im&#39;我需要写的一个对象作为&#39; tif&#39;

#Import libraries
library(spatstat)
library(rgdal)

#Read-in road features (shapefile format)
roads_sldf <- readOGR("x://path to shapefile" , "roads")

#Convert roads spatial lines data frame to psp object
psp_roads <- as.psp(roads_sldf)
#Apply kernel density, however this is where I am unsure of the arguments
road_density <- spatstat::density.psp(psp_roads, sigma = 0.01, eps = 500) 

干杯。

0 个答案:

没有答案