18

Tôi đang cố hiển thị tuyến đường giữa hai địa điểm, tôi muốn sử dụng Google Places API V3 cho các tuyến đường giữa hai điểm.Sự khác biệt phiên bản API Google Maps


Trước khi tôi đã sử dụng Old Google Maps API, và sau yêu cầu đưa ra kết quả hoàn hảo:

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 

Output:

Old Google Maps API


Bây giờ tôi cố gắng thay thế này với API Google Maps mới, và yêu cầu sau đây cho kết quả sai, Trong cả hai trường hợp tôi đang sử dụng cùng một nguồn và đích, nhưng kết quả mang lại cho hành vi khác nhau trên Google Map:

http://maps.googleapis.com/maps/api/directions/json?origin=19.5217608,-99.2615823&destination=19.531224,-99.248262&sensor=false 

New Google Maps API

Vấn đề của tôi là, New Google Maps API trở lại số bước ít hơn giữa nguồn và đích do đó tuyến đường không hiển thị hoàn hảo trên Google Map.

Vui lòng trợ giúp giải quyết vấn đề này cho API Google Maps mới v3.

Xin cảm ơn trước.

Trả lời

16

Tính năng mới trong Google Map API v3?
Google Maps Directions API v3 dành cho Android cung cấp các tuyến đường trong Encoded Polyline Algorithm Format.

Chúng ta phải làm gì?
We must have to decode this Polyline for showing exact Map

Làm sao chúng ta giải mã Polyline này mã hóa được cung cấp bởi Google API hướng dẫn v3?
Hãy tham khảo những ba liên kết để rõ ràng hơn với lợi nhuận Polyline được mã hóa từ Google Maps Directions API v3

Làm thế nào chúng ta có thể giải quyết vấn đề trong câu hỏi trên?
Vui lòng tham khảo những ba liên kết câu trả lời, mà giải quyết vấn đề của bạn:

1

Vui lòng kiểm tra này link..

Và Xác định Travel Chế độ

-- driving 
-- walking 
-- bicycling 
-- transit 

để bạn có được kết quả khác nhau.

hãy dùng thử.

3

Bạn không sử dụng tất cả các điểm được trả lại trong kết quả. Bạn chưa cung cấp mã của mình, nhưng here is an example with the v3 API hiển thị cùng một đường dẫn như được trả về bởi ví dụ "bản đồ google" của bạn.

21

Tôi đã lấy URL yêu cầu của bạn và dán nó vào ứng dụng của tôi, đang sử dụng phiên bản mới hơn và nó hoạt động tuyệt vời. Sự cố có thể là cách bạn phân tích cú pháp dữ liệu hoặc giải mã chuỗi JSON đã nhận. 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)); 

và phương pháp decodePoly() được lấy từ một câu hỏi ở đây trong SO, mà tôi không nhớ tác giả:

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; 
} 

tôi bao gồm những gì tôi đã sử dụng để thêm lớp phủ vào chính bản đồ là tốt, Tôi không thể tìm thấy hướng dẫn được lấy từ .. xin lỗi vì không cho tín dụng. (đã thêm cuộc gọi này vào phương thức đầu tiên mà tôi đã đăng)

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; 
    } 
} 

Hy vọng điều này phù hợp với bạn.

+0

Tôi đã thay đổi phân tích cú pháp kml thành phân tích cú pháp json bằng cách sử dụng câu trả lời này. Cảm ơn bạn, câu trả lời tuyệt vời. – Murat

+0

amaziingggg .. !!!!!!!!!! – sephtian

+0

Nó hoạt động! Cảm ơn người đàn ông đã đặt tất cả cùng nhau! – AlexAndro

0

Liên quan đến GeoPoint là chưa được giải quyết, tôi chỉ thay đổi tất cả các lần xuất hiện của GeoPoint đến LatLng và mọi thứ đã hoạt động.

0

Giải pháp ở trên được đăng bởi https://stackoverflow.com/users/975959/la-bla-bla hoạt động rất tốt với API Google Maps V2 nhưng cần một số sửa đổi nhỏ:
Thay thế tất cả các lần xuất hiện của GeoPoint bằng LatLng.
Thay thế dòng:

GeoPoint p = new GeoPoint((int) (((double) lat/1E5) * 1E6), (int) (((double) lng/1E5) * 1E6)); 

nào nằm ngay trước khi kết thúc của phương pháp decodePoly, với dòng này:

LatLng p = new LatLng(lat/1E5, lng/1E5); 

Hope này làm việc cho người dùng Google Maps API v2.

0

Tôi đã sử dụng giải pháp được đưa ra bởi "La bla bla", nhưng tôi đã thực hiện một số sửa đổi nhỏ. Tôi đã gặp sự cố khi hiển thị đường dẫn khi tôi có quá nhiều điểm, khi bạn Phóng to quá nhiều, tuyến đường sẽ không hiển thị nữa và bạn nhận được thông báo này trong đường dẫn hình dạng "quá lớn" sẽ được hiển thị thành kết cấu ".

Những gì tôi đã làm là để chia nhỏ các con đường theo cách sau:

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); 
      } 
     } 
    } 

Tôi chỉ dẫn các nẻo mỗi 10 điểm, nó có thể kém hiệu quả, nhưng cách này bạn có thể hiển thị các đường dẫn khi zoom là trong giá trị cao.

0

@ Ghareeb-Strange- Nhưng tại sao chúng ta cần điều đó với API v2? Ý tôi là, chúng tôi có polyline làm cho nó dễ dàng hơn.

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); 
    } 

Với thứ như mã được đăng ở trên, bạn sẽ vẽ đường dẫn hoàn hảo trong ứng dụng của mình.

pathList là Danh sách chứa tất cả các điểm trong đường dẫn của chúng tôi.

Chúc mừng!

0

Có vẻ như có đủ câu trả lời nhưng đối với chủ đề này, tôi được hưởng lợi ích này link. Nhưng nó không hoạt động khi tôi tải xuống và nhập. Vì vậy, tôi thực hiện trên ứng dụng của riêng tôi. Và có một sai lầm trong mã đó. Khi bạn muốn lần thứ hai tính toán một tuyến đường, ứng dụng. nghỉ giải lao.

if (mMarkerPoints.size() > 1) { 

       mMarkerPoints.clear(); 
       map.clear(); 
       // LatLng startPoint = new LatLng(nearbyLatitude, 
       // nearbyLongitude); 
       // drawMarker(startPoint); 
      } 

Tìm dòng đó và đưa ra nhận xét như tôi đã làm. Dù sao, thực ra bạn đã yêu cầu vẽ một con đường không phải là toàn bộ mã, vì vậy bạn có thể kiểm tra mã trên trang web đó. Nó là tốt để vẽ đường giữa các điểm (đánh dấu). Chúc một ngày tốt lành.

Các vấn đề liên quan