Cassandra 使用CQL3查找距离内的点
我有一个带有用户名、纬度和经度的cassandra表。我想得到一个在给定纬度、经度和距离范围内的用户列表 例如:我的输入Lat=78.3232,Long=65.3234,距离=30英里Cassandra 使用CQL3查找距离内的点,cassandra,cql3,Cassandra,Cql3,我有一个带有用户名、纬度和经度的cassandra表。我想得到一个在给定纬度、经度和距离范围内的用户列表 例如:我的输入Lat=78.3232,Long=65.3234,距离=30英里 我想得到一份距离78.3232点和65.3234点30英里以内的用户列表。是否可以通过单个CQL3查询解决此问题?或者有人能给我一个开始解决这个查询的提示吗?cassandra没有地理空间支持,所以我找到了一种数学实现方法来生成点周围的框坐标(这对我的工作来说已经足够好了),并使用查询来获得边界内的坐标。 我会把
我想得到一份距离78.3232点和65.3234点30英里以内的用户列表。是否可以通过单个CQL3查询解决此问题?或者有人能给我一个开始解决这个查询的提示吗?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);
}
}
}
然后使用简单的CQL查找范围内的坐标
如果值是这样的
UPPER_LATITUDE = 60
LOWER_LATITUDE = 40
UPPER_LONGITUDE = 10
LOWER_LONGITUDE = 5
查询将是这样的(实际上我使用了JPA查询,所以我还没有测试它,但它应该可以工作)
SELECT*FROM Points\u table
其中纬度>40
纬度<60
经度>5
经度<10;
如果您使用的是DataStax enterprise,则可以直接使用地理空间。查看Patrick的演示:
您可以搜索“cassandra geospatial”,通过cassandra和其他搜索平台获得一些解决方案的想法。虽然有点老,但已经过时了relevant@ChrisLohfink当时不知道simpleGeo的事。看起来很有希望。Thanx如果需要,请发布您的CQL查询possible@VijayM这是几年前做的。。。。因此,在cassandra中可能会有更好的地理空间数据处理解决方案(添加了查询)您能为您的计算提供理论基础吗?例如,距离是距离(经度、纬度)点的半径吗?如果是这样,为什么要将距离除以69以获得Lat_系数?(角半径应为距离除以地球直径,并应从纬度中加减,以获得最小和最大纬度值。)
SELECT * FROM Points_Tablle
WHERE LATITUDE > 40
AND LATITUDE < 60
AND LONGITUDE > 5
AND LONGITUDE < 10;