这是一个用Java实现的在Android设备上构建基于位置查询的例子。
这个想法来自于KennyTM(见被接受的回答),它需要在你的表中添加4列,以存储纬度和经度的正弦和余弦值。
以下是为“商店”表准备插入数据的代码:
public static void injectLocationValues(ContentValues values, double latitude, double longitude) {
values.put(LocationColumns.LATITUDE, latitude);
values.put(LocationColumns.LONGITUDE, longitude);
values.put(LocationColumns.COSLAT, Math.cos(MathUtil.deg2rad(latitude)));
values.put(LocationColumns.SINLAT, Math.sin(MathUtil.deg2rad(latitude)));
values.put(LocationColumns.COSLNG, Math.cos(MathUtil.deg2rad(longitude)));
values.put(LocationColumns.SINLNG, Math.sin(MathUtil.deg2rad(longitude)));
}
public static double deg2rad(double deg) {
return (deg * Math.PI / 180.0);
}
你可以使用以下函数来构建你的投影:
public static String buildDistanceQuery(double latitude, double longitude) {
final double coslat = Math.cos(MathUtil.deg2rad(latitude));
final double sinlat = Math.sin(MathUtil.deg2rad(latitude));
final double coslng = Math.cos(MathUtil.deg2rad(longitude));
final double sinlng = Math.sin(MathUtil.deg2rad(longitude));
return "(" + coslat + "*" + LocationColumns.COSLAT
+ "*(" + LocationColumns.COSLNG + "*" + coslng
+ "+" + LocationColumns.SINLNG + "*" + sinlng
+ ")+" + sinlat + "*" + LocationColumns.SINLAT
+ ")";
}
它会注入一个响应列,其中包含距离,您需要应用以下公式将其转换为千米:
public static double convertPartialDistanceToKm(double result) {
return Math.acos(result) * 6371;
}
如果你想使用偏移距离(partial distance)排序查询结果,那么你需要按照降序(DESC)而不是升序(ASC)的方式排序。