QGISを使って八ヶ岳の植生図を解析してみました。

GISとは地図空間情報を扱うソフトウェア(Geographic Information System)のことです。以前は専門的な業務に携わる会社でしか扱えないような(高価な)ものでしたが,今やQGIS(Quantum GIS)というフリー&オープンソースになっていて,少し学べば膨大なデータを自由に利用できる時代になりました。ということについ最近気がついたのですが,ようやく本屋でQGISの入門書を見つけてすこしかじってみました。

QGISで描いた八ヶ岳北部の植生図
同じく八ヶ岳南部の植生図

今から40年前の研究テーマだった,八ヶ岳の地形と植生の関係(当時数ヶ月かけてやったようなこと)のおさらいが3日くらいでできてしまいました。使ったデータは,国土地理院の基盤地図情報サービスと,環境省生物多様性センターの1/2,5000植生図GISデータです。要するに,今は地図情報がすべて電子化されているというわけです。土地の細かい起伏などは,レーザー航空測量とかで分かっていますし,空中写真から読み取った道路や建物などの形や位置もすべてダウンロードすることができます。そういったGISデータを加工するノウハウをつかめば,ほんとに何でもできそうな気がします。位置を座標で表すベクターデータと面的に並べて表すラスターデータがあるのですが,ラスターデータは天体写真で使う画像と同じですので,Pythonのmatplotlibを使えばデータとして読み込め,統計処理も簡単にできてしまいます。上のような10mメッシュの植生データと標高データから,標高や生育する植生との関係をグラフ化してみました。

植生と高度の関係

日本の中部山岳の標高2500m前後以上は高山帯(実は亜高山帯)と呼ばれる,ハイマツやお花畑からなる景観が広がっています。それが,どんな環境要因で生じるのか確かめてみたいと思ったのですが,40年前には,あまりパッとしない結果で終わってしまいました。八ヶ岳以外のデータも簡単に示せそうなので,これもまた老後の楽しみのひとつにして行こうと思います。


"""
GeoTiffファイルの集計プログラム
"""
import csv
import matplotlib
matplotlib.use('Agg') # for printout-file fig-histgram
import matplotlib.pyplot as plt
import numpy as np
from PIL import Image   #PIL;pillow module

xc =[] # list for raw-band data

filename = "tsuga-keisya"   # filename input and output
im = np.array(Image.open(filename +'.tif'))
# print(type(im))   # <class 'numpy.ndarray'>
x = np.ravel(im)   # conversion to list
xl = x.tolist()

for i in xl:   # ignore 0 data  
    if i <= 0: 
        continue
    xc.append(i)

# histgram method by matplotlib
r = plt.hist(xc, bins=16, range=(0,80), normed=False, weights=None,
                       cumulative=False, bottom=None, histtype='bar',
                       align='mid', orientation='vertical', rwidth=1,
                       log=False, color=None, label=None, stacked=False,)
#                       hold=None, data=None, )
# dic = {key: val for key, val in zip(r[1],r[0])}
plt.show()
plt.savefig('histgram.png')
# print(dic)
# output hist_data for csv-file

with open(filename +".csv", "w", newline="") as f:
    w = csv.writer(f,delimiter=",", quotechar='"')

    length = len(r[0])
    for i in range(length):
        w.writerow([r[1][i],r[0][i]])