13.3.3 获取各项指标

本文介绍如何使用F#从世界银行API下载国家森林覆盖率等指标数据,包括异步及并行处理技术。
13.3.3 获取各项指标



若要获取有关国家或地区的数据,需要使用世界银行服务的不同函数。函数的路径是 /countries/indicators(/国家/指标),可以在 Data Calls 选项卡下的 Query Generator(查询生成器)中找到。能够请求指定国家特定时间段内的有关指标数据。不是单独下载我们感兴趣的数据每个区域,而是一次获取所有国家的信息,并在内存中处理。虽然以这种方式会下载更多的数据,但是,使用数量较少的请求,因为我们根本不必为每个区域创建请求。

我们将按照与以前相同的模式,首先下载部分示例数据,然后,使用我们的 XML 查询函数来检查。清单 13.11 显示了如何下载一个国家的森林覆盖率指标,这项指标的键是 AG.LND.FRST.ZS,最好办法是在查询生成器中模拟查询。我们将下载 1990 年的数据,并请求数据集的第一页。



Listing 13.11 Obtaining area covered by forests (F# Interactive)



> let ind = "AG.LND.FRST.ZS"
let date = "1990:1990"
let page = 1
let props =
[ "countries", "indicators"; ind ]
[ "date", date; "page", string(page) ];;
(...)

> let doc = Async.RunSynchronously(worldBankRequest(props))
printfn "%s..." (doc.ToString().Substring(0, 301));;
val doc : XDocument
<wb:data xmlns:wb="http://www.worldbank.org"
page="1" pages="3" per_page="100" total="231">
<wb:data>
<wb:indicator id="AG.LND.FRST.ZS">Forest area (% ...</wb:indicator>
<wb:country id="AW">Aruba</wb:country>
<wb:value></wb:value>
<wb:date>1990</wb:date>
</wb:data>...

> doc |> xnested [ "data" ]
|> xattr "pages" |> int;;
val it : int = 3

> doc |> xnested [ "data"; "data"; "country" ]
|> xvalue;;
val it : string = "Aruba"



清单 13.11 首先定义了一组为了创建请求而指定的属性。然后,创建一个用于 worldBankRequest 函数的属性列表。下载文档之后,想要探索其结构,所以,要把它转换成字符串,打印出前几行。输出表明,整个数据集有三个页。每个国家的信息被嵌套在 data 元素中,包含国家名和 ID,有关数据的信息,和实际值。对于第一个国家,这个值省略了,所以,在解析数据时,我们必须小心处理这种情况。

接下来,写了两个简单表达式,我们很快就会需要。首先,我们需要读出页数,这样,我们就能下载所有数据。第二个表达式读出第一个国家名,在后面会需要,因为,希望它与我们在上一节中收集的区域的名字相匹配。

现在,对于这些数据的结构,我们有一个很好的概念,就可以写函数,来下载我们所需的一切。清单 13.12 显示了一个异步的工作流,循环运行,直至获得所有页。我们没有并行下载页面,因为,这会稍微难写,但是,对于不同指标和不同年份,我们将并行运行相同的函数,这样,最终也会有足够的并行度。



Listing 13.12 Downloading all indicator data asynchronously (F#)



let rec getIndicatorData(date, indicator, page) = async {
let args = [ "countries"; "indicators"; ind ],
[ "date", date; "page", string(page)]
let! doc = worldBankRequest args

let pages =
doc |> xnested [ "data" ]
|> xattr "pages" |> int
if (pages = page) then
return [doc]
else
let page = page + 1
let! rest = getIndicatorData(date, indicator, page)
return doc::rest }



这个函数取日期、指标以及所需的页数作为参数,用它们来生成 worldBankRequest 函数参数值列表。当收到 XML 时,读出数据集总页数的属性。如果当前正在处理的页是最后一个,我们就会返回只有一个元素的列表,包含在当前页。否则,我们需要下载其余页。注意,该函数用 let rec 声明,所以,我们可以递归地调用它,获得剩余页。还使用了 let!,因为是在异步工作流的内部。一旦得到了其余页的列表,再加上刚刚下载的页,就可以返回所有页作为结果。

在继续之前,可以使用 F# Interactive 来验证函数的正确性。制作一个要求,指标为 AG.LND.FRST.ZS,年度范围 1990:1990,页数为 1。当使用 Async.RunSynchronously,运行该工作流,应该得到三页,包含有关所有国家和地区的数据。

现在,让我们介绍一下并行度,下载我们感兴趣年度的所有指标。我们将使用 Async.Parallel 基元,因此,需要创建异步工作流的序列。清单 13.13 中的代码通过使用简单的序列表达式,调用 getIndicatorData 函数,实现所有参数的组合来实现。别忘了,调用 getIndicatorData 不执行读取,它返回可以执行读取的工作流。



Listing 13.13 Downloading multiple indicators for multiple years in parallel (F#)



let downloadAll = seq {
for ind in [ "AG.SRF.TOTL.K2"; "AG.LND.FRST.ZS" ] do
for year in [ "1990:1990"; "2000:2000"; "2005:2005" ] do
yield getIndicatorData(year, ind, 1) }

let data = Async.RunSynchronously(Async.Parallel(downloadAll))



脚本首先为我们感兴趣的指标和年度的每个组合,生成工作流,然后,它将所有工作流组合为平行运行的一个,并同步运行,来下载所有数据。

序列表达式首先迭代两个指标。第一个表示国家或地区总面积,以平方公里计,第二个是森林覆盖的百分比,正如我们已经看到的。如果在世界银行的网站上看数据的话,可以看到,森林覆盖指标只供三个不同年份,因此,嵌套的循环只遍历这些年份。对于这些参数的每个组合,我们创建 (产生)一个工作流,第一页开始运行下载。

这意味着,我们就会得到总共六个任务,其中每一个都可能下载多个页面。我们将这些任务组合到一个工作流,返回这六个结果的一个数组,使用 Async.RunSynchronously 运行组合的工作流。下载可能花一些时间,可能看到一些请求会失败,然后重新启动,正如我们前面讨论的。我们得到的 data 值的类型,结果是 array<list<XDocument>>。这个数组包含了页面列表,返回了每个指标-年组合。

因为我们正在写一个 F# 脚本,不必担心读写配置文件,比如年和指标。此刻,我们写的代码只有一个目的。我们以后可以修改它,使它更通用,但是,可以在后来的开发中碰到。现在,我们已经检索了所需要的数据,用它来一些有用的事情。


同步定位与地图构建(SLAM)技术为移动机器人或自主载具在未知空间中的导航提供了核心支撑。借助该技术,机器人能够在探索过程中实时构建环境地图并确定自身位置。典型的SLAM流程涵盖传感器数据采集、数据处理、状态估计及地图生成等环节,其核心挑战在于有效处理定位与环境建模中的各类不确定性。 Matlab作为工程计算与数据可视化领域广泛应用的数学软件,具备丰富的内置函数与专用工具箱,尤其适用于算法开发与仿真验证。在SLAM研究方面,Matlab可用于模拟传感器输出、实现定位建图算法,并进行系统性能评估。其仿真环境能显著降低实验成本,加速算法开发与验证周期。 本次“SLAM-基于Matlab的同步定位与建图仿真实践项目”通过Matlab平台完整再现了SLAM的关键流程,包括数据采集、滤波估计、特征提取、数据关联与地图更新等核心模块。该项目不仅呈现了SLAM技术的实际应用场景,更为机器人导航与自主移动领域的研究人员提供了系统的实践参考。 项目涉及的核心技术要点主要包括:传感器模型(如激光雷达与视觉传感器)的建立与应用、特征匹配与数据关联方法、滤波器设计(如扩展卡尔曼滤波与粒子滤波)、图优化框架(如GTSAM与Ceres Solver)以及路径规划与避障策略。通过项目实践,参与者可深入掌握SLAM算法的实现原理,并提升相关算法的设计与调试能力。 该项目同时注重理论向工程实践的转化,为机器人技术领域的学习者提供了宝贵的实操经验。Matlab仿真环境将复杂的技术问题可视化与可操作化,显著降低了学习门槛,提升了学习效率与质量。 实践过程中,学习者将直面SLAM技术在实际应用中遇到的典型问题,包括传感器误差补偿、动态环境下的建图定位挑战以及计算资源优化等。这些问题的解决对推动SLAM技术的产业化应用具有重要价值。 SLAM技术在工业自动化、服务机器人、自动驾驶及无人机等领域的应用前景广阔。掌握该项技术不仅有助于提升个人专业能力,也为相关行业的技术发展提供了重要支撑。随着技术进步与应用场景的持续拓展,SLAM技术的重要性将日益凸显。 本实践项目作为综合性学习资源,为机器人技术领域的专业人员提供了深入研习SLAM技术的实践平台。通过Matlab这一高效工具,参与者能够直观理解SLAM的实现过程,掌握关键算法,并将理论知识系统应用于实际工程问题的解决之中。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
ERROR TypeError: Cannot convert undefined or null to object TypeError: Cannot convert undefined or null to object at Function.assign () at /home/project/wdckqx/sc-jygl-nbwz-web-yzl/node_modules/.pnpm/@dcloudio+vue-cli-plugin-uni@2.0.2-4070620250821001/node_modules/@dcloudio/vue-cli-plugin-uni/lib/chain-webpack.js:53:34 at Object.tap (/home/project/wdckqx/sc-jygl-nbwz-web-yzl/node_modules/.pnpm/webpack-chain@6.5.1/node_modules/webpack-chain/src/Use.js:14:20) at /home/project/wdckqx/sc-jygl-nbwz-web-yzl/node_modules/.pnpm/@dcloudio+vue-cli-plugin-uni@2.0.2-4070620250821001/node_modules/@dcloudio/vue-cli-plugin-uni/lib/chain-webpack.js:53:12 at Array.forEach () at /home/project/wdckqx/sc-jygl-nbwz-web-yzl/node_modules/.pnpm/@dcloudio+vue-cli-plugin-uni@2.0.2-4070620250821001/node_modules/@dcloudio/vue-cli-plugin-uni/lib/chain-webpack.js:22:17 at /home/project/wdckqx/sc-jygl-nbwz-web-yzl/node_modules/.pnpm/@vue+cli-service@5.0.9_prettier@3.6.2_sass-loader@13.3.3_vue-template-compiler@2.7.16_vue@2.7.16_webpack-sources@1.4.3/node_modules/@vue/cli-service/lib/Service.js:268:40 at Array.forEach () at Service.resolveChainableWebpackConfig (/home/project/wdckqx/sc-jygl-nbwz-web-yzl/node_modules/.pnpm/@vue+cli-service@5.0.9_prettier@3.6.2_sass-loader@13.3.3_vue-template-compiler@2.7.16_vue@2.7.16_webpack-sources@1.4.3/node_modules/@vue/cli-service/lib/Service.js:268:26) at Service.resolveWebpackConfig (/home/project/wdckqx/sc-jygl-nbwz-web-yzl/node_modules/.pnpm/@vue+cli-service@5.0.9_prettier@3.6.2_sass-loader@13.3.3_vue-template-compiler@2.7.16_vue@2.7.16_webpack-sources@1.4.3/node_modules/@vue/cli-service/lib/Service.js:272:48) at PluginAPI.resolveWebpackConfig (/home/project/wdckqx/sc-jygl-nbwz-web-yzl/node_modules/.pnpm/@vue+cli-service@5.0.9_prettier@3.6.2_sass-loader@13.3.3_vue-template-compiler@2.7.16_vue@2.7.16_webpack-sources@1.4.3/node_modules/@vue/cli-service/lib/PluginAPI.js:132:25) at serve (/home/project/wdckqx/sc-jygl-nbwz-web-yzl/node_modules/.pnpm/@dcloudio+vue-cli-plugin-uni@2.0.2-4070620250821001/node_modules/@dcloudio/vue-cli-plugin-uni/commands/serve.js:51:31) at Service.run (/home/project/wdckqx/sc-jygl-nbwz-web-yzl/node_modules/.pnpm/@vue+cli-service@5.0.9_prettier@3.6.2_sass-loader@13.3.3_vue-template-compiler@2.7.16_vue@2.7.16_webpack-sources@1.4.3/node_modules/@vue/cli-service/lib/Service.js:262:12) at processTicksAndRejections (internal/process/task_queues.js:95:5) npm ERR! code ELIFECYCLE npm ERR! errno 1 npm ERR! jeecg-boot-h5@0.1.0 dev:h5: `cross-env NODE_ENV=development UNI_PLATFORM=h5 vue-cli-service uni-serve` npm ERR! Exit status 1 npm ERR! npm ERR! Failed at the jeecg-boot-h5@0.1.0 dev:h5 script. npm ERR! This is probably not a problem with npm. There is likely additional logging output above. npm ERR! A complete log of this run can be found in: npm ERR! /root/.npm/_logs/2025-10-29T03_03_43_662Z-debug.log  ELIFECYCLE  Command failed with exit code 1. 请帮我分析并解决以上问题
10-30
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值