所以我正在编写一个Android应用程序,并希望编写一个SQLite查询,以便它仅选择包含事件位置信息的行,这些行使用距离约束(英里和当前经度和纬度)以及按计算距离排序。最后,一旦我进一步深入SQLite数据库,将在Azure上的数据库上进行此查询,该数据库可能会或可能不会打开某些功能,而不是查询使用模拟数据插入的SQLite数据库。但是,由于我正在使用SQLite ATM,我试图想出一个Android-SQLite解决方案。
SQLite表架构是这样的:
event_id | event_name | event_latitude | event_longitude
下面是一些与真实代码混合的伪代码,以了解我尝试创建的内容:
sqlite_table = "some_table";
double distanceConstraint = 50.00; //in miles
//using Decimal Degrees (DDD) as it's probably easiest to calculate with
currentLat = 41.40338;
currentLong = 2.17403;
mCursor = mDb.query(true,
SQLITE_TABLE,
new String[] {event_id, event_name},
/* (where) current lat & long is within distanceContraint of event_latitude & event_longitude*/,
null,
null,
null,
/* distanceBetweenPointsResult */ + " DESC",
null);
如何编写查询以计算当前位置与事件之间的距离(以英里为单位)并相应地过滤和排序?
答案 0 :(得分:-1)
要计算两个坐标之间的距离,通常使用Haversine公式。以下是基于MySQL Haversine的查询的特定帖子:https://stackoverflow.com/a/574736/3784227
它建议的实施基于以下Google Maps API文章:https://developers.google.com/maps/articles/phpsqlsearch_v3#findnearsql
这是我的(未经测试)尝试SQL查询来解决您的问题。我使用上面提到的Haversine公式;特别是Google Maps API讨论的版本。
"SELECT event_id, event_name, event_latitude, event_longitude,
(3959 * acos( cos( radians(event_latitude) )
* cos( radians(" + currentLat + ") ) * cos( radians(" + currentLon + ")
- radians(event_longitude) ) + sin( radians(event_latitude) )
* sin(radians(" + currentLat + ")) ) ) AS distance
FROM " + sqlite_table + "
HAVING distance < " + distanceConstraint + "
ORDER BY distance LIMIT 0, 20;"
如果我没有弄错的话,这应该会在event_id
范围内的最多20个地点返回event_name
,event_latitude
,event_longitude
和distanceConstraint
来自{currentLat
,currentLon
},由distance
排序。
我不熟悉如何使用Android / SQLite实现此查询,但希望这有助于指明您正确的方向。