[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[dennou-ruby:003424] Re: rb-grib-0.1.0 released
- To: dennou-ruby@xxxxxxxxxxx
- Subject: [dennou-ruby:003424] Re: rb-grib-0.1.0 released
- From: ÂçÄÍÀ®ÆÁ <otsuka@xxxxxxxxxxxxxxxxxx>
- Date: Wed, 30 Nov 2011 22:18:14 +0900
西澤様
大塚です。
rb-grib で開いた GPhys オブジェクトに cut メソッド等を
用いた場合、最初の二次元のどちらかの次元が落ちるような
範囲指定を行う(例えばある緯度で切り出すなど)とエラーになります。
添付のパッチで一応動くようになります。
ついでに、インデックスを指定する際に複数次元をまとめて
全範囲指定する "false" が、インデックスの配列の
最初もしくは最後以外の場所に使われた場合にエラーメッセージを
出すのは、NArray などの仕様と矛盾する気がした(NArray では出来る)
ので、そのような場合でも切り出しを行うように変更してみました。
もし問題なさそうならば取り込んでいただけると助かります。
(2011/11/30 13:44), 大塚成徳 wrote:
> 西澤様
>
> ありがとうございます。うまく読めるようになったようです。
>
> 大塚
>
> (2011/11/30 13:18), Seiya Nishizawa wrote:
>> 大塚様
>>
>>
>> 2011/11/29 大塚成徳<otsuka@xxxxxxxxxxxxxxxxxx>:
>>> GRIB 1 形式のデータを読もうとすると、添付のようなエラーが出ました。
>>> エラーメッセージの中の forecastTime に該当する項目が nil になって
>>> いますが、本当は複数の予報時刻のデータが格納されているファイルなので、
>>> 予報時刻情報の読み取りに失敗していると思われます。
>>>
>>> GRIB 2 形式は正しく読めたので、GRIB 1 と GRIB 2 の仕様の違いでしょうか?
>>> stepRange, startStep, endStep というのが予報時刻を表しているように
>>> 見えます。
>> GRIB 1 では startStep を使うように変更しました。
>>
>>
>> 西澤誠也
>>
>
>
--
京都大学大学院理学研究科
気象学研究室
大塚成徳 (Shigenori OTSUKA)
email: otsuka@xxxxxxxxxxxxxxxxxx
tel: 075-753-3935
diff --git a/lib/numru/grib/grib.rb b/lib/numru/grib/grib.rb
index c4a3d18..b906e3d 100644
--- a/lib/numru/grib/grib.rb
+++ b/lib/numru/grib/grib.rb
@@ -367,13 +367,14 @@ module NumRu
mask = nil
first = Array.new(rank-@xy_dims,0)
if indices.length != 0
- if indices[0] == false
- indices[0] = [true]*(sha.length-indices.length+1)
- elsif indices[-1] == false
- indices[-1] = [true]*(sha.length-indices.length+1)
- elsif indices.include?(false) || indices.length != rank
- raise "invalid indices"
+ if indices.include?(false)
+ sha2 = sha.dup
+ sha2.delete(false)
+ raise ArgumentError, 'multiple "false" in indices' if sha.length - sha2.length > 1
+ indices[indices.index(false)] = [true]*(sha.length-indices.length+1)
+ indices.flatten!
end
+
rank.times{|n|
ind = indices[n]
case ind
@@ -427,7 +428,7 @@ module NumRu
val.reshape!(*shape[0...@xy_dims])
# val = msg.get_data[2].reshape!(*shape[0...@xy_dims])
unless indices.length==0 || indices[0...@xy_dims].inject(true){|t,v| t &&= v==true}
- val = val[*indices[0...@xy_dims]]
+ val = val.slice(*indices[0...@xy_dims])
end
end
(MAXNDIM-2).times do |i| index[i] = idx[i]-first[i] end