当前位置: 首页 > 知识库问答 >
问题:

在android上使用航路点绘制驾驶路线(谷歌地图、谷歌方向api、json解析、解码谷歌多段线)

霍建章
2023-03-14

DrawPath()用于在地图上绘制多边形。

public void drawPath(String result){
        try {
            final JSONObject jsonObject = new JSONObject(result);

            JSONArray routeArray = jsonObject.getJSONArray("routes");
            JSONObject routes = routeArray.getJSONObject(0);


            JSONObject overviewPolylines = routes.getJSONObject("overview_polyline");
            String encodedString = overviewPolylines.getString("points");

            String statusString = jsonObject.getString("status");

            Log.d("test: ", encodedString);
            List<LatLng> list = decodePoly(encodedString);

            LatLng last = null;
            for (int i = 0; i < list.size()-1; i++) {
                LatLng src = list.get(i);
                LatLng dest = list.get(i+1);
                last = dest;
                Log.d("Last latLng:", last.latitude + ", " + last.longitude );
                Polyline line = mMap.addPolyline(new PolylineOptions()
                .add(new LatLng(src.latitude, src.longitude), new LatLng(dest.latitude, dest.longitude))
                .width(4)
                .color(Color.GREEN));
            }

            Log.d("Last latLng:", last.latitude + ", " + last.longitude );
        }catch (JSONException e){
            e.printStackTrace();
        }
        catch(ArrayIndexOutOfBoundsException e) {
            System.err.println("Caught ArrayIndexOutOfBoundsException: "+ e.getMessage());
        }
    }

    private List<LatLng> decodePoly(String encoded){


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

        int latitude = 0;
        int longitude = 0;

        while(index < length){
            int b;
            int shift = 0;
            int result = 0;

            do {
                b = encoded.charAt(index++) - 63;
                result |= (b & 0x1f) << shift;
                shift += 5;
            } while (b >= 0x20);

            int destLat = ((result & 1) != 0 ? ~(result >> 1) : (result >> 1));
            latitude += destLat;

            shift = 0;
            result = 0;
            do {
                b = encoded.charAt(index++) - 63;
                result |= (b & 0x1f) << shift;
                shift += 5;
            } while (b > 0x20);

            int destLong = ((result & 1) != 0 ? ~(result >> 1) : (result >> 1));
            longitude += destLong;

            poly.add(new LatLng((latitude / 1E5),(longitude / 1E5) ));
        }
        return poly;
    }

现在我的问题是路线没有正确显示在地图上,因为它在链接中有航路点。我在Android4.2上使用它

我的链接是http://maps.googleapis.com/maps/api/directions/json?origin=18.XXX,73.XXXdestination=18。三十、 73。XXX

共有2个答案

万坚壁
2023-03-14

@Zeratul感谢您通过概述\u折线解码代码。积分。效果很好。顺便说一句,在获得LatLng列表后,您不需要在列表上循环。只需使用多段线选项的addAll方法

List<LatLng> list = decodePoly(encodedString);
PolylineOptions po = new PolylineOptions();
po.addAll(list);
po.width(2).color(Color.BLUE);
Polyline line = getMap().addPolyline(po);
虞正业
2023-03-14

我已经测试了你的解码部分。似乎没有问题。你可以使用步骤和腿来更精确。

 类似资料:
  • 我已经阅读了一些有关堆栈溢出的主题,但没有找到解决问题的确切方法。我会尽力解释我的问题。例如,假设我有一个网格9x9。坐标由交点表示。是否有一种方法或某人是否已经实施了一个程序,从坐标a(X,Y)到坐标B(V,W)绘制一条线,其中该线表示最短路径。。 在我的问题中,我使用的是谷歌地图,我想在坐标之间画一条折线。。 这类似于我的问题,但在我的情况下,我想使用坐标而不是“权重” Java-在距离加权地

  • 我遇到了Google Maps API的问题:当我请求以下url时,它返回结果https://Maps.googleapis.com/Maps/api/directions/json?origin=brooklyn&destination=queens

  • 我已经用自动完成和谷歌地理编码应用编程接口实现了谷歌地方应用编程接口。问题是结果似乎不正确。 有时自动完成列表中的一些选择结果根本没有地理编码,我得到的只是状态ZERO_RESULTS。 我知道Google Autocomplete也使用Places,而Google Geocode只使用邮政编码,这可能会有一些问题,但我如何限制Autocomplete只提供邮政编码结果呢。

  • 所以我看到了一个特殊的例外,我敢肯定的是谷歌地图的绘图代码。 我有一个片段,在那里我以编程方式添加了一个支持地图片段,然后我在其中操纵谷歌地图实例。 这是stacktrace: 我无法可靠地复制它(尽管这种情况经常发生),我已经查看了ReadWriteDirectByteBuffer和ShortToByteBufferAdapter,但没有任何东西突然出现在我面前。 有什么想法吗?

  • 我正在开发一个应用程序,其中我必须显示最短路线。我正在使用Google Direction API,但结果与相同目的地和旅行模式的Google Maps应用程序不同。 https://maps.googleapis.com/maps/api/directions/json?origin=19.107163,72.862375 既然备选方案是正确的,我已经在使用可用路线中的最短路线(响应)。 注意:

  • 我试图在两个位置之间找到驾驶方向: 我尝试过的代码: 但是这在两点之间画了一条直线。 有没有其他方法/途径可以得到这两点之间的行驶方向。