Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Geohash i szukanie w pobliżu

Avatar for jasisz jasisz
September 27, 2011

Geohash i szukanie w pobliżu

Pywaw#4 - ja i przemo

Avatar for jasisz

jasisz

September 27, 2011
Tweet

Other Decks in Programming

Transcript

  1. U3

  2. Nieparzyste geohashe • siatka 8x4 • tyle samo bitów na

    długość i na szerokość Parzyste geohashe • siatka 4x8 • 1 bit więcej informacji o długości (kto zgadnie dlaczego?)
  3. Magiczna właściwość miejsca mają ten sam prefiks => miejsca są

    w pobliżu (znajdują się w tym samym prostokącie) Niestety implikacja nie zachodzi w drugą stronę.
  4. A w Pythonie Polecamy bibliotekę python-geohash • http://code.google.com/p/python-geohash/ • prosta,

    • szybka, • jeszcze szybsza z rozszerzeniem w C, • dla japonofilów: napisał ją Japończyk Hiroaki Kawai, ze wsparciem dla używanego tam jpgrid (podobne do geohasha)
  5. python-geohash >>> geohash.encode(42.6, -5.6) 'ezs42e44yx96' >>> geohash.decode('ezs42') (42.60498046875, -5.60302734375 >>>

    geohash.expand('ezs42') ['ezefr', 'ezs43', 'ezefx', 'ezs48', 'ezs49', 'ezefp', 'ezs40', 'ezs41', 'ezs42']
  6. Przykład (niby-django) import geohash def near(qs, hash, prec=5): hashes =

    geohash.expand(hash[:prec]) qfilter = Q() for h in hashes: qfilter = qfilter | Q(geohash__startswith=h) return qs.filter(qfilter)
  7. Z tego wyjdzie +/- zapytanie: SELECT "place"."id", "place"."name", "place"."geohash" WHERE

    ("place"."geohash" LIKE ezefr% OR "place"."geohash" LIKE ezs43% OR "place"."geohash" LIKE ezs40% OR "place"."geohash" LIKE ezefp% OR "place"."geohash" LIKE ezs41% OR "place"."geohash" LIKE ezs48% OR "place"."geohash" LIKE ezefx% OR "place"."geohash" LIKE ezs49% OR "place"."geohash" LIKE ezs42% )
  8. Inne rozwiązania • Umowna odległość d: SELECT * FROM Business

    WHERE Lat > (position_lat - d) AND Lat < (position_lat + d) AND Lon > (position_lon - d) AND Lon < (position_lon + d); Nie zadziała na Google App Engine. • GIS (PostGIS, GeoDjango)