Formulas to Calculate Geo Proximity
(我是Android开发的新手,所以请建议我最好的答案,不要投票给沮丧,抱歉我的英语不好)
我使用Haver正弦公式计算距离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 Formula比Vincenty Formula更快,我能在大约6秒钟内完成100万次计算,这几乎可以满足我的需求
这个scnario最好是代表当前位置从数据库获取位置(在我的数据库表中包含地方/行的thousends)。即计算和查询服务线程中的数据是否最佳。 (我应该在服务主线程以外的地方执行)如果不是告诉我该怎么做??
之后,一旦我有一个地方列表,最好是在同一个线程或brodcast中生成通知所有地方,而不是BroadCastReceiver为每个地方生成通知。请记住简单的通知,其中仅包含地点名称,发生时间和小描述
答案 0 :(得分:0)
一个老问题,但是一个常见问题。
您可以查看Mapsforge解决方案以及它们如何管理POI搜索。
仔细研究POI search management,DbConstants和AbstractPoiPersistenceManager类,并专门研究findNearPosition()
方法。
Mapsforge团队可以完成高质量的工作,并且逻辑上可以满足我的要求(可以选择所有类别,并且POI数量巨大),也许它可以满足您的要求。
比起您可以在扩展Android findNearPosition()
的类中使用AsyncTask
并在其doInBackground()
方法中执行此方法调用。 onPostExecute()
,您可以收集结果并更新用户界面。如果位置发生变化,则可以取消AsyncTask
并启动另一个。