appengine ja night BT 近くを探す?

Preview:

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