(我是android开发的新手,所以请建议我最好的答案,不要投反对票,对不起我的英语不好)
我正在使用 Haver Sine 公式计算距离 bt 2 点。
在上述情况下,Alix Axel 使用 mysql 和 php,但在我的情况下,我在我的 android 应用程序上实现了这一点,实际上在我的应用程序中,我有一个 LocationService(背景),我的应用程序将继续使用 GPS 和网络提供商获取 lon/lat使用....
locationManager.requestLocationUpdates(provider, THIRTY_SEC, HUNDRED_METER, Locationlistener);
一旦找到最好的,而不是在那个位置的基础上,我正在执行 sqlite indexng 查询,我的 sqlite 查询是(这个方法在 SQLiteHelper 类中同步)
SELECT * FROM (
SELECT * FROM Places WHERE
(Lat >= 1.2393 AND Lat <= 1.5532) AND (Lon >= -1.8184 AND Lon <= 0.4221)
) WHERE
acos(sin(1.3963) * sin(Lat) + cos(1.3963) * cos(Lat) * cos(Lon - (-0.6981))) <= 0.1570;
如上所述,此查询导致我存储在局部变量中的一些行
List<Places> places = aboveQuery(location);
结果地方可能是 1,100 或更多,之后我为列表中的每个地方生成一个简单的通知。所以通知仍然可能是 1、100 或更多。下面是我执行此任务的代码。
public class LocationServices extends Service {
// rest of the code here to fatch location using GPS, Network
private class LocationServiceProcess implements Runnable {
@Override
public void run() {
try {
List<Places> Places = query a databse for location matching
// generate notification here
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
}
我想现在你们可以理解我的问题了,现在我的问题是
正如 Alix Axel 在他的帖子中所说,Haversine 公式比 Vincenty 公式快得多,我能够在大约 6 秒内运行 100 万次计算,这对于我的需求来说几乎是可以接受的
这个 scnario 是否最好代表当前位置从数据库中获取位置(假设在我的数据库表中包含数千个位置/行)。即这种计算和查询服务线程中的数据是否最好。(我应该在服务主线程之外执行)如果不是告诉我该怎么做?
在那之后,一旦我有了一个地点列表,最好在同一个线程中生成通知或广播所有地点,而不是在 BroadCastReceiver 中为每个地点生成通知。请记住只是简单的通知,其中仅包含地点名称、发生时间和简短说明