概要
マイクロソフトが提供する衛星画像より推定した建物地図の入手方法について紹介します。
Building Footprints by Microsoft
建物地図データは、こちらより確認できますのでご参考ください。
また、Google Colaboratoryのサンプルコードをこちらにアップしましたので、あわせてご参考ください。最後に、衛星画像に重畳した建物地図の例を紹介しています。
1.建物地図情報の入手
今回は、pythonでよく用いる行例モジュールであるpandasと同じ形式の位置情報データを扱うgeopandasを使います。geopandasを含めた位置データの使い方については、以下のサイトが網羅的にまとめれていますので、是非こちらをご参考ください。
【PythonでGIS】GeoPandasまとめ
PythonでのShapefile(.shp)操作まとめ
まず位置情報を扱うのに必要なモジュールをインストールします。
!pip install geopandas
!pip install shapely
次に使用するモジュールを宣言します。
import pandas as pd
import geopandas as gpd
from shapely.geometry import shape
from tqdm import tqdm
建物地図データを入手します。データは国別にURLリンクで整理されていますので、そちらの情報を入手します。
dataset_links = pd.read_csv("https://minedbuildings.blob.core.windows.net/global-buildings/dataset-links.csv")
取得したファイルを確認します。
dataset_links
出力
Locationで国別に別れているのがわかりました。また、Urlにデータセットの入手先がわかります。これより、関心のある国を選んで建物情報を入手します。今回はスリランカを対象としました。
#関心のある国を設定
country = 'Sri Lanka'
geometry_links = dataset_links[dataset_links.Location == country]
geometry_links
こちらの情報をつかってスリランカの建物情報を入手します。まずは、各リンク先のデータ・セットをダウンロードし、geopandasで一つのファイルでまとめます。
#Building Footprints情報の入手およびGeopandasによるデータ整理
building_foorprints_df = gpd.GeoDataFrame()
for _, row in tqdm(geometry_links.iterrows()):
df = pd.read_json(row.Url, lines=True)
df['geometry'] = df['geometry'].apply(shape)
gdf = gpd.GeoDataFrame(df, crs=4326)
gdf.to_file(f"{row.QuadKey}.geojson", driver="GeoJSON")
building_foorprints_df = building_foorprints_df.append(gdf)
建物数が多いとすべて入手するまでに時間がかかります。リンク先数を先に確認しておき、tqdmで経過時間を予測するなど参考にしてください。
今回はスリランカの建物情報を入手するのに20分弱かかりました。
データを確認します。
building_foorprints_df.head()
見慣れたpandasのdataframe形式であことがわかります。geometryに建物ポリゴンの情報(緯度・経度)があります。
取得した建物の総数を確認します。
#建物数の確認
len(building_foorprints_df)
出力
3162958
スリランカの全建物数は320万軒ほどであることがわかりました。
こちらのbuilding_footprints_dfを保存すれば、今後は建物情報として利用できます。
2.Foliumによる建物地図の閲覧
次に、取得した建物地図を地図上に重畳してみます。ここでは、pythonの地図閲覧によく用いられているfoliumを使います。
すべての建物地図は多すぎてメモリエラーとなるため、一部のみを閲覧します。
取得した建物地図を地図重畳するためにgeojsonに変換する必要があるため、そのモジュールをインストールします。
!pip install geojson
次に、取得した建物地図をgeojsonに変換します。今回は、最後に取得したデータ・セットを使います。
import geojson
from geojson.feature import FeatureCollection
import folium
polyz = []
for i in range(30000): #30000ポリゴンのみ描画する
AREA = gdf['geometry'][i]
buildings = geojson.Feature(geometry = AREA)
polyz.append(buildings)
building_polygon = FeatureCollection(polyz)
これで準備はできましたので、Foliumで地図に建物地図を重畳します。
map_ = folium.Map(location = [6.927, 79.8612], zoom_start = 10) #Sri Lanka
folium.GeoJson(building_polygon).add_to(map_)
map_
出力
スリランカの首都のコロンボ付近の建物地図を確認することができました。
マイクロソフトが提供する建物地図については、以下のサイトでも紹介されていますので、ご参考にしてください。
Microsoft Building Footprints in GEE: Revisiting Scale & accessibility
3.まとめ
ここでは、マイクロソフトが提供する建物地図のデータ・セットの取得方法、およびFoliumによる簡易的な地図上での閲覧方法について紹介しました。建物地図情報は、一般的なGISソフトで閲覧可能なGeojsonフォーマットとなっていますので、今回紹介した方法以外でも簡易に利用できます。Google Earth Engineでも提供されていますので、大量の建物地図情報を処理するにはこちらの環境が便利ですね。
何かありましたら、コメントなどいただければ嬉しいです。
参考リンク
Building Footprints by Microsoft
【PythonでGIS】GeoPandasまとめ
PythonでのShapefile(.shp)操作まとめ
Microsoft Building Footprints in GEE: Revisiting Scale & accessibility