2012-03-04 9 views
3

위도 및 경도 특성을 가진 위치 개체가 있고 현재 위도/경도 위치에서 특정 거리 내에있는 개체에 대한 데이터베이스를 쿼리하고 싶습니다.거리 좌표에서 레일 3.x

내가 찾고있는 것을 수행 할 수있는 것 같은 '지오 코더'보석에 대해 읽었지 만, obj.near 기능을 추가하려면 객체에 지오 코딩을 추가해야합니다. 지오 코딩 또는 역 지오 코딩이 필요하지 않습니다. 좌표로 거리 쿼리 만 수행하면됩니다.

지오 코딩 기능을 추가하지 않고 .jear 기능을 'geocoder'가있는 개체에 추가 할 수 있습니까? 내가 원하는 것을 할 수있는 또 다른 방법이 있습니까?

+0

이러한 가장 가까운 neightbour 쿼리를 효율적으로 수행하려면 데이터베이스에서 인덱싱 된 쿼리를 사용하여 데이터베이스를 지원하거나 DB에서 인덱싱 할 수 있도록 데이터를 준비해야합니다. 그러니 먼저 DB에 대해 알려주십시오. 또한 최상의 접근 방식을 선택하려면 프로젝트에 필요한 정밀도를 파악하는 것이 좋습니다. – cryo28

답변

1

왜 지오 코더 소스를 보지 않습니까? 기껏해야. 나는 당신이 찾고있는 클래스가 stores/active_record.rb

입니다. 분명히 라이브러리 사용의 확장 성이나 다른 이점을 얻지는 못하지만, 이것은 당신에게 필요한 코드를 줄 것입니다.

편집 : 이것은 당신에게 해고하려면이 옵션을 얻을 수

DROP FUNCTION IF EXISTS calculateDistance; 
delimiter | 
CREATE FUNCTION calculateDistance (originLatitude FLOAT, originLongitude FLOAT, targetLatitude FLOAT, targetLongitude FLOAT) 
returns FLOAT 
deterministic 
BEGIN 
DECLARE radianConversion FLOAT; 
DECLARE interim FLOAT; 
DECLARE earthRadius FLOAT; 

SET radianConversion = 180/pi() ;/*57.2957795130823;*/ 
SET interim = SIN(originLatitude/radianConversion) * SIN(targetLatitude/radianConversion) + COS(originLatitude/radianConversion) * COS(targetLatitude/radianConversion) * COS(targetLongitude/radianConversion - originLongitude/radianConversion); 

IF interim > 1 THEN 
    SET interim = 1; 
ELSEIF interim < -1 THEN 
    SET interim = -1; 
END IF; 
SET earthRadius = 6371.0072; 
RETURN earthRadius * ACOS(interim); 
END| 
delimiter ; 

select calculateDistance(43.6667,-79.4167,45.5000,-73.5833); 

그런 다음 당신은 그냥 클래스의 메소드에서 올바른 값을 전달하는 데 필요한 거리를 계산합니다 MySQL의에서 UDF를 줄 것이다. 분명히 이것은 Sqlite에서 작동하지 않을 것입니다

0

여기에 RailsCast about Geocoder이 있습니다. 여러분의 모델에 위도와 경도를 추가하고 gecoder가 작동하는 것을 보았습니다.

+0

모델에 위도와 경도를 추가하는 것만으로는 작동하지 않습니다. –