[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[dennou-ruby:001993] Re: gpprint, gpview



堀之内です。

> そこまで一気にやらずに, まずは絵を書くために必要なパラメターを
> 並べることから始めたらどうでしょうか. 自動化までは欲張らず, 
> とりあえず外から数字をできるようにしておくことはまだ簡単ですよね. 
> getopts を見るに, 1 行追加していくだけでオプションが作れるようですから. 

地図投影について。

一気にやらないと2度手間になってしんどいので、思いきってやりまし
た。まだ cvs のみですが、近々バージョンアップして fix したいです。
下記のプログラムで、

http://ruby.gfd-dennou.org/products/gphys/tmp/

にある画像ができます(この置き場は一時的なものです)。
sldiv('t',3,2)で、縦分割なのに注意(ペアで出してる図が多いので)。
テスト用データは gphys 配布パッケージのtestdata/ にあります。
プログラムが長いのは沢山書いてるからで、それぞれは短いです。

結局投影の指定法をどう整理したかというと、

  map_axis: 接点の座標と回転角 -- DCL.umscnt の3パラメター
            (UXC,UYC,ROT)。 単位は度(以下同じ)

  map_radius: (円錐/方位図法用) 接点を中心に地図に含む半径

  map_lat_range: (円筒図法用) この範囲より外は地図に含めない

です。これだけでよろしくやってくれ、しかも全部省略可能です。
とりあえず変換番号さえ指定すれば、あとはいつも通り GGraph.tone
や GGraph.contour を呼べばなんとかしてくれます。(投影法に
よっては、裏側のデータを含まないようにしたほうがいいですが。)

ちなみにデフォルト値はこなってます。

  円筒図法のデフォルト値:
    map_axis = [180.0, 0.0, 0.0]
    map_lat_range = [-75,75] 
    
    なお、投影軸が傾いている場合は map_lar_range の指定は無効で、
    常にデフォルト値を用います。円筒図法は全球に向いているので、
    以上のデフォルト値でいいと思います。

  円錐/方位図法のデフォルト値:
    map_axis = [180.0, 90.0, 0.0]
    map_radius = 70.0

グリッド線や海岸線に関しては、今までの座標軸書き関数 axes と
並列に map というのを用意しました。もちろん何を書いて何を書かな
いかは変えられます。contour/tone/vector は投影法に応じてこの2つ
を呼び分けます。

なお、地図投影をしたらデータがサイクリックに繋がらないとかっこ
悪いので GPhys に新メソッド cyclic_ext を設けました。
呼び方は cyclic_ext(dim_or_dimname, modulo)。指定し多次元に関し、
あと一個足せば、(丸め誤差も含めて)幅が modulo に合う場合だけ
拡張します。それ以外では self を返す。GGraph では、地図投影の場
合経度に関しこれを自動で呼びます。

こんな感じでいいでしょうか。サンプルプログラムと結果の図を見比べ
てコメント頂けないでしょうか > 竹広様。もうちょっと待ってから、
GPhys のバージョンアップをします。

塚原様:

gpview を rd2 して doc/ に加えました。今後もし変更したら、
こちらのアップデートもお願いします。

水田様:

どれもずいぶん前からの宿題でしたね。いままでせずにすみません。

堀之内 武                    horinout@xxxxxxxxxxxxxxxxxx
京都大学生存圏研究所               611-0011 宇治市五ヶ庄

-------------------- 以下 map_projection.rb ------------------
=begin
=map_projection.rb
==USAGE
  % ruby map_projection.rb [wsn]
where wsn is 1,2,3,or 4.
PNG files will be dumped if wsn==4.
=end

require 'numru/ggraph'
include NumRu

wsn = ( ARGV[0] ? ARGV[0].to_i : 1 )

path = '../testdata/T.jan.nc'
var = 'T'
gp = GPhys::IO.open(path,var)

DCL.swpset('ldump',true) if wsn == 4
DCL.gropn(wsn)
DCL.sldiv('t',3,2)

DCL.sgpset('lcntl',false)

# < defalut: itr==1 >
GGraph.tone( gp )
DCL.grfrm

# < map projection >

itr=11
GGraph.set_fig('itr'=>itr)
GGraph.set_map('vpt_boundary'=>true, 'coast_world'=>true)

[ [180.0,0.0,0.0],  [180.0,0.0,180.0] ].each do |axis|
  GGraph.next_fig('map_axis'=>axis)
  GGraph.tone( gp.cut('lat'=>-70.0..-20.0) )
  DCL::sgtxzr(0.5, 0.15, DCL::sgtrnl(itr).strip+"  map_axis=#{axis.inspect}", 
	      0.025, 0, 0, 3)

  GGraph.next_fig('map_axis'=>axis, 'map_lat_range'=>[-70.0,-20.0])
  GGraph.tone( gp.cut('lat'=>-70.0..-20.0) )
  DCL::sgtxzr(0.5, 0.15, DCL::sgtrnl(itr).strip+"  map_axis=#{axis.inspect}",
	      0.025, 0, 0, 3)
end

[  [180.0,0.0,90.0], [180.0,0.0,60.0] ].each do |axis|
  GGraph.next_fig('map_axis'=>axis)
  GGraph.tone( gp.cut('lat'=>-70.0..-20.0) )
  DCL::sgtxzr(0.5, 0.15, DCL::sgtrnl(itr).strip+"  map_axis=#{axis.inspect}",
	      0.025, 0, 0, 3)
end

GGraph.set_map('vpt_boundary'=>false)

[10,11,12,13,14,15].each do |itr|
  GGraph.next_fig('itr'=>itr)
  GGraph.tone( gp )
  DCL::sgtxzr(0.5, 0.15, DCL::sgtrnl(itr), 0.025, 0, 0, 3)
end

[20,21,22,23,30,31,32,33].each do |itr|
  GGraph.next_fig('itr'=>itr)
  if itr==31  # polar stereo
    GGraph.next_map('vpt_boundary'=>3) 
    DCL::sgpset('lclip', true)
  else
    DCL::sgpset('lclip', false)
  end
  GGraph.tone( gp )
  DCL::sgtxzr(0.5, 0.15, DCL::sgtrnl(itr), 0.025, 0, 0, 3)

  axis = [135,60,0]
  GGraph.next_fig('itr'=>itr,'map_axis'=>axis,'map_radius'=>60.0)
  GGraph.next_map('vpt_boundary'=>3) if itr==31  # polar stereo
  GGraph.tone( gp.cut('lat'=>0..90) )
  DCL::sgtxzr(0.5, 0.15, DCL::sgtrnl(itr).strip+"  map_axis=#{axis.inspect}",
	      0.025, 0, 0, 3)
end

DCL.grcls