2014-06-09 3 views
1

나는 사용자 이름, 위도 및 경도로 cassandra 테이블을 가지고 있습니다. 주어진 위도와 경도의 원 안에있는 사용자의 목록을 주어진 거리에서 얻고 싶습니다. 예를 들어 나의 입력 Lat = 78.3232, Long = 65.3234, 거리 = 30 마일. 78.3232와 65.3234 지점에서 30 마일 거리에있는 사용자 목록을 얻고 싶습니다. 단일 CQL3 쿼리로이를 해결할 수 있습니까? 아니면 누군가 나에게이 쿼리를 해결하기위한 힌트를 제공 할 수 있습니까?CQL3을 사용하여 멀리있는 지점 찾기 (cassanda 데이터베이스)

+0

당신은 "카산드라의 지리 공간"을 검색 할 수 카산드라이에 대한 해결책 및 추가 검색 플랫폼과 몇 가지 아이디어를 얻을. – BrianC

+2

조금 오래되었지만 http://readwrite.com/2011/02/17/video-simplegeo-cassandra는 관련이 있습니다 –

+0

@ChrisLohfink는 그 당시 simpleGeo에 대해 알지 못했습니다. 유망 해 보인다. 고맙습니다 – prasadmadanayake

답변

1

cassandra에 대한 지형 공간 지원이 없었으므로 지점 주위에 상자 좌표를 생성하여 수학적으로 구현하여 (내 작업에는 충분 함) 쿼리를 사용하여 경계 내에서 좌표를 가져 오는 방법을 찾았습니다. 다른 사람들이 참조 할 수 있도록 코드를 게시하겠습니다. 범위

내에서 좌표를 찾기 위해 간단한 CQL 사용

public class GeoOperations { 

public static final int UPPER_LATITUDE = 0; 
public static final int LOWER_LATITUDE = 1; 
public static final int UPPER_LONGITUDE = 2; 
public static final int LOWER_LONGITUDE = 3; 
private static final double KM_TO_MILES = 0.621371; 
private final double Latitude; 
private final double Longitude; 

double Boundary[]; 

public GeoOperations(double init_latitude, double init_longitude) { 
    Latitude = init_latitude; 
    Longitude = init_longitude; 
    Boundary = new double[4]; 
} 

public void GenerateBoxCoordinates(double Distance) { 
    Distance = Distance * KM_TO_MILES; 
    double Lat_Factor = (Distance)/69; 
    Boundary[UPPER_LATITUDE] = Latitude + Lat_Factor; 
    Boundary[LOWER_LATITUDE] = Latitude - Lat_Factor; 


    double Long_Factor = (Distance)/(3960 * 2 * Math.PI/360 * Math.cos(Latitude)); 
    Boundary[UPPER_LONGITUDE] = Longitude + Long_Factor; 
    Boundary[LOWER_LONGITUDE] = Longitude - Long_Factor; 

    for (double x : Boundary) { 
     System.out.println(x); 
    } 

} 
} 

그리고

값이 같은 경우이

UPPER_LATITUDE = 60 
    LOWER_LATITUDE = 40 
    UPPER_LONGITUDE = 10 
    LOWER_LONGITUDE = 5 

쿼리가 될 것 같은 것을 (실제로 내가 Hibernatekundera 사용하고 JPA를 사용 쿼리. 그래서 그것을 테스트 havent하지만 작동합니다)

SELECT * FROM Points_Tablle 
    WHERE LATITUDE > 40 
    AND LATITUDE < 60 
    AND LONGITUDE > 5 
    AND LONGITUDE < 10; 
+0

가능한 경우 CQL 쿼리를 게시 해주십시오. – VijayM

+0

@VijayM이 작업은 몇 년 전으로 거슬러 올라갑니다 .... 따라서 카산드라의 지형 공간 데이터 조작을 위해 구현 된 더 나은 솔루션이있을 수 있습니다. (쿼리 추가) – prasadmadanayake

+0

당신의 계산을위한 이론적 기초? 예를 들어 반경과 (경도, 위도) 점 사이의 거리입니까? 그렇다면 Lat_Factor를 얻기 위해 왜 거리를 69로 나눈 것입니까? 각도 반경은 거리를 지구의 지름으로 나눈 값이어야하며 최소 및 최대 위도 값을 얻으려면 위치 찾기에서 더하고 빼야합니다. –