Странность расчета расстояний Geokit

Я использую плагин Geokit для расчета расстояния между текущим_пользователем и другими пользователями (геокодирование фактически хранится в модели профиля).

В целях тестирования я создал двух пользователей, одного в Миннеаполисе, штат Миннесота, и одного в Сент-Поле, штат Миннесота. Я использовал гем Geokit для геокодирования пары широта/долгота профилей в сеансе IRB.

Я изменил представление «Указатель», чтобы перечислить имя каждого профиля, местоположение и пару широта/долгота. Эти значения соответствуют значениям в базе данных.

Я изменил представление индекса, чтобы отобразить пару широта/долгота текущего_пользователя. Я аутентифицировался как каждый пользователь, чтобы убедиться, что пара lat/lng для current_user соответствует ожиданиям. Так и было.

Я добавил метод экземпляра в модель Profile с именем ll, чтобы возвращать поля lat/lng как объект LatLng:

def ll
  #if lat and lng fields aren't empty
  LatLng.new(self.lat,self.lng) if (!self.lat.nil? && !self.lng.nil?)
end

Я изменил запрос в действии индекса ProfileController, чтобы рассчитать расстояние между каждым пользователем и текущим_пользователем:

@profiles = Profile.find(:all,
  :conditions => conditions,  # set WHERE clause
  :order => order_by, # set ORDER BY clause
  :origin => current_user.profile.ll,  # calculate distance based on current_user's location
  :units => :miles  # use miles

Наконец, я изменил представление индекса, чтобы отображать расстояние между текущим_пользователем и каждым отдельным пользователем:

<%=h profile.location %> (<%= profile.ll %>) -
<%= profile.distance.to_f.round(1) %> mi

Когда я аутентифицировался как пользователь A (44.9799654,-93.2638361), расчеты расстояния были правильными:

A (44.9799654,-93.2638361) - 0.0 mi B (44.9444101,-93.0932742) - 8.7 m

Однако, когда я аутентифицировался как пользователь B (44.9444101,-93.0932742), расчеты расстояния были неверными:

A (44.9799654,-93.2638361) - 32.8 mi B (44.9444101,-93.0932742) - 41.1 mi

Мне удалось проверить расчеты расстояния между «сырыми» парами широта/долгота:

a = LatLng.new(44.9799654,-93.2638361)
=> #<Geokit::LatLng:0x1034af778 @lat=44.9799654, @lng=-93.2638361>
>> b = LatLng.new(44.9444101,-93.0932742)
=> #<Geokit::LatLng:0x1034aab88 @lat=44.9444101, @lng=-93.0932742>
>> a.distance_to(b)
=> 8.70261379563918
>> b.distance_to(a)
=> 8.70261379563918

Я затрудняюсь объяснить, что происходит. Любые идеи были бы хорошы.


person craig    schedule 19.05.2010    source источник


Ответы (1)


Что произойдет, если вы сделаете:

 @profiles = Profile.find(:all,
  :conditions => conditions,  # set WHERE clause
  :order => order_by, # set ORDER BY clause
  :origin => current_user.profile, # .ll # calculate distance based on current_user's location
  :units => :miles  # use miles

Ваша ошибка заставляет меня подозревать, что возникают проблемы с округлением/преобразованием данных, и :origin должен иметь возможность напрямую получать широту и долготу. Вы также можете проверить (logger.debug) все задействованные типы прямо перед вызовом Profile.find(...)

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

Отредактировано, чтобы добавить:

Крейг, для отладки типов дайте:

logger.debug("lat: #{current_user.profile.lat}  #{current_user.profile.lat.class.to_s} lng: #{current_user.profile.lng} #{current_user.profile.lng.class.to_s}")
logger.debug("lat: #{current_user.profile.ll.lat}  #{current_user.profile.ll.lat.class.to_s} lng: #{current_user.profile.ll.lng} #{current_user.profile.ll.lng.class.to_s}")

попробуйте, когда вы действительно столкнулись с ошибкой, а затем посмотрите свой файл development.log. (примечание: в этом коде может быть ошибка, потому что я просто ввожу его в окно, но вы поняли идею.) В противном случае вам, вероятно, следует проверить, что отображается в SQL-запросе, поскольку это покажет пост- номера преобразования строк.

person corprew    schedule 20.05.2010
comment
СПАСИБО! СПАСИБО! СПАСИБО! Похоже, это проблема преобразования, но будь я проклят, если смогу определить, что это такое. Я хотел бы взглянуть на типы (logger.debug) и сгенерированный sql. Не могли бы вы рассказать мне, как это сделать? - person craig; 21.05.2010