【问题标题】:Comparing LatLng and/or Location Objects比较 LatLng 和/或位置对象
【发布时间】:2014-06-24 21:46:25
【问题描述】:

我有一些代码首先创建了一些 LatLng 对象,如下所示(仅一个示例):

LatLng turnOne = new LatLng(52.512657, 1.011376);

在 onLocationChanged 方法中,我想检查使用当前位置创建的 LatLng,如果它们相等,则执行某些操作(在我的情况下触发语音)。

我尝试了很多东西,例如:

  1. 从 Location 对象创建一个 LatLng。我确信这可能有效,但两个比较的 LatLng 对象必须是准确的吗?如果是这样,试图在没有阈值的情况下在移动中匹配它们似乎不太可能。

    LatLng a = new LatLng(location.getLatitude(), location.getLongitude());
    if(turnOne.equals(a))
    {
        ttobj.speak("stuff", 
                TextToSpeech.QUEUE_FLUSH, null);
    }
    
  2. 从 LatLng 创建一个 Location 对象。我不确定为什么这不起作用。我正在比较两个 Location 对象并允许 10 米或更小的阈值(在道路上),但它似乎不起作用(我没有听到任何语音)。

     Location loc1 = new Location("");
     loc1.setLatitude(turnOne.latitude);
     loc1.setLongitude(turnOne.longitude);
     if(location.distanceTo(loc1) <= 10)
     {
         ttobj.speak("stuff", 
                TextToSpeech.QUEUE_FLUSH, null);
     }
    

因此,我的问题是如何比较两个 LatLngs 并允许在跟踪中使用轻微的阈值(例如 5 米)或比较两个位置。

我唯一能找到接近这个问题的是Comparing two LatLng objects in google map v2 android,但它并没有完全帮助我。

【问题讨论】:

    标签: android


    【解决方案1】:

    只是为了回答这个问题。

    比较一个全局的 LatLng 对象,例如:

    LatLng aLatLng = new LatLng(51.116492, -0.541767);
    

    到提供的位置参数:

    public void onLocationChanged(Location location)
    

    使用效果很好:

    Location locationOne = new Location("");
    locationOne.setLatitude(aLatLng.latitude);
    locationOne.setLongitudeaLatLng.longitude);
    float distanceInMetersOne = locationOne.distanceTo(location);
    

    【讨论】:

      【解决方案2】:

      使用 .equals 是个坏主意,因为 lat 和 long 不太可能完全相等。直接比较浮点数绝不是一个好主意。如果您还没有 2 个位置对象,我会使用:

      Location.distanceBetween(double startLatitude, double startLongitude, double endLatitude, double endLongitude, float[] 结果)

      这可能是你最好的选择。顺便说一句,如果您想在设备接近某个位置时触发,请考虑使用地理围栏或 LocationManager 接近警报。

      【讨论】:

      • 感谢您的回复。目前我决定使用我的 LatLng 对象在 onLocationChanged 方法中创建 Location 对象,以便我可以将它们与当前位置进行比较。我已经这样做了: Location locationOne = new Location(""); locationOne.setLatitude(turnOne.latitude); locationOne.setLongitude(turnOne.longitude); float distanceInMetersOne = locationOne.distanceTo(location);
      • 然后使用 if(distanceInMetersOne
      • 如果失败,我认为 LocationManager 接近警报似乎是一个不错的选择。
      猜你喜欢
      • 1970-01-01
      • 2013-02-28
      • 1970-01-01
      • 2015-05-23
      • 2018-02-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-07
      相关资源
      最近更新 更多