Geohashing - рекурсивно найти соседей соседей

Сейчас я ищу элегантный алгоритм для рекурсивного поиска соседей соседей с помощью алгоритма геохеширования (http://www.geohash.org).
В основном берем центральный геохеш, а затем получаем первое «кольцо» хэшей одинакового размера вокруг него (8 элементов), затем, на следующем шаге, получаем следующее кольцо вокруг первого и т. д. и т. д. Вы слышали об элегантном способе сделать это?

Грубая сила может заключаться в том, чтобы взять каждого соседа и заставить их соседей просто игнорировать массивное перекрытие. Соседи вокруг одного центрального геохэша решались много раз (здесь, например, в Ruby: http://github.com/masuidrive/pr_geohash/blob/master/lib/pr_geohash.rb)

Редактировать для уточнения: Текущее решение с передачей центрального ключа и направления, как это (с соответствующими таблицами поиска):

  def adjacent(geohash, dir)
    base, lastChr = geohash[0..-2], geohash[-1,1]
    type = (geohash.length % 2)==1 ? :odd : :even
    if BORDERS[dir][type].include?(lastChr)
      base = adjacent(base, dir)
    end
    base + BASE32[NEIGHBORS[dir][type].index(lastChr),1]
  end

(отрывок из библиотеки Юичиро МАСУИ)

Я говорю, что этот подход скоро станет уродливым, потому что направления становятся уродливыми, как только мы оказываемся на втором или третьем кольце. В идеале алгоритм должен просто принимать два параметра: центральная площадь и расстояние от 0 — это только центральный геохеш (["u0m"] и 1 — первое кольцо, состоящее из 8 геохэшей одинакового размера вокруг него (=> [["u0t", "u0w"], ["u0q", "u0n"], ["u0j", "u0h"], ["u0k", "u0s"]]). Два — второе кольцо с 16 областями. вокруг первого кольца и т. д.

Видите ли вы какой-нибудь способ элегантно вывести «кольца» из битов?


person itsme    schedule 10.06.2010    source источник


Ответы (2)


Это зависит от того, что вы подразумеваете под Соседом. Я предполагаю, что это используется в контексте поиска близости. В этом случае я бы подумал, что вам лучше всего искать от самого внешнего кольца внутрь.

Предположим, вы можете найти самый дальний набор (самую дальнюю близость) в доступной для поиска Вселенной. Сохраните это как новую Вселенную, а затем найдите следующий внутренний набор в этой Вселенной. Этот поиск должен вычесть это внутреннее множество из Вселенной. Сохраните старую Вселенную (самое внешнее кольцо) и повторяйте этот процесс, пока не дойдете до центра. Каждый поиск после первого будет уменьшать область поиска и давать вам звонок.

person philosodad    schedule 07.01.2011

Начните с построения сторон непосредственно вокруг центрального геохэша, то есть сверху, справа, снизу и слева, изначально каждая из них будет состоять только из одного геохеша и угла. Затем рекурсивно итерируйте стороны, используя соседнюю функцию с направлением, соответствующим этой стороне (т.е. расширяйте влево для левой стороны), сохраняя при этом соответствующий набор результатов и стороны для следующей итерации. Вам также необходимо обработать диагональный/угловой геохеш для каждой стороны (например, левый-верхний для левого, верхний-правый для верхнего, если используется ассоциация по часовой стрелке). Пример процедуры см. в разделе эту реализацию я сделал на Lua или Javascript (но с дополнительными функциями), которые начинаются с вызова Grid().

person Jacob Jay    schedule 29.05.2013
comment
Какую длину геохеша следует учитывать, когда вы начинаете с центрального геохеша? - person Atul; 10.07.2015