首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >R中土地覆被面积的计算

R中土地覆被面积的计算
EN

Stack Overflow用户
提问于 2017-12-03 01:20:59
回答 2查看 4.3K关注 0票数 6

基本上,我以ASCII的形式计算了一个全局分布概率模型,例如:gdpmgdpm的值都在0到1之间。

然后,我从shape文件中导入了一个本地映射:

代码语言:javascript
运行
AI代码解释
复制
shape <- file.choose()  
map <- readOGR(shape, basename(file_path_sans_ext(shape)))

下一步,我对gdpm进行了栅格化,并使用本地地图进行了裁剪:

代码语言:javascript
运行
AI代码解释
复制
ldpm <- mask(gdpm, map)

然后,我将这个连续模型重新分类为一个离散模型(我将模型划分为6个层次):

代码语言:javascript
运行
AI代码解释
复制
recalc <- matrix(c(0, 0.05, 0, 0.05, 0.2, 1, 0.2, 0.4, 2, 0.4, 0.6, 3, 0.6, 0.8, 4, 0.8, 1, 5), ncol = 3, byrow = TRUE) 

ldpmR <- reclassify(ldpm, recalc)

我有一个裁剪和重新分类的栅格,现在我需要总结土地覆盖,即到每一层,我想计算它在当地地图的每个区域的面积的比例。(我不知道如何用术语来描述它)。我发现并效仿了一个例子(RobertH):

代码语言:javascript
运行
AI代码解释
复制
ext <- raster::extract(ldpmR, map)

tab <- sapply(ext, function(x) tabulate(x, 10))
tab <- tab / colSums(tab)

但我不确定它是否有效,因为tab的输出令人困惑。,那么如何正确计算土地覆盖面积呢?如何在每个多边形中应用正确的方法?

我的原始数据太大了,我只能提供另一个栅格(我认为这个例子应该应用不同的重新分类矩阵):

示例光栅

也可以生成测试光栅(RobertH):

代码语言:javascript
运行
AI代码解释
复制
library(raster)
s <- stack(system.file("external/rlogo.grd", package="raster")) 
writeRaster(s, file='testtif', format='GTiff', bylayer=T, overwrite=T)
f <- list.files(pattern="testtif_..tif")

我也有一个关于策划光栅的问题:

代码语言:javascript
运行
AI代码解释
复制
r <- as(r, "SpatialPixelsDataFrame")
r <- as.data.frame(r)
colnames(r) <- c("value", "x", "y")

我做这个转换是为了用ggplot2制作一个栅格图,有更简洁的方法吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-12-03 12:40:08

洛基的回答是好的,但这可以用光栅的方式,这是比较安全的。考虑坐标是角(经纬度)还是平面(投影)是很重要的。

示例数据

代码语言:javascript
运行
AI代码解释
复制
library(raster)
r <- raster(system.file("external/test.grd", package="raster"))
r <- r / 1000
recalc <- matrix(c(0, 0.05, 0, 0.05, 0.2, 1, 0.2, 0.4, 2, 0.4, 0.6, 3, 0.6, 0.8, 4, 0.8, 2, 5), ncol = 3, byrow = TRUE) 
r2 <- reclassify(r, recalc)

方法1.仅适用于平面数据

代码语言:javascript
运行
AI代码解释
复制
f <- freq(r2, useNA='no')
apc <- prod(res(r))
f <- cbind(f, area=f[,2] * apc)
f

#     value count    area
#[1,]     1    78  124800
#[2,]     2  1750 2800000
#[3,]     3   819 1310400
#[4,]     4   304  486400
#[5,]     5   152  243200

方法2.角数据(但也适用于平面数据)

代码语言:javascript
运行
AI代码解释
复制
a <- area(r2)
z <- zonal(a, r2, 'sum')
z
#     zone     sum
#[1,]    1  124800
#[2,]    2 2800000
#[3,]    3 1310400
#[4,]    4  486400
#[5,]    5  243200

如果你想用多边形来概括,你可以这样做:

代码语言:javascript
运行
AI代码解释
复制
# example polygons
a <- rasterToPolygons(aggregate(r, 25))

方法1

代码语言:javascript
运行
AI代码解释
复制
# extract values (slow)
ext <- extract(r2, a)

# tabulate values for each polygon
tab <- sapply(ext, function(x) tabulate(x, 5))
# adjust for area (planar data only)
tab <- tab * prod(res(r2))

# check the results, by summing over the regions
rowSums(tab)
#[1]  124800 2800000 1310400  486400  243200    

方法2

代码语言:javascript
运行
AI代码解释
复制
x <- rasterize(a, r2)
z <- crosstab(x, r2)
z <- cbind(z, area = z[,3] * prod(res(r2)))

检查结果:

代码语言:javascript
运行
AI代码解释
复制
aggregate(z[, 'area', drop=F], z[,'Var2', drop=F], sum)
  Var2    area
#1    1  124800
#2    2 2800000
#3    3 1310400
#4    4  486400
#5    5  243200

请注意,如果您正在处理lon/lat数据,则不能使用prod(res(r))获取单元格大小。我认为,在这种情况下,您需要使用area函数并对类进行循环。

你还问过密谋的事。有许多方法来绘制一个光栅*对象。基本原则是:

代码语言:javascript
运行
AI代码解释
复制
 image(r2)
 plot(r2)
 spplot(r2)

 library(rasterVis); 
 levelplot(r2)

更棘手的方法:

代码语言:javascript
运行
AI代码解释
复制
 library(ggplot2) # using a rasterVis method
 theme_set(theme_bw())
 gplot(r2) + geom_tile(aes(fill = value)) +
      facet_wrap(~ variable) +
      scale_fill_gradient(low = 'white', high = 'blue') +
      coord_equal()


 library(leaflet)
 leaflet() %>% addTiles() %>%
 addRasterImage(r2, colors = "Spectral", opacity = 0.8)       
票数 7
EN

Stack Overflow用户

发布于 2017-12-03 10:21:42

看上去你可以用像素的数量来得到面积。

让我们从一个可重复的例子开始:

代码语言:javascript
运行
AI代码解释
复制
r <- raster(system.file("external/test.grd", package="raster"))
plot(r)

由于这个栅格中的值在与您的数据不同的范围内,让我们将它们调整为您的值:

代码语言:javascript
运行
AI代码解释
复制
r <- r / 1000
r[r>1,] <- 1

之后,我们申请您的改叙:

代码语言:javascript
运行
AI代码解释
复制
recalc <- matrix(c(0, 0.05, 0, 0.05, 0.2, 1, 0.2, 0.4, 2, 0.4, 0.6, 3, 0.6, 0.8, 4, 0.8, 1, 5), ncol = 3, byrow = TRUE) 
r2 <- reclassify(r, recalc)
plot(r2)

现在,我们怎样才能得到这个区域?

由于您使用的是投影光栅,您可以简单地使用像素数和光栅分辨率。因此,我们首先需要检查投影的分辨率和地图单位:

代码语言:javascript
运行
AI代码解释
复制
res(r)
# [1] 40 40
crs(r)
# CRS arguments:
#   +init=epsg:28992
# +towgs84=565.237,50.0087,465.658,-0.406857,0.350733,-1.87035,4.0812 +proj=sterea
# +lat_0=52.15616055555555 +lon_0=5.38763888888889 +k=0.9999079 +x_0=155000
# +y_0=463000 +ellps=bessel +units=m +no_defs

现在,我们知道我们处理的是40 x40米的像素,因为我们有一个度量CRS。

让我们使用这些信息来计算每个类的面积。

代码语言:javascript
运行
AI代码解释
复制
app <- res(r)[1] * res(r)[2] # area per pixel

table(r2[]) * app
#      1       2       3       4       5 
# 124800 2800000 1310400  486400  243200 

关于地理坐标光栅的绘制,我想请您参考这里有个老问题

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47616990

复制
相关文章
Atom飞行手册翻译: 4.3 作用域设置、作用域和作用域描述符
Atom支持语言特定的设置。你可以在Markdown文件中软换行,或者在Python中把tab的宽度设置为4。
ApacheCN_飞龙
2022/11/27
4030
Atom飞行手册翻译: 4.3 作用域设置、作用域和作用域描述符
为matplotlib设置不同的主题
所谓主题,其实就是一套样式规则,对背景色,坐标轴,标题等图形基本元素的样式进行设定。R语言的ggplot2中,通过theme来指定图片主题,既可以采用系统自带的主题,也可以自定义其中的各个元素。
生信修炼手册
2020/09/04
2K0
为matplotlib设置不同的主题
git为不同的项目设置不同的邮箱
在我们使用Git开发项目的时候,可能经常会碰到个人和公司开发的项目都在一台机器上的情况。不管你们有没有,反正我是碰到了。因为公司有公司自己分配的邮箱,而我自己喜欢用自己的邮箱开发自己的项目。这样可能会导致邮箱混用的情况。
魔王卷子
2019/05/31
1.4K0
全局作用域、函数作用域、块级作用域的理解
ES6中新增的概念,在ES5中是没有的,ES5中没有? 没有的时候我们代码也写的好好的,现在新增的概念,我不用不行吗? 来,拋一个典型的问题出来,你就明白块级作用域出现的重要性了。
yuezhongbao
2019/02/26
3.1K0
全局作用域、函数作用域、块级作用域的理解
作用域与作用域链
通常来说,一段程序代码中所用到的名字并不总是有效或可用的,而限定这个名字的可用性的代码范围就是这个名字的作用域scope。当一个方法或成员被声明,他就拥有当前的执行上下文context环境。在有具体值的context中,表达式是可见也都能够被引用。如果一个变量或者其他表达式不在当前的作用域,则将无法使用。作用域也可以根据代码层次分层,以便子作用域可以访问父作用域,通常是指沿着链式的作用域链查找,而不能从父作用域引用子作用域中的变量和引用。
WindRunnerMax
2020/08/27
1.9K0
3分钟短文:Laravel模型作用域,为你“节省”更多代码
原则上代码写一次,处处是引用,不需要大量的冗余代码,这是一种趋势,也是提高代码健壮性的努力方向。
程序员小助手
2020/10/04
1.4K0
作用域和作用域链的简单理解
javascript采用的静态作用域,也可以称为词法作用域,意思是说作用域是在定义的时候就创建了, 而不是运行的时候。此话对于初学者很不好理解,看看下面这个例子:
ZEHAN
2020/09/23
8320
作用域和作用域链的简单理解
JavaScript中的作用域和作用域链
作用域是在运行时代码中的某些特定部分中变量,函数和对象的可访问性。换句话说,作用域决定了代码区块中变量和其他资源的可见性。可能这两句话并不好理解,我们先来看个例子:
刘亦枫
2020/03/19
2.2K0
JavaScript中的作用域和作用域链
java作用域-什么是JavaScript作用域、作用域链?
作用域、作用域链也是面试中出镜率很高的问题之一java作用域java作用域,同时也是中最重要的基础概念之一。
宜轩
2022/12/29
2K0
Rust中的作用域及作用域的规则
所有权是 Rust 最独特的特性,它使 Rust 能够在不需要 GC 的情况下保证内存安全。在本章中,我们将讨论所有权以及几个相关特性:借用/切片,以及 Rust 如何在内存中布局数据。
端碗吹水
2022/06/02
4K1
Rust中的作用域及作用域的规则
作用域及作用域链的解释说明
javascript中作用域是指变量与函数可访问的范围。作用域分为两类,一种是全局作用域,一种是局部作用域。全局变量拥有全局作用域,在JavaScript代码中的任何地方都有定义。局部变量是在函数体内声明而且只作用在函数体内部以及该函数体的子函数的变量。下面我们对全局作用域和局部作用域来做一个深入的理解。
OECOM
2020/07/02
1.2K0
作用域及作用域链的解释说明
【RecyclerView】 九、为 RecyclerView 设置不同的布局样式
① 自定义 RecyclerView.Adapter 泛型类型 : 适配器的泛型类型需要设置为 RecyclerView.ViewHolder , 这是所有 ViewHolder 的基类 ;
韩曙亮
2023/03/28
9430
【RecyclerView】 九、为 RecyclerView 设置不同的布局样式
静态作用域和动态作用域
所谓作用域规则就是程序解析名字的方法。如果一个变量的名称不在当前作用域内,则这样的变量称为 unbound variable,例如有一个函数 (lambda () (+ a a)),a 就是一个 unbound variable,在当前作用域内我们无法找到这个变量。那么调用这个函数的求值结果是什么呢?显然要根据 context 来确定,对于 unbound variables 的解析,从解析的时机来划分,有两种规则,一种是「静态作用域」(Static Scope)也被称为「词法作用域」(Lexical Scope),另一种是「动态作用域」(Dynamic Scope)1。
zhiruili
2021/08/10
2.2K0
作用域、执行环境、作用域链
作用域,之前有介绍过,JavaScript无块级作用域,只有函数作用域,简单点说就是JavaScript的作用域就是函数作用域。因为有函数作用域,所以我们有全局作用域和局部作用域的说法。
wade
2020/04/23
1.5K0
JS作用域和作用域链
全局变量的作用域是全局性的,即在JavaScript代码中,该全局变量处处都有定义。
前端_AWhile
2019/08/29
4.2K0
JS作用域和作用域链
JavaScript作用域及作用域链
作用域 作用域规定了如何查找变量,也就是确定当前执行代码对变量的访问权限。 JavaScript 采用词法作用域(lexical scoping),也就是静态作用域。 因为 JavaScript 采用的是词法作用域,函数的作用域在函数定义的时候就决定了。 而与词法作用域相对的是动态作用域,函数的作用域是在函数调用的时候才决定的。
青梅煮码
2023/03/02
1.6K0
JavaScript 作用域和作用域链
作用域就是变量与函数的可访问范围。在JavaScript中,变量的作用域有全局作用域和局部作用域两种。
零式的天空
2022/03/02
1.8K0
函数作用域和块作用域
正如上一章讨论,作用域包含了一系列的“气泡”,每一个都可以作为容器,其中包含了标识符(变量、函数)的定义,这些气泡互相嵌套并且整齐地排列成蜂窝型,排列的结构是在写代码时定义的。
Karl Du
2020/10/23
2.4K0
java作用域-javaScript预编译、作用域,作用域链详解
  ES5中只分为全局作用域和函数作用域java作用域,也就是说for,if,while等语句是不会创建作用域的。ES6(let,const)除外。
宜轩
2022/12/29
1.5K0
点击加载更多

相似问题

如何使用设计为不同的用户模型配置路由?

16

以作用域为不同类的别名Rails模型

14

为域模型设计类图

35

不同模型上的条件作用域

10

Spring Prototype作用域bean,配置的设计模式

23
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档