varios una trazar rutas ruta route reparto puntos programa planificador para hacer guardar gratis google example crear con como android android-maps-v2

android - una - programa para hacer rutas de reparto gratis



Android: Cómo dibujar direcciones de ruta google maps API V2 desde la ubicación actual hasta el destino (3)

Cómo dibujar la dirección de la ruta desde la ubicación actual hasta el destino que (latitud y longitud), tengo el código de la siguiente manera:

import android.os.Bundle; import com.actionbarsherlock.app.SherlockActivity; import com.google.android.gms.maps.CameraUpdateFactory; import com.google.android.gms.maps.GoogleMap; import com.google.android.gms.maps.MapFragment; import com.google.android.gms.maps.model.LatLng; import com.google.android.gms.maps.model.MarkerOptions; public class DetailMapActivity extends SherlockActivity { private GoogleMap map; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main_detail_map); LatLng TO_DESTINATION = new LatLng(-6.33438, 106.74316); map = ((MapFragment) getFragmentManager().findFragmentById(R.id.map)) .getMap(); map.setMyLocationEnabled(true); map.addMarker(new MarkerOptions().position(TO_DESTINATION).title("Destination Title") .snippet("Destination Description")); map.moveCamera(CameraUpdateFactory.newLatLngZoom(TO_LOCATION, 40)); map.animateCamera(CameraUpdateFactory.zoomTo(10), 2000, null); } }

Quiero dibujar desde la ubicación actual por red de proveedores o gps, y luego dibujar la ruta conduciendo hasta el destino.

Estoy usando android google apis V2.

Gracias por tu ayuda.


Al usar la clase dvrm GMapV2Direction , es una buena solución y sigue funcionando, pero ahora necesita implementar el método getDocument en una nueva cadena para permitir las conexiones de red. Este es un ejemplo de AsyncTask para este método, el resto de la clase es el mismo. Puede manejarlo con un Manejar o implementar su propia devolución de llamada de interfaz para obtener la respuesta Docmuent xml.

public class GMapV2DirectionAsyncTask extends AsyncTask<String, Void, Document> { private final static String TAG = GMapV2DirectionAsyncTask.class.getSimpleName(); private Handler handler; private LatLng start, end; private String mode; public GMapV2DirectionAsyncTask(Handler handler, LatLng start, LatLng end, String mode) { this.start = start; this.end = end; this.mode = mode; this.handler = handler; } @Override protected Document doInBackground(String... params) { String url = "http://maps.googleapis.com/maps/api/directions/xml?" + "origin=" + start.latitude + "," + start.longitude + "&destination=" + end.latitude + "," + end.longitude + "&sensor=false&units=metric&mode=" + mode; Log.d("url", url); try { HttpClient httpClient = new DefaultHttpClient(); HttpContext localContext = new BasicHttpContext(); HttpPost httpPost = new HttpPost(url); HttpResponse response = httpClient.execute(httpPost, localContext); InputStream in = response.getEntity().getContent(); DocumentBuilder builder = DocumentBuilderFactory.newInstance() .newDocumentBuilder(); Document doc = builder.parse(in); return doc; } catch (Exception e) { e.printStackTrace(); } return null; } @Override protected void onPostExecute(Document result) { if (result != null) { Log.d(TAG, "---- GMapV2DirectionAsyncTask OK ----"); Message message = new Message(); message.obj = result; handler.dispatchMessage(message); } else { Log.d(TAG, "---- GMapV2DirectionAsyncTask ERROR ----"); } } @Override protected void onPreExecute() { } @Override protected void onProgressUpdate(Void... values) { }

}

Este es el método del controlador asíncrono para la actividad:

protected void route(LatLng sourcePosition, LatLng destPosition, String mode) { final Handler handler = new Handler() { public void handleMessage(Message msg) { try { Document doc = (Document) msg.obj; GMapV2Direction md = new GMapV2Direction(); ArrayList<LatLng> directionPoint = md.getDirection(doc); PolylineOptions rectLine = new PolylineOptions().width(15).color(getActivity().getResources().getColor(R.color.magoo_user_base_color)); for (int i = 0; i < directionPoint.size(); i++) { rectLine.add(directionPoint.get(i)); } Polyline polylin = googleMap.addPolyline(rectLine); md.getDurationText(doc); } catch (Exception e) { e.printStackTrace(); } } }; new GMapV2DirectionAsyncTask(handler, sourcePosition, destPosition, GMapV2Direction.MODE_DRIVING).execute(); }

Una cosa más, si el valor de duración es incorrecto, la solución es cambiar una línea del código de la clase GMapV2Direction:

Node node1 = nl1.item(nl1.getLength() - 1);

en lugar:

Node node1 = nl1.item(0);


Esto funciona genial para mí:
No es mi código , lo tomé de una gran respuesta en pero no puedo encontrar esta respuesta ahora, así que aquí está el código:

Agregue esta clase a su proyecto:

package ...; import java.io.InputStream; import java.util.ArrayList; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import org.apache.http.HttpResponse; import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpPost; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.protocol.BasicHttpContext; import org.apache.http.protocol.HttpContext; import org.w3c.dom.Document; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import com.google.android.gms.maps.model.LatLng; import android.content.Context; import android.util.Log; public class GMapV2Direction { public final static String MODE_DRIVING = "driving"; public final static String MODE_WALKING = "walking"; public GMapV2Direction() { } public Document getDocument(LatLng start, LatLng end, String mode) { String url = "http://maps.googleapis.com/maps/api/directions/xml?" + "origin=" + start.latitude + "," + start.longitude + "&destination=" + end.latitude + "," + end.longitude + "&sensor=false&units=metric&mode=driving"; Log.d("url", url); try { HttpClient httpClient = new DefaultHttpClient(); HttpContext localContext = new BasicHttpContext(); HttpPost httpPost = new HttpPost(url); HttpResponse response = httpClient.execute(httpPost, localContext); InputStream in = response.getEntity().getContent(); DocumentBuilder builder = DocumentBuilderFactory.newInstance() .newDocumentBuilder(); Document doc = builder.parse(in); return doc; } catch (Exception e) { e.printStackTrace(); } return null; } public String getDurationText(Document doc) { try { NodeList nl1 = doc.getElementsByTagName("duration"); Node node1 = nl1.item(0); NodeList nl2 = node1.getChildNodes(); Node node2 = nl2.item(getNodeIndex(nl2, "text")); Log.i("DurationText", node2.getTextContent()); return node2.getTextContent(); } catch (Exception e) { return "0"; } } public int getDurationValue(Document doc) { try { NodeList nl1 = doc.getElementsByTagName("duration"); Node node1 = nl1.item(0); NodeList nl2 = node1.getChildNodes(); Node node2 = nl2.item(getNodeIndex(nl2, "value")); Log.i("DurationValue", node2.getTextContent()); return Integer.parseInt(node2.getTextContent()); } catch (Exception e) { return -1; } } public String getDistanceText(Document doc) { /* * while (en.hasMoreElements()) { type type = (type) en.nextElement(); * * } */ try { NodeList nl1; nl1 = doc.getElementsByTagName("distance"); Node node1 = nl1.item(nl1.getLength() - 1); NodeList nl2 = null; nl2 = node1.getChildNodes(); Node node2 = nl2.item(getNodeIndex(nl2, "value")); Log.d("DistanceText", node2.getTextContent()); return node2.getTextContent(); } catch (Exception e) { return "-1"; } /* * NodeList nl1; if(doc.getElementsByTagName("distance")!=null){ nl1= * doc.getElementsByTagName("distance"); * * Node node1 = nl1.item(nl1.getLength() - 1); NodeList nl2 = null; if * (node1.getChildNodes() != null) { nl2 = node1.getChildNodes(); Node * node2 = nl2.item(getNodeIndex(nl2, "value")); Log.d("DistanceText", * node2.getTextContent()); return node2.getTextContent(); } else return * "-1";} else return "-1"; */ } public int getDistanceValue(Document doc) { try { NodeList nl1 = doc.getElementsByTagName("distance"); Node node1 = null; node1 = nl1.item(nl1.getLength() - 1); NodeList nl2 = node1.getChildNodes(); Node node2 = nl2.item(getNodeIndex(nl2, "value")); Log.i("DistanceValue", node2.getTextContent()); return Integer.parseInt(node2.getTextContent()); } catch (Exception e) { return -1; } /* * NodeList nl1 = doc.getElementsByTagName("distance"); Node node1 = * null; if (nl1.getLength() > 0) node1 = nl1.item(nl1.getLength() - 1); * if (node1 != null) { NodeList nl2 = node1.getChildNodes(); Node node2 * = nl2.item(getNodeIndex(nl2, "value")); Log.i("DistanceValue", * node2.getTextContent()); return * Integer.parseInt(node2.getTextContent()); } else return 0; */ } public String getStartAddress(Document doc) { try { NodeList nl1 = doc.getElementsByTagName("start_address"); Node node1 = nl1.item(0); Log.i("StartAddress", node1.getTextContent()); return node1.getTextContent(); } catch (Exception e) { return "-1"; } } public String getEndAddress(Document doc) { try { NodeList nl1 = doc.getElementsByTagName("end_address"); Node node1 = nl1.item(0); Log.i("StartAddress", node1.getTextContent()); return node1.getTextContent(); } catch (Exception e) { return "-1"; } } public String getCopyRights(Document doc) { try { NodeList nl1 = doc.getElementsByTagName("copyrights"); Node node1 = nl1.item(0); Log.i("CopyRights", node1.getTextContent()); return node1.getTextContent(); } catch (Exception e) { return "-1"; } } public ArrayList<LatLng> getDirection(Document doc) { NodeList nl1, nl2, nl3; ArrayList<LatLng> listGeopoints = new ArrayList<LatLng>(); nl1 = doc.getElementsByTagName("step"); if (nl1.getLength() > 0) { for (int i = 0; i < nl1.getLength(); i++) { Node node1 = nl1.item(i); nl2 = node1.getChildNodes(); Node locationNode = nl2 .item(getNodeIndex(nl2, "start_location")); nl3 = locationNode.getChildNodes(); Node latNode = nl3.item(getNodeIndex(nl3, "lat")); double lat = Double.parseDouble(latNode.getTextContent()); Node lngNode = nl3.item(getNodeIndex(nl3, "lng")); double lng = Double.parseDouble(lngNode.getTextContent()); listGeopoints.add(new LatLng(lat, lng)); locationNode = nl2.item(getNodeIndex(nl2, "polyline")); nl3 = locationNode.getChildNodes(); latNode = nl3.item(getNodeIndex(nl3, "points")); ArrayList<LatLng> arr = decodePoly(latNode.getTextContent()); for (int j = 0; j < arr.size(); j++) { listGeopoints.add(new LatLng(arr.get(j).latitude, arr .get(j).longitude)); } locationNode = nl2.item(getNodeIndex(nl2, "end_location")); nl3 = locationNode.getChildNodes(); latNode = nl3.item(getNodeIndex(nl3, "lat")); lat = Double.parseDouble(latNode.getTextContent()); lngNode = nl3.item(getNodeIndex(nl3, "lng")); lng = Double.parseDouble(lngNode.getTextContent()); listGeopoints.add(new LatLng(lat, lng)); } } return listGeopoints; } private int getNodeIndex(NodeList nl, String nodename) { for (int i = 0; i < nl.getLength(); i++) { if (nl.item(i).getNodeName().equals(nodename)) return i; } return -1; } private ArrayList<LatLng> decodePoly(String encoded) { ArrayList<LatLng> poly = new ArrayList<LatLng>(); 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; LatLng position = new LatLng((double) lat / 1E5, (double) lng / 1E5); poly.add(position); } return poly; } }

Luego usa esta clase para tus necesidades.
Por ejemplo, para dibujar direcciones:

GMapV2Direction md = new GMapV2Direction(); mMap = ((SupportMapFragment) getSupportFragmentManager() .findFragmentById(R.id.map)).getMap(); Document doc = md.getDocument(sourcePosition, destPosition, GMapV2Direction.MODE_DRIVING); ArrayList<LatLng> directionPoint = md.getDirection(doc); PolylineOptions rectLine = new PolylineOptions().width(3).color( Color.RED); for (int i = 0; i < directionPoint.size(); i++) { rectLine.add(directionPoint.get(i)); } Polyline polylin = mMap.addPolyline(rectLine);

sourcePosition, destPosition son del tipo LatLng, y les das los puntos deseados.

Escribí aquí partes de mi código que creo que podrían ayudar. Cualquier pregunta es bienvenida.


@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main_detail_map); ..... ..... /* Use the LocationManager class to obtain GPS locations */ LocationManager mlocManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE); LocationListener mlocListener = new MyLocationListener(); mlocManager.requestLocationUpdates( LocationManager.GPS_PROVIDER, 0, 0, mlocListener); } /* Class My Location Listener */ public class MyLocationListener implements LocationListener { @Override public void onLocationChanged(Location loc) { CURRENT_LAT = loc.getLatitude(); CURRENT_LNG = loc.getLongitude(); } @Override public void onProviderDisabled(String provider) { Toast.makeText( getApplicationContext(), "Gps Disabled", Toast.LENGTH_SHORT ).show(); } @Override public void onProviderEnabled(String provider) { Toast.makeText( getApplicationContext(), "Gps Enabled", Toast.LENGTH_SHORT).show(); } @Override public void onStatusChanged(String provider, int status, Bundle extras) { } }