ruby-robotの夢

cygwin-ruby,qgisの達人を目指す奮闘記

気候等の複数要素特性の色表現手法

世界の気象データ(気温と降水量)から如何に類似性を評価するか

気候区分方法

世界の気候区分としては、気温と湿潤度に基づくケッペンの気候分類が知られるが、区分数は、30数個で、おおざっぱである。日本を分けると温帯、亜寒帯、亜熱帯の3つにしか分類されない。

この区分では類似性を評価するのは難しい。

Google検索してみたが、一般的な評価方法はなさそうなので、考えてみた。

参考になるかと思ったのが、

縦軸に、気温、横軸に、湿度をとって、月ごとのプロットをしたクリモグラフ(climatograph)で表現した区分もあるが、湿度データは取得しにくい。

 下の、個人ブログであるが、月平均気温と月降水量の差分指標によるものである。

http://nyhoustl.pythonanywhere.com/index_en

月平均気温と月降水量は基本な指標であろう。

上記の指標は、丁寧ではあるが、24もの要素で構成され、複雑である。

クリモグラフを単純化し、気温と降水量を2,5,8,11の4ヶ月分又は2,8,等でプロットしてもよさそうである。

 もっと言えば、①TY年平均気温、②TYD年間気温差、③RY年降水量 で概ねのことが表現されそうだ。

ケッペンの区分は、最暖月気温や最寒月気温や湿潤度等によって区分され、似た考え方である。

気候の特性は、この3つのパラメータを用いて、直接的に区分することでより精密な区分が可能と考える。また、直接的に色分けすることで明確化が図れる。

カラー設定の方法

R,G,Bで表現すると、どうだろうか?

R:TY G:TYD B:RY で割り当てる。

熱帯 100,   0,100 マゼンタ

温帯  50,100,  50 薄緑

寒帯    0,  50,  50 暗シアン

砂漠 100,100,    0 黄色

通常の色分けと類似性もあり、良さそう。仮にDRR式気候区分図と名付けよう。

 

HSL,HSV,CMY等、他のカラーモデルも含めて試してみる価値がありそうだ。

出力例

R:["TY", 0.0,30,6.0 ], #min,max,pit
G:["TYD", 0.0,20,4.0],
B:["RY", 0.0,2500,500.0],}

の6*6*6の216階調としてみた。

f:id:george_thai:20190603101624p:plain

気候区分図(DRR式)

区分を増やしてみる。

R:["TY", -10.0,30,5.0 ], #min,max,pit
G:["TYD", 0.0,16,2.0],
B:["RY", 0.0,2800,350.0],}

の8*8*8の512階調としてみた。なかなかよいのではないか。

f:id:george_thai:20190603161707p:plain

気候区分図(RGB888,RRD法)

qml出力プログラム

QGISで、上のようなカラー設定は、自動ではできない。

qmlファイルをrubyで作ることとした。

#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
lmax=8;p=36.4286
colors=[*0..(lmax-1)].product([*0..(lmax-1)],[*0..(lmax-1)])

 .map.with_index{|(iR,iG,iB),ic|
 [ic.to_s,"#{iR}#{iG}#{iB}",*[iR,iG,iB].map{|i| [i*p,255].min.to_i.to_s}]}
print colors

fo=open(nfo="climat_rgb888.qml","w");ityp=0;name1="climt888";name2="climt";
#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

fo.print head= '<!DOCTYPE qgis PUBLIC \'http://mrcc.com/qgis.dtd\' \'SYSTEM\'>
<qgis version="3.4.7-Madeira" styleCategories="LayerConfiguration|Symbology" readOnly="0">
<flags>
<Identifiable>1</Identifiable>
<Removable>1</Removable>
<Searchable>1</Searchable>
</flags>
<renderer-v2 forceraster="0" symbollevels="0" attr="climt888" enableorderby="0" type="categorizedSymbol">
<categories>'

#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

fo.print list= colors.map.with_index{|color,ic|
value=color[1]
label=color[1]
' <category render="true" symbol="'+ic.to_s+'" value="'+value+'" label="'+label+'"/>'
}*"\n" fo.print qml_2=<<EOD
</categories>
<symbols>
EOD

#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

fo.print bodies=colors.map.with_index{|color,ic|

outline_style="solid"
outline_style="no"
rgba=(color[2,3]+["255"])*","
' <symbol alpha="1" clip_to_extent="1" force_rhr="0" name="'+ic.to_s+'" type="marker">
<layer locked="0" pass="0" enabled="1" class="SimpleMarker">
<prop v="0" k="angle"/>
<prop v="'+rgba+'" k="color"/>
<prop v="1" k="horizontal_anchor_point"/>
<prop v="bevel" k="joinstyle"/>
<prop v="circle" k="name"/>
<prop v="0,0" k="offset"/>
<prop v="3x:0,0,0,0,0,0" k="offset_map_unit_scale"/>
<prop v="MM" k="offset_unit"/>
<prop v="35,35,35,255" k="outline_color"/>
<prop v="'+outline_style+'" k="outline_style"/>
<prop v="0" k="outline_width"/>
<prop v="3x:0,0,0,0,0,0" k="outline_width_map_unit_scale"/>
<prop v="MM" k="outline_width_unit"/>
<prop v="diameter" k="scale_method"/>
<prop v="2" k="size"/>
<prop v="3x:0,0,0,0,0,0" k="size_map_unit_scale"/>
<prop v="MM" k="size_unit"/>
<prop v="1" k="vertical_anchor_point"/>
<data_defined_properties>
<Option type="Map">
<Option value="" name="name" type="QString"/>
<Option name="properties"/>
<Option value="collection" name="type" type="QString"/>
</Option>
</data_defined_properties>
</layer>
</symbol>'}*"\n"

#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

fo.print tail=<<EOD

</symbols>
<source-symbol>
<symbol alpha="1" clip_to_extent="1" force_rhr="0" name="0" type="marker"> <layer locked="0" pass="0" enabled="1" class="SimpleMarker">
<prop v="0" k="angle"/>
<prop v="243,166,178,255" k="color"/>
<prop v="1" k="horizontal_anchor_point"/>
<prop v="bevel" k="joinstyle"/>
<prop v="circle" k="name"/>
<prop v="0,0" k="offset"/>
<prop v="3x:0,0,0,0,0,0" k="offset_map_unit_scale"/>
<prop v="MM" k="offset_unit"/>
<prop v="35,35,35,255" k="outline_color"/>
<prop v="solid" k="outline_style"/>
<prop v="0" k="outline_width"/>
<prop v="3x:0,0,0,0,0,0" k="outline_width_map_unit_scale"/>
<prop v="MM" k="outline_width_unit"/>
<prop v="diameter" k="scale_method"/>
<prop v="2" k="size"/>
<prop v="3x:0,0,0,0,0,0" k="size_map_unit_scale"/>
<prop v="MM" k="size_unit"/>
<prop v="1" k="vertical_anchor_point"/>
<data_defined_properties>
<Option type="Map">
<Option value="" name="name" type="QString"/>
<Option name="properties"/>
<Option value="collection" name="type" type="QString"/>
</Option>
</data_defined_properties>
</layer>
</symbol>
</source-symbol>
<rotation/>
<sizescale/>
</renderer-v2>
<blendMode>0</blendMode>
<featureBlendMode>0</featureBlendMode>

<previewExpression>id</previewExpression>
<layerGeometryType>0</layerGeometryType>
</qgis>
EOD
print nfo

気候の類似性評価

気候の類似性を評価する指標は、上の、R,G,Bの指標値を用い、空間距離を算定すればよい。指標の重みを付けることも考えられる。