java - PolyUtil 解码 JavaScript 和 Java 的区别

标签 java android google-maps

我有多个点对应于 PolyUtil 编码中的一条路线。我在网络和 native android 应用程序中显示这条路线,问题是在我的网络中它显示正确但在我的 android 应用程序中它显示有点不同。

我记录了 PolyUtil 解码和解码的点是不同的。使用 PolyUtil 交互式网站我得到了正确的路线。我认为问题出在android库上。

PolyUtil 编码点:

lvzsEhgvuI~c@HbJr@lJ`@|MrDfJlE~GxCdEvQ~IhCfDh@bIi@dGwB|D{GL{VqBqGcHcEeNGqGpGmHnQ

android 点解码:

-34.88199, -56.15223
-34.883770000000005, -56.152280000000005
-34.885600000000004, -56.15254
-34.88799, -56.152710000000006
-34.889790000000005, -56.15361000000001
-34.89123, -56.15464000000001
-34.89222, -56.15541
-34.893980000000006, -56.15841
-34.89482, -56.1591
-34.896440000000005, -56.159310000000005
-34.89775, -56.1591
-34.898700000000005, -56.158500000000004
-34.898770000000006, -56.15708000000001
-34.8982, -56.15326
-34.89674, -56.15189
-34.894310000000004, -56.15091
-34.89294, -56.150870000000005
-34.89143, -56.152240000000006
-34.891290000000005, -56.15520000000001

解码的网络点:

-34.876070000000006,-56.152370000000005
-34.88199,-56.152420000000006
-34.883770000000005,-56.152680000000004
-34.885600000000004,-56.15285000000001
-34.88799,-56.15375
-34.889790000000005,-56.15478
-34.89123,-56.155550000000005
-34.89222,-56.158550000000005
-34.893980000000006,-56.159240000000004
-34.89482,-56.15945000000001
-34.896440000000005,-56.159240000000004
-34.89775,-56.158640000000005
-34.898700000000005,-56.15722
-34.898770000000006,-56.153400000000005
-34.8982,-56.15203
-34.89674,-56.151050000000005
-34.894310000000004,-56.15101000000001
-34.89294,-56.15238000000001
-34.89143,-56.15534

在我的网络中我这样解码:

google.maps.geometry.encoding.decodePath(encoded_estimated_wp);

Web preview

在 android 应用程序中我这样解码:

PolyUtil.decode(encoded_path);

Android preview


我该如何修复android路线?它显示不正确。

最佳答案

代码如下:

List <LatLng> pathPoints = PolyUtil.decode("lvzsEhgvuI~c@HbJr@lJ`@|MrDfJlE~GxCdEvQ~IhCfDh@bIi@dGwB|D{GL{VqBqGcHcEeNGqGpGmHnQ");
for (LatLng point : pathPoints) {
    Log.d(TAG, "" + point.latitude + "," + point.longitude);
}
PolylineOptions polylineOptions = new PolylineOptions()
        .addAll(pathPoints)
        .color(Color.RED)
        .width(20);

解码折线

lvzsEhgvuI~c@HbJr@lJ`@|MrDfJlE~GxCdEvQ~IhCfDh@bIi@dGwB|D{GL{VqBqGcHcEeNGqGpGmHnQ

与您的网络完全相同 (google.maps.geometry.encoding.decodePath(encoded_estimated_wp);) 解码:

-34.876070000000006,-56.152370000000005
-34.88199,-56.152420000000006
-34.883770000000005,-56.152680000000004
-34.885600000000004,-56.15285000000001
-34.88799,-56.15375
-34.889790000000005,-56.15478
-34.89123,-56.155550000000005
-34.89222,-56.158550000000005
-34.893980000000006,-56.159240000000004
...

Decoded polyline

所以检查你的 android-maps-utils 在应用 buld.gradle 文件依赖并添加最新的 version (目前为 0.5+):

dependencies {
    ...
    implementation 'com.google.maps.android:android-maps-utils:0.5+'
}

或使用自定义decodePoly() 方法,如this Marlon的答案(实际上它是从 android-map-utils 抓取的)并给出相同的结果:

private List<LatLng> decodePoly(String encoded) {

  List<LatLng> poly = new ArrayList<>();
  int index = 0, len = encoded.length();
  int lat = 0, lng = 0;

  while (index < len) {
      int b, shift = 0, result = 0;
      do {
          b = encoded.charAt(index++) - 63;
          result |= (b & 0x1f) << shift;
          shift += 5;
      } while (b >= 0x20);
      int dlat = ((result & 1) != 0 ? ~(result >> 1) : (result >> 1));
      lat += dlat;

      shift = 0;
      result = 0;
      do {
          b = encoded.charAt(index++) - 63;
          result |= (b & 0x1f) << shift;
          shift += 5;
      } while (b >= 0x20);
      int dlng = ((result & 1) != 0 ? ~(result >> 1) : (result >> 1));
      lng += dlng;

      LatLng p = new LatLng((((double) lat / 1E5)),
              (((double) lng / 1E5)));
      poly.add(p);
  }

  return poly;
}

关于java - PolyUtil 解码 JavaScript 和 Java 的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54269305/

相关文章:

java - 如何制作像 uber 这样的标记标签?

java - 当 Firebase 和 Android 中有新节点时,我的应用程序不断跳回 Activity

java - Spring MessageSource 通过多个语言环境查找

java - SQLCipher 如何解码数据库?密码存储在哪里?如何与多个用户一起工作?

java - 相同安装的 Java 版本具有相同的 serialversionUID

android - 如何检查哪个图像面被按下

java - Android SRP 客户端通过 OpenSSL SRP 与 Linux 服务器一起工作

安卓打开pdf文件

java - 在特定位置设置相机动画

javascript - 相当于 v3 Maps API 中的 GMap2.savePosition?