Cecil

CecilとPythonを用いた再生可能な森林減少地域の特定

近年、多くの国で人間活動や気候変動の影響により、森林減少が加速しています。森林が失われることで、炭素隔離や生物多様性の保全、水循環の調整といった重要な生態系サービスも同時に失われてしまいます。
そのため現在では、単に森林減少を検知するだけでなく、ネイチャーベースソリューション(Nature-Based Solutions)によって回復可能な地域を特定することがますます重要になっています。

今回の分析では、環境データプラットフォームCecilを活用しています。Cecilは、衛星データや地理空間データを用いて、森林減少や土地利用の変化などの環境変化を分析できるデータプラットフォームで、プログラミングを通じた効率的な可視化・分析を可能にし、環境分野におけるデータ活用を支援しています。
(公式サイト:https://cecil.earth/

本記事では、Cecilが提供する無料データセットとPythonを用いて、再生可能な森林減少地域を迅速に特定するための、シンプルかつ再現性の高いワークフローをご紹介します。

アプローチの概要

本分析では、主に以下の3点を目的としています:
1. 2000年以降に森林が失われた地域を特定する
2. 現在の土地被覆データと組み合わせて状況を評価する
3. 森林が失われた後も「自然地」(草地・牧草地など)として分類されている地域を抽出し、森林再生の可能性を評価する

ステップ1:セットアップとライブラリのインポート

まず、必要なPythonパッケージをインポートし、Cecilクライアントを初期化します。

import geopandas as gpd
import json
from shapely.geometry import Point, mapping

import cecil
client = cecil.Client()

ステップ2:解析対象地域の定義

解析対象として、日本・北海道の足寄(Ashoro)地域を選択しました。この山岳地帯は近年、産業的な伐採が多く行われており、本手法を検証するのに適した地域です。
関心地点を定義し、半径2.5kmのバッファを作成します。これにより、約9,500ヘクタールの解析領域が得られます。

lat, lon = 43.397660, 143.420522

# POIポイントでGDFを作成
gdf = gpd.GeoDataFrame(
    {'name': ['Ashoro Forest']},
    geometry=[Point(lon, lat)],
    crs='EPSG:4326'
)

# 座標を2500メートル分バッファリングし、geojson文字列に変換する
buffer_radius_m = 2500 
buffered_geom = gdf.to_crs('EPSG:3857').geometry.buffer(2500).to_crs('EPSG:4326')
gdf['geom_buffer'] = buffered_geom
gdf['geojson_str'] = gdf['geom_buffer'].apply(lambda geom: json.dumps(mapping(geom)))

ステップ3:Cecil AOIの作成

作成したバッファ付きジオメトリを使用して、CecilのArea of Interest(AOI)を作成します。これにより、Cecilに対して解析対象の正確な空間範囲を指定できます。

# 単一の関心領域(AOI)に対するCecil AOIを作成する
geometry = json.loads(gdf.iloc[0]['geojson_str'])
ashoro_aoi = client.create_aoi(external_ref=gdf.iloc[0]['name'], geometry=geometry)

ステップ4:使用するデータセットの選択

本分析では、以下の2つの無料データセットを使用します:
・Hansen Global Forest Change:2000年以降の森林減少年を提供
・Land Cover 9-Class:全球の土地被覆分類データ
対象データセットを検索し、それぞれのIDを取得します。

dataset_names = ["Hansen Global Forest Change", "Land Cover 9-Class"]
forest_datasets = [ds for ds in client.list_datasets() if ds.name in dataset_names]
forest_dataset_ids = [dataset.id for dataset in forest_datasets]

ステップ5:データサブスクリプションの作成

Cecilのデータサブスクリプションは、「特定のAOIに対するデータセットのクエリ」を表します。今回は2つのデータセットを使用するため、2つのサブスクリプションを作成します。

for dataset_id in forest_dataset_ids:
    data_subscription = client.create_subscription(
        external_ref=f"Ashoro Forest_{ashoro_aoi.id}_{dataset_id}",
        aoi_id=ashoro_aoi.id,
        dataset_id=dataset_id,
    )

ステップ6:ラスターデータの読み込み

サブスクリプションが作成されたら、Cecilのload_xarray関数を使ってラスターデータを取得します。

ds_forest_change = client.load_xarray(subscription_id=data_subscriptions_created[0].id)
ds_land_cover_9_class = client.load_xarray(subscription_id=data_subscriptions_created[1].id)

ステップ7:再生可能地域の特定

ここで2つのデータセットを統合します:
・Hansenデータセットからloss_yearを使用し、森林減少が発生した場所を特定
・Land Coverデータセットから、最新年(2024年)の土地被覆クラスを取得
以下の条件を満たす場所を「再生可能」と定義します:
・森林減少が発生している
・現在の土地被覆が自然地クラスである

import numpy as np

# Forest change (EPSG:4326)
loss = ds_forest_change.loss_year.compute()
loss = loss.where(loss != 255) # マスクバッファ外部の欠損データ
loss = loss.rio.write_crs("EPSG:4326", inplace=True)

# Land cover (EPSG:3857)
lc = ds_land_cover_9_class.isel(time=-1).land_cover_class.compute()
lc = lc.where(lc != 255) # マスクバッファ外部の欠損データ
lc = lc.rio.write_crs("EPSG:3857", inplace=True)

# 土地被覆を損失グリッドに再投影する
lc_on_loss = lc.rio.reproject_match(loss)

# 再生可能な状態
reclaim_classes = [2, 4, 5, 11]
mask = (loss > 0) & np.isin(lc_on_loss, reclaim_classes)

reclaimable_loss_year = loss.where(mask)
reclaimable_loss_year

ステップ8:結果の可視化

以下の3つのレイヤーを可視化します:

1.森林減少年(Forest Change)

2.土地被覆(Land Use)

3.再生可能地域(Reclaimable Land)

結果と考察

分析の結果、森林が失われているにもかかわらず、現在の土地被覆が自然地として維持されている地域が多数確認できました。これらの地域は、再森林化や生態系回復に向けた有力な候補地と考えられます。
また、結果を森林減少年(loss_year)で色分けすることで、比較的最近伐採された地域を優先的に特定・把握でき、再生の成功率が高いと見込まれるエリアの選定に役立ちます。

まとめ

本ワークフローは、無料で利用可能なデータセットとオープンソースツールを組み合わせることで、再生可能な森林減少地域を効率的に特定できることを示しました。最小限のセットアップで、実践的かつ拡張可能なインサイトを得ることができます。
今後は、生態学的な制約条件や社会経済データ、さらなる環境データセットを組み合わせることで、より精度の高い復元優先度評価へと発展させることも可能です。

本製品の価格や利用条件、導入に関するご相談などは、弊社にてご案内しております。 ご質問等がございましたら、お気軽にお知らせください。

TOP