昨今の Google Colab 事情

# FOSS4G Advent Calendar 2023

世界で一番で使われている FOSS4G は何でしょうか？

そう Python ですね。

:thinking: 

## Google Colab

そんな Python 環境をパソコン内で作らなくても気軽に実行することができる Google Colaboratory というサービスがあります。 Google アカウントを持っている人であれば利用することができます。

そんな Google Colab ですが、少し前までは一部のジオなモジュールでエラーが出たり、それを避けるため面倒な対応をしなければいけないものもありました。

https://qiita.com/noritada/items/8f0d69169dc6ab753e08

https://qiita.com/tohka383/items/5416d9bb87626f575116

それから遥かなる時空が流れ、今では問題ないように見える状態になっていたので整理してみたいと思います。もっとも、いずれ Colab の環境が更に変化するとどうなるかわからないのですが。


## インストールされているモジュールの確認

:::note warn
2023年12月時点の情報です。
:::

### Python のバージョン

```console:code
!python -V
```

```:output
Python 3.10.12
```

### numpy などの Geospatial 以外でも使われたりするやーつ

```console:code
# インストールされているモジュールの確認
!pip list | grep -iE "^(Package|-+|numpy|pandas|matplotlib|plotly)\s"
```

```:output
Package                          Version
-------------------------------- ---------------------
matplotlib                       3.7.1
numpy                            1.23.5
pandas                           1.5.3
plotly                           5.15.0
```

### ジオなやつ

```console:code
# インストールされているモジュールの確認
!pip list | grep -iE "^(Package|-+|shapely|fiona|pyproj|gdal|geopandas|geemap)\s"
```

```:output
Package                          Version
-------------------------------- ---------------------
fiona                            1.9.5
GDAL                             3.4.3
geemap                           0.28.2
geopandas                        0.13.2
pyproj                           3.6.1
shapely                          2.0.2
```

`pyproj` / `fiona` / `shapely` / `gdal` (`osgeo`) なんかは最初から入っていますし `geopandas` もあります。

使ったことないのですが Google Earth Engine 用の `geemap` もありました。

## 別途インストールが必要なやつ

### cartopy

地図作成やデータプロットが簡単にできるモジュールです。

#### インストール

```console:code
!pip install -U pip
!pip install cartopy
```

```:output
(略)
```

```console:code
# インストールされているモジュールの確認
!pip list | grep -iE "^(Package|-+|cartopy)\s"
```

```:output
Package                          Version
-------------------------------- ---------------------
Cartopy                          0.22.0
```

#### サンプル

```python:code
import matplotlib.pyplot as plt

import cartopy.crs as ccrs
import cartopy.feature as cfeature


def main():
    fig = plt.figure()
    ax = fig.add_subplot(1, 1, 1, projection=ccrs.PlateCarree())
    ax.set_extent([-20, 60, -40, 45], crs=ccrs.PlateCarree())

    ax.add_feature(cfeature.LAND)
    ax.add_feature(cfeature.OCEAN)
    ax.add_feature(cfeature.COASTLINE)
    ax.add_feature(cfeature.BORDERS, linestyle=':')
    ax.add_feature(cfeature.LAKES, alpha=0.5)
    ax.add_feature(cfeature.RIVERS)

    plt.show()


if __name__ == '__main__':
    main()
```

#### 出力

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215290/65427275-6a4b-a928-f8b7-0b9d6cd2d430.png)

#### サンプルの出典

https://scitools.org.uk/cartopy/docs/latest/gallery/lines_and_polygons/features.html

### PyGMT

地球科学や海洋科学などでよく使われている（らしい）地図描画ツール GMT (The Generic Mapping Tool) の Python ラッパです。

#### インストール

```console:code
!pip install pygmt
```

```:output
(略)
```

```console:code
# インストールされているモジュールの確認
!pip list | grep -iE "^(Package|-+|pygmt)\s"
```

```:output
Package                          Version
-------------------------------- ---------------------
pygmt                            0.10.0
```

PyGMT を使うには、追加ライブラリ（大本のツール）が必要なのでインストールします。

```console:code
# 追加ライブラリのインストール
!apt install gmt libgmt-dev ghostscript
```

```:output
(略)
```

#### サンプル

```python:code
import pygmt

fig = pygmt.Figure()
fig.coast(
    # Expand the region setting outside the range of Japan by 3 degrees in all
    # directions, without rounding to the nearest increment.
    region="JP+R3",
    projection="M12c",
    land="lightgray",
    water="white",
    borders="1/0.5p",
    shorelines="1/0.5p",
    frame="ag",
)
fig.show()
```

#### 出力

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215290/62b43fe5-1b98-5309-c80a-bc41d56f29e8.png)

#### サンプルの出典

https://www.pygmt.org/dev/tutorials/basics/regions.html

### OSMnx

OpenStreetMap からデータをダウンロードしたりグラフ構造を作ったり、ネットワーク分析したりできるやつ（らしい）。

#### インストール

```console:code
!pip install osmnx
```

```:output
(略)
```

```console:code
# インストールされているモジュールの確認
!pip list | grep -iE "^(Package|-+|osmnx)\s"
```

```:output
Package                          Version
-------------------------------- ---------------------
osmnx                            1.8.0
```

#### サンプル

```python:code
import osmnx as ox
import matplotlib.pyplot as plt

graph = ox.graph_from_place("飛島村", network_type="drive")
fig, ax = ox.plot_graph(graph, bgcolor="white", node_color="black", node_size=0)
```

#### 出力

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/215290/2c550141-6ec9-2957-d48c-d099a67acfaa.png)

#### サンプルの出典

『Python による地理空間データ分析』より地名等を一部変更。

https://www.oreilly.co.jp/books/9784814400324/

## 今日のまとめ

それぞれのモジュールについてちゃんと動作テストを行ったわけではありませんが、一時期にくらべると安定した実行環境を比較的ラクに構築することができる感じです。

とはいえ、まとめるきっかけは以前作成したノートがうまく動かなかったことなので、いいのか悪いのか難しいところですね。