MENU

東京湾〜外房・茨城エリアの海床地形マップを作ってみました

昨年からシーバス釣りを始めました。(本当は渓流釣りがやりたいのですが近場には海しか無いので)
今年からショアジギングにも挑戦しようと思っており、また船釣りにもよく行くので、普段釣りをするエリアがどの程度の水深があるのか知りたいと思っておりました。
ネットを色々と調べたところThe Nippon Foundation-GEBCO Seabed 2030 Projectで無償で海床地形データが公開されていたため、とりあえず自分がよく釣りをする東京湾〜外房・茨城エリアの地形マップを作成してみました。

作ったもの

こんな感じでとりあえずherokuにデプロイして公開してみましたのでよろしければ見てみてください。

Fishing Depth Map f:id:ti_taka:20210529115409p:plain

ちょっとしたWebサービスにして育てていこうかと思いましたが現時点ではここで力尽きました。

使ったデータ

The Nippon Foundation-GEBCO Seabed 2030 Projectの200mメッシュ標高データを使用しております。
(全世界分公開されている!!凄い!!↑のページに色々とプロジェクトの取組みなども記載されているので後で読んでみようと思います。) 緯度経度15秒ごとのメッシュデータなので約450mごとのデータですかね。 釣りに使う、特にショアから狙うエリアの地形を把握するには少し粗いかもしれません。 もっとよいデータが見つかれば入れ替えようかと思います。有料データなら良いものがあるかもしれません。
自分がよく行く東京湾奥〜幕張ぐらいのエリアはやっぱり浅いな〜ぐらいに見てました。

やっていること

無償提供されている地形データをmatplotlibでプロット、画像出力しGoogle mapに重ねて表示してます。
プロットは↓を参考にしました。

[Pythonによる科学・技術計算] 2次元(カラー)等高線等の描画,可視化,matplotlib - Qiita

matplotlib - contour で等高線を描画する方法 - pystyle

データは以下の形式でダウンロードすることが出来、ncolsが横方向のデータ数、nrowsが縦方向のデータ数、xllcorneryllcornerが対象エリアの左下の緯度、経度座標になっております。cellsizeは文字通りセルのサイズです。
7行目以降が実際の標高データなのですが、このデータ、実際の地図の配置と同じ配置で並んでいる、つまりこのデータの一番下端の左端の座標がxllcorneryllcornerとなります。

ncols        517
nrows        583
xllcorner    139.183333333333
yllcorner    34.612500000000
cellsize     0.004166666667
NODATA_value -32767
 1290 1176 1215 1355 1462 1500 1354 1288 1370 1510 1488 1380 1258 1142 1037 944 865 907 971 983 1071 1253 1369 1330 1209 1100 1057(略)
 1312 1310 1295 1357 1490 1556 1463 1378 1378 1492 1391 1267 1170 1068 981 913 877 969 1104 1134 1134 1243 1370 1358 1216 1100 1102(略)
 1470 1496 1392 1463 1567 1553 1481 1420 1464 1528 1411 1296 1165 1057 959 892 920 1016 1135 1219 1269 1375 1426 1347 1222 1121 1117(略)
 1582 1599 1520 1546 1546 1519 1499 1504 1590 1520 1395 1266 1182 1085 973 905 988 1033 1042 1116 1194 1327 1427 1371 1241 1159 1222(略)
〜 以下略 〜
geo_data_file = open("{{ ファイルパス }}", "r")

〜〜 ヘッダー行読み取り 〜〜
x_point = xllcorner
y_point = yllcorner + cellsize * nrows

x = np.zeros(ncols)
y = np.zeros(nrows)
Z = np.zeros([nrows, ncols])
while True:
    line_txt = geo_data_file.readline()
    if line_txt:
        line_txt = line_txt.strip()
        line = line_txt.split(" ")
        col_no = 0
        for z in line:
            if float(z) > 0:
                Z[row_no][col_no] = 0
            else:
                Z[row_no][col_no] = float(z)
            if row_no == 0:
                x[col_no] = x_point
            x_point += cellsize
            col_no += 1

        x_point = xllcorner
        y[row_no] = y_point
        y_point -= cellsize
        row_no += 1
    else:
        break

geo_data_file.close()
X, Y = np.meshgrid(x, y)

cm = plt.cm.get_cmap('seismic')

vmin = -40
vmax = 40

fig = plt.figure()
ax = fig.add_subplot(1, 1, 1)

cont = plt.contour(X, Y, Z, 5, vmin=vmin, vmax=vmax, colors=['red'], levels=[-200, -100, -70, -50, -20, -10, -5, 0], linewidths=0.05, linestyles=["-"])
cont.clabel(fmt='%1.1f', fontsize=1)

ax.pcolormesh(X, Y, Z, cmap=cm, vmin=vmin, vmax=vmax)
ax.axis("off")
plt.subplots_adjust(left=0, right=1, bottom=0, top=1)
fig.savefig("img.png", dpi=600)

Google Mapsへの画像の重ね方は下記を参考にしました。

【マップ】Googleマップにオリジナル画像を重ねて表示 | WEB制作 活用事例 サンプル

vue.js上で動かそうと思いましたが難しそうだったので断念して結局そのまま使わせてもらってます。

let map;

function initMap() {
    var latlng = new google.maps.LatLng(35.52390135624109, 139.85743908123192);
    var map = new google.maps.Map(document.getElementById('map'), {
        zoom: 10,
        center: latlng
    });

    var sw = new google.maps.LatLng(34.6125, 139.183333333333);
    var ne = new google.maps.LatLng(37.041666666861, 141.33333333350703);
    var latlngImg = new google.maps.LatLngBounds(
        sw,ne
    );
    var groundOverlay = new google.maps.GroundOverlay(
        '/static/images/img.png',
        latlngImg,
        {map: map}
    );
}

でも結局。。

これを頑張ってプロットしてみてから海釣図V(かいちょうずV)で海底地形見れることに気付きました。 これめちゃめちゃ便利じゃないですか・・!こちらは「航海用電子参考図 new pec(ニューペック)」のデータを使っているとのことなのでデータも細かいし、アプリ自体もとても使いやすい!!
しばらくは釣り用にはこちらを使い、自分で作ったマップの方も色々と勉強用がてらちょこちょこ更新していこうと思います。