Разница версий API Карт Google
Я пытаюсь показать маршрут между двумя местами, я хочу использовать Google Places API V3 для шагов маршрута между двумя точками.
До того, как я использовал Старый API Карт Google, и следующий запрос дает отличный результат:
http://maps.google.com/maps?f=d&hl=en&saddr=19.5217608,-99.2615823&daddr=19.531224,-99.248262&ie=UTF8&0&om=0&output=kml
Выход:
![Old Google Maps API]()
Теперь я пытаюсь заменить это новым API Карт Google, и следующий запрос дает неправильный результат. В обоих случаях я использую тот же источник и пункт назначения, но результат дает другое поведение на Карте Google:
http://maps.googleapis.com/maps/api/directions/json?origin=19.5217608,-99.2615823&destination=19.531224,-99.248262&sensor=false
![New Google Maps API]()
Моя проблема заключается в том, что новый API Карт Google возвращает меньшее количество шагов между источником и получателем, поэтому маршрут не отображается на карте Google.
Пожалуйста, помогите решить эту проблему для нового API Карт Google v3.
Спасибо заранее.
Ответы
Ответ 1
Что нового в Google Map API v3?
Google Maps Directions API v3
для Android предусмотрены маршруты в Encoded Polyline Algorithm Format
.
Что нам нужно делать?
We must have to decode this Polyline for showing exact Map
Как мы декодируем эту закодированную полилинию, предоставленную Google Directions API v3?
Пожалуйста, ознакомьтесь с этими тремя ссылками, чтобы получить более четкое представление с зашифрованной Полилинией от Google Maps Directions API v3
Как мы можем решить проблему в вышеуказанном вопросе?
Пожалуйста, обратитесь к этим трем ответам, которые решают вашу проблему:
Ответ 2
Я взял ваш URL-адрес запроса и вставил его в свое приложение, которое использует новую версию, и оно отлично работает.
Проблема может заключаться в том, как вы анализируете данные или декодируете полученную строку JSON.
![enter image description here]()
String url = "http://maps.googleapis.com/maps/api/directions/json?origin=19.5217608,-99.2615823&destination=19.531224,-99.248262&sensor=false";
HttpPost httppost = new HttpPost(url);
HttpResponse response = httpclient.execute(httppost);
HttpEntity entity = response.getEntity();
InputStream is = null;
is = entity.getContent();
BufferedReader reader = new BufferedReader(new InputStreamReader(is, "iso-8859-1"), 8);
StringBuilder sb = new StringBuilder();
sb.append(reader.readLine() + "\n");
String line = "0";
while ((line = reader.readLine()) != null) {
sb.append(line + "\n");
}
is.close();
reader.close();
String result = sb.toString();
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");
List<GeoPoint> pointToDraw = decodePoly(encodedString);
//Added line:
mapView.getOverlays().add(new RoutePathOverlay(pointToDraw));
и метод decodePoly()
берется из другого вопроса здесь, в SO, который я не помню автора:
private List<GeoPoint> decodePoly(String encoded) {
List<GeoPoint> poly = new ArrayList<GeoPoint>();
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;
GeoPoint p = new GeoPoint((int) (((double) lat / 1E5) * 1E6), (int) (((double) lng / 1E5) * 1E6));
poly.add(p);
}
return poly;
}
Я включаю то, что я использовал, чтобы добавить наложение к самой карте,
Я не могу найти учебник, из которого он взят. Извините за то, что не отдал должное. (добавлен призыв к этому в первом методе, который я опубликовал)
public class RoutePathOverlay extends Overlay {
private int _pathColor;
private final List<GeoPoint> _points;
private boolean _drawStartEnd;
public RoutePathOverlay(List<GeoPoint> points) {
this(points, Color.RED, true);
}
public RoutePathOverlay(List<GeoPoint> points, int pathColor, boolean drawStartEnd) {
_points = points;
_pathColor = pathColor;
_drawStartEnd = drawStartEnd;
}
private void drawOval(Canvas canvas, Paint paint, Point point) {
Paint ovalPaint = new Paint(paint);
ovalPaint.setStyle(Paint.Style.FILL_AND_STROKE);
ovalPaint.setStrokeWidth(2);
int _radius = 6;
RectF oval = new RectF(point.x - _radius, point.y - _radius, point.x + _radius, point.y + _radius);
canvas.drawOval(oval, ovalPaint);
}
public boolean draw(Canvas canvas, MapView mapView, boolean shadow, long when) {
Projection projection = mapView.getProjection();
if (shadow == false && _points != null) {
Point startPoint = null, endPoint = null;
Path path = new Path();
//We are creating the path
for (int i = 0; i < _points.size(); i++) {
GeoPoint gPointA = _points.get(i);
Point pointA = new Point();
projection.toPixels(gPointA, pointA);
if (i == 0) { //This is the start point
startPoint = pointA;
path.moveTo(pointA.x, pointA.y);
} else {
if (i == _points.size() - 1)//This is the end point
endPoint = pointA;
path.lineTo(pointA.x, pointA.y);
}
}
Paint paint = new Paint();
paint.setAntiAlias(true);
paint.setColor(_pathColor);
paint.setStyle(Paint.Style.STROKE);
paint.setStrokeWidth(5);
paint.setAlpha(90);
if (getDrawStartEnd()) {
if (startPoint != null) {
drawOval(canvas, paint, startPoint);
}
if (endPoint != null) {
drawOval(canvas, paint, endPoint);
}
}
if (!path.isEmpty())
canvas.drawPath(path, paint);
}
return super.draw(canvas, mapView, shadow, when);
}
public boolean getDrawStartEnd() {
return _drawStartEnd;
}
public void setDrawStartEnd(boolean markStartEnd) {
_drawStartEnd = markStartEnd;
}
}
Надеюсь, это сработает для вас.
Ответ 3
Вы не используете все точки, возвращенные в результате. Вы не указали свой код, но вот пример с API v3, который показывает тот же путь, что и возвращаемые вашими "картами google", пример.
Ответ 4
Пожалуйста, проверьте эту ссылку .
И укажите Режимы перемещения
-- driving
-- walking
-- bicycling
-- transit
чтобы получить разные результаты.
попробуйте.
Ответ 5
Что касается того, что GeoPoint не решен, я просто изменил все события GeoPoint на LatLng, и все сработало.
Ответ 6
Решение выше, размещенное https://stackoverflow.com/users/975959/la-bla-bla, отлично работает с Google Maps API V2, но для него требуются небольшие модификации:
Замените все вхождения GeoPoint на LatLng.
Замените строку:
GeoPoint p = new GeoPoint((int) (((double) lat / 1E5) * 1E6), (int) (((double) lng / 1E5) * 1E6));
который находится непосредственно перед завершением метода decodePoly, с этой строкой:
LatLng p = new LatLng(lat / 1E5, lng / 1E5);
Надеемся, что это будет работать для пользователей Google Maps API v2.
Ответ 7
Я использовал решение, данное "La bla bla", но сделал некоторые небольшие изменения. У меня возникла проблема с отображением пути, когда у меня было слишком много очков, когда вы слишком сильно увеличиваете масштаб, маршрут больше не отображается, и вы получаете это сообщение в логарифмическом "слишком длинном пути формы для визуализации в текстуру".
То, что я сделал, заключалось в том, чтобы разделить путь следующим образом:
if (shadow == false && _points != null) {
Path path = new Path();;
//We are creating the path
Point pointA = new Point();
for (int i = 0; i < _points.size(); i++) {
mapView.getProjection().toPixels(_points.get(i), pointA);
if (i == 0) path.moveTo(pointA.x, pointA.y);
else path.lineTo(pointA.x, pointA.y);
if(i%10==0 || i == _points.size()-1){
Paint paint = new Paint();
paint.setAntiAlias(true);
paint.setColor(_pathColor);
paint.setStyle(Paint.Style.STROKE);
paint.setStrokeJoin(Paint.Join.ROUND);
paint.setStrokeCap(Paint.Cap.ROUND);
paint.setStrokeWidth(mapView.getZoomLevel()-10);
paint.setAlpha(200);
if (!path.isEmpty()) canvas.drawPath(path, paint);
path = new Path();
path.moveTo(pointA.x, pointA.y);
}
}
}
Я делаю маршруты каждые 10 пунктов, он может быть менее эффективным, но таким образом вы можете отобразить путь, когда масштаб имеет большие значения.
Ответ 8
@Ghareeb-Strange - Но зачем нам это нужно с API v2? Я имею в виду, что у нас есть полилиния, которая делает ее более простой.
private void drawPath(){
PolylineOptions options = new PolylineOptions();
options.width(4);
options.color(Color.RED);
for(int i = 0; i< pathList.size(); i++ ){
options.add(pathList.get(i));
}
map.addPolyline(options);
}
С чем-то вроде кода, вышедшего выше, у вас будет отличный путь в вашем приложении.
pathList - это список, содержащий все точки нашего пути.
Ура!
Ответ 9
Кажется, что ответов достаточно, но по этому вопросу я получаю выгоду от этой . Но это не сработало, когда я загрузил и импортировал. Поэтому я реализовал свое приложение. И в этом коде есть ошибка. Когда вы хотите во второй раз вычислить маршрут, приложение. брейки.
if (mMarkerPoints.size() > 1) {
mMarkerPoints.clear();
map.clear();
// LatLng startPoint = new LatLng(nearbyLatitude,
// nearbyLongitude);
// drawMarker(startPoint);
}
Найдите эти строки и сделайте комментарий, как я сделал. Во всяком случае, на самом деле вы попросили нарисовать маршрут не весь код, чтобы вы могли проверить код на этом веб-сайте. Хорошо провести маршрут между точками (маркерами).
Удачного дня.