Press "Enter" to skip to content

从GeoJSON到网络图:用Python分析世界国家边界

利用NetworkX进行基于图的国家边界分析

Maksim Shutov在Unsplash上

Python提供了广泛的库,可以帮助我们在各种研究领域轻松快速地解决问题。地理空间数据分析和图论是两个研究领域,Python提供了一套功能强大的有用的库。在本文中,我们将对世界边界进行简单分析,具体探索哪些国家与其他国家共享边界。我们将首先利用包含全球所有国家多边形的GeoJSON文件中的信息来进行分析。最终目标是创建一个使用NetworkX表示各种边界的图,并利用这个图进行多次分析。

GeoJSON数据摄入:读取和加载全球国家数据

GeoJSON文件可以表示各种地理区域,在地理分析和可视化中广泛使用。我们分析的初始阶段涉及读取countries.geojson文件,并使用GeoPandas将其转换为GeoDataFrame。该文件来自以下GitHub存储库,包含表示不同国家的多边形。

GitHub – 数据集/geo-countries:国家多边形作为GeoJSON在datapackage中

国家多边形作为GeoJSON在datapackage中。通过创建一个账户,为datasets/geo-countries的发展做出贡献…

github.com

具有全面国家信息的GeoDataFrame(由作者创建的图像)

如上所示,GeoDataFrame包含以下列:

  1. ADMIN:表示地理区域的行政名称,如国家或地区名称。
  2. ISO_A3:表示ISO 3166-1 alpha-3国家代码,一个三位字母的代码唯一标识国家。
  3. ISO_A2:表示ISO 3166-1 alpha-2国家代码,一个两位字母的代码,也用于国家识别。
  4. geometry:此列包含定义地理区域形状的几何信息,表示为MULTIPOLYGON数据。

您可以使用plot方法可视化组成GeoDataFrame的所有多边形,如下所示。

GeoDataFrame的可视化表示(由作者创建的图像)

计算多边形坐标:纬度和经度

geometry列中的多边形属于shapely.geometry.multipolygon.MultiPolygon类。这些对象包含各种属性,其中之一是centroid属性。centroid属性提供MULTIPOLYGON的几何中心,并返回表示该中心的POINT

随后,我们可以使用这个POINT提取每个MULTIPOLYGON的纬度和经度,并将结果存储在GeoDataFrame的两列中。我们进行此计算是因为后续将使用这些纬度和经度值根据它们的真实地理位置在图上可视化节点。

创建一个国家边界网络图

现在是时候继续进行了,构建一个将代表全球不同国家边界的图表。在这个图中,节点代表国家,而边表示这些国家之间存在边界。如果两个节点之间存在边界,图表将有连接它们的边;否则,就没有边。

函数create_country_network处理GeoDataFrame中的信息,并构建一个表示国家边界的Graph

最初,该函数遍历GeoDataFrame的每一行,其中每一行对应一个不同的国家。然后,为该国家创建一个节点,同时将纬度和经度作为节点的属性添加进去。

如果几何图形无效,它将使用buffer(0)方法予以矫正。该方法通过应用一个距离为零的小缓冲操作来修复无效的几何图形。这个操作解决了多边形表示中的自交叉或其他几何不规则问题。

创建节点之后,下一步是将网络填充到相关的边。为了做到这一点,我们遍历不同的国家,如果表示这两个国家的多边形之间存在交集,则意味着它们共享一个边界,结果就是在它们的节点之间创建一个边。

可视化构建的国家边界网络

下一步是对创建的网络进行可视化,其中节点代表世界各国,边表示它们之间的边界。

函数plot_country_network_on_map负责处理图G的节点和边,并将它们显示在地图上。

国家边界网络(图片由作者创建)

图上节点的位置由国家的纬度和经度坐标确定。此外,背景中还有一张地图,以提供对创建的网络的更清晰的上下文。这个地图是使用GeoDataFrame中的boundary属性生成的。该属性提供了所表示国家的几何边界的信息,有助于创建背景地图。

值得注意的是,在使用的GeoJSON文件中,有些被认为是独立国家的岛屿,尽管它们在行政上属于特定国家。这就是为什么你可能会在海上区域看到很多点的原因。请记住,创建的图表依赖于从中生成的GeoJSON文件中可用的信息。如果我们使用不同的文件,得到的图表将会不同。

探索见解:通过国家边界网络回答问题

我们创建的国家边界网络可以迅速帮助我们解决多个问题。下面,我们将概述可以通过处理网络提供的信息轻松得出的三个见解。然而,这个网络还可以帮助我们回答许多其他问题。

见解 1:审视选择国家的边界

在本节中,我们将通过视觉评估特定国家的邻国

plot_country_borders函数能够快速可视化特定国家的边界。该函数生成所提供的国家及其邻国的子图。然后,它继续可视化这些国家,使我们能够轻松观察特定国家的邻国。在本例中,选择的国家是墨西哥,但我们可以轻松根据输入进行调整以可视化任何其他国家。

墨西哥的国家边界网络(图片由作者创建)

正如您在生成的图像中看到的,墨西哥与三个国家接壤:美国、伯利兹和危地马拉。

见解2:拥有最多边界的前10个国家

在本节中,我们将分析哪些国家拥有最多的邻国并将结果显示在屏幕上。为此,我们实现了calculate_top_border_countries函数。该函数评估网络中每个节点的邻居数量,并仅显示具有最多邻居的节点(前10个)。

具有最多边界的前10个国家(图片由作者创建)

我们必须再次强调,所获得的结果取决于初始的GeoJSON文件。在本例中,锡亚琴冰川被编码为一个单独的国家,这就是为什么它看起来与中国共享边界的原因。

见解3:探索最短的国家之间路线

我们以路线评估结束我们的分析。在这种情况下,我们将评估从起始国家到目的国家旅行时必须穿越的最少边界数量

find_shortest_path_between_countries函数计算起始国家和目的国家之间的最短路径。然而,值得注意的是,该函数只提供可能的最短路径之一。这个限制是由于它使用了NetworkX中的shortest_path函数,由于算法的特性,它本质上只找到一条最短路径。

为了访问两点之间的所有可能路径,包括多个最短路径,有一些可用的替代方案。在find_shortest_path_between_countries函数的上下文中,可以探索诸如all_shortest_pathsall_simple_paths等选项。这些替代方案能够根据分析的具体要求返回多条最短路径,而不仅仅是一条。

我们使用该函数找到了从西班牙到波兰的最短路径,并分析结果显示,从西班牙到波兰旅行所需的最少边界穿越次数为3。

从西班牙到波兰的最佳路线(图片由作者创建)

总结

Python提供了许多涵盖各种领域知识的库,可以无缝地集成到任何数据科学项目中。在本示例中,我们利用了专用于几何数据分析和图分析的库,创建了表示世界边界的图形。随后,我们展示了该图形的用例,以快速回答问题,使我们能够轻松进行地理分析。

感谢您的阅读。

Amanda Iglesias

Leave a Reply

Your email address will not be published. Required fields are marked *