使用栅格计算农药的平均施用量和总施用量,但未将数字相加

如何解决使用栅格计算农药的平均施用量和总施用量,但未将数字相加

我使用一个栅格文件,该文件具有2015年草甘膦对大豆的全球施用量(以千克/公顷为单位)。我想计算每个国家的平均施用量,并得出以千克为单位的总施用量。

我尝试提取数据,但是当我检查数据时,它们并没有加起来,因此我需要一些错误信息。

这是我的代码:

## Load libraries and read data ----
library(raster)
library(tidyverse)
library(maptools) # To get the borders of countries

# Border of countries
data(wrld_simpl)

# Make a data frame to put my numbers on the corresponding countries
world_data_empty = data.frame(country = wrld_simpl$NAME,iso3c = wrld_simpl$ISO3)

# This is a file with the application rate of glyphosate to soybeans in 2015 in kg/ha
raster_path = "https://raw.github.com/hansronald/Pesticide-data/master/APR_Soybean_Glyphosate_2015_L.tif"
sqm_to_ha_conversion = 0.0001
rast <- raster(raster_path)

## Extract the raster data ----

# Remove all the negative values of the raster
# This is because negative values correspond to things like water and I dont want them to count when adding,replace with NAs
# Then trim to remove NAs
rast_positive = rast
rast_positive <- clamp(rast,lower=0,useValues=FALSE)
rast_trimmed = trim(rast_positive)

# Multiply the kg/ha with the area of each cell to get the total kgs
rast_total_pesticide_application = rast_trimmed * area(rast_trimmed)

# Get the mean applcation rate (kg/ha) for each country
mean_application_rate_extract = raster::extract(rast_trimmed,wrld_simpl,fun = mean,na.rm = TRUE) # sp = T for keeping original dataframe

# Get the total applcation rate (kg/ha) for each country
total_application_extract = raster::extract(rast_total_pesticide_application,fun = sum,na.rm = TRUE)

# Get the total area 
total_area_extract = raster::extract(area(rast_trimmed),na.rm = TRUE)

## Create the data frame ----

# Put the mean pesticide use per country in a dataframe and name the column after the pesticide
# NaNs created because all raster cells are NA in country polygon,replace with 0
mean_application_rate_extract[is.nan(mean_application_rate_extract)] = 0
mean_application_rate = data.frame(mean_application_rate = mean_application_rate_extract)
total_application = data.frame(total_application = total_application_extract)
total_area = data.frame(total_area = total_area_extract)

world_data = data.frame(world_data_empty,mean_application_rate,total_application,total_area) %>% 
  as_tibble()

# Check calculations by selecting a few countries and multiplying apr*area
world_data %>% 
  filter(iso3c %in% c("CHN","BRA","USA")) %>% 
  mutate(total_application_calc = mean_application_rate * total_area)

这是输出

  country       iso3c mean_application_rate total_application total_area total_application_calc
  <fct>         <fct>                 <dbl>             <dbl>      <dbl>                  <dbl>
1 Brazil        BRA                    2.00          4253187.     84469.                168653.
2 China         CHN                    2.09          9153007.     93254.                194736.
3 United States USA                    1.93          5070446.     93889.                181164.

所以这里有一些问题。首先是total_application_calc应该等于总施用量(因为它是施用量(kg / ha)乘以总面积(ha)。

但是问题还在于整个应用程序似乎至少具有一个数量级。根据{{​​3}},2014年草甘膦在大豆上的总施用量为122,473,987磅,相当于55,553,266千克,而我从该数据集中获得的5,070,446千克。可以略有不同,因为它们是来自不同假设的不同来源,但是没有那么多。

有人可以在我做错事情的地方帮忙吗?

解决方法

我稍微简化了您的代码,现在我觉得数字更有意义。我不能说外部有效性问题。

library(raster)
library(maptools)
data(wrld_simpl)

r <- raster("https://raw.github.com/hansronald/Pesticide-data/master/APR_Soybean_Glyphosate_2015_L.tif")
r <- clamp(r,lower=0,useValues=FALSE)

# area in ha
a <- area(r) * 100

mean_app <- raster::extract(r,wrld_simpl,fun = mean,na.rm = TRUE)
rtot  <- r * a
tot_app  <- raster::extract(rtot,fun = sum,na.rm = TRUE)

我认为您在这里犯了一个错误。您需要使用非仅NA的单元格。

rarea <- mask(a,r)
tot_area <- raster::extract(rarea,na.rm = TRUE)
## not 
## tot_area <- raster::extract(area(r),na.rm = TRUE)

检查结果

w <- data.frame(country = wrld_simpl$NAME,iso3c = wrld_simpl$ISO3,mean_app=mean_app,tot_app=tot_app,tot_area=tot_area)
w$tot_calc <- w$tot_area * w$mean_app
w[is.na(w)] <- 0

w[w$iso3c %in% c("CHN","BRA","USA"),]
#          country iso3c mean_app   tot_app  tot_area  tot_calc
#21         Brazil   BRA 1.996631 425318662 213982181 427243427
#30          China   CHN 2.088219 915300667 439036703 916804725
#209 United States   USA 1.929559 507044556 263544939 508525402
  
global_app <- cellStats(rtot,"sum")
global_app
# 2375398749

sum(w$tot_app)
# 2367120358
 

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-
参考1 参考2 解决方案 # 点击安装源 协议选择 http:// 路径填写 mirrors.aliyun.com/centos/8.3.2011/BaseOS/x86_64/os URL类型 软件库URL 其他路径 # 版本 7 mirrors.aliyun.com/centos/7/os/x86
报错1 [root@slave1 data_mocker]# kafka-console-consumer.sh --bootstrap-server slave1:9092 --topic topic_db [2023-12-19 18:31:12,770] WARN [Consumer clie
错误1 # 重写数据 hive (edu)&gt; insert overwrite table dwd_trade_cart_add_inc &gt; select data.id, &gt; data.user_id, &gt; data.course_id, &gt; date_format(
错误1 hive (edu)&gt; insert into huanhuan values(1,&#39;haoge&#39;); Query ID = root_20240110071417_fe1517ad-3607-41f4-bdcf-d00b98ac443e Total jobs = 1
报错1:执行到如下就不执行了,没有显示Successfully registered new MBean. [root@slave1 bin]# /usr/local/software/flume-1.9.0/bin/flume-ng agent -n a1 -c /usr/local/softwa
虚拟及没有启动任何服务器查看jps会显示jps,如果没有显示任何东西 [root@slave2 ~]# jps 9647 Jps 解决方案 # 进入/tmp查看 [root@slave1 dfs]# cd /tmp [root@slave1 tmp]# ll 总用量 48 drwxr-xr-x. 2
报错1 hive&gt; show databases; OK Failed with exception java.io.IOException:java.lang.RuntimeException: Error in configuring object Time taken: 0.474 se
报错1 [root@localhost ~]# vim -bash: vim: 未找到命令 安装vim yum -y install vim* # 查看是否安装成功 [root@hadoop01 hadoop]# rpm -qa |grep vim vim-X11-7.4.629-8.el7_9.x
修改hadoop配置 vi /usr/local/software/hadoop-2.9.2/etc/hadoop/yarn-site.xml # 添加如下 &lt;configuration&gt; &lt;property&gt; &lt;name&gt;yarn.nodemanager.res