プログラム日記φ(..)

おもにPython関係のプログラムメモ

地球全体を、標高1m毎に別の色で塗り絵して地図を作ってみる。

 前回作成した要領で、水深6000mから標高5500mまでのカラーマップを作成し

 

memomemokun.hateblo.jp

 

ETOPO1の標高値を使い

 

https://www.ngdc.noaa.gov/mgg/global/global.html

 

地球の全体を標高1m間隔を別の色で塗り絵してみる。

 

こんな感じ。

f:id:memomemokun:20190214081556j:plain

ETOPO1グローバル地形データセットを標高1m間隔で色付けしてみる

 

水深6000m以下は青、標高5500m以上は白。

また、水深6000mから標高5500mまでは以下のような配色のカラーグラデーションを生成し、標高・水深1m毎に異なる色を割り当てているので、総計11,502色で色分けしている感じです。

f:id:memomemokun:20190214095016j:plain

 

 

上を作成した時のソースは以下

#!/usr/bin/env python
# -*- coding: utf-8 -*- 
    
    
from netCDF4 import Dataset
import numpy as np

import matplotlib.pyplot as plt
import matplotlib.colors as colors
from matplotlib import cm
from sklearn import preprocessing


def makecolormap():

    # 基点となる標高での色を配列として定義する
    color = np.array([[-6000, '#0938BF'],
                 [-2500,  '#50D9FB'],
                 [-1,     '#B7E5FA'],
                 [0,      '#1F4806'],
                 [100,    '#68E36B'],
                 [150,    '#98D685'],
                 [300,    '#F9EFCD'],
                 [800,    '#E0BB7D'],
                 [1000,   '#D3A62D'],
                 [2500,   '#997618'],
                 [3000,   '#705B10'],
                 [3500,   '#5F510D'],
                 [4000,   '#A56453'],
                 [5000,   '#5C1D09'],
                 [5500,   'snow']])


    # 標高値を0..1の範囲に正規化
    hight = color[:, 0].astype(np.float32)
    hightnorm = preprocessing.minmax_scale(hight)


    # 正規化した標高値と各色の組みのリストcolornormを生成
    colornorm = []
    for no, norm in enumerate(hightnorm):
        colornorm.append([norm, color[no, 1]])
        
    # colornormに従いグラデーションカラーマップを作成
    cmap = colors.LinearSegmentedColormap.from_list('a', colornorm, N=hight.max()-hight.min()+1)


    # カラーマップを割り当てる1m間隔の標高値
    hightbounds = range(int(hight.min()), int(hight.max()+1))

    return cmap, hightbounds



# 水深・標高用カラーマップ作成
etopo1 = Dataset('ETOPO1_Bed_g_gmt4.grd','r')

x=etopo1.variables['x'][:]
y=etopo1.variables['y'][:]
Z=etopo1.variables['z'][:]

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

# メッシュを間引く
X=X[::10,::10]
Y=Y[::10,::10]
Z=Z[::10,::10]

# 標高・水深地図を作成する
fig = plt.figure(figsize=(40, 20), dpi=72, facecolor='w', edgecolor='k')
plt.subplots_adjust(left=0, right=1, bottom=0, top=1)
ax = fig.add_subplot(111)


# 水深・標高用カラーマップ作成
cmap, hightbounds = makecolormap()
cmap.set_over('white')
cmap.set_under('darkblue')
norm = colors.BoundaryNorm(hightbounds, cmap.N)


# 標高・水深に応じて地形を塗りつぶす
pcolor = ax.pcolor(X, Y, Z, norm=norm, linewidth=0, alpha=.7, cmap=cmap)


#plt.savefig('1.jpg', dpi=72, facecolor="azure", bbox_inches='tight', pad_inches=0)
plt.savefig('1.jpg', dpi=72)
plt.show()

 

 

これに、海底地形き日本地図を作ってみた際の陰影起伏 (Hillshade)を加えれば、略々、ETOPO1に掲載の地球全体画像に等しい感じになるでしょうか。

 

memomemokun.hateblo.jp