1

计算地理接近度的公式

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

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

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

4

1 回答 1

0

一个老问题,但一个普遍的问题。

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

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

于 2018-07-18T08:51:12.963 回答