Android 谷歌地图 - 使折线更直/更平滑

Posted

技术标签:

【中文标题】Android 谷歌地图 - 使折线更直/更平滑【英文标题】:Android google maps - make polyline more straighter /smoother 【发布时间】:2013-08-14 19:04:58 【问题描述】:

我正在创建应用程序来通过 GPS 绘制我的步行路径。一切都很好,当我走路时路径正在绘制,但我有一个问题 - 有可能以某种方式以编程方式使路径线更直吗?

例如。首先,走后我看到我的路径是这样的(它不是折线,在示例中是多边形,但我想你会明白的): https://www.dropbox.com/s/763mq0wja6x7lpy/11.png

但保存后,应用程序使路径更直/更平滑: https://www.dropbox.com/s/npwkz9coqve7m4g/22.png

如何做到这一点?因为我没有任何想法。

我正在用LocationListener绘制路径:

位置管理器位置管理器 = (LocationManager)this.getSystemService(Context.LOCATION_SERVICE);

    Criteria criteria = new Criteria();
  //criteria.setPowerRequirement(Criteria.POWER_LOW); 
    criteria.setAccuracy(Criteria.ACCURACY_FINE);
    criteria.setAltitudeRequired(false);
    criteria.setBearingRequired(false);
    criteria.setCostAllowed(true);
    criteria.setSpeedRequired(false);       
    String bestProvider = locationManager.getBestProvider(criteria, true);
    locationManager.requestLocationUpdates(bestProvider, 500, 3, this );

和 onLocationChanged 监听器:

@Override public void onLocationChanged(位置位置)

          if(lastLocationloc == null) 
                          lastLocationloc = location;     
          LatLng lastLatLng= locationToLatLng(lastLocationloc);
          LatLng thisLatLng= locationToLatLng(location);
          mMap.addPolyline
                       (new PolylineOptions().add(lastLatLng).add(thisLatLng).width(4).color(Color.RED));
          lastLocationloc = location;             
  

【问题讨论】:

不确定,但我猜这只是因为您的lastLatLngthisLatLng。经纬度信息总是有点不稳定,所以如果你用它作为直接输入来画一条线……这条线会很不稳定。您可以尝试稍微调整一下您的 latlong 信息以减少噪音,但这可能会很棘手。 你说“调整你的纬度”是什么意思? 【参考方案1】:

LocationManager 永远不会为您提供确切的位置。因此,虽然您可能不会以不顺畅的方式行走,但即使您在 Criteria 中设置了非常高的准确度,您获得的 GPS 坐标也会始终不稳定。

所以,在绘制路径的时候,可以考虑使用android's Path API

有关这方面的一些代码,请查看此答案:

Android How to draw a smooth line following your finger

【讨论】:

我在哪里可以找到地图的 quadTo 函数?因为我认为这是我一直在寻找的。或者以某种方式使用地图的路径功能? 这比这个空间所能容纳的要远一些。简而言之:您需要创建自己的叠加层并将其添加到地图中。在 Overlay 中,您覆盖 draw(Canvas canvas, MapView mv, ...) 方法。画布很重要,因为您现在可以直接在地图上绘制。要将位置转换为地图上的相应像素,您必须获取投影并转换为像素,如下所示:mapView.getProjection().toPixels(...)。此时,您现在必须应用 Path.quadTo() 方法来绘制平滑路径。 好吧,我知道了,但我认为它不能正常工作。因为您可以在行走的同时拖动地图(或者地图相机可以跟随您的移动),所以我认为您的方法可以将线画到错误的像素上。但顺便说一句,查看您给定的链接,我不小心找到了这个链接 johan.karlsteen.com/2011/07/30/… ,这是我迄今为止找到的最佳解决方案。感谢您的帮助! 不错的链接。关于错误的像素:这不会发生。每次更新都会在空画布上调用 draw。所以你可以缩放、平移等等……只要你得到当前的投影并用它把纬度/经度坐标转换成像素,你就会得到正确的结果。

以上是关于Android 谷歌地图 - 使折线更直/更平滑的主要内容,如果未能解决你的问题,请参考以下文章

如何在路线谷歌地图v2 android上绘制交互式折线

如何在谷歌地图android中显示当前位置的平滑移动

如何使用谷歌地图获取折线中的坐标?

将可拖动标记与折线谷歌地图绑定

如何保存谷歌地图绘制的折线路径?

无法删除谷歌地图片段中的折线