геокит, использующий необработанную широту и длину в рельсах

Я использую GeoKit для Rails, и он отлично работает. Однако я заметил, что при загрузке большого количества списков он ОЧЕНЬ медленно загружается.

Мне интересно, связано ли это с тем, что он запрашивает Google или какой-либо внешний источник, прежде чем возвращать результаты. Если это так, есть ли способ использовать необработанные координаты широты и долготы (которые у меня есть), чтобы просто вычислить расстояние внутри?

Или просто рубиновая формула, которая сделает это за меня?


person stewart715    schedule 28.07.2011    source источник
comment
Что вы подразумеваете под вытягиванием списков? Вы пытаетесь найти все экземпляры модели на определенном расстоянии от точки?   -  person jimworm    schedule 28.07.2011


Ответы (2)


По расстоянию:

Geokit-gem предоставляет метод расчета расстояния между двумя точками:

# model has acts_as_mappable
Model.distance_between obj1, obj2, :units => :kms, :formula => :sphere

Искатель:

Geokit-rails (плагин) имеет средство поиска, которое генерирует SQL (для mysql, postgres и SQL-сервера) для расчета расстояний, позволяя вам находить строки на определенном расстоянии:

Model.find_within(100, :units => :kms)

Он вычисляет расстояния для всех строк, но ему не нужно запрашивать внешние ресурсы. Если ваша таблица действительно огромна, это может помочь (но я не уверен, что это так) сузить ее, сначала предварительно рассчитав диапазоны широты/долготы:

Model.where(:lat => (x-0.05)..(x+0.05), :lng => (y-0.05)..(y+0.05)).find_within(z, :units => :kms)

Если это все еще не поможет, вам придется написать собственный SQL. Расчеты расстояния sql для geokit-rails находятся здесь: https://github.com/andre/geokit-rails/tree/master/lib/geokit-rails/adapters

person jimworm    schedule 28.07.2011
comment
Спасибо -- есть ли другие менее точные форумы (менее дорогие, конечно) - person stewart715; 28.07.2011
comment
Я запутался - что представляют собой obj1 и obj2, если я уже вызываю его внутри модели? - person stewart715; 28.07.2011
comment
Вы вызываете его в классе (это метод класса), obj1 и obj2 являются экземплярами. - person jimworm; 28.07.2011

Вы можете использовать формулы для сфер, чтобы вычислить расстояние между двумя точками на поверхности.

Вот некоторая реализация JavaScript для вычисления расстояния между широтами/долготами (и некоторыми другими полезными вещами). Не должно быть слишком много мозговой работы, чтобы перевести на рубин ;-)

http://www.movable-type.co.uk/scripts/latlong.html

person arnep    schedule 28.07.2011