使用SQLite索引查询在android中的Geo Proximity

时间:2013-03-10 17:55:03

标签: android database performance sqlite geo

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万次计算,这几乎可以满足我的需求

  1. 这个scnario最好是代表当前位置从数据库获取位置(在我的数据库表中包含地方/行的thousends)。即计算和查询服务线程中的数据是否最佳。 (我应该在服务主线程以外的地方执行)如果不是告诉我该怎么做??

  2. 之后,一旦我有一个地方列表,最好是在同一个线程或brodcast中生成通知所有地方,而不是BroadCastReceiver为每个地方生成通知。请记住简单的通知,其中仅包含地点名称,发生时间和小描述

1 个答案:

答案 0 :(得分:0)

一个老问题,但是一个常见问题。

您可以查看Mapsforge解决方案以及它们如何管理POI搜索​​。 仔细研究POI search managementDbConstantsAbstractPoiPersistenceManager类,并专门研究findNearPosition()方法。 Mapsforge团队可以完成高质量的工作,并且逻辑上可以满足我的要求(可以选择所有类别,并且POI数量巨大),也许它可以满足您的要求。

比起您可以在扩展Android findNearPosition()的类中使用AsyncTask并在其doInBackground()方法中执行此方法调用。 onPostExecute(),您可以收集结果并更新用户界面。如果位置发生变化,则可以取消AsyncTask并启动另一个。