我有一张带有用户名,纬度和经度的cassandra表。我想获得一个具有给定纬度,经度和距离的圈内用户列表。
例如:我的输入Lat = 78.3232和Long = 65.3234,距离= 30英里。
我想获得距离点78.3232和65.3234不到30英里的用户列表。是否可以通过单个CQL3查询来解决这个问题?或者任何人都可以给我一个提示开始解决这个问题吗?
答案 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