メッシュ地盤高のリサンプリング
リサンプルとは
国土地理院の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]]