ruby-robotの夢

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

メッシュ地盤高のリサンプリング

リサンプルとは

国土地理院のDEMデータ(5m)は、1kmを、南北150,東西225分割したメッシュで提供されている。これを、南北200,東西200分割のメッシュに割り当てる。

というようなテーマである。

これは、画像処理でよくいうリサンプルと同様のことで、

ArcGIS,QGISでも、リサンプル、リサンプリングと呼んでいる。

リサンプリング方法

・最近隣(ニアレストネイバー)法

・面積加重平均法 Bilinear Interpolation (バイリニア;共1次内挿法)
等があるようだ。

どちらの方法も、難しくはなさそうだが、コードを探しても出てこないので、自分で作ってみよう。下は、面積率を出すための延長率の算出を行った。

面積率は、縦と横を掛け合わせばよい。

 プログラムコード(コア部分)

#リサンプルの面積率を算出

def i_rates(ni,nm)
# 1をni分した区間毎に、nm分した区間の占める割合を返す
 lcm=ni.lcm(nm) #least common multiple
 li=lcm/ni
 lm=lcm/nm
 ims=[*0..ni-1].map{|i|
  [*0..li-1].map{|m|
   k=i*li+m
   mm=k/lm
  }.group_by{|i| i}.map{|i,a| [i,a.size.to_f/li]}
 }
end

#最近点を算出

def im_is(ni,nm)
 if ni<nm
  imrs=i_rates(nm,ni)
  ixs=imrs.map{|ir| ir.sort_by{|i,r| r}[-1][0]}
  ixs.zip([*0..ixs.size-1]).group_by{|m,i| m}
   .map{|m,mis| mis.map{|mm,ii| ii} }
 else
  imrs=i_rates(ni,nm)
  ixs=imrs.map{|ir| [ir.sort_by{|i,r| r}[-1][0]]}

 end
end
im=[4,3]
print is=i_rates(*im)
print is=im_is(*im)
jm=[4,5]
print js=im_is(*jm)

__END__

_________
[0, 1.0, [[0, 0.333], [1, 0.667]], [[1, 0.667], [2, 0.333]], 2, 1.0]
[[0], [1], [1], [2]]
[[0], [1], [2, 3], [4]]