2012-07-27 4 views
16

TuttiOutput di Google Maps = kml rotto?

Stavo usando l'output KML di Google Maps nella mia app per iPhone. Se digito il seguente nel browser, è usato per dare la possibilità di salvare il file kml:

http://maps.google.com/maps?q=restaurant&mrt=yp&num=10&sll=37.786945,-122.406013&radius=5&output=kml 

Ma tutto ad un tratto oggi, sta tornando un file html. Quello che è successo? qualche idea? Lo uso nella mia app per iPhone e genera un errore in quanto non è restituito un xml valido. Ovviamente ....

Grazie, mbH

+0

stesso problema con la mia mappa KML .. Penso che dobbiamo passare a XML o JSON .. – iosfanboy9

+0

oh mio dio, la sua la mia prova finale al college, e ora kml non funziona, la scadenza è uno settimana!! : (( come suppongo di fare ??? – sephtian

+2

google è sufficiente modificare l'impostazione questo giorno, vedere https://developers.google.com/maps/documentation/directions/ alla fine della pagina, accidenti! – sephtian

risposta

3

Desidero Google non aveva smesso di sostenere la loro documentata KML senza preavviso.

Ho migrato il mio codice all'API di Google Places ora utilizzando il loro output xml.

https://developers.google.com/places/documentation/

+0

Dove è stato documentato l'output KML? Non l'ho mai visto documentato ... – barryhunter

+0

C'era una pagina in cui era chiaramente documentata.Il 2011 è quando l'ho visto l'ultima volta.La pagina non è più disponibile – mbh

+0

Era su mapki.com? Non era documentazione ufficiale Proprio quello che le persone avevano stato in grado di decodificare. – barryhunter

0

Per quanto riguarda Android ora che sto usando:

Intent myIntent = 
new Intent(android.content.Intent.ACTION_VIEW, 
Uri.parse("geo:0,0?q="+ lat +","+ lon));     
startActivity(myIntent); 

penso che ci dovrebbe essere qualcosa di simile in iOS.

1

-Bene ho appena modificato il mio risposta-

lascia la faccia esso, Google ha cambiato il suo sistem, dobbiamo seguirli

così lascia uso JSON o XML

:)

- modificato parte due--

ho appena trovato la soluzione migliore, usa JSON e analizza in polilinea, quindi possiamo farlo!

Google Maps API Version difference

7

Google ha cambiato qualcosa e ora shows major turns only. Ma quando si utilizza JSON, è che mostra il percorso correttamente:

public class DrivingDirectionActivity extends MapActivity { 

Point p1 = new Point(); 
Point p2 = new Point(); 

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    MapView mapView = (MapView) findViewById(R.id.map); 
    // setting a default value 
    double src_lat = 18.5535; 
    double src_long = 73.7966; 
    double dest_lat = 18.5535; 
    double dest_long = 73.7966; 

    Geocoder coder = new Geocoder(getApplicationContext(), 
      Locale.getDefault()); 

    List<Address> address_src = null; 
    List<Address> address_dest = null; 

    try { 
     address_src = coder 
       .getFromLocationName(
         "Deepmala Housing Complex, Pimple Saudagar, Pimpri Chinchwad", 
         1); 
     if (address_src.size() > 0) { 
      Address loc = address_src.get(0); 
      src_lat = loc.getLatitude(); 
      src_long = loc.getLongitude(); 
     } 
    } catch (IOException e) { // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

    try { 
     address_dest = coder.getFromLocationName(
       "Infosys Phase 2, Hinjewadi Phase II, Hinjewadi", 1); 
     if (address_dest.size() > 0) { 
      Address loc = address_dest.get(0); 
      dest_lat = loc.getLatitude(); 
      dest_long = loc.getLongitude(); 
     } 
    } catch (IOException e) { // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

    mapView.setBuiltInZoomControls(true); 
    GeoPoint srcGeoPoint = new GeoPoint((int) (src_lat * 1E6), 
      (int) (src_long * 1E6)); 
    GeoPoint destGeoPoint = new GeoPoint((int) (dest_lat * 1E6), 
      (int) (dest_long * 1E6)); 

    DrawPath(srcGeoPoint, destGeoPoint, Color.GREEN, mapView); 

    mapView.getController().animateTo(srcGeoPoint); 
    mapView.getController().setZoom(13); 

} 

protected boolean isRouteDisplayed() { 
    // TODO Auto-generated method stub 
    return false; 
} 

private void DrawPath(GeoPoint src, GeoPoint dest, int color, 
     MapView mMapView) { 
    // connect to map web service 
    HttpClient httpclient = new DefaultHttpClient(); 
    HttpPost httppost = new HttpPost(makeUrl(src, dest)); 
    HttpResponse response; 
    try { 
     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); 
     mMapView.getOverlays().add(new MyOverLay(pointToDraw)); 
    } catch (ClientProtocolException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
     // TODO: handle exception 
    } 

} 

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

private String makeUrl(GeoPoint src, GeoPoint dest) { 
    // TODO Auto-generated method stub 

    StringBuilder urlString = new StringBuilder(); 

    urlString.append("http://maps.googleapis.com/maps/api/directions/json"); 
    urlString.append("?origin=");// from 
    urlString.append(Double.toString((double) src.getLatitudeE6()/1.0E6)); 
    urlString.append(","); 
    urlString 
      .append(Double.toString((double) src.getLongitudeE6()/1.0E6)); 
    urlString.append("&destination=");// to 
    urlString 
      .append(Double.toString((double) dest.getLatitudeE6()/1.0E6)); 
    urlString.append(","); 
    urlString 
      .append(Double.toString((double) dest.getLongitudeE6()/1.0E6)); 
    urlString.append("&sensor=false"); 

    Log.d("xxx", "URL=" + urlString.toString()); 
    return urlString.toString(); 
} 

class MyOverLay extends Overlay { 
    private int pathColor; 
    private final List<GeoPoint> points; 
    private boolean drawStartEnd; 

    public MyOverLay(List<GeoPoint> pointToDraw) { 
     // TODO Auto-generated constructor stub 
     this(pointToDraw, Color.GREEN, true); 
    } 

    public MyOverLay(List<GeoPoint> points, int pathColor, 
      boolean drawStartEnd) { 
     this.points = points; 
     this.pathColor = pathColor; 
     this.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); 
     ovalPaint.setColor(Color.BLUE); 
     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; 
    } 
} 
} 
+0

sì, ma le coordinate xml non sono complete come xml – sephtian

+0

ya..it mostra solo i turni principali .. Sto cercando qualche soluzione .. e alos ha inviato googel su questo .. http://code.google.com/p/ gmaps-api-issues/issues/detail? id = 4321 –

+0

well..i ho appena modificato il mio codice e ora uso json e il suo percorso di visualizzazione correttamente. –

8

Questo modo di estrarre i Google Indicazioni da Google per l'analisi del file KML non è più disponibile dal 27 luglio 2012 (perché Google ha cambiato la struttura di recupero di Google Indicazioni stradali, ora è possibile ottenerlo solo tramite JSON o XML), è ora di migrare il codice su JSON anziché KML.

Vedere la risposta (solo per Android ma forse per iPhone è possibile comprendere l'algoritmo e applicarlo) nella mia domanda here.

0

Ho trovato il modo di ottenere le uscite KML come prima utilizzando i collegamenti standard di google maps per i percorsi.

Sembra che google analizzi il referrer per tali collegamenti e se sia https://code.google.com allora genererà l'allegato KML invece di mostrare la mappa.

Quindi, in un primo momento, è necessario creare un progetto allo https://code.google.com. Quindi crea un problema con il link di instradamento in un commento.

Ora è possibile toccare il collegamento e ottenere l'allegato KML.

enter image description here