Android Google Place API, Рисование полилинии - PullRequest
0 голосов
/ 27 сентября 2019

Я пытаюсь добавить полилинию, используя Google Direction API.Я получаю два маршрута на карте вместо одного, как на скриншоте.

Пожалуйста, смотрите изображение.Это мой кодЯ следовал одному руководству и делал то же самое, что и в kotlin.

val link = "${DirectionUtils.DIRECTION_API}origin=${fromLatLng.latitude}," + "${fromLatLng.longitude}&destination=${toLatLng.latitude},${toLatLng.longitude}" + "&sensor=false&mode=driving&alternatives=false&transit_routing_preference=less_driving&key=${resources.getString(
                        R.string.google_map_api
                    )}"

Это мой код, выполняющий вызов API

APIClient(this).get(link, object : ResponseListener { override fun onResponse(statusCode: Int, response: String) { when (statusCode) {200 -> { val jsonObject: JSONObject = JSONObject(response)
                        Single.just(DecodePolyline().parse(jsonObject)).subscribeOn(Schedulers.io())
                            .observeOn(AndroidSchedulers.mainThread())
                            .subscribe(io.reactivex.functions.Consumer<List<List<HashMap<String, String>>>> {

                                it?.let {
                                    var points = ArrayList<LatLng>();


                                    for (i in 0 until it.size) {
                                        val path = it.get(i)

                                        for (j in 0 until path.size) {
                                            val point = path.get(j) as HashMap<String, String>

                                            try {
                                                val lat = point.get("lat")!!.toDouble();
                                                val lng = point.get("lng")!!.toDouble();
                                                val gottenLatLng = LatLng(lat, lng)
                                                points.add(gottenLatLng);

                                            } catch (e: NullPointerException) {
                                                e.printStackTrace()
                                            }
                                        }
                                        points.addAll(points);
                                    }

                                    val lineOptions = PolylineOptions().width(5f)
                                        .color(resources.getColor(R.color.makerIconColor)).geodesic(true);
                                    for (i in 0 until points.size) {
                                        lineOptions.add(points.get(i))
                                    }
                                    mMap?.addPolyline(lineOptions)


                                    /* val greyOptions = PolylineOptions();
                                     greyOptions.width(10f);
                                     greyOptions.color(Color.GRAY);
                                     greyOptions.startCap(SquareCap());
                                     greyOptions.jointType(JointType.ROUND)
                                     greyOptions.endCap(SquareCap());
                                     placeHolderGoogleMapPolyline = this@run.addPolyline(greyOptions);
                                    */


                                    val width = resources.getDisplayMetrics().widthPixels;
                                    val height = getResources().getDisplayMetrics().heightPixels;
                                    val padding = (width * 0.30).toInt()
                                    val latLngBounds = LatLngBounds.Builder()
                                    latLngBounds.include(fromLatLng)
                                    latLngBounds.include(toLatLng)


                                    val cameraposition = CameraPosition.builder().zoom(17f)
                                        .target(latLngBounds.build().center).build()
                                    mMap?.animateCamera(
                                        CameraUpdateFactory.newCameraPosition(cameraposition),
                                        1200, null
                                    )
                                }
                            })
                    }
                    else -> {
                    }
                }
            }
        })
Decode Polyline related code in java

    public List<LatLng> decodePoly(String encoded) {

        List<LatLng> poly = new ArrayList<LatLng>();
        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;
    }

    public List<List<HashMap<String, String>>> parse(JSONObject jObject) {

        List<List<HashMap<String, String>>> routes = new ArrayList<List<HashMap<String, String>>>();
        JSONArray jRoutes = null;
        JSONArray jLegs = null;
        JSONArray jSteps = null;

        try {

            jRoutes = jObject.getJSONArray("routes");

            /** Traversing all routes */
            for (int i = 0; i < jRoutes.length(); i++) {
                jLegs = ((JSONObject) jRoutes.get(i)).getJSONArray("legs");
                List path = new ArrayList<HashMap<String, String>>();

                /** Traversing all legs */
                for (int j = 0; j < jLegs.length(); j++) {
                    jSteps = ((JSONObject) jLegs.get(j)).getJSONArray("steps");

                    /** Traversing all steps */
                    for (int k = 0; k < jSteps.length(); k++) {
                        String polyline = "";
                        polyline = (String) ((JSONObject) ((JSONObject) jSteps.get(k)).get("polyline")).get("points");
                        List<LatLng> list = decodePoly(polyline);

                        /** Traversing all points */
                        for (int l = 0; l < list.size(); l++) {
                            HashMap<String, String> hm = new HashMap<String, String>();
                            hm.put("lat", Double.toString(((LatLng) list.get(l)).latitude));
                            hm.put("lng", Double.toString(((LatLng) list.get(l)).longitude));
                            path.add(hm);
                        }
                    }
                    routes.add(path);
                }
            }

        } catch (JSONException e) {
            e.printStackTrace();
        } catch (Exception ignored) {
        }

        return routes;
    }

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...