Saída do Google Maps = kml interrompida?

Todos

Eu estava usando a saída KML do Google Maps no meu aplicativo para iPhone. Se eu digitar o seguinte no meu navegador, costumava dar uma opção para salvar o arquivo kml:

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

Mas de repente hoje, ele está retornando um arquivo html. O que aconteceu? alguma ideia? Eu uso no meu aplicativo para iPhone e está jogando erro, pois não é um xml válido retornado. Obviamente….

Obrigado, mbh

Essa maneira de extrair o Google Directions do Google analisando o arquivo KML não está mais disponível desde 27 de julho de 2012 (porque o Google alterou a estrutura de recuperação do Google Directions, agora você só pode obtê-lo por JSON ou XML), é hora de migrar seu código para JSON em vez de KML.

Veja a resposta (apenas para o Android, mas talvez para o iPhone possa entender o algoritmo e aplicá-lo) na minha própria pergunta aqui .

O Google mudou alguma coisa e agora mostra apenas os principais turnos . Mas ao usar o JSON, ele mostra o caminho corretamente:

 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_src = null; List
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 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 decodePoly(String encoded) { List poly = new ArrayList(); 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 points; private boolean drawStartEnd; public MyOverLay(List pointToDraw) { // TODO Auto-generated constructor stub this(pointToDraw, Color.GREEN, true); } public MyOverLay(List 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; } } }

Gostaria que o Google não tivesse deixado de dar suporte ao KML documentado sem aviso prévio.

Migrei meu código para a API do Google Places agora usando a saída xml deles.

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

Bem, eu apenas editei minha resposta.

vamos enfrentá-lo, o google mudou seu sistema, temos que segui-los

então vamos usar JSON ou XML

🙂

– editado parte dois–

Acabei de encontrar a melhor solução, use JSON e analise em polyline, para que possamos fazer isso!

Diferença da versão da API do Google Maps

Eu encontrei o caminho para obter saídas KML como antes usando links padrão do google maps para rotas.

Parece que o Google analisa o referenciador de tais links e, se for https://code.google.com , ele gerará o anexo do KML vez de mostrar o mapa.

Então, primeiro, você precisa criar um projeto em https://code.google.com . Em seguida, crie um problema com o link da rota em um comentário.

Agora você pode tocar no link e obter o anexo KML .

insira a descrição da imagem aqui

Quanto ao Android agora estou usando:

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

Eu acho que deveria haver algo parecido no iOS.