「GeoPandasを使ったPythonにおける地理空間データの活用」
Using GeoPandas for Geospatial Data in Python
空間データは、位置に関連付けられたレコードで構成されています。このデータは、GPSトラック、地球観測画像、マップなどから取得できます。各空間データポイントは、正確な位置情報を持つ座標参照システム(緯度/経度のペアなど)を使用して地図上に配置することができます。これにより、それらの間の関係を調査することができます。
空間データの真の潜在能力は、データポイントとそれらの位置を結びつけ、高度な分析のための無限の可能性を創造することにあります。ジオ空間データサイエンスは、ジオ空間情報を利用し、機械学習や深層学習などの高度な手法や空間アルゴリズムを使用して、発生したイベントとその原因について有益な洞察を抽出するデータサイエンスの新興分野です。ジオ空間データサイエンスによって、イベントがどこで起こるかだけでなく、なぜ起こるかも理解できます。
GeoPandasは、情報との作業に特化したオープンソースのPythonパッケージです。これは、ジオメトリオブジェクトに対する空間演算を提供することで、Pythonを使用した空間分析をpandasのデータ操作ツールを使って簡単に行うことができます。GeoPandasはPandasに基づいているため、Pythonの構文に精通したプロフェッショナルがGeoPandasの構文にすばやく慣れるための簡単なパスを提供します。
1. GeoPandasのインストール
使用するためには、GeoPandasパッケージをインストールする必要があります。ただし、GeoPandasは問題なく使用するために他のライブラリに依存していることに注意する必要があります。これらの依存関係は、shapely、Fiona、pyproj、およびrtreeです。
GeoPandasパッケージをダウンロードする方法は2つあります。まず、condaを使用してGeoPandas condaパッケージをインストールすることができます。この方法は、自分でこれらの依存関係をインストールする必要がないため、推奨されます。次のコマンドを実行してGeoPandasをインストールできます:
conda install geopandas
2つ目の方法は、Pythonの標準パッケージインストーラであるpipを使用することです。ただし、この方法を使用する場合は、他の依存関係のインストールが必要になります。
pip install geopandas
GeoPandasパッケージがインストールされたら、次のコマンドを使用してPythonコードでインポートすることができます:
import geopandas as gpd
2. 空間データの読み込みと書き込み
GeoPandasは、空間データを読み込んでGeoDataFrameに変換するために使用されます。ただし、空間データには2つの主要なタイプがあります:
- ベクトルデータ:ベクトルデータは、地理の特徴を点、線、ポリゴンなどの離散的なジオメトリを使用して表現します。
- ラスターデータ:ラスターデータは、グリッドで表される表面として世界を符号化します。このグリッドの各ピクセルは、連続値またはカテゴリクラスで表されます。
GeoPandasは主にベクトルデータで動作しますが、rasterioなどの他のPythonパッケージと組み合わせてラスターデータを処理するためにも使用することができます。強力なgeopandas.read_file()関数を使用して、ほとんどのベクトルベースの空間データを読み込むことができます。ベクトルベースの部分データには、次の2つの主要なデータ型があります:
-
Shapefile:Shapefileは最も一般的なデータ形式であり、業界レベルのデータ型として認識されています。通常、3つのファイルで構成され、zipファイルとして提供されます:
.shpファイル:このファイルには形状のジオメトリが含まれています。
.dbfファイル:このファイルには各ジオメトリの属性が格納されています。
.shxファイル:これは属性を形状にリンクするためのシェイプインデックスファイルです。
-
GeoJSON:これは2016年にリリースされた新しいジオ空間データのファイル形式です。単一のファイルで構成されているため、Shapefileと比較して使用が容易です。
この記事では、geopandas.read_file()関数を使用して、バルセロナ市の異なる地区に関するジオスペーシャルデータが含まれたGeoJSONファイルをホストしているGitHubを使用します。
まず、以下のコードを使用してデータを読み込み、最初の5列を出力します。
url = 'https://raw.githubusercontent.com/jcanalesluna/bcn-geodata/master/districtes/districtes.geojson'
districts = gpd.read_file(url)
districts.head()
次に、データをファイルに書き込むために、GeoDataFrame.to_file()関数を使用してデータをデフォルトでShapefileに書き込むことができますが、driverパラメータを使用してGeoJSONに変換することもできます。
districts.to_file("districts.geojson", driver="GeoJSON")
3. GeoDataFramesのプロパティ
GeoDataFramesはpandas DataFrameのサブクラスであり、多くのプロパティを継承しています。ただし、いくつかの違いがあります。主な違いは、ジオメトリ列(またはジオシリーズとも呼ばれる)を格納し、空間操作を実行できることです。 GeoDataFrameのジオメトリ列には、ポイント、ライン、ポリゴンなど、さまざまなタイプのベクターデータが含まれることができます。ただし、1つの列のみがアクティブジオメトリと見なされ、すべての空間操作はその列に基づいて行われます。
それに加えて、重要な特徴の1つは、すべての列にはそれぞれ関連するCRS情報が付属していることです。これにより、2つの空間データセットを組み合わせる必要がある場合、それらが同じCRSで表現されていることを確認する必要があります。そうしないと、間違った結果が得られます。CRS情報は、GeoPandasのcrs属性に格納されています:
districts.crs
適切な投影CRSを設定したので、GeoDataFramesの属性を探索する準備ができました。
4. GeoDataFramesの探索
GeoPandasには、データを探索するために使用できる4つの便利なメソッドと属性があります。以下の4つのメソッドを探索します:
- 面積
- 重心
- 境界
- 距離
4.1. 面積
area属性は、ジオメトリの計算された面積を返します。以下の例では、各地区の面積をkm2で計算します。
districts['area'] = districts.area / 1000000
districts['area']
4.2. 重心
2番目の属性は重心で、ジオメトリの中心点を返します。以下のコードスニペットでは、新しい列を追加し、各地区の重心を保存します。
districts['centroid']=districts.centroid
districts['centroid']
4.3. 境界
3番目のメソッドは境界属性で、各地区のポリゴンの境界を計算します。以下のコードはそれを返し、別の列に保存します。
districts['boundary']=districts.boundary
4.4. 距離
distanceメソッドは、特定のジオメトリから特定の位置までの最小距離を計算します。以下のコードでは、サグラダ・ファミリア教会からバルセロナのすべての地区の重心までの距離を計算します。その後、距離をkm2で追加し、新しい列に保存します。
from shapely.geometry import Point
sagrada_fam = Point(2.1743680500855005, 41.403656946781304)
sagrada_fam = gpd.GeoSeries(sagrada_fam, crs=4326)
sagrada_fam= sagrada_fam.to_crs(epsg=2062)
districts['sagrada_fam_dist'] = [float(sagrada_fam.distance(centroid)) / 1000 for centroid in districts.centroid]
5. GeoPandasでデータをプロットする
データをプロットして可視化することは、データをよりよく理解するための重要なステップです。GeoPandasでのプロットは、Pandasでのプロットと同じく、非常に簡単で直感的です。これは、matplotlibのPythonパッケージに基づいて構築されたGeoDataFrame.plot()関数を使用することで実現されます。
まず、バルセロナの地区を基本的なプロットで探索してみましょう。
ax= districts.plot(figsize=(10,6))
これは非常に基本的なプロットであり、多くの情報を提供しません。ただし、各地区を異なる色で塗りつぶすことで、より具体的な情報を表示することができます。
ax= districts.plot(column='DISTRICTE', figsize=(10,6), edgecolor='black', legend=True)
最後に、地区の重心を追加することで、プロットにさらに情報を追加できます。
import contextily
import matplotlib.pyplot as plt
ax= districts.plot(column='DISTRICTE', figsize=(12,6), alpha=0.5, legend=True)
districts["centroid"].plot(ax=ax, color="green")
contextily.add_basemap(ax, crs=districts.crs.to_string())
plt.title('バルセロナの重心を含むカラーマップ')
plt.axis('off')
plt.show()
次に、GeoPandasの非常に重要な機能である空間関係とその関連性について調査します。
6. 空間関係の定義
ジオスペーシャルデータは、空間上で相互に関連します。GeoPandasは、空間関係のためにpandasとshapelyパッケージを使用します。このセクションでは、一般的な操作について説明します。属性結合と空間結合の2つの主要な方法でGeoPandasのデータフレームを結合することができます。このセクションでは、両方の結合方法を探索します。
6.1. 属性結合
属性結合を使用すると、非ジオメトリ変数を使用して2つのGeoPandasデータフレームを結合できます。これは、Pandasの通常の結合操作と似ています。結合操作は、以下の例に示すように、pandas.merge()メソッドを使用して行われます。この例では、バルセロナの人口データをジオスペーシャルデータに結合して、より多くの情報を追加します。
import pandas as pd
pop =pd.read_csv('2022_padro_sexe.csv', usecols=['Nom_Districte','Nombre'])
pop = pd.DataFrame(pop.groupby('Nom_Districte')['Nombre'].sum()).reset_index()
pop.columns=['NOM','population_22']
districts = districts.merge(pop)
districts
6.2. 空間結合
一方、空間結合は空間的な関係に基づいてデータフレームを結合します。以下の例では、自転車レーンを持つ地区を特定します。まず、次のコードでデータを読み込みます:
url = 'https://opendata-ajuntament.barcelona.cat/resources/bcn/CarrilsBici/CARRIL_BICI.geojson'
bike_lane = gpd.read_file(url)
bike_lane = bike_lane.loc[:,['ID','geometry']]
bike_lane.to_crs(epsg=2062, inplace=True)
2つのデータフレームを空間的に結合するには、sjoin()関数を使用できます。sjoin()関数は4つの主要な引数を取ります:最初の引数はGeoDataFrame、2番目の引数は最初のGeoDataFrameに追加するGeoDataFrameです。3番目の引数は結合のタイプで、最後の引数は2つのGeoDataFrameをマッチングするために使用する述語です。最も一般的な部分的な関係は交差、含む、および内部です。この例では、交差パラメータを使用します。
lanes_districts = gpd.sjoin(districts, bike_lane, how='inner', predicate='intersects')
lanes_districts
この記事では、オープンソースのGeoPandasライブラリを使用したジオ空間データ分析について紹介しました。まず、GeoPandasパッケージのダウンロードから始め、さまざまなタイプのジオ空間データとその読み込み方法について説明しました。最後に、ジオ空間データセットにアクセスするための基本的な操作を探求します。ジオ空間データ分析にはまだまだ探求することがありますが、このブログは学習の出発点となるものです。 Youssef Rafaatは、コンピュータビジョンの研究者兼データサイエンティストです。彼の研究は、医療応用のためのリアルタイムコンピュータビジョンアルゴリズムの開発に重点を置いています。また、彼は3年以上にわたり、マーケティング、ファイナンス、およびヘルスケアのドメインでデータサイエンティストとしても活動していました。
We will continue to update VoAGI; if you have any questions or suggestions, please contact us!
Was this article helpful?
93 out of 132 found this helpful
Related articles