(16)结论

本文由SCY翻译自《Geocomputation with R》第十六章

综合本书的内容,引用重复出现的主题/概念,并激发未来应用和发展的方向。本章不需要先修知识。然而,如果您已经阅读并尝试了第一部分(基础)中的练习,并考虑了地理计算如何帮助您解决工作、研究或其他问题,参考了第三部分(应用)中的章节,那么您可能会从中获得更多收益。

引言

与引言一样,这个结尾章节也包含了很少的代码块。其目的是综合本书的内容,引用重复出现的主题/概念,并激发未来应用和发展的方向。本章不需要先修知识。然而,如果您已经阅读并尝试了第一部分(基础)中的练习,并考虑了地理计算如何帮助您解决工作、研究或其他问题,参考了第三部分(应用)中的章节,那么您可能会从中获得更多收益。

本章的组织如下。选择包节讨论了在R中处理地理数据的各种选择。选择是开源软件的一个关键特性;本节提供了在不同选项之间进行选择的指导。空缺节描述了本书内容的不足之处,并解释了为什么一些研究领域被有意省略,而其他领域受到强调。这个讨论引出了一个问题(下一步节中得到解答):在阅读了本书之后,下一步去哪里?开源方法节回到了引言章中提出的更广泛问题。在这一部分中,我们将地理计算视为更广泛的“开源方法”的一部分,确保方法是公开可访问、可复现并受到协作社区的支持。本书的最后一节还提供了一些参与的指导。

选择包

R以及开源软件的一个一般特点是,通常有多种方法可以实现相同的结果。下面的代码块通过使用三个函数,这些函数在属性操作几何操作章中有介绍,将新西兰的16个地区合并为一个单一的几何图形:

1
2
3
4
5
6
7
8
library(spData)
nz_u1 = sf::st_union(nz)
nz_u2 = aggregate(nz["Population"], list(rep(1, nrow(nz))), sum)
nz_u3 = dplyr::summarise(nz, t = sum(Population))
identical(nz_u1, nz_u2$geometry)
#> [1] TRUE
identical(nz_u1, nz_u3$geom)
#> [1] TRUE

虽然结果对象 nz_u1nz_u3 的类、属性和列名不同,但它们的几何图形是相同的,可以通过使用基本的R函数 identical() 来验证。^[第一个操作由函数 st_union()\index{vector!union} 执行,创建了一个 sfc 类的对象(一个简单要素列)。后两个操作创建了 sf 对象,每个对象都包含一个简单要素列。因此,相同的是包含在简单要素列中的几何图形,而不是对象本身。]应该选择哪个呢?这取决于情况:前者仅处理包含在 nz 中的几何数据,因此速度更快,而其他选项执行了属性操作,这对于后续步骤可能有用。在使用基本的 R 函数 aggregate() 还是 dplyr 函数 summarise() 时,取决于个人偏好,后者在许多情况下更易读。

更重要的是,在R中处理地理数据时,通常有多种选择,甚至在单个包内也是如此。在考虑更多R包时,选择范围会进一步增加:例如,您可以使用较旧的 sp 包来实现相同的结果。然而,基于我们提供良好建议的目标,我们建议使用更近期、更高性能且未来可靠的 sf 包。在本书中展示的所有包都适用于同样的原则,尽管了解替代方案并能够为自己选择的软件进行合理的辩解可能会有所帮助(当不会分散注意力时)。

一个常见的选择,没有简单的答案,就是在地理计算中选择 tidyverse还是基本的R。例如,下面的代码块展示了在 tidyverse 和基本的R中从 nz 对象中提取 Name 列的方法,正如在属性操作章中描述的:

1
2
3
4
5
6
library(dplyr)                          # attach tidyverse package
nz_name1 = nz["Name"] # base R approach
nz_name2 = nz |> # tidyverse approach
select(Name)
identical(nz_name1$Name, nz_name2$Name) # check results
#> [1] TRUE

这引出了一个问题:该选择哪个呢?答案是:取决于情况。每种方法都有其优势:基本的 R 往往是稳定、众所周知的,且依赖性较小,因此在软件(包)开发中通常更受欢迎。另一方面,tidyverse 方法通常更适用于交互式编程。因此,在这两种方法之间做出选择是一种个人偏好和应用问题。

虽然本书涵盖了常常需要的函数,例如基本的 R [ 子集运算符和上面代码块中演示的 dplyr 函数 select(),但还有许多其他用于处理地理数据的函数,来自其他包,尚未提及。引言章提到了适用于处理地理数据的 20 多个有影响力的包,但在本书中只涵盖了其中几个。数以百计的其他包可用于在 R 中处理地理数据,并且每年都有更多的包在不断发展。截至 2023 年中,Spatial Task View 中提到的包超过 160 个,每年都会开发出无数用于地理数据分析的函数。

R 的空间生态系统的发展速度可能很快,但有许多策略可以处理多样的选择。我们的建议是从深入学习一种方法开始,但要对现有选项的广度有一个普遍的了解。这个建议同样适用于使用 R 解决地理问题,就像适用于其他领域的知识和应用一样。下一步章节涵盖了其他语言的发展。

当然,对于相同的任务,有些包的性能优于其他包,这种情况下了解哪个包更合适是很重要的。在本书中,我们的目标是专注于那些具有未来性(它们将在很长时间内工作)、高性能(相对于其他 R 包)的、得到很好维护的(拥有用户和开发者社区的支持)以及互补性的包。尽管我们使用的包存在重叠,就像在高级制图章中强调的制作地图的多样性包一样。

重叠的功能是有好处的。一个具有与现有包类似(但不完全相同)功能的新包可以增强韧性、性能(部分是由开发者之间的友好竞争和相互学习推动的)和选择性,这都是使用开源软件进行地理计算的关键优势。在这种情况下,决定使用 sftidyverseterra 或其他包的组合应该是在了解替代方案的基础上做出的。例如,sf 旨在替代的 sp 生态系统可以执行本书中涵盖的许多操作,由于其年龄较长,许多其他包都在其基础上构建。截至 2023 年 5 月,463 个包 DependImport sp,略高于 2018 年的 452 个,显示其数据结构被广泛使用,并且在许多方向上得到了扩展。sf 的相应数字分别为 2018 年的 69 个和 2023 年的 431 个,这突显了该包具有未来性,拥有不断增长的用户群和开发者社区。尽管以点模式分析而闻名,spatstat 包也支持栅格\index{raster}和其他矢量几何,提供了强大的空间统计功能等。如果您的需求在已建立的包中无法满足,还值得研究正在开发中的新替代方案。

空缺和重叠

地理计算是一个庞大的领域,因此这本书中不可避免地有一些空白。我们进行了选择,故意强调某些主题、技术和包,同时省略了其他内容。我们试图强调在实际应用中最常需要的主题,例如地理数据操作、坐标参考系统的基础知识、读/写数据操作和可视化技术。有些主题和主题会反复出现,目的是建立地理计算的基础技能,并向您展示如何进一步深入更高级的主题和特定应用。

我们故意省略了一些在其他地方有深入讨论的主题。例如,空间数据的统计建模,如点模式分析、空间插值(克里金法)和空间回归,在统计学习章的机器学习背景下有提及,但没有详细介绍。关于这些方法已有优秀的资源,包括统计导向章节,以及关于点模式分析、应用于空间数据的贝叶斯技术,以及特定应用方面的书籍,如健康和野火严重性分析。受到有限关注的其他主题包括遥感以及使用R与(而不是作为桥接到)专用GIS软件。关于这些主题有很多资源,包括@wegmann_remote_2016和来自马尔堡大学的GIS相关教学材料。

统计学习生态章中,我们更关注机器学习而非空间统计推断,因为有关这个主题的高质量资源很多。这些资源包括@zuur_mixed_2009、@zuur_beginners_2017,它们专注于生态学用例,以及在css.cornell.edu/faculty/dgr2托管的Geostatistics & Open-source Statistical Computing的免费教学材料和代码。R for Geographic Data Science提供了R用于地理数据科学和建模的入门。

我们基本上没有涉及到’大数据’地理计算,也就是那些不适合在高配置笔记本上运行的数据集。这一决定是基于大多数用于常见研究或政策应用的地理数据集确实适合在消费级硬件上运行,大型高分辨率遥感数据集是一个值得注意的例外(参见云服务节)。您可以在计算机上增加更多RAM,或者暂时在像GitHub Codespaces这样的平台上“租用”计算能力,以运行本书中的代码。此外,学习如何在小数据集上解决问题是解决大数据集问题的先决条件,本书的重点是入门,您在这里学到的技能在您转向更大的数据集时也将是有用的。'大数据’分析通常涉及从数据库中提取少量数据进行特定的统计分析。GIS章涵盖的空间数据库可以帮助分析不适合在内存中运行的数据集。'地球观测云后端’可以通过openeo包从R中访问,如openeo.org网站所述。如果您需要处理大型地理数据集,我们建议探索像Apache Sedona这样的项目以及新兴的文件格式,如GeoParquet

获取帮助

地理计算是一个庞大而具有挑战性的领域,几乎不可避免地会出现问题和暂时的工作障碍。在许多情况下,你可能会在数据分析流程的某个特定点“卡住”,面对难以调试的神秘错误信息。或者你可能会得到意外的结果,却鲜有线索来了解发生了什么。本节提供了一些指导,以帮助你通过明确地定义问题、搜索现有解决方案的知识,以及(如果这些方法没有解决问题)通过提出好问题来克服这些问题。

当你在某一特定点遇到困难时,首先值得退一步思考哪种方法最有可能解决这个问题。尝试以下列出的步骤——跳过已经尝试过的步骤——提供了一种结构化的问题解决方法:

  1. 确切地定义你试图实现的目标,从最基本的原则开始(通常如下所述,从一个草图开始)
  2. 通过运行和探索代码的单独行及其各个组件的输出,确切地诊断出代码中哪里出现了意外的结果(例如,在RStudio中,你可以通过用光标选择它们并按Ctrl+Enter来运行复杂命令的单个部分)
  3. 阅读在上一步被诊断为‘失败点’的函数的文档。仅仅通过了解函数所需的输入,以及运行通常在帮助页面底部提供的示例,就可以解决相当大比例的问题(例如,运行命令 ?terra::rast 并向下滚动到值得在开始使用该函数时复制的示例)
  4. 如果阅读R内置的文档,如上一步所述,没有帮助解决问题,那么可能是时候在网上进行更广泛的搜索,看看是否有其他人写过你所遇到的问题。以下列出了寻找帮助的地方
  5. 如果上面所有的步骤都失败了,并且你从在线搜索中也找不到解决方案,那么可能是时候用一个可复现的示例来组织一个问题,并在适当的地方发布了

以上概述的1到3步相对容易理解,但由于互联网的广阔和多种多样的搜索选项,值得在决定提出问题之前考虑有效的搜索策略。

在线搜索解决方案

搜索引擎是解决许多问题的合理起点。'Google一下’在某些情况下可能会发现关于你所遇到的确切问题的博客文章、论坛消息和其他在线内容。在这里简单地输入问题/问题的清晰描述是一个有效的方法,但重要的是要具体(例如,如果问题特定于数据集,则参考函数和软件包名称以及输入数据集来源)。您还可以通过包括额外的细节来提高在线搜索的效果:

  • 使用引号来最大化与您所遇到的确切问题有关的“命中”的机会,从而减少返回的结果数量。例如,如果你尝试并未能在已存在的位置保存一个GeoJSON文件,你会收到一个包含"GDAL Error 6: DeleteLayer() not supported by this dataset"的错误消息。具体的搜索查询,如"GDAL Error 6" sf,比不带引号的GDAL Error 6更有可能找到一个解决方案。
  • 设置时间限制,例如,仅返回在过去一年内创建的内容,在搜索关于不断演变的软件包的帮助时可能很有用。
  • 利用额外的搜索引擎功能,例如限制搜索内容只来自CRAN,使用site:r-project.org。

寻找(和提问)帮助的地方

在在线搜索没有找到解决方案的情况下,值得寻求帮助。有很多论坛可以做到这一点,包括:

  • R地理数据特别兴趣组邮件列表(R-SIG-GEO
  • GIS Stackexchange网站 gis.stackexchange.com
  • 大型和通用编程问答网站 stackoverflow.com
  • 与特定实体关联的在线论坛,例如 RStudio CommunityrOpenSci Discuss网络论坛,以及与特定软件工具关联的论坛,例如 Stan 论坛
  • 软件开发平台,如GitHub,它托管了大多数R-空间软件包的问题跟踪器,而且越来越多地有内置的讨论页面,例如为了鼓励围绕 sfnetworks 软件包(参见 luukvdmeer/sfnetworks/discussions)的讨论(而不仅仅是报告bug)而创建的。
  • 与如 rOpenScigeocompx 社区(该社区有一个 Discord 服务器,您可以在那里提问)相关联的在线聊天室和论坛,这本书也是其中的一部分。

使用 reprex 创建可复现的示例

在提出一个好问题方面,一个明确陈述的问题并由一个易于获取和完全可复现的示例支持是关键(也可参见 https://r4ds.hadley.nz/workflow-help.html)。在展示了从用户角度看“不起作用”的代码后,解释您希望看到什么也是有帮助的。用于创建可复现示例的一个非常有用的工具是 reprex 包。要突出显示意外行为,您可以编写完全可复现的代码来演示问题,然后使用 reprex() 函数创建一个可以粘贴到论坛或其他在线空间的代码副本。

假设你正试图用蓝色的海和绿色的陆地创建一个世界地图。您可以简单地在上一节中概述的某个地方询问如何做到这一点。然而,如果您提供了到目前为止您尝试的可复现示例,您很可能会得到更好的回应。以下代码创建了一个带有蓝色海洋和绿色陆地的世界地图,但陆地没有填充:

1
2
3
library(sf)
library(spData)
plot(st_geometry(world), col = "green")

如果您在论坛上发布了这段代码,您很可能会得到更具体和有用的回应。例如,有人可能会用以下代码作为回应,这段代码可以明显地解决问题,如下图所示:

1
2
3
4
library(sf)
library(spData)
# use the bg argument to fill in the land
plot(st_geometry(world), col = "green", bg = "lightblue")


A map of the world with green land, illustrating a question with a reproducible example (left) and the solution (right).

给读者的练习:复制上面的代码,运行命令 reprex::reprex()(或将命令粘贴到 reprex() 函数调用中),并将输出粘贴到论坛或其他在线空间。

地理计算的开源和协作方法的一个优点是它们生成了一个庞大且不断发展的知识体系,本书就是其中的一部分。展示你自己解决问题的努力,并提供问题的可复现示例,是对这一知识体系做出贡献的一种方式。

定义和草绘问题

在某些情况下,您可能无法在线找到解决问题的方案,或者您可能无法构建一个可以通过搜索引擎回答的问题。在这种情况下,或者在开发新的地理计算方法时,最好的起点可能是一支笔和一张纸(或相当于数字草图工具,如 Excalidrawtldraw,它们允许协作式草图和快速分享思想)。在方法开发工作的最具创造性的早期阶段,任何类型的软件都可能减缓您的思维速度,并使您的思考偏离重要的抽象思想。强烈推荐用数学来构建问题,并参考一个您可以数字化地草绘“前后”版本的最小示例。如果您具备相关技能并且问题需要这样做,用代数方式描述方法在某些情况下可能有助于开发有效的实现。

接下来何去何从?

正如空缺节所指出的,本书仅涵盖了R地理生态系统的一部分,还有更多需要发现的内容。我们已经迅速前进,从空间数据章的地理数据模型到生态章的高级应用。建议的未来方向是巩固所学技能,发现用于处理地理数据的新包和方法,并将这些方法应用于新数据集和领域。本节通过提出以下粗体突出显示的具体“下一步”来扩展这一通用建议。

除了通过参考前一节中引用的作品来进一步了解R中的地理方法和应用外,加深对 R本身 的理解是一个合乎逻辑的下一步。R的基础类,如 data.framematrix,是 sfraster 类的基础,因此学习它们将提高您对地理数据的理解。这可以通过参考R的一部分文档来完成,这些文档可以通过 help.start() 命令以及 @wickham_advanced_2019 和 @chambers_extending_2016 等主题的其他资源来找到。

未来学习的另一个与软件相关的方向是 用其他语言发现地理计算。学习R作为地理计算的语言有很好的理由,如引言章所述,但这不是唯一的选项。例如,rasterio 是一个具有与本书中使用的 terra 包类似功能的Python包。参见 Geocomputation with Python,以了解用Python进行地理计算的介绍。

数十个地理空间库已经用C++开发出来,包括众所周知的库,如GDAL和GEOS,以及不太为人知的库,如用于处理遥感(栅格)数据的**Orfeo Toolbox**。Turf.js 是用JavaScript进行地理计算潜力的一个例子。GeoTrellis 提供了用基于Java的语言Scala处理栅格和矢量数据的函数。WhiteBoxTools 是用Rust实现的快速发展的命令行GIS的一个例子。这些包/库/语言各有其地理计算的优点,还有更多等待你去发现,如在开源地理空间资源的策划列表 Awesome-Geospatial 中有文档。

然而,地理计算不仅仅是软件。我们推荐探索和学习新的研究主题和方法,从学术和理论的角度出发。许多已经被写过的方法尚未实施。因此,在编写任何代码之前,了解地理方法和潜在的应用可能是有益的。一个地理方法越来越多地在R中实现的例子是用于科学应用的抽样策略。接下来的一步是阅读该领域的相关文章,如@brus_sampling_2018,它附带有可复制的代码和存放在github.com/DickBrus/TutorialSampling4DSM 的教程内容。

开源方法

这是一本技术性的书,因此在前一节中概述的下一步也应是技术性的。然而,在这最后一节中,还有更广泛的问题值得考虑,这将回到我们对地理计算的定义。在引言章介绍的术语元素之一是地理方法应具有积极的影响。当然,如何定义和衡量’积极’是一个主观的、哲学的问题,超出了本书的范围。不论你的世界观如何,考虑地理计算工作的影响是一个有用的练习:积极影响的潜力可以为未来的学习提供强有力的动力,相反地,新方法可以开放许多可能的应用领域。这些考虑导致了一个结论:地理计算是更广泛的“开源方法”的一部分。

什么是地理计算节介绍了与地理计算大致意义相同的其他术语,包括地理数据科学(GDS)和’GIScience’。两者都捕捉到了使用地理数据的实质,但地理计算有优势:它简洁地捕捉到了这本书所倡导的用地理数据进行’计算’的工作方式——在代码中实现,因此鼓励可重复性——并基于其早期定义的有益成分:

  • 地理数据的创造性使用
  • 应用于实际问题
  • 构建’科学’工具
  • 可重复性

我们增加了最后一个成分:早期关于地理计算的工作几乎没有提到可重复性,但可以为它是前两个成分的重要组成部分提出有力的理由。可重复性

  • 通过将焦点从基础(通过共享代码容易获得)转向应用,鼓励创造性
  • 阻止人们’重复造轮子’:如果其他人的方法可以被其他人使用,就没有必要重新做;
  • 使研究更有利于实际应用,通过使任何行业的任何人都能在新的领域应用你的方法。

如果可重复性是地理计算(或命令行GIS)的定义资产,那么值得考虑的是什么使它可重复。
这引导我们到’开源方法’,它有三个主要组成部分:

  • 命令行界面(CLI),鼓励分享和重现地理工作的脚本
  • 开源软件,可以被世界上的任何人检查和可能改进
  • 一个活跃的开发者社区,合作和自组织来构建互补和模块化的工具

像地理计算这个术语一样,开源方法不仅仅是一个技术实体。它是一个由人组成的社群,每天都在与共享目标进行互动:生产高性能的工具,没有商业或法律限制,任何人都可以使用。与地理数据一起工作的开源方法具有超越软件工作技术性的优点,鼓励学习、合作和劳动力的有效划分。

有很多方式可以参与这个社群,尤其是随着代码托管网站(如GitHub)的出现,这些网站鼓励沟通和合作。一个好的开始就是简单地浏览一些感兴趣的地理包的源代码、‘问题’和’提交’。在r-spatial/sf GitHub仓库快速查看,该仓库托管了sf包的底层代码,显示有100+人对代码库和文档做出了贡献。更多人通过提问和对sf使用的’上游’包做出贡献。在其问题追踪器上已经关闭了超过1,600个问题,代表了大量的工作,使sf更快、更稳定和用户友好。这个例子,仅仅是数十个包中的一个,显示了为使R成为一个高效且不断发展的地理计算语言所进行的知识操作的规模。

观察公共论坛(如GitHub)上不断发展的开发活动是有教育意义的,但成为一个活跃的参与者更加有益。这是开源方法的最大特点之一:它鼓励人们参与。这本书本身就是开源方法的一个结果:它是由R在过去二十年里地理能力的惊人发展所激发的,但是通过对合作平台上的对话和代码共享而实际可能。我们希望,除了传播与地理数据一起工作的有用方法外,这本书还能激励你采取更开源的方法。

-------------已经到底啦-------------