いちからはじめる GMT その19 - nearneighbor

2009年 6月 1日 掲載, 2011年 1月 4日 修正(-Nオプションの説明)


今回は,きちんとグリッドに並んでいないデータから, 内挿計算によって grdファイルを作ってみる.


前回まで使ってきた双曲放物面データ hp.txt は計算して作ったので, データの座標がグリッド状で,xyz2grdコマンドで,そのまま grdファイルにしても問題なかった. しかし,あつかうデータが観測によるものなどの場合, データの座標がグリッドと一致していることはあまりないだろう. 今回はそういうケースをあつかってみる.

まずは例のデータ作りである. あつかうのは,前回と同じ双曲放物面で,やっぱり awk で作るのだが, 座標をランダムにしてある.

$ awk 'BEGIN{for(i=0; i<2500; i++){x=rand()*10-5; y=rand()*10-5; print x, y, (x^2-y^2)}}' > hpr.txt

データの個数は 2500個. 0.2間隔のグリッド点と同数にした((10/0.2)2).

できあがったデータをプロットしてみよう. カラーパレットファイルには,その17 で作った cp2.cpt を使う.

$ psxy hpr.txt -R-4/4/-4/4 -Jx1 -Ba1 -Sc0.2 -Ccp2.cpt -K > hpr.eps
$ psxy hpr.txt -R -J -Sc0.2 -O >> hpr.eps

双曲放物面データ

これを,そのまま xyz2grdコマンドで grdファイルにしてみると….

$ xyz2grd hpr.txt -Ghpr.grd -I0.2 -R-4/4/-4/4
$ grdimage hpr.grd -Jx1 -Ccp2.cpt -Ba1 > hpr.eps

双曲放物面

予想通り穴だらけである.この穴を何らかの方法で補完したい.

GMT には nearneighbor という, Nearest neighbor法で内挿してグリッドデータを作るコマンドがある.

Nearest neighbor法がどういうアルゴリズムかは,man に説明がある.

nearneighbor reads  arbitrarily  located  (x,y,z[,w]) triples [quadru-
plets] from standard input [or xyzfile(s)] and uses a nearest  neighbor
algorithm to assign an average value to each node that have one or more
points within a radius centered on the node.  The average value is com-
puted  as  a weighted mean of the nearest point from each sector inside
the search radius.  The weighting function used is w(r) = 1 / (1 + d  ^
2),  where  d  = 3 * r / search_radius and r is distance from the node.
This weight is modulated by the observation points'  weights  [if  sup-
plied].

求めたいグリッド座標から,各セクタの一番近いデータを使い, 距離 r から計算した重み係数 w(r) = 1 / (1 + d2) (ここで d = 3 * r / S,S は探索半径)で重み付き平均を行うのである.

さっそく使ってみよう. まずは,例によってコマンドを単独で実行して,usage を見てみる.

$ nearneighbor
nearneighbor 4.2.1 - A "Nearest neighbor" gridding algorithm

usage: nearneighbor [xyzfile(s)] -G<out_grdfile> -I<xinc>[u][=|+][/<yinc>[u][=|+]]
	-N<sectors>[/<min_sectors>] -R<west>/<east>/<south>/<north>[r] -S<radius>[m|c|k|K] [-E<empty>] [-F]
	[-H[i][<nrec>]] [-L<flags>] [-V ] [-W] [-:[i|o]] [-bi[s|S|d|D][<ncol>]] [-f[i|o]<colinfo>]

	-G name of output grid.
	-I<xinc>[m|c|e|k|i|n|+][=][/<yinc>[m|c|e|k|i|n|+][=]]
	   Give increment and append unit (m)inute, se(c)ond, m(e)ter, (k)ilometer, m(i)les, (n)autical miles.
	   (Note: m,c,e,k,i,n only apply to geographic regions specified in degrees)
	   Append = to adjust the domain to fit the increment [Default adjusts increment to fit domain].
	   Alternatively, specify number of nodes by appending +. Then, the increments are calculated
	   from the given domain and grid-registration settings (see Appendix B for details).
	-N sets number of sectors and minimum number to be filled.
	   Default is quadrant search [4], requiring all to be filled.
	-R specifies the min/max coordinates of data region in user units.
	   Use dd:mm[:ss] format for regions given in degrees and minutes [and seconds].
	   Use [yyy[-mm[-dd]]]T[hh[:mm[:ss[.xxx]]]] format for time axes.
	   Append r if -R specifies the longitudes/latitudes of the lower left
	   and upper right corners of a rectangular area.
	   -Rg -Rd are accepted shorthands for -R0/360/-90/90 -R-180/180/-90/90
	-S sets search radius in -R, -I units; append m or c for minutes or seconds.
	   Append k for km (implies -R,-I in degrees), use flat Earth approximation.
	   Append K for km (implies -R,-I in degrees), use exact geodesic distances.
	   If the current ELLIPSOID is Sphere then spherical great circle distances are used.

         :
         :

元のデータファイルを指定することと, grdファイル名を指定する -Gオプション,グリッド間隔を指定する -Iオプション, 範囲を指定する -Rオプションは,xyz2grdコマンドと同じである. nearneighborコマンドでは,さらに探索半径を指定する -Sオプションが必要となる (データを探索するセクタ数を指定する -Nオプションも必須とあるが, なければデフォルト値 4(quadrant search)が入るので,省略してもいい).

では,実際に計算をして grdファイルを作ってみる.

$ nearneighbor hpr.txt -Ghpr2.grd -I0.2 -R-4/4/-4/4 -S1.0

元データ hpr.txtから, 探索範囲 1.0 で Nearest neighbor法の内挿を行い, グリッド間隔 0.2 の grdファイル hpr2.grd を作成した.

これを図化してみよう.

$ grdimage hpr2.grd -Jx1 -Ccp2.cpt -Ba1 > hpr2.eps

双曲放物面

きれいな図ができた.


[ KDOホームにもどる ] [ いちからはじめる GMT インデックスにもどる ]


(C) 2009 KDO