近くを探す?

appengine ja night beer talk
あらかわ (@ashigeru)
テーマ
   座標(x, y)に近い点を探す
     App   Engineのデータストアでどうやる?




               appengine ja night beer talk - @ashigeru   2
App Engineのクエリの特性
   1次元のレンジスキャン
     1つの値を大小関係で並べて順に取り出すだけ
     開始地点(と終了地点)を選べる
     (x,   y)とかどう見ても2次元座標




       ...
方法1: 離散化
   座標を一定の幅で区切ってブロックに
     付近のブロックに含まれているか調べる




         appengine ja night beer talk - @ashigeru   4
離散化の問題点
   濃度によってはダメ
     少ない→見つからない,                   多い→見つかりすぎ




          appengine ja night beer talk - @ashigeru...
方法2: インメモリフィルタ
   2次元目はインメモリで処理する
     1次元目はデータストアフィルタでやる




         appengine ja night beer talk - @ashigeru   6
インメモリフィルタの問題点
   個数によってはダメ
     1次元目の結果が爆発しているかも




          appengine ja night beer talk - @ashigeru   7
空間充填曲線
   (x, y)から遠くに向かってスキャンしたい
     でも1次元のレンジスキャンしかできない



   空間を1本の線で一筆書きする
     空間充填曲線(Space Filling Curve)
     ...
Z曲線 (1)
   平面の4点をZで結んでブロックにする
     むしろN




             appengine ja night beer talk - @ashigeru   9
Z曲線 (2)
   ブロック4つをさらにZで結んでブロック
    にする




          appengine ja night beer talk - @ashigeru   10
Z曲線 (3)
   これを繰り返すと平面上のすべての点を
    一筆書きできる




          appengine ja night beer talk - @ashigeru   11
空間充填曲線のスキャン (1)
   ある点から前後にスキャンする
     ただし、Z曲線の上でスキャン




          appengine ja night beer talk - @ashigeru   12
空間充填曲線のスキャン (2)
   最初のZになければ、ひとつ大きなZで探
    す




         appengine ja night beer talk - @ashigeru   13
空間充填曲線のスキャン (3)
   徐々にZを大きくしていけばいつか見つか
    る
     小→大で探すので、近い順に見つかる




         appengine ja night beer talk - @ashiger...
Z曲線の作り方 (1)
   それぞれの次元の値を2進数で書く




         appengine ja night beer talk - @ashigeru   15
Z曲線の作り方 (2)
   1ビットずつ取り出して並べ替える




         appengine ja night beer talk - @ashigeru   16
Z曲線の作り方 (3)
   繰り返して順になぞるとZ曲線になる




         appengine ja night beer talk - @ashigeru   17
多次元空間への拡張
   平面じゃなくて4次元とかでも同じ
     http://tiling.latest.ashigeru-demo.appspot.com/

     http://gist.github.com/398695
...
Z曲線の問題点
   アライメントに左右される
     隣のZが意外と遠い
     なので「一番近いものを探す」というのは難
    しい
   超立方体の構造で探す
     1次元だけ極端に値が違ったりすると非常に遠
    ...
参考文献
   Geospatial Queries with Google App
    Engine using GeoModel
     http://code.google.com/intl/ja/apis/maps/
    ...
Upcoming SlideShare
Loading in …5
×

appengine ja night BT 近くを探す?

2,552 views

Published on

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

0 Comments
3 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
2,552
On SlideShare
0
From Embeds
0
Number of Embeds
190
Actions
Shares
0
Downloads
17
Comments
0
Likes
3
Embeds 0
No embeds

No notes for slide

appengine ja night BT 近くを探す?

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

×