全世界の建物地図情報の入手方法

## 概要
　マイクロソフトが提供する**衛星画像より推定した建物地図**の入手方法について紹介します。

  [Building Footprints by Microsoft](https://www.microsoft.com/en-us/maps/building-footprints)

 ![Screenshot from 2023-02-12 23-34-40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/187602/1c8d259f-bcbc-bfcf-1441-d5c8e91f6fa5.png)
  ![Screenshot from 2023-02-12 23-34-51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/187602/798e2650-acbf-6c03-9a44-55c9a5eb01b1.png)
 **建物地図の提供状況((C)Microsoft)**

建物地図データは、[こちら](https://github.com/microsoft/GlobalMLBuildingFootprints)より確認できますのでご参考ください。
また、Google Colaboratoryの[サンプルコード](https://colab.research.google.com/drive/1I_cWdNG71PfD083C0Ctt8PdPHDThYUIA?usp=sharing)をこちらにアップしましたので、あわせてご参考ください。最後に、衛星画像に重畳した建物地図の例を紹介しています。

## 1.建物地図情報の入手
 今回は、pythonでよく用いる行例モジュールであるpandasと同じ形式の位置情報データを扱う**geopandas**を使います。geopandasを含めた位置データの使い方については、以下のサイトが網羅的にまとめれていますので、是非こちらをご参考ください。

 [【PythonでGIS】GeoPandasまとめ](https://qiita.com/c60evaporator/items/ac6a6d66a20520f129e6)
 [PythonでのShapefile（.shp）操作まとめ](https://qiita.com/c60evaporator/items/78b4148bac6afa4844f9)

 まず位置情報を扱うのに必要なモジュールをインストールします。

```python
!pip install geopandas
!pip install shapely
```
次に使用するモジュールを宣言します。
```python
import pandas as pd
import geopandas as gpd
from shapely.geometry import shape

from tqdm import tqdm
```
　建物地図データを入手します。データは国別にURLリンクで整理されていますので、そちらの情報を入手します。
```python
dataset_links = pd.read_csv("https://minedbuildings.blob.core.windows.net/global-buildings/dataset-links.csv")
```
 取得したファイルを確認します。
```python
dataset_links
```
出力

![Screenshot from 2023-02-12 23-50-30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/187602/265c1483-2bcd-2ee4-99cb-1e6d0654e918.png)


Locationで国別に別れているのがわかりました。また、Urlにデータセットの入手先がわかります。これより、**関心のある国を選んで建物情報**を入手します。今回はスリランカを対象としました。
```python
#関心のある国を設定

country = 'Sri Lanka'
geometry_links = dataset_links[dataset_links.Location == country]
geometry_links
```
出力
![Screenshot from 2023-02-12 23-50-47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/187602/6b24b014-a4e5-0812-24c8-21e7d9620945.png)

　こちらの情報をつかってスリランカの建物情報を入手します。まずは、各リンク先のデータ・セットをダウンロードし、geopandasで一つのファイルでまとめます。

```python
#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分弱**かかりました。
　データを確認します。
```python
building_foorprints_df.head()
```
出力
![Screenshot from 2023-02-12 23-54-23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/187602/886df626-569e-8d89-d1ac-a861bf4fa33c.png)

　**見慣れたpandasのdataframe形式**であことがわかります。geometryに建物ポリゴンの情報（緯度・経度）があります。
　取得した建物の総数を確認します。

```python
#建物数の確認

len(building_foorprints_df)
```
出力　
3162958

　スリランカの全建物数は320万軒ほどであることがわかりました。

　こちらのbuilding_footprints_dfを保存すれば、今後は建物情報として利用できます。

## 2.Foliumによる建物地図の閲覧
 次に、取得した建物地図を地図上に重畳してみます。ここでは、pythonの地図閲覧によく用いられているfoliumを使います。
 すべての建物地図は多すぎて**メモリエラー**となるため、一部のみを閲覧します。

　取得した建物地図を地図重畳するためにgeojsonに変換する必要があるため、そのモジュールをインストールします。


```python
!pip install geojson
```
 次に、取得した建物地図をgeojsonに変換します。今回は、最後に取得したデータ・セットを使います。
```python
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で地図に建物地図を重畳します。
```python
map_ = folium.Map(location = [6.927, 79.8612], zoom_start = 10) #Sri Lanka
folium.GeoJson(building_polygon).add_to(map_)
map_
```
出力

![Screenshot from 2023-02-13 20-36-02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/187602/f0fa6f4b-1fd3-3f6f-7d36-f5e946af095a.png)

スリランカの首都の**コロンボ付近の建物地図**を確認することができました。
マイクロソフトが提供する建物地図については、以下のサイトでも紹介されていますので、ご参考にしてください。

[Microsoft Building Footprints in GEE: Revisiting Scale & accessibility](https://samapriyaroy.medium.com/microsoft-building-footprints-in-gee-revisiting-scale-accessibility-eee5e97c17a3)

## 3.まとめ
　ここでは、マイクロソフトが提供する建物地図のデータ・セットの取得方法、およびFoliumによる簡易的な地図上での閲覧方法について紹介しました。建物地図情報は、一般的なGISソフトで閲覧可能なGeojsonフォーマットとなっていますので、今回紹介した方法以外でも簡易に利用できます。Google Earth Engineでも提供されていますので、大量の建物地図情報を処理するにはこちらの環境が便利ですね。
　何かありましたら、コメントなどいただければ嬉しいです。


## 参考リンク
  [Building Footprints by Microsoft](https://www.microsoft.com/en-us/maps/building-footprints)
 [【PythonでGIS】GeoPandasまとめ](https://qiita.com/c60evaporator/items/ac6a6d66a20520f129e6)
 [PythonでのShapefile（.shp）操作まとめ](https://qiita.com/c60evaporator/items/78b4148bac6afa4844f9)
[Microsoft Building Footprints in GEE: Revisiting Scale & accessibility](https://samapriyaroy.medium.com/microsoft-building-footprints-in-gee-revisiting-scale-accessibility-eee5e97c17a3)