2010-05-19 10 views
0

저는 Geokit 플러그인을 사용하여 current_user와 다른 사용자 간의 거리를 계산합니다 (프로파일 모델에 실제로 저장되는 지오 코딩).Geokit 거리 계산이 이상 함

테스트 목적으로 미네소타 주 미니애폴리스와 미네소타 주 세인트 폴에 각각 한 명씩 두 명의 사용자를 만들었습니다. Geokit 보석을 사용하여 IRB 세션에서 프로필의 위도/경도 쌍을 지오 코딩했습니다.

각 프로필의 이름, 위치 및 위도/경도 쌍을 나열하도록 색인보기를 변경했습니다. 이 값은 데이터베이스의 값과 일치합니다.

색인보기를 변경하여 current_user의 lat/lng 쌍을 표시했습니다. current_user의 lat/lng 쌍이 기대와 일치하는지 확인하기 위해 각 사용자로 인증되었습니다. 그게했다. 나는 각 사용자 사이의 거리를 계산하는 ProfileController의 색인 작업에서 쿼리를 변경

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

:

내가하는 LatLng 객체와 위도/LNG 필드를 반환 할 정보 모델, 이름 LL에 인스턴스 메소드를 추가 상기 CURRENT_USER :

01,232,552,456,429,545 : 마지막

@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 

, I는 CURRENT_USER 및 개별 사용자들 사이의 거리를 표시하는 인덱스보기를 변경 (-93.2638361, 44.9799654)

A - 0.0 MI B (44.9444101, -93.0932742) - 8.7 m

: 62,156,310,173,210 I는 (-93.2638361, 44.9799654), 유저 (A)로 인증

거리 계산 정확 (-93.2638361, 44.9799654)

A - 32.8 MI B (44.9444101, -93.0932742) - 41.1 MI

: I가 사용자 B (44.9444101, -93.0932742)로 인증하는 경우

그러나, 거리 계산이 잘못되었습니다

나는이 '원시'위도/LNG 쌍 사이의 거리 계산을 확인 할 수 있었다 :

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 

나는 손실에있어이 무슨 일이 일어나고 있는지 설명 할 수 있습니다. 어떤 아이디어라도 감사 할 것입니다. 당신이 할 경우 어떻게됩니까

답변

1

: 원산지 직접 위도와 LNG를 따기 할 수 있어야한다 :

@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 

귀하의 오류가 날 의심이 벌어 데이터 반올림/변환 문제이며, 그 수 있습니다. Profile.find (...)를 호출하기 전에 관련된 모든 유형을 (logger.debug) 확인하고 싶을 수도 있습니다.

나는 이러한 특별한 오류를 제공하는 간단한 변환을 찾을 수 없었지만 그건 내 의심이다. 그 도움이되지 않으면 생성 된 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 쿼리에 표시되는 내용을 체크 아웃해야합니다. 문자열 변환 번호.

+0

감사합니다. 고맙습니다! 고맙습니다! 전환 문제로 보입니다. 그러나 그것이 무엇인지 판단 할 수 있으면 저주받을 것입니다. 나는 유형 (logger.debug)과 생성 된 sql을 살펴보고 싶다. 어떻게 그렇게 할 수 있는지 말해 줄 수 있니? – craig