【发布时间】:2015-07-21 15:57:14
【问题描述】:
我有一个表格,其中使用基于纬度和经度的地理位置存储项目。在某一时刻,我只想从数据库中检索那些在我当前位置的特定范围(距离或半径)内的项目。
项目(纬度、经度)
所以我真的遵循了nice post 并尝试以最高票数实现答案。第一件事:我必须在存储项目时添加更多列。这将在稍后启用选择语句:
项目(lat、lat_cos、lat_sin、lng、lng_cos、lng_sin)
到目前为止一切都很好,但是当我尝试构建查询时,我发疯了。如果我使用较少符号 则检索所有项目(即使太远)。但是,如果我使用更大的符号 > ,则不会检索到任何项目。但我知道我的范围内有物品。
问题:那么我在这个词上做错了什么?
WHERE (coslat * LAT_COS * (LNG_COS * coslng + LNG_SIN * sinlng)) + sinlat * LAT_SIN > cos_allowed_distance
这是我用来查询我的 ContentProvider 的代码。 ContentInfo 类具有用于 sortOrder、selection 和 selectionArgs 的字段:
public static ContentInfo buildDistanceWhereClause(double latitude, double longitude, double distanceInKilometers) {
final double coslat = Math.cos(Math.toRadians(latitude));
final double sinlat = Math.sin(Math.toRadians(latitude));
final double coslng = Math.cos(Math.toRadians(longitude));
final double sinlng = Math.sin(Math.toRadians(longitude));
// (coslat * LAT_COS * (LNG_COS * coslng + LNG_SIN * sinlng)) + sinlat * LAT_SIN > cos_allowed_distance
final String where = "(? * ? * (? * ? + ? * ?)) + ? * ? > ?";
final String[] whereClause = new String[] {
String.valueOf(coslat),
ItemTable.COLUMN_LATITUDE_COS,
ItemTable.COLUMN_LONGITUDE_COS,
String.valueOf(coslng),
ItemTable.COLUMN_LONGITUDE_SIN,
String.valueOf(sinlng),
String.valueOf(sinlat),
ItemTable.COLUMN_LATITUDE_SIN,
String.valueOf(Math.cos(distanceInKilometers / 6371.0))
};
return new ContentInfo(null, where, whereClause);
}
}
【问题讨论】:
标签: android sqlite google-maps