20
近くを探す? appengine ja night beer talk あらかわ (@ashigeru)

appengine ja night BT 近くを探す?

Embed Size (px)

DESCRIPTION

#appengine のレンジスキャンで近傍点を探すアレ

Citation preview

Page 1: appengine ja night BT 近くを探す?

近くを探す?

appengine ja night beer talk

あらかわ (@ashigeru)

Page 2: appengine ja night BT 近くを探す?

appengine ja night beer talk - @ashigeru 2

テーマ

座標(x, y)に近い点を探す

App Engineのデータストアでどうやる?

Page 3: appengine ja night BT 近くを探す?

appengine ja night beer talk - @ashigeru 3

App Engineのクエリの特性

1次元のレンジスキャン

1つの値を大小関係で並べて順に取り出すだけ

開始地点(と終了地点)を選べる

(x, y)とかどう見ても2次元座標

Page 4: appengine ja night BT 近くを探す?

appengine ja night beer talk - @ashigeru 4

方法1: 離散化

座標を一定の幅で区切ってブロックに

付近のブロックに含まれているか調べる

Page 5: appengine ja night BT 近くを探す?

appengine ja night beer talk - @ashigeru 5

離散化の問題点

濃度によってはダメ

少ない→見つからない, 多い→見つかりすぎ

Page 6: appengine ja night BT 近くを探す?

appengine ja night beer talk - @ashigeru 6

方法2: インメモリフィルタ

2次元目はインメモリで処理する

1次元目はデータストアフィルタでやる

Page 7: appengine ja night BT 近くを探す?

appengine ja night beer talk - @ashigeru 7

インメモリフィルタの問題点

個数によってはダメ

1次元目の結果が爆発しているかも

Page 8: appengine ja night BT 近くを探す?

appengine ja night beer talk - @ashigeru 8

空間充填曲線

(x, y)から遠くに向かってスキャンしたい

でも1次元のレンジスキャンしかできない

空間を1本の線で一筆書きする

空間充填曲線 (Space Filling Curve)

ヒルベルト曲線、Z曲線などが有名

Page 9: appengine ja night BT 近くを探す?

appengine ja night beer talk - @ashigeru 9

Z曲線 (1)

平面の4点をZで結んでブロックにする

むしろN

Page 10: appengine ja night BT 近くを探す?

appengine ja night beer talk - @ashigeru 10

Z曲線 (2)

ブロック4つをさらにZで結んでブロックにする

Page 11: appengine ja night BT 近くを探す?

appengine ja night beer talk - @ashigeru 11

Z曲線 (3)

これを繰り返すと平面上のすべての点を一筆書きできる

Page 12: appengine ja night BT 近くを探す?

appengine ja night beer talk - @ashigeru 12

空間充填曲線のスキャン (1)

ある点から前後にスキャンする

ただし、Z曲線の上でスキャン

Page 13: appengine ja night BT 近くを探す?

appengine ja night beer talk - @ashigeru 13

空間充填曲線のスキャン (2)

最初のZになければ、ひとつ大きなZで探す

Page 14: appengine ja night BT 近くを探す?

appengine ja night beer talk - @ashigeru 14

空間充填曲線のスキャン (3)

徐々にZを大きくしていけばいつか見つかる

小→大で探すので、近い順に見つかる

Page 15: appengine ja night BT 近くを探す?

appengine ja night beer talk - @ashigeru 15

Z曲線の作り方 (1)

それぞれの次元の値を2進数で書く

Page 16: appengine ja night BT 近くを探す?

appengine ja night beer talk - @ashigeru 16

Z曲線の作り方 (2)

1ビットずつ取り出して並べ替える

Page 17: appengine ja night BT 近くを探す?

appengine ja night beer talk - @ashigeru 17

Z曲線の作り方 (3)

繰り返して順になぞるとZ曲線になる

Page 18: appengine ja night BT 近くを探す?

appengine ja night beer talk - @ashigeru 18

多次元空間への拡張

平面じゃなくて4次元とかでも同じ http://tiling.latest.ashigeru-demo.appspot.com/

http://gist.github.com/398695

4次元の得点空間で、近くの点を探す≒ 得点が近い人を探す

Page 19: appengine ja night BT 近くを探す?

appengine ja night beer talk - @ashigeru 19

Z曲線の問題点

アライメントに左右される

隣のZが意外と遠い

なので「一番近いものを探す」というのは難しい

超立方体の構造で探す

1次元だけ極端に値が違ったりすると非常に遠い

次元数が多すぎると使いにくい

Page 20: appengine ja night BT 近くを探す?

参考文献

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