コンテンツにスキップ

FAQ/ 任意の地点の浸水深時系列を出力したい

洪水シミュレーション実施後、任意の地点の浸水深時系列を出力したいです。

よい方法はありますでしょうか。

回答

時系列データをnetCDFで出力し、さらにそのnetCDFファイルから、希望の地点の緯度、経度を指定し、時系列を出力する方法がよいかと思います。時系列データをnetCDFで出力する方法は、テクニカルリファレンス/ 入出力機能/ 計算結果のエクスポート/ CSV, NetCDF を参照してください。

画面を通じてnetCDFファイルを分析するには、QGISなどのGISツールが便利です。netCDFファイルを地図上に表示すること、地図をクリックしてその場所の時系列変化をグラフで表示すること、および、グラフに示した値を表形式で表示する方法が、次のビデオで示されています。

Visualize pixel timeseries from netCDF in QGIS 2.18

コマンドラインを通じて netCDFファイルを分析するには、Pythonなどの解析ツールが便利です。Python 3.6 以降で出力する場合のサンプルソースを示します。

解析にあたっては、netcdf4 モジュールが必要です。 condaを使っている場合は、次のコマンドを実行してください。

1
2
conda install netCDF4
conda install matplotlib
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
import os
import numpy as np
import matplotlib.pyplot as plt
import netCDF4
def writeTimeSeriesChart(ncFile, varName, targetLon, targetLat):
    nc = netCDF4.Dataset(ncFile, 'r') #読み込み用
    targetVar = nc.variables[varName]
    timeVar = nc.variables['time']
    latVar = nc.variables['lat'] #緯度
    lonVar = nc.variables['lon'] #経度
    timeTs = timeVar[:]
    targetLonIndex = np.absolute(lonVar[:] - targetLon).argmin()
    targetLatIndex = np.absolute(latVar[:] - targetLat).argmin()
    varTs = targetVar[:, targetLatIndex, targetLonIndex]
    plt.plot(timeTs / 60.0, varTs)
    plt.title(f'{varName} at {lonVar[targetLonIndex]}, {latVar[targetLatIndex]}')
    plt.xlabel("time [hour]")
    plt.ylabel("depth [m]")
    plt.xlim([0, 48])
    plt.savefig(f'{ncFile}.png')
    with open(f'{ncFile}.csv', 'w') as f:
        for i in range(0, len(timeTs)):
            f.write(f'{timeTs[i]}, {varTs[i]}\n')
    nc.close()

if __name__ == '__main__':
    os.chdir(r'C:\temp')
    writeTimeSeriesChart('BP001.nc', "depth", 135.183667, 35.314539)

これを実行すると、C:\temp\BP001.nc ファイルから、ある1地点(経度135.183667, 緯度35.314539に最も近いセル)の水深時系列のデータをグラフおよびCSVファイルで出力します。出力されるファイル名は、C:\temp\BP001.nc.csv および C:\temp\BP001.nc.png です。これらは、27行目から28行目で指定していますので、必要に応じて書き換えてください。 出力されるグラフの例を示します。


最終更新日: 2023-03-20