Я пытаюсь добавить полилинию, используя 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;
}