京都という斜面、流れる水路の流れを眺めてみよう。('24.05.22)#

マンハッタン座標系で作られた京都という街#

京都の地名は、道を基準に、北が上ルで南が下ル。 東や西は入ル。 基本的に、マンハッタン座標系と東西南北の方向で指示されます。 だから、京都の街での距離は、ほとんどユークルド・ノルムで表されることになります。

北は標高が高くて南は標高が低い、山に囲まれた京都盆地#

けれど、「北が上ルで南が下ル」という言葉の通り、北は標高が高くて南は標高が低い、それが山に囲まれた京都盆地です。 そのため、自転車で標高が高い北に上ルときは位置エネルギーの分、ペダルを踏む足に力を入れる必要があります。 その逆に、帰宅に下ル時は、自然に自転車が加速していくものです。

だから、京都の街を歩いたり・自転車で巡る時には、標高という名のスカラー値、つまりは位置エネルギーをいやでも意識することになります。

地理院地図データで京都の坂道を可視化する#

Software Design誌2024年6月号Software Design誌2023年5月号に、国土地理院が地理院地図(電子国土Web)で提供している標高データや地図・航空写真を使ったデータ処理記事を書きました。 それと同様の方法で、今回は京都の地理院地図データをッ使って、京都の坂道を可視化してみます。

まずは、Software Design誌2024年6月号Software Design誌2023年5月号と同様に、国土地理院の地理院情報をもとに3Dレンダリングするための関数を定義しておきます。

import numpy as np
import matplotlib.pyplot as plt
from imageio.v3 import imread, imwrite # conda install conda-forge::imageio
import cv2; from mpl_toolkits.mplot3d import Axes3D

# 国土地理院の地理院情報をもとに3Dレンダリングする
def draw_jp_map(texture, dem, height):
    l=512
    size=(l,l)
    # 標高データをlxlピクセルに解像度変換する
    z = cv2.resize(dem, size)
    # 地図画像データも同様にlxlピクセルに解像度変換する
    tex = cv2.resize(np.delete(texture, 3, axis=2), size)
    # 描画する高さ・色データを作成する
    x = y = np.linspace(0, l, l)
    x, y = np.meshgrid(x, y)
    x = np.ravel(x);y = np.ravel(y);z = np.ravel(z)
    c=np.reshape(tex,(l*l,3))
    for idx, z_ in enumerate(z):
        if z_< height:
          z[idx]=0.0
          c[idx]=[0,0,1]
    fig=plt.figure(figsize=[20,20])
    ax=fig.add_subplot(111,projection='3d')
    # レンダリングする標高レンジを決める
    ax.set_zlim(20,120)
    # レンダリングする視点を決める
    # elevはz軸方向から見た仰角,azimはx, y軸方向の方位角.
    ax.view_init(elev=30, azim=240)
    ax.invert_yaxis()
    ax.scatter3D(x,y,z,
        s=8,alpha=0.6,
        c=np.reshape(tex,(l*l,3)))

京都の街は意外に坂道だ。#

その上で、京都の地理院地図データを使って、標高差を強調しつつ、京都の街を3Dレンダリングしてみます。 手前左が嵐山・嵯峨野、左奥の斜面が化野念仏寺・仁和寺・竜安寺・金閣寺がある京都の西北。 そこを北から南に流れるのが桂川。

右奥が修学院離宮から銀閣寺がある京都の東北、そして、右手前が南禅寺・清水寺・三十三間堂がある京都の東側です。 北東奥から流れる賀茂川と高野川が交わる鴨川デルタから、鴨川という名前を襲名した水の流れは南へ流れ、やがて桂川と合流し、淀川という名前を次に襲名することになります。

そんな街並みを3Dレンダリングした結果が、次の結果です。

Hide code cell source
# 地図画像と写真画像(2048, 2048, 4)を読む
# 地図画像
texture_map = imread('data/day_240522_imageio_kyoto_texture.png')
# 写真画像
texture_photo = imread('data/day_240522_imageio_kyoto_texture-2.png')
# 地図・写真を適当な比率で合成する
texture = (texture_map*0.3+texture_photo*0.7)/255 
# 標高情報(CSVファイル)を読み込む
dem = np.loadtxt('data/day_240522_imageio_kyoto_dem.csv', delimiter=',')
dem_size = 257
dem = 100*dem.reshape([dem_size,dem_size])

draw_jp_map(texture, dem, 7)
_images/7befbc9ea8aede134ea64122ce7cfc5de95f76ebe8d42a85ac4170a2e45b1637.png

東山なら六波羅蜜寺、西なら竜安寺近く、それは山の斜面#

「北から南への下り坂」が京都という街ですが、それに加えて、京都には意外なことに坂があります。 たとえば、京都の東なら六波羅蜜寺辺り、あるいは西なら竜安寺近く、その辺りは小高い場所になっています。

南から北に流れる哲学の道の疎水#

京都の街並みを散策する時は、こんな3D標高地図を頭に浮かべて歩いてみると、とても面白いものです。 たとえば、北から南に下る斜度が割とあるのにも関わらず、琵琶湖から蹴上経由で白川にグルリと向かう疎水(いわゆる哲学の道沿いなど)は、北上して流れています。 そんな流れの向きを見ると、疎水の工事設計に興味を感じたりするのではないでしょうか。

_images/day_240522_imageio_kyoto_sosui.jpg

図 2 京都の疎水#