如何使用SQL条件行的Lat和&之间的距离。长,&目前的Lat&长

时间:2014-06-27 18:49:02

标签: java android sql sqlite distance

所以我正在编写一个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);

如何编写查询以计算当前位置与事件之间的距离(以英里为单位)并相应地过滤和排序?

1 个答案:

答案 0 :(得分:-1)

背景:使用Haversine公式

要计算两个坐标之间的距离,通常使用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_nameevent_latitudeevent_longitudedistanceConstraint来自{currentLatcurrentLon},由distance排序。

我不熟悉如何使用Android / SQLite实现此查询,但希望这有助于指明您正确的方向。