Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何对面积变量的矢量进行栅格化?

如何对面积变量的矢量进行栅格化?
EN

Stack Overflow用户
提问于 2022-04-11 01:38:23
回答 2查看 362关注 0票数 0

我多次使用了同样的光栅化过程,效果相当好:

代码语言:javascript
运行
AI代码解释
复制
raster <- rasterize(vect(shapefile.shp), base_grid, "my_variable")

其中光栅是光栅化的形状文件,shapefile.shp是原始矢量,base_grid是光栅骨架,"my“是要考虑的变量。对于与多边形面积无关的变量,这种方法是令人满意的,因为它使用平均计算来重新排列数据(例如:人口、生产、产量、温度、降水量)。

然而,现在我试图从矢量转换为栅格多边形,这些多边形具有可变的收获面积,这不是严格意义上的多边形的区域,而是可以被认为是与整个多边形面积成正比的区域。上述方法在考虑收获面积时会产生膨胀值(是对应向量的3-4倍),这可能是因为多边形通常比网格单元大。因此,一个包含100个单元的大多边形被划分成10个网格单元,每个单元将给出100个单元,而我希望它们每个都有10个单元(因为它是一个区域)。

我认为我的方法是这样的:“在每个网格单元中,加权平均所有多边形的值与它们在网格单元中的存在成正比。”

但我要寻找的是:“对于每个网格单元中的每个多边形部分,计算网格单元内多边形的比例(wrt与总多边形面积),并将网格单元内的所有值之和(因为它是一个区域单位)”。

任何帮助都是非常感谢的。

更新:

矢量数据的视图。光栅其实很多,因为我有好几年的时间:

代码语言:javascript
运行
AI代码解释
复制
Simple feature collection with 9382 features and 3 fields
Geometry type: MULTIPOLYGON
Dimension:     XYZ
Bounding box:  xmin: -67.38379 ymin: -41.03791 xmax: -53.63737 ymax: -21.99877
z_range:       zmin: 0 zmax: 0
Geodetic CRS:  WGS 84
First 10 features:
       ADM2_REF anio my_variable                       geometry
2  Tres Arroyos 1978                     180 MULTIPOLYGON Z (((-60.16947...
3  Tres Arroyos 1979                       0 MULTIPOLYGON Z (((-60.16947...
4  Tres Arroyos 1988                    1000 MULTIPOLYGON Z (((-60.16947...
5  Tres Arroyos 1989                    1000 MULTIPOLYGON Z (((-60.16947...
6  Tres Arroyos 1990                    3000 MULTIPOLYGON Z (((-60.16947...
7  Tres Arroyos 1991                    1500 MULTIPOLYGON Z (((-60.16947...
8  Tres Arroyos 1992                    2800 MULTIPOLYGON Z (((-60.16947...
9  Tres Arroyos 1993                    2800 MULTIPOLYGON Z (((-60.16947...
10 Tres Arroyos 1994                    2500 MULTIPOLYGON Z (((-60.16947...
11 Tres Arroyos 1995                    1250 MULTIPOLYGON Z (((-60.16947...

将上面的数据文件转换为光栅的步骤如下:

代码语言:javascript
运行
AI代码解释
复制
baserast <- rast(nrows=nrows, ncol=nrows,
                 extent= extent,
                 crs="+proj=longlat +datum=WGS84",
                 vals=NA)

rasters <- rast(lapply(1978:2019, 
                       function(x)
                         rasterize(vect(shp.soy.yld.arg %>% 
                                          filter(anio==x)), baserast, "my variable")))

链接一年的数据.gpkg (对所有年份来说都太大了)。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-04-11 08:51:02

在这种情况下,你应该用栅格化密度而不是面积。

示例数据:

代码语言:javascript
运行
AI代码解释
复制
library(terra)
f <- system.file("ex/lux.shp", package="terra")
v <- vect(f)
# all areas have 100 ha of the crop
v$crop_area <- 100
r <- rast(v, res=.01)    

计算密度

代码语言:javascript
运行
AI代码解释
复制
e <- expanse(v, unit="ha") # or "km" to avoid small numbers
v$density <- v$crop_area / e

拉斯特尔

代码语言:javascript
运行
AI代码解释
复制
x <- rasterize(v, r, "density")

返回地区

代码语言:javascript
运行
AI代码解释
复制
ra <- cellSize(r, unit="ha")         
area <- x * ra

检查数字是否合理(大面积/小单元的误差应最小)。每个多边形的期望值为100。

代码语言:javascript
运行
AI代码解释
复制
extract(area, v, sum, na.rm=TRUE, exact=TRUE) |> round()
#      ID density
# [1,]  1      99
# [2,]  2     101
# [3,]  3      99
# [4,]  4      95
# [5,]  5      99
# [6,]  6      98
# [7,]  7      96
# [8,]  8      99
# [9,]  9      98
#[10,] 10      98
#[11,] 11     101
#[12,] 12     100

下面,我将展示如何在多年的循环中完成此操作。

示例数据:

代码语言:javascript
运行
AI代码解释
复制
library(terra)
f <- system.file("ex/lux.shp", package="terra")
v <- vect(f)
# all areas have 100 ha of the crop
v$crop_area <- 100
v$year <- rep(c(1990,1991, 1992), each=4)
r <- rast(v, res=.01)    

解决方案

代码语言:javascript
运行
AI代码解释
复制
ra <- cellSize(r, unit="ha")         
e <- expanse(v, unit="ha") 
v$density <- v$crop_area / e

years <- unique(v$year)
out <- list()
for (i in 1:length(years)) {
   vv <- v[v$year == years[i], ]
   x <- rasterize(vv, r, "density")
   out[[i]] <- x * ra
}
out <- rast(out)
names(out) <- years

out
#class       : SpatRaster 
#dimensions  : 73, 78, 3  (nrow, ncol, nlyr)
#resolution  : 0.01, 0.01  (x, y)
#extent      : 5.74414, 6.52414, 49.44781, 50.17781  (xmin, xmax, ymin, ymax)
#coord. ref. : lon/lat WGS 84 (EPSG:4326) 
#sources     : memory  
#              memory  
#              memory  
#names       :      1990,      1991,      1992 
#min values  : 0.2544571, 0.3028134, 0.3200223 
#max values  : 1.0492719, 0.6249076, 0.4335355 
票数 1
EN

Stack Overflow用户

发布于 2022-04-11 06:17:48

如果我很好地理解你的问题(一个可重复的例子会很好),你会希望所有的像素在栅格化多边形之和的收获值("my_variable“在您的代码)。

在这里,我创建了一个玩具示例,向您展示我的推理:

  1. 首先加载库
  2. 用一个示例创建玩具数据总数和收获面积
  3. 计算多边形覆盖的每个像素的分数。
  4. 将每个覆盖部分除以多边形的总面积,再乘以收获的面积。 图书馆(Sf)图书馆(栅格)图书馆(正式版) rast <-光栅:光栅(矩阵(rep(1,100),ncol=10),xmn=0,ymn=0,xmx=10,ymx=10) pol <- ymn=0 c(1,0,4,1) pol <- st_sf(data.frame(area = st_area(pol),harvest=0.7,(geom=pol)光栅::情节( cov_frac )光栅::情节(波尔,波尔)cov_frac <- exactextractr::coverage_fraction(rast,pol)[1]光栅:情节(Cov_frac)光栅:情节(pol,add=T)结果<- cov_frac/st_area(Pol)*$收获费(值(结果))

正如您所看到的,在栅格化多边形中所有像素的和等于所获取的面积。

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

https://stackoverflow.com/questions/71825642

复制
相关文章
传统 for 循环的函数式替代方案
在 Java 语言的第 1 个版本中就开始引入了传统的 for 循环,它的更简单的变体 for-each 是在 Java 5 中引入的。大部分开发人员更喜欢使用 for-each 执行日常迭代,但对于迭代一个范围或跳过范围中的值等操作,他们仍会使用 for。
IT小马哥
2020/03/18
3K0
Java 中for循环和foreach循环哪个更快?
在Java编程中,循环结构是程序员常用的控制流程,而for循环和foreach循环是其中比较常见的两种形式。关于它们哪一个更快的讨论一直存在。本文旨在探究Java中的for循环和foreach循环的性能差异,并帮助读者更好地选择适合自身需求的循环方式。通过详细比较它们的遍历效率、数据结构适用性和编译器优化等因素,我们将为大家揭示它们的差异和适用场景,以便您能够做出更明智的编程决策。
葡萄城控件
2023/10/16
7500
Java 中for循环和foreach循环哪个更快?
onpropertychange替代方案[通俗易懂]
大家好,又见面了,我是你们的朋友全栈君。 onpropertychange替代方案
全栈程序员站长
2022/08/01
1.4K0
Base:Acid的替代方案
作者:DAN PRITCHETT 译者:java达人 来源:https://queue.acm.org/detail.cfm?id=1394128(点击阅读原文前往) 在数据库分区中,以一致性换取可
java达人
2018/03/26
2.4K0
Base:Acid的替代方案
Web 框架的替代方案
在本系列第二部分中,Noam 提出了一些模式,说明如何直接用 Web 平台作为框架提供的一些解决方案的替代方案。
深度学习与Python
2022/04/19
2.7K0
Hugo .GitInfo 的替代方案
今天有人问我博客页脚 footer 里的 git hash 是怎么显示的,就是页面底部里的 69d6ffe 这一串数字。
eallion
2022/12/20
1.9K0
Hugo .GitInfo 的替代方案
探讨if...else的替代方案
假设我们要做一个计算器,实现加减乘除的需求。使用if...else...语句实现代码如下:
互联网金融打杂
2022/08/01
2.3K0
探讨if...else的替代方案
Flutter 中FlatButton的替代方案
最新版本的Flutter已将FlatButton标记为过时,我们可以使用 TextButton 或 ElevatedButton 来进行替代,FlatButton 与替代组件的参数会有差异。
xiangzhihong
2023/07/09
7710
企业用途的 V** 替代方案
虚拟专用网络 (VPN) 是最常用的远程网络连接解决方案之一。但是,它有许多限制,会对网络性能和安全性产生负面影响。使用更专业的远程解决方案替代 VPN ,可以提高安全性,同时还可以提高远程访问的质量和远程工作人员的工作效率。
Loki
2023/01/10
2.3K0
企业用途的 V** 替代方案
循环结构 if语句我替代语法
通过这两者的比较,我得出了一个结论,就是while是符合条件在执行语句,do while是先执行在判断是否符合条件 这两个都一样,但是while就像我想结婚了,所以我去求家长父母的同意是吧,他们同意了我和李文的婚事我们才能结婚,但是do while就有点不同了,他是私奔了呀,先结婚然后在慢慢跟各方家长说,家长同意了就行了一样的啦 问题:为什么都是执行10次,因为do while那里是$i++到10了啊就不符合条件了啊,所以才10次啊,像是我明天要给你十块钱,我不管你今天你花钱欠账明天再给商家也好,还是明天在花也好,就十块哈,一分也没有,就十块.do while就像是先花了,while就像是给再花哈哈哈哈,
贵哥的编程之路
2020/10/28
3640
循环结构 if语句我替代语法
break-跳出内循环
i = 1 j = 1 while i <= 10: print('第%d个碗' % i) while j <= 10: if j == 5: break else: print('这是内循环的第%d个碗' % j) j += 1 i += 1
汪凡
2018/05/29
8130
加油站智能视频监控系统方案
加油站智能视频监控系统方案利用加油站现场的已经装好的监控摄像头对加油站进行打电话识别、抽烟识别、明火烟雾识别、车辆识别。除此之外,加油站智能视频监控系统方案还可以对汽油静电释放检测、灭火器摆放识别、玩手机识别。有益于加油站安全隐患的管理把控,从根源上降低与分析安全隐患的主要原因,提升管控效率。
燧机科技
2022/10/03
6350
加油站智能视频监控系统方案
内拐角的铣削方案
利用编程半径 (圆弧铣) 来减少接触弧及径向切宽以减少振动趋势,从而在铣削内拐角时实现更大的切深和更高的进给率。
lrglu
2022/03/30
9100
内拐角的铣削方案
Electron中remote模块的替代方案
在Electron12时候被废弃,使用必须配置enableRemoteModule
码客说
2023/09/14
2.1K0
替代Websocket的解决方案:GoEasy
GoEasy这个库的适用场景:同Websocket的场景 在后台使用例如Java进行逻辑处理后将变量的值传入前台,前台不用发起请求即可接收后台发布的数据, 整个流程与Redis的Pub和Sub过程类似 整个交互类似Socket的长连接,前台首次调用不需要请求后台。 非常适合监控后台参数等场景;
ZONGLYN
2019/08/08
5.6K0
Java 高效编程·函数式替代 for 循环
虽然使用 range 没有显著减少代码量,但降低了它的复杂性,这么做的两个重要原因:
数媒派
2022/12/01
8000
Java 函数引用 替代方案
通过接口和内部类 举个例子吧 比如new一个线程 c#里是这样 Thread tr = new Thread(new ThreadStart(func)); 其中func是函数名 那么java里可以这样 Thread tr = new Thread() { public void run() {func();} }; 也没有多写多少代码
ApacheCN_飞龙
2019/02/15
8480
5 个 Docker 替代方案
提高容器安全性、Docker 未来的不确定性、技术战略变化和预算问题都可能促使企业寻找 Docker 的替代品作为其容器标准。
我的小碗汤
2023/03/19
2.5K0
5 个 Docker 替代方案
react useCallback完美替代方案
react函数组件为了保持引用不变,很多时候需要借助useCallback,但是useCallback强依赖于外部变量,必须传个依赖变量,万一漏传了很容易出问题。比较函数复杂时较麻烦,使用这个即可完美解决,引用不变,调用肯定是最新的,并且不需依赖
ACK
2021/01/21
1.6K0
点击加载更多

相似问题

我可以在Switch语句上使用对象吗?

354

可以在事件处理程序上使用延迟对象链吗?

11

可以使用对象而不是Switch语句吗?

31

是否可以在switch语句中使用switch语句?

22

可以在switch语句中使用类吗?

41
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

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

洞察 腾讯核心技术

剖析业界实践案例

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