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

[dennou-ruby:003424] Re: rb-grib-0.1.0 released



西澤様

大塚です。

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