見出し画像

AW3D30でマラソンコースの高低差を見える化しよう

2022年7月にスタートした豊橋市とのコラボレーション企画の続編!
豊橋市で集めたアイデアの中で、サービスとして可能性のあるアイデアを実験的に検証していきます。
マガジンはこちら。

愛知県豊橋市出身の著名人の一人に、2016年リオデジャネイロオリンピックなどに出場したマラソンランナーの鈴木亜由子さんがいます。豊橋市では、そんな鈴木さんが名誉大会会長を務める「鈴木亜由子杯 穂の国・豊橋ハーフマラソン」が毎年開催されています。ランナーの方のなかには運動強度を上げるため、意識的に高低差のある道を練習コースにされてる方もいらっしゃるのではないでしょうか?

今回は、人工衛星「だいち」の撮影データから作成されたAW3D30というDSM(数値地表モデル)データを用いて、豊橋ハーフマラソンのコースの高低差を見える化してみます。

QGISでマラソンコースのポリラインを作成する

QGISとは、フリーで利用できる高品質なGIS(地理情報システム)のオープンソースソフトです。公式ページにアクセスし、お使いの環境にダウンロードしましょう。

今回は豊橋ハーフマラソンの公式サイトで公開されているコース地図を参考に、QGISでコースのポリライン(連続した線で表された線データ)を作成しました。具体的な図化方法については、QGISの公式ドキュメントをご覧ください。

図:豊橋市競技場近辺(credit:QGIS,OpenStreetMap)
図:豊橋ハーフマラソン コース地図(source:https://honokuni-runner.com/)

最終的には以下のようなポリラインを作成しました。公式サイトのコース地図と一緒の形になりました。

図:豊橋ハーフマラソン コース ポリライン(credit:QGIS,GoogleMap)

AW3D30でコースの高低差を表示する

AW3D30とは、陸域観測技術衛星「だいち」に搭載された光学センサ・パンクロマチック立体視センサ(PRISM)による解像度30m相当の全球数値地表モデル(DSM)です。数値地表モデル(DSM)とは、地形(地面)と地物(建物・樹木など)の高さが加わった地表面の高さデータを示します。AW3D30データはEORCの公式サイトから無償でダウンロードできます。

今回は、作成したマラソンコースのポリラインデータと豊橋市のAW3D30データを使ってコースの高低差を棒グラフで表示するpythonのプログラムを使います。

import geopandas as gpd
import rasterio
from pyproj import Proj
%matplotlib inline
import matplotlib.pyplot as plt
import japanize_matplotlib
import seaborn as sns
sns.set(font="IPAexGothic")

# 設定パラメータ
cource_line = "cource_line.shp" # コースのポリラインshp
dsm_file_path = "dsm.tif" # AW3D30のDSMデータ
distance_interval = 30 # メートル。AW3D30の解像度30mに合わせる

def detect_utm_zone(lon, lat):
    # 緯度経度からUTM座標系のEPSGコードを返す
    utm_zone = int((lon + 180) / 6) + 1
    if lat >= 0:
        return 32600 + utm_zone
    else:
        return 32700 + utm_zone

def convert_to_utm(gdf):
    # GeoDataFrameをWGS84(LatLon)からUTM座標系に変換し、EPSGコードを返す
    centroid = gdf['geometry'].centroid.iloc[0]
    lon, lat = centroid.x, centroid.y
    utm_epsg = detect_utm_zone(lon, lat)
    gdf_utm = gdf.to_crs(epsg=utm_epsg)
    return gdf_utm, utm_epsg

gdf_line = gpd.read_file(cource_line)
gdf_line_utm, utm_epsg = convert_to_utm(gdf_line)

# ポリラインを30mごとのポイントデータに変換
line = gdf_line_utm['geometry'].iloc[0]
distances = list(range(0, int(total_length), distance_interval))
interpolated_points = [line.interpolate(distance) for distance in distances]
interpolated_gdf = gpd.GeoDataFrame(geometry=interpolated_points, crs=f"EPSG:{utm_epsg}")
interpolated_gdf_wgs84 = interpolated_gdf.to_crs(4326)

with rasterio.open(dsm_file_path) as dsm:
    # 各ポイントに重なるDSMの値を取得し、新しい属性「height」に追加
    heights = []
    for index, point in interpolated_gdf_wgs84.iterrows():
        x, y = point['geometry'].x, point['geometry'].y
        row, col = dsm.index(x, y)
        height = dsm.read(1, window=((row, row + 1), (col, col + 1)))[0, 0]
        heights.append(height)

    interpolated_gdf_wgs84['height'] = heights

# 特定の列を棒グラフで出力
column_to_plot = 'height'
interpolated_gdf_wgs84['point_number'] = interpolated_gdf_wgs84.reset_index().index

# グラフのタイトルや軸ラベルを追加(オプション)
plt.figure(figsize=(20, 5))
plt.ylabel('高度[m]', fontsize=16)
plt.xlabel('走行距離[km]', fontsize=16)
plt.legend(loc='upper right', fontsize=16)
plt.grid(True)
interpolated_gdf_wgs84['length'] = interpolated_gdf_wgs84['point_number'] * distance_interval / 1000
sns.lineplot(x='length', y='height' ,data=interpolated_gdf_wgs84, label='豊橋ハーフマラソン')

# グラフを表示
plt.show()

 上記のプログラムを実行すると、豊橋ハーフマラソンの高低差が線グラフで表すことができます。

図:豊橋ハーフマラソン 高低差グラフ

一見、起伏が激しいように見えますが、高低差は最大で25m程度であり、全体的に平坦なコースのようです。起伏がゆるやかであることは次章の大学駅伝コースの比較でも一目瞭然ですので、ぜひ確認いただければと思います。

大学駅伝のコースを比較する

前章の手法を用いれば、さまざまなランニングコースの高低差を比較することができます。そこで今回は、愛知県熱田神宮から三重県伊勢神宮まで走る「全日本大学駅伝」と、東京から箱根まで走る「箱根駅伝」、そして前章で出力した「豊橋ハーフマラソン」を比較してみました。

図:2つの大学駅伝 高低差比較グラフ

線グラフを表示してみると、豊橋ハーフマラソンと全日本大学駅伝の高低差はほとんどありません。一方、箱根駅伝は高低差が大きいことがわかります。箱根駅伝では終盤の5区で箱根の山を一気に駆け上がる最大の難所があります。「山の神」という称号があることも納得です。

まとめ

今回、DSMデータを使うことでマラソンと駅伝のコースがどのようにアップダウンをしているかを視覚的に捉えることができました。人工衛星の光学画像には、AW3D30のように様々な活用方法があります。今後も衛星画像を使った技術の進歩に目が離せませんね。


〜soranomeからのお知らせ〜
「わたしたちの日常を、宇宙ビジネスで豊かにする。」をビジョンに掲げ、様々な専門性を持つ多様な人財コミュニティをベースに、様々な宇宙ビジネスの加速支援を行っています。
現在エンジニア等を随時募集中です!
https://soranome.com/

この記事が気に入ったらサポートをしてみませんか?