appengine ja night bt 近くを探す?
DESCRIPTION
#appengine のレンジスキャンで近傍点を探すアレTRANSCRIPT
![Page 1: appengine ja night BT 近くを探す?](https://reader034.vdocuments.net/reader034/viewer/2022052321/549d4bd1ac7959ba2a8b4952/html5/thumbnails/1.jpg)
近くを探す?
appengine ja night beer talk
あらかわ (@ashigeru)
![Page 2: appengine ja night BT 近くを探す?](https://reader034.vdocuments.net/reader034/viewer/2022052321/549d4bd1ac7959ba2a8b4952/html5/thumbnails/2.jpg)
appengine ja night beer talk - @ashigeru 2
テーマ
座標(x, y)に近い点を探す
App Engineのデータストアでどうやる?
![Page 3: appengine ja night BT 近くを探す?](https://reader034.vdocuments.net/reader034/viewer/2022052321/549d4bd1ac7959ba2a8b4952/html5/thumbnails/3.jpg)
appengine ja night beer talk - @ashigeru 3
App Engineのクエリの特性
1次元のレンジスキャン
1つの値を大小関係で並べて順に取り出すだけ
開始地点(と終了地点)を選べる
(x, y)とかどう見ても2次元座標
![Page 4: appengine ja night BT 近くを探す?](https://reader034.vdocuments.net/reader034/viewer/2022052321/549d4bd1ac7959ba2a8b4952/html5/thumbnails/4.jpg)
appengine ja night beer talk - @ashigeru 4
方法1: 離散化
座標を一定の幅で区切ってブロックに
付近のブロックに含まれているか調べる
![Page 5: appengine ja night BT 近くを探す?](https://reader034.vdocuments.net/reader034/viewer/2022052321/549d4bd1ac7959ba2a8b4952/html5/thumbnails/5.jpg)
appengine ja night beer talk - @ashigeru 5
離散化の問題点
濃度によってはダメ
少ない→見つからない, 多い→見つかりすぎ
![Page 6: appengine ja night BT 近くを探す?](https://reader034.vdocuments.net/reader034/viewer/2022052321/549d4bd1ac7959ba2a8b4952/html5/thumbnails/6.jpg)
appengine ja night beer talk - @ashigeru 6
方法2: インメモリフィルタ
2次元目はインメモリで処理する
1次元目はデータストアフィルタでやる
![Page 7: appengine ja night BT 近くを探す?](https://reader034.vdocuments.net/reader034/viewer/2022052321/549d4bd1ac7959ba2a8b4952/html5/thumbnails/7.jpg)
appengine ja night beer talk - @ashigeru 7
インメモリフィルタの問題点
個数によってはダメ
1次元目の結果が爆発しているかも
![Page 8: appengine ja night BT 近くを探す?](https://reader034.vdocuments.net/reader034/viewer/2022052321/549d4bd1ac7959ba2a8b4952/html5/thumbnails/8.jpg)
appengine ja night beer talk - @ashigeru 8
空間充填曲線
(x, y)から遠くに向かってスキャンしたい
でも1次元のレンジスキャンしかできない
空間を1本の線で一筆書きする
空間充填曲線 (Space Filling Curve)
ヒルベルト曲線、Z曲線などが有名
![Page 9: appengine ja night BT 近くを探す?](https://reader034.vdocuments.net/reader034/viewer/2022052321/549d4bd1ac7959ba2a8b4952/html5/thumbnails/9.jpg)
appengine ja night beer talk - @ashigeru 9
Z曲線 (1)
平面の4点をZで結んでブロックにする
むしろN
![Page 10: appengine ja night BT 近くを探す?](https://reader034.vdocuments.net/reader034/viewer/2022052321/549d4bd1ac7959ba2a8b4952/html5/thumbnails/10.jpg)
appengine ja night beer talk - @ashigeru 10
Z曲線 (2)
ブロック4つをさらにZで結んでブロックにする
![Page 11: appengine ja night BT 近くを探す?](https://reader034.vdocuments.net/reader034/viewer/2022052321/549d4bd1ac7959ba2a8b4952/html5/thumbnails/11.jpg)
appengine ja night beer talk - @ashigeru 11
Z曲線 (3)
これを繰り返すと平面上のすべての点を一筆書きできる
![Page 12: appengine ja night BT 近くを探す?](https://reader034.vdocuments.net/reader034/viewer/2022052321/549d4bd1ac7959ba2a8b4952/html5/thumbnails/12.jpg)
appengine ja night beer talk - @ashigeru 12
空間充填曲線のスキャン (1)
ある点から前後にスキャンする
ただし、Z曲線の上でスキャン
![Page 13: appengine ja night BT 近くを探す?](https://reader034.vdocuments.net/reader034/viewer/2022052321/549d4bd1ac7959ba2a8b4952/html5/thumbnails/13.jpg)
appengine ja night beer talk - @ashigeru 13
空間充填曲線のスキャン (2)
最初のZになければ、ひとつ大きなZで探す
![Page 14: appengine ja night BT 近くを探す?](https://reader034.vdocuments.net/reader034/viewer/2022052321/549d4bd1ac7959ba2a8b4952/html5/thumbnails/14.jpg)
appengine ja night beer talk - @ashigeru 14
空間充填曲線のスキャン (3)
徐々にZを大きくしていけばいつか見つかる
小→大で探すので、近い順に見つかる
![Page 15: appengine ja night BT 近くを探す?](https://reader034.vdocuments.net/reader034/viewer/2022052321/549d4bd1ac7959ba2a8b4952/html5/thumbnails/15.jpg)
appengine ja night beer talk - @ashigeru 15
Z曲線の作り方 (1)
それぞれの次元の値を2進数で書く
![Page 16: appengine ja night BT 近くを探す?](https://reader034.vdocuments.net/reader034/viewer/2022052321/549d4bd1ac7959ba2a8b4952/html5/thumbnails/16.jpg)
appengine ja night beer talk - @ashigeru 16
Z曲線の作り方 (2)
1ビットずつ取り出して並べ替える
![Page 17: appengine ja night BT 近くを探す?](https://reader034.vdocuments.net/reader034/viewer/2022052321/549d4bd1ac7959ba2a8b4952/html5/thumbnails/17.jpg)
appengine ja night beer talk - @ashigeru 17
Z曲線の作り方 (3)
繰り返して順になぞるとZ曲線になる
![Page 18: appengine ja night BT 近くを探す?](https://reader034.vdocuments.net/reader034/viewer/2022052321/549d4bd1ac7959ba2a8b4952/html5/thumbnails/18.jpg)
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 近くを探す?](https://reader034.vdocuments.net/reader034/viewer/2022052321/549d4bd1ac7959ba2a8b4952/html5/thumbnails/19.jpg)
appengine ja night beer talk - @ashigeru 19
Z曲線の問題点
アライメントに左右される
隣のZが意外と遠い
なので「一番近いものを探す」というのは難しい
超立方体の構造で探す
1次元だけ極端に値が違ったりすると非常に遠い
次元数が多すぎると使いにくい
![Page 20: appengine ja night BT 近くを探す?](https://reader034.vdocuments.net/reader034/viewer/2022052321/549d4bd1ac7959ba2a8b4952/html5/thumbnails/20.jpg)
参考文献
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