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
- Android Studio XML no reconoce objectAnimator
- Error en styles.xml en android-support-v7-mediarouter
- Cómo cambiar los valores xml de recursos de cadena en Android mediante programación?
- No se encontró ningún identificador de recurso para el atributo 'roundIcon' en el paquete 'android'
- "ArrayAdapter requiere que el identificador de recurso sea un TextView" xml problems
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); } } } }
- Hacer AppBarLayout responder a desplazamiento en WebView
- Cualquier posibilidad de obtener autocompletar / tipo-ahead / intellisense en archivos XML de Android (Eclipse)
- Android: Cómo acceder a la carpeta de recursos de otra aplicación de Android
- División de XML en varios archivos xml
- Atributos personalizados del tipo de matriz
- CoordinatorLayout con RecyclerView & CollapsingToolbarLayout
- ¿Cómo recuperar partes del contenido de Wikipedia en la aplicación para Android?
- Cómo comprobar NULL en etiquetas XML XML analizadas
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(" ", " ")); } 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; }
- Actividad de Android Línea de archivo XML binario: Debe proporcionar un atributo layout_width
- ¿Cómo implementar correctamente el feed (similar a Facebook / Instagram) en Android?