【问题标题】:Geo Proximity in android using SQLite indexing query使用 SQLite 索引查询在 android 中的 Geo Proximity
【发布时间】:2013-02-25 20:35:24
【问题描述】:

Formulas to Calculate Geo Proximity

(我是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&lt;Places&gt; 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 万次计算,这对于我的需求来说几乎可以接受

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

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

【问题讨论】:

    标签: android database performance sqlite geo


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多