👋

Automating GIS Processes 2023 を読む その6

2024/07/03に公開

概要

ヘルシンキ大学地球科学・地理学科の GIS コースの教材であるAutomating GIS Processes 203を読んでいきます。

Lesson6

講義動画

https://www.youtube.com/watch?v=EZnKCn0LXkw

Retrieving data from OpenStreetMap

What is OpenStreetMap?

OpenStreetMapはフリーでオープンな地図サービスであるが、何よりもまず、フリーでオープンなジオデータを収集するための世界的な共同作業である。出典:wiki.openstreetmap.org

Main tools in this lesson

OSMnx

今週は、OpenStreetMapから道路網を取得し、それを構築、分析、視覚化するために使用できるOSMnxというPythonパッケージを探求する。OSMnxは、レストラン、学校、様々なサービスなどのPOI(Point of Interest)データを取得することもできる。このパッケージには、OpenStreetMapからダウンロードしたネットワーク上のルートを検索するツールも含まれており、徒歩、自転車、または車での最短接続を見つけるアルゴリズムを実装しています。

NetworkX

また、NetworkXを使用して、OpenStreetMapから取得した道路ネットワークデータを操作・分析する。NetworkXは、複雑なネットワークの構造、ダイナミクス、機能を作成、操作、研究するために使用できるPythonパッケージです。

Download and visualise OpenStreetMap data with OSMnx

Street network

osmnx.graphモジュールは、ユーザーが定義した関心領域に基づいて、ルーティング可能な道路ネットワークグラフを構築するためにデータをダウンロードします。この関心領域は、例えば、地名、バウンディングボックス、ポリゴンを使って指定することができる。ここでは、フィンランドのヘルシンキにあるKamppi地域をカバーするデータを取得するために、地名を使用します。

Convert a graph to GeoDataFrames

ダウンロードしたストリート・ネットワークはグラフであり、より具体的にはnetworkx.MultiDiGraphである。このグラフの主な目的は、ノード間のトポロジー的な関係と、ノード間のリンク(エッジ)を表現することです。ジオデータをgeopandas.GeoDataFramesで持っていた方が便利な場合もあります。OSMnxには、グラフを2つのジオデータフレーム(ノード用とエッジ用)に変換する便利な関数があります: osmnx.graph_to_gdfs()。

Place Polygon

興味のあるエリア(Kamppi, Helsinki)を表すポリゴンもプロットしてみましょう。osmnx.geocode_to_gdf()](https://osmnx.readthedocs.io/en/stable/osmnx.html?highlight=geocode_to_gdf(#osmnx.geocoder.geocode_to_gdf)関数を使ってポリゴンのジオメトリを取得できます。

Building footprints

ネットワークデータ以外にも、OSMnxはOpenStreetMapデータベースに含まれるあらゆるデータをダウンロードすることができます。これには例えば、建物の足跡や様々なPOI(Points-of-Interests)が含まれる。OSMタグと地名でフィルタリングされた任意のジオメトリをダウンロードするには、osmnx.geometries_from_place() [geometriesはまもなく廃止されます - 代わりにfeaturesを使いましょう]を使います。すべての建物を取得するタグは building = yes です。

Points-of-interest

Point-of-interest (POI) は、関心のある場所を表す点の位置を記述する一般的な概念です。osmnx.geometries_from_place()はOpenStreetMapデータベースに含まれるあらゆるジオメトリデータをダウンロードできるので、あらゆる種類のPOIデータをダウンロードするのにも使用できます。[geometriesはすぐに非推奨になります - 代わりにfeaturesを使いましょう]。

OpenStreetMapでは、多くのPOIがamenityタグを使って記述されています。例えば、amenity=restaurantとクエリすることで、全てのレストランの場所を取得することができます。

Network analysis in Python

特定の道路網を使った最短経路の探索は、多くの実用的なアプリケーションを持つ一般的なGIS問題である。例えば、ナビゲーションは、2つ以上の地点間の最適なルートを見つけるためにルーティングアルゴリズムが使用される「日常的な」アプリケーションの1つです。

もちろん、Pythonのエコシステムは、ルーティングのようなネットワーク分析を行うために使用できるパッケージを生み出している。NetworkXパッケージはネットワークを分析するための様々なツールを提供し、ダイクストラアルゴリズムやA*アルゴリズムなど、いくつかの異なるルーティングアルゴリズムを実装している。どちらも、輸送ネットワークに沿った最短経路を見つけるのによく使われます。

ネットワーク分析を行うには、もちろん分析に使用するネットワークが必要です。OSMnxパッケージを使えば、OpenStreetMapから様々な交通手段(徒歩、自転車、車)の経路可能なネットワークを取得することができる。また、OSMnxはNetworkXの機能の一部をOpenStreetMapデータ上で使用するために便利な方法でラップしています。

Data overview

指定した移動モード(サイクリング)の完全なネットワークグラフが得られたので、どの属性がネットワークのノードとエッジに割り当てられているかを詳しく見ることができる。まずネットワークをジオ・データ・フレームに変換するのが最も簡単でしょう。

グラフをジオデータフレームに変換するには、osmnx.graph_to_gdfs() を使うことができる(前のセクションを参照)。ここでは、関数のパラメータnodesとedgesを使用して、ノードのみ、エッジのみ、または両方(デフォルト)のいずれかを選択することができる:

Transform to projected reference system

ネットワーク・データの地図参照系(CRS)は、地理参照系であるWGS84(EPSG:4326)である。つまり、距離は度、面積は平方度で記録され、表現される。これは、最短経路を見つけるようなネットワーク分析には不便です。

osmnx.project_graph()は入力グラフとCRSをパラメータとして受け取り、変換された新しいグラフを返します。crs が省略された場合、変換はローカルで最も適切な UTM ゾーンにデフォルト設定されます。

Analysing network properties

ルーティング可能なネットワークグラフを作成したので、次はOSMnxの分析機能を使い、ネットワークに関する情報を抽出します。基本的なネットワーク特性を計算するには、osmnx.basic_stats() を使います:

Shortest path analysis

Origin and destination points

まず、ルートのソースとターゲットの場所を指定する必要があります。もしあなたがKamppi地域に詳しいなら、カスタム地名をソースロケーションとして指定することができる。あるいは、これらの地点を分析における起点と目的地として選択することもできる:

「マリア01、ヘルシンキ」:かつての病院街にあるスタートアップの拠点。
「ruttopuisto」:公園。この公園の正式名称は「Vanha kirkkopuisto」だが、Nominatimはニックネームをジオコーディングすることもできる。

これらの場所の座標を手作業で割り出し、座標に基づいてshapely.geometry.Pointsを作成することもできる。しかし、2つ以上のポイントがある場合、それはすぐに面倒になります。代わりに、OSMnxを使って位置をジオコーディングすることができます。

Nearest node

ネットワーク上でルーティングを行うには、まずネットワークの一部である始点と終点を見つけなければならない。最も近いノードのIDを返すには、osmnx.distance.nearest_nodes()を使う:

Routing

これでルーティングの準備が整い、出発地と目的地の間の最短パスを見つけることができる。osmnx.shortest_path()を使用する。

この関数は、3つの必須パラメータ:グラフ、起点ノードID、および目的地ノードID、および2つのオプションパラメータ:weightは、ルートの長さとは異なるコストインピーダンスを考慮するように設定することができ、cpusは、多数のルートの並列計算を制御します。

その結果、最短経路上にあるすべてのノードのリストが得られます。

ノードGeoDataFrameからこれらのノードの位置を抽出し、ポイントのLineStringプレゼンテーションを作成することもできますが、幸運なことにOSMnxがそれをやってくれるので、plot_graph_route()関数を使って最短経路をプロットすることができます:

Saving shortest paths to disk

さらなる分析や視覚化のために、ルートをファイルに保存したり、少なくとも Python で GeoDataFrame オブジェクトとして持つ必要があることがよくあります。したがって、もう少し続けて、どのようにルートをラインストリングに変えて、最短パスのジオメトリと関連する属性をジオパッケージファイルに保存できるか見てみましょう。

Prepare data for saving to file

データには特定のデータ型(リストなど)が含まれているため、データをファイルに保存する前に文字列に変換する必要がある(無効な列を削除するという方法もある)。

Codes

lesson5 のコードを実行した結果は以下に置きました。

https://github.com/mopinfish/auto-gis-notebooks/tree/main/lessons/lesson-6

Discussion