Upload
suguru-arakawa
View
2.036
Download
0
Embed Size (px)
DESCRIPTION
#appengine のレンジスキャンで近傍点を探すアレ
Citation preview
近くを探す?
appengine ja night beer talk
あらかわ (@ashigeru)
appengine ja night beer talk - @ashigeru 2
テーマ
座標(x, y)に近い点を探す
App Engineのデータストアでどうやる?
appengine ja night beer talk - @ashigeru 3
App Engineのクエリの特性
1次元のレンジスキャン
1つの値を大小関係で並べて順に取り出すだけ
開始地点(と終了地点)を選べる
(x, y)とかどう見ても2次元座標
appengine ja night beer talk - @ashigeru 4
方法1: 離散化
座標を一定の幅で区切ってブロックに
付近のブロックに含まれているか調べる
appengine ja night beer talk - @ashigeru 5
離散化の問題点
濃度によってはダメ
少ない→見つからない, 多い→見つかりすぎ
appengine ja night beer talk - @ashigeru 6
方法2: インメモリフィルタ
2次元目はインメモリで処理する
1次元目はデータストアフィルタでやる
appengine ja night beer talk - @ashigeru 7
インメモリフィルタの問題点
個数によってはダメ
1次元目の結果が爆発しているかも
appengine ja night beer talk - @ashigeru 8
空間充填曲線
(x, y)から遠くに向かってスキャンしたい
でも1次元のレンジスキャンしかできない
空間を1本の線で一筆書きする
空間充填曲線 (Space Filling Curve)
ヒルベルト曲線、Z曲線などが有名
appengine ja night beer talk - @ashigeru 9
Z曲線 (1)
平面の4点をZで結んでブロックにする
むしろN
appengine ja night beer talk - @ashigeru 10
Z曲線 (2)
ブロック4つをさらにZで結んでブロックにする
appengine ja night beer talk - @ashigeru 11
Z曲線 (3)
これを繰り返すと平面上のすべての点を一筆書きできる
appengine ja night beer talk - @ashigeru 12
空間充填曲線のスキャン (1)
ある点から前後にスキャンする
ただし、Z曲線の上でスキャン
appengine ja night beer talk - @ashigeru 13
空間充填曲線のスキャン (2)
最初のZになければ、ひとつ大きなZで探す
appengine ja night beer talk - @ashigeru 14
空間充填曲線のスキャン (3)
徐々にZを大きくしていけばいつか見つかる
小→大で探すので、近い順に見つかる
appengine ja night beer talk - @ashigeru 15
Z曲線の作り方 (1)
それぞれの次元の値を2進数で書く
appengine ja night beer talk - @ashigeru 16
Z曲線の作り方 (2)
1ビットずつ取り出して並べ替える
appengine ja night beer talk - @ashigeru 17
Z曲線の作り方 (3)
繰り返して順になぞるとZ曲線になる
appengine ja night beer talk - @ashigeru 18
多次元空間への拡張
平面じゃなくて4次元とかでも同じ http://tiling.latest.ashigeru-demo.appspot.com/
http://gist.github.com/398695
4次元の得点空間で、近くの点を探す≒ 得点が近い人を探す
appengine ja night beer talk - @ashigeru 19
Z曲線の問題点
アライメントに左右される
隣のZが意外と遠い
なので「一番近いものを探す」というのは難しい
超立方体の構造で探す
1次元だけ極端に値が違ったりすると非常に遠い
次元数が多すぎると使いにくい
参考文献
Geospatial Queries with Google App
Engine using GeoModel
http://code.google.com/intl/ja/apis/maps/
articles/geospatial.html
(その他募集中)
appengine ja night beer talk - @ashigeru 20