使用CQL3在一定距离内找到点

时间:2014-06-09 04:36:52

标签: cassandra cql3

我有一张带有用户名,纬度和经度的cassandra表。我想获得一个具有给定纬度,经度和距离的圈内用户列表。

例如:我的输入Lat = 78.3232和Long = 65.3234,距离= 30英里。

我想获得距离点78.3232和65.3234不到30英里的用户列表。是否可以通过单个CQL3查询来解决这个问题?或者任何人都可以给我一个提示开始解决这个问题吗?

2 个答案:

答案 0 :(得分:1)

没有对cassandra的地理空间支持,所以我找到了一种方法来数学地实现它以生成点周围的框坐标(这对我的工作来说已经足够了)并使用查询来获取边界内的坐标。 我会发布代码供其他人参考。

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);
    }

}
}

然后使用Simple CQL查找范围内的坐标

如果值是这样的

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

查询将是这样的(实际上我使用kundera Hibernate并使用了JPA查询。所以我没有测试它但它应该工作)

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

答案 1 :(得分:1)

如果您正在使用DataStax企业,则可以获得开箱即用的地理空间信息。查看Patrick的演示:

https://github.com/PatrickCallaghan/datastax-geospatial-demo