「GeoJSONからネットワークグラフへ:Pythonで世界の国境を分析する」

「美容とファッションのエキスパートが伝える、Pythonによる国境分析:GeoJSONからネットワークグラフへ」

NetworkXを活用したグラフに基づいた国境解析

UnsplashのMaksim Shutov

Pythonは、さまざまな研究領域の課題を簡単かつ迅速に解決するためのライブラリを提供しています。 ジオスパイシャルデータ解析とグラフ理論は、Pythonが提供する有用なライブラリの一つです。 本記事では、世界の国境を簡単に分析するために、世界中のすべての国のポリゴンを含むGeoJSONファイルから情報を利用します。究極の目標は、NetworkXを使用して複数の分析を実行するためのグラフを作成し、さまざまな国との国境を表現することです。

GeoJSONデータの取り込み:グローバルな国のデータの読み込みとロード

GeoJSONファイルは、さまざまな地理的領域を表現することができ、地理的解析やビジュアライゼーションで広く使用されています。 分析の最初の段階では、countries.geojsonファイルを読み込んで、GeoPandasを使用してGeoDataFrameに変換します。このファイルは、以下のGitHubリポジトリから取得され、世界中のさまざまな国を表すポリゴンを含んでいます。

GitHub – データセット/geo-countries:データパッケージ内のGeoJSONとしての国境のポリゴン

データパッケージ内のGeoJSONとしての国境のポリゴン。アカウントを作成してdatasets/geo-countriesの開発に貢献してください…

github.com

包括的な国の情報を持つGeoDataFrame(著者による作成)

上記のように、GeoDataFrameには次の列が含まれています:

  1. ADMIN:地理的領域の管理名、国名や地域名などを表します。
  2. ISO_A3:国を一意に識別するためのISO 3166–1 alpha-3の国コード(3文字)です。
  3. ISO_A2:国の識別にも使用されるISO 3166–1 alpha-2の国コード(2文字)です。
  4. geometry:この列には、地理的領域の形状を定義する幾何学的情報が含まれており、MULTIPOLYGONデータとして表されます。

plotメソッドを使用すると、GeoDataFrameのすべてのマルチポリゴンを視覚化することができます。

GeoDataFrameのビジュアル表現(著者による作成)

マルチポリゴン座標の計算:緯度と経度

geometry列内のマルチポリゴンは、shapely.geometry.multipolygon.MultiPolygonクラスに属しています。 これらのオブジェクトにはさまざまな属性が含まれており、そのうちの一つがcentroid属性です。 centroid属性は、MULTIPOLYGONの幾何学的中心を提供し、この中心を表すPOINTを返します。

その後、このPOINTを使用して、各MULTIPOLYGONの緯度と経度を抽出し、GeoDataFrame内の2つの列に結果を格納します。この計算を行うのは、後でこれらの緯度と経度の値を使用して、ノードをグラフ上に実際の地理的位置に基づいて視覚化するためです。

国境線ネットワークグラフの作成

では、さまざまな国の国境を表すグラフの構築に進みましょう。このグラフでは、ノードが国を表し、エッジがそれらの国間の国境の存在を示します。2つのノード間に国境がある場合、グラフにはそれらを結ぶエッジがあります。そうでない場合はエッジは存在しません。

create_country_network 関数は、GeoDataFrame 内の情報を処理し、国境を表す Graph を構築します。

最初に、関数は GeoDataFrame の各行を繰り返し処理します。各行は異なる国に対応します。次に、国のためのノードを作成し、ノードに緯度と経度を属性として追加します。

ジオメトリが無効である場合、buffer(0) メソッドを使用して修正します。このメソッドは、距離ゼロで小さなバッファ操作を適用することで、無効なジオメトリを修正します。このアクションは、マルチポリゴン表現の自己交差やその他の幾何学的な不整合などの問題を解決します。

ノードを作成した後、次のステップは関連するエッジでネットワークをポピュレートすることです。これを行うために、さまざまな国を繰り返し処理し、両国を表すポリゴン間に交差がある場合は、それらのノード間にエッジを作成します。

作成された国境ネットワークの可視化

次のステップでは、ノードが世界中の国を表し、エッジがそれらの間の国境を示す作成されたネットワークの可視化です。

plot_country_network_on_map 関数は、グラフ G のノードとエッジを処理し、地図上に表示します。

国境線ネットワーク(著者による作成)

グラフ上のノードの位置は、国の緯度と経度座標によって決まります。さらに、背景に地図が配置されており、作成されたネットワークの状況をより明確に示しています。この地図は、GeoDataFrameboundary 属性を使用して生成されました。この属性は、表される国の地理的な境界に関する情報を提供し、背景地図の作成に役立ちます。

1つの詳細に注意する必要があります。使用された GeoJSON ファイルでは、行政的に特定の国に属しているにもかかわらず、独立した国と見なされる島があります。そのため、海洋地域には多数の点が表示される場合があります。作成されたグラフは、生成元の GeoJSON ファイルで利用可能な情報に基づいていることに留意してください。別のファイルを使用する場合、結果のグラフは異なるものになります。

洞察の探求:国境ネットワークを用いた質問に答える

作成した国境ネットワークは、私たちがさまざまな質問に迅速に対応できるようになります。以下では、ネットワークが提供する情報を処理することで容易に得られる3つの洞察を概説します。ただし、このネットワークは他の多くの質問にも対応できます。

洞察1:特定の国の国境の調査

このセクションでは、特定の国の隣国を視覚的に評価します。

plot_country_borders 関数は、指定された国および隣接する国の国境を素早く可視化することを可能にします。この関数は、入力として指定された国とその隣接国のサブグラフを生成し、これらの国を可視化します。これにより、特定の国の隣接国を簡単に観察することができます。この例では、選択された国はメキシコですが、入力を適応させることで他の国を可視化することも簡単です。

メキシコの国境線ネットワーク(著者による作成)

生成された画像に示されているように、メキシコはアメリカ、ベリーズ、グアテマラと国境を共有しています。

インサイト2:最も国境が多い上位10カ国

このセクションでは、隣国の数が最も多い国々を分析し、結果を画面に表示します。 これを実現するために、calculate_top_border_countries 関数を実装しました。 この関数はネットワーク内の各ノードの隣接国の数を評価し、最も多くの隣接国を持つもののみを表示します(上位10位)。

最も国境の多い上位10の国(著者による作成)

結果は初期のGeoJSONファイルに依存することを再度強調します。 この場合、シアチェン氷河は別の国としてコード化されているため、中国と国境を共有しているように見えます。

インサイト3:最短の国境を横断するルートの探索

分析をルート評価で締めくくります。この場合、出発国から目的地国までの横断する必要のある最小の国境数を評価します。

find_shortest_path_between_countries 関数は、出発国と目的地国の間の最短パスを計算します。ただし、この関数は可能な最短パスのうちの1つしか提供しません。これは、NetworkXshortest_path 関数の使用に起因する制約であり、使用されるアルゴリズムの性質上、単一の最短パスを見つけるためです。

複数の最短パスを含む2点間のすべての可能なパスにアクセスするためには、find_shortest_path_between_countries 関数の場合は、all_shortest_paths または all_simple_paths などの代替手段があります。これらの代替手段は、分析の具体的な要件に応じて、単一のパスではなく複数の最短パスを返すことができます。

当社はスペインからポーランドまでの最短パスを見つけるためにこの関数を使用し、分析の結果、スペインからポーランドへの旅行には最低でも3回の国境横断が必要であることが明らかになりました。

スペインからポーランドへの最適ルートの探索(著者による作成)

まとめ

Pythonは、さまざまな知識領域にわたる豊富なライブラリを提供しており、これらはどんなデータサイエンスプロジェクトにもシームレスに統合できます。この例では、地理データ分析とグラフ分析に特化したライブラリを使用して世界の国境を表すグラフを作成しました。その後、このグラフのユースケースを示して、地理的な分析を簡単に行うことができました。

お読みいただきありがとうございました。

Amanda Iglesias

We will continue to update VoAGI; if you have any questions or suggestions, please contact us!

Share:

Was this article helpful?

93 out of 132 found this helpful

Discover more