Edición de Android Dibujo de rutas largas en MapView mediante análisis XML

Tengo el problema que ocurre en mi uso. Usando el archivo de XML estoy consiguiendo geopoints para dibujar la trayectoria entre dos localizaciones … pero solamente me muestra la ruta si la distancia es menos de 300 kilómetros. De lo contrario no dibuja la trayectoria llena.

Cualquier solución para dividir el archivo xml en trozos .. o cualquier alternativa .. porque las direcciones que da son perfectos incluso para larga distancia … entonces ¿cuál es el problema? No puedo entender

por favor ayuda..

EDITED: He encontrado que hay un problema en el archivo KML. Si hay una distancia larga que está proporcionando la etiqueta de la cadena de dos líneas cada uno que tiene lista de las coordenadas de la trayectoria completa dividida en piezas. como sigue

<GeometryCollection>
<LineString>
<coordinates> 70.799640,22.283370, … </coordinates> </LineString>
<LineString>
<coordinates> 73.005940,21.536300, …. </coordinates> </LineString>
</GeometryCollection>

Es por eso que va a dibujar una ruta en el mapa sólo de la segunda mitad de la cadena .. así que .. nadie sabe cómo resolver esto ..

EDITADO: –

 public class DrivingDirectionsGoogleKML extends DrivingDirections { @Override protected void startDrivingTo (GeoPoint startPoint, GeoPoint endPoint, Mode mode, IDirectionsListener listener) { new LoadDirectionsTask(startPoint, endPoint).execute(mode); } private class LoadDirectionsTask extends AsyncTask<Mode, Void, RouteImpl> { private static final String BASE_URL = "http://maps.google.com/maps?f=d&hl=en"; private static final String ELEMENT_PLACEMARK = "Placemark"; private static final String ELEMENT_NAME = "name"; private static final String ELEMENT_DESC = "description"; private static final String ELEMENT_POINT = "Point"; private static final String ELEMENT_ROUTE = "Route"; private static final String ELEMENT_GEOM = "GeometryCollection"; private GeoPoint startPoint; private GeoPoint endPoint; public LoadDirectionsTask (GeoPoint startPoint, GeoPoint endPoint) { this.startPoint = startPoint; this.endPoint = endPoint; } @Override protected void onPreExecute() { super.onPreExecute(); } @Override protected RouteImpl doInBackground(Mode... params) { // Connect to the Google Maps web service that will return a KML string // containing the directions from one point to another. // StringBuilder urlString = new StringBuilder(); urlString .append(BASE_URL) .append("&saddr=") .append(startPoint.getLatitudeE6() / 1E6) .append(",") .append(startPoint.getLongitudeE6() / 1E6) .append("&daddr=") .append(endPoint.getLatitudeE6() / 1E6) .append(",") .append(endPoint.getLongitudeE6() / 1E6) .append("&ie=UTF8&0&om=0&output=kml"); if (params[0] == Mode.WALKING) { urlString.append("&dirflg=w"); } RouteImpl route = null; try { URL url = new URL (urlString.toString()); Log.i("-------- Url",url.toString()); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setRequestMethod("GET"); connection.setDoOutput(true); connection.setDoInput(true); connection.connect(); route = parseResponse (connection.getInputStream()); } catch (Exception e) { route = null; } return route; } private RouteImpl parseResponse(InputStream inputStream) throws Exception { // Parse the KML file returned by the Google Maps web service // using the default XML DOM parser. DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); Document document = builder.parse(inputStream); NodeList placemarkList = document.getElementsByTagName(ELEMENT_PLACEMARK); // Get the list of placemarks to plot along the route. List<Placemark> placemarks = new ArrayList<Placemark>(); for (int i = 0; i < placemarkList.getLength(); i++) { PlacemarkImpl placemark = parsePlacemark (placemarkList.item(i)); if (placemark != null) { placemarks.add(placemark); } } // Get the route defining the driving directions. RouteImpl route = parseRoute (placemarkList); route.setPlacemarks(placemarks); return route; } private PlacemarkImpl parsePlacemark(Node item) { PlacemarkImpl placemark = new PlacemarkImpl (); boolean isRouteElement = false; NodeList children = item.getChildNodes(); for (int i = 0; i < children.getLength(); i++) { Node node = children.item(i); if (node.getNodeName().equals(ELEMENT_NAME)) { String name = node.getFirstChild().getNodeValue(); if (name.equals(ELEMENT_ROUTE)) { isRouteElement = true; } else { isRouteElement = false; placemark.setInstructions(name); } } else if (node.getNodeName().equals(ELEMENT_DESC)) { if (!isRouteElement) { String distance = node.getFirstChild().getNodeValue(); placemark.setDistance(distance.substring(3).replace(" ", " ")); } } else if (node.getNodeName().equals(ELEMENT_POINT)) { if (!isRouteElement) { String coords = node.getFirstChild().getFirstChild().getNodeValue(); String[] latlon = coords.split(","); placemark.setLocation(new GeoPoint ((int) (Double.parseDouble(latlon[1]) * 1E6),(int) (Double.parseDouble(latlon[0]) * 1E6))); } } } return isRouteElement ? null : placemark; } private RouteImpl parseRoute(NodeList placemarkList) { RouteImpl route = null; for (int i = 0; i < placemarkList.getLength(); i++) { // Iterate through all the <Placemark> KML tags to find the one // whose child <name> tag is "Route". // Node item = placemarkList.item(i); NodeList children = item.getChildNodes(); for (int j = 0; j < children.getLength(); j++) { Node node = children.item(j); if (node.getNodeName().equals(ELEMENT_NAME)) { String name = node.getFirstChild().getNodeValue(); if (name.equals(ELEMENT_ROUTE)) { route = parseRoute (item); break; } } } } return route; } private RouteImpl parseRoute(Node item) { RouteImpl route = new RouteImpl (); NodeList children = item.getChildNodes(); for (int i = 0; i < children.getLength(); i++) { Node node = children.item(i); if (node.getNodeName().equals(ELEMENT_DESC)) { // Get the value of the <description> KML tag. String distance = node.getFirstChild().getNodeValue(); route.setTotalDistance(distance.split("<br/>")[0].substring(10).replace(" ", " ")); } else if (node.getNodeName().equals(ELEMENT_GEOM)) //Here Reading Co-Ordinates../// { String path = node.getFirstChild().getFirstChild().getFirstChild().getNodeValue(); String[] pairs = path.split(" "); // For each coordinate, get its {latitude, longitude} values and add the corresponding geographical point to the route. List<GeoPoint> geoPoints = new ArrayList<GeoPoint>(); for (int p = 0; p < pairs.length; p++) { String[] coords = pairs[p].split(","); GeoPoint geoPoint = new GeoPoint ((int) (Double.parseDouble(coords[1]) * 1E6),(int) (Double.parseDouble(coords[0]) * 1E6)); geoPoints.add (geoPoint); } route.setGeoPoints(geoPoints); } } return route; } protected void onPostExecute (RouteImpl route) { if (route == null) { DrivingDirectionsGoogleKML.this.onDirectionsNotAvailable(); } else { DrivingDirectionsGoogleKML.this.onDirectionsAvailable(route); } } } } 

He encontrado la solución para él. Creado NodeList de <GeometryCollection>....</GeometryCollection> y proporcionará todas las coordenadas entre dos localizaciones.

 private RouteImpl parseRoute(Node item) { RouteImpl route = new RouteImpl (); NodeList children = item.getChildNodes(); for (int i = 0; i < children.getLength(); i++) { Node node = children.item(i); if (node.getNodeName().equals(ELEMENT_DESC)) { // Get the value of the <description> KML tag. // String distance = node.getFirstChild().getNodeValue(); route.setTotalDistance(distance.split("<br/>")[0].substring(10).replace("&#160;", " ")); } else if (node.getNodeName().equals(ELEMENT_GEOM)) { // Get the space-separated coordinates of the geographical points defining the route. // List<GeoPoint> geoPoints = new ArrayList<GeoPoint>(); // Create a NodeList here .. NodeList geoMetryChildren = node.getChildNodes(); for(int k=0;k<geoMetryChildren.getLength();k++) { Node geoMetryChildrenNode = geoMetryChildren.item(k); String path = geoMetryChildrenNode.getFirstChild().getFirstChild().getNodeValue(); String[] pairs = path.split(" "); for (int p = 0; p < pairs.length; p++) { String[] coords = pairs[p].split(","); GeoPoint geoPoint = new GeoPoint ((int) (Double.parseDouble(coords[1]) * 1E6),(int) (Double.parseDouble(coords[0]) * 1E6)); geoPoints.add (geoPoint); } } route.setGeoPoints(geoPoints); } } return route; } 
  • No se encontró ningún identificador de recurso para el atributo 'layout_behavior' en el paquete
  • Cómo envolver el fragmento GoogleMap en un LinearLayout?
  • XmlPullParser - token inesperado (android)
  • Android TextView debe desplazarse verticalmente automáticamente
  • Archivo XML válido da un error "no se pudo analizar" en Android ADT
  • Problema XML en el ejemplo del menú básico
  • WebView no funciona, el lanzamiento de la URL externa en el navegador. Visualización de la página web en la aplicación
  • Crear un AlertDialog en Android con la vista xml personalizada
  • Error cómico en la declaración de forma xml de Android
  • cómo comprobar si una respuesta está en formato xml en lugar de HTML?
  • ¿Puede explicar alguien inflar método? Mayor comprensión de las vistas de Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.