varios una ubicacion trazar rutas ruta puntos planificador personalizado mapa hacer guardar google croquis con como android google-maps overlay android-mapview draw

android - ubicacion - Dibujando una línea/ruta en Google Maps



planificador de rutas google maps (12)

He estado ocupado durante mucho tiempo descubriendo cómo trazar una línea entre dos puntos (GPS) en el mapa en HelloMapView pero sin suerte.

¿Alguien podría decirme cómo hacerlo?

Supongamos que uso HelloMapView, que amplía MapView. ¿Necesito usar superposiciones? Si es así, ¿tengo que anular el método onDraw () de la superposición y dibujar una línea aquí? De hecho, probé estas cosas pero sin resultado.

¡Gracias de antemano!


Es realmente fácil con Google Maps Android API v2

Solo copie el ejemplo de la https://developers.google.com/maps/documentation/android/reference/com/google/android/gms/maps/model/Polyline del https://developers.google.com/maps/documentation/android/reference/com/google/android/gms/maps/model/Polyline

(por supuesto, primero debes iniciar tu mapa)

GoogleMap map; // ... get a map. // Add a thin red line from London to New York. Polyline line = map.addPolyline(new PolylineOptions() .add(new LatLng(51.5, -0.1), new LatLng(40.7, -74.0)) .width(5) .color(Color.RED));


Este es el código fuente completo para dibujar la ruta de dirección desde la latitud y la longitud de la fuente a la latitud y longitud del destino. He cambiado el código anterior para adaptarlo a la latitud y la longitud en lugar de a la fuente y el destino. Entonces, cualquiera que esté accediendo a su latitud y longitud a través de su GPS puede obtener la dirección desde su dispositivo GPS hasta las coordenadas de destino.

Gracias a las respuestas anteriores pudimos hacer ese cambio y obtener la dirección del camino.

public class DrawMapActivity extends MapActivity { MapView myMapView = null; MapController myMC = null; GeoPoint geoPoint = null; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); myMapView = (MapView) findViewById(R.id.mapview); geoPoint = null; myMapView.setSatellite(false); double fromLat = 12.303534; double fromLong = 76.64611; double toLat = 12.9715987; double toLong = 77.5945627; String sourceLat = Double.toString(fromLat); String sourceLong = Double.toString(fromLong); String destinationLat = Double.toString(toLat); String destinationLong = Double.toString(toLong); String pairs[] = getDirectionData(sourceLat,sourceLong, destinationLat, destinationLong ); String[] lngLat = pairs[0].split(","); // STARTING POINT GeoPoint startGP = new GeoPoint((int) (Double.parseDouble(lngLat[1]) * 1E6), (int) (Double.parseDouble(lngLat[0]) * 1E6)); myMC = myMapView.getController(); geoPoint = startGP; myMC.setCenter(geoPoint); myMC.setZoom(10); myMapView.getOverlays().add(new DirectionPathOverlay(startGP, startGP)); // NAVIGATE THE PATH GeoPoint gp1; GeoPoint gp2 = startGP; for (int i = 1; i < pairs.length; i++) { lngLat = pairs[i].split(","); gp1 = gp2; // watch out! For GeoPoint, first:latitude, second:longitude gp2 = new GeoPoint((int) (Double.parseDouble(lngLat[1]) * 1E6),(int) (Double.parseDouble(lngLat[0]) * 1E6)); myMapView.getOverlays().add(new DirectionPathOverlay(gp1, gp2)); Log.d("xxx", "pair:" + pairs[i]); } // END POINT myMapView.getOverlays().add(new DirectionPathOverlay(gp2, gp2)); myMapView.getController().animateTo(startGP); myMapView.setBuiltInZoomControls(true); myMapView.displayZoomControls(true); } @Override protected boolean isRouteDisplayed() { // TODO Auto-generated method stub return false; } private String[] getDirectionData(String sourceLat, String sourceLong, String destinationLat, String destinationLong) { String urlString = "http://maps.google.com/maps?f=d&hl=en&" +"saddr="+sourceLat+","+sourceLong+"&daddr="+destinationLat+","+destinationLong + "&ie=UTF8&0&om=0&output=kml"; Log.d("URL", urlString); Document doc = null; HttpURLConnection urlConnection = null; URL url = null; String pathConent = ""; try { url = new URL(urlString.toString()); urlConnection = (HttpURLConnection) url.openConnection(); urlConnection.setRequestMethod("GET"); urlConnection.setDoOutput(true); urlConnection.setDoInput(true); urlConnection.connect(); DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder db = dbf.newDocumentBuilder(); doc = db.parse(urlConnection.getInputStream()); } catch (Exception e) { } NodeList nl = doc.getElementsByTagName("LineString"); for (int s = 0; s < nl.getLength(); s++) { Node rootNode = nl.item(s); NodeList configItems = rootNode.getChildNodes(); for (int x = 0; x < configItems.getLength(); x++) { Node lineStringNode = configItems.item(x); NodeList path = lineStringNode.getChildNodes(); pathConent = path.item(0).getNodeValue(); } } String[] tempContent = pathConent.split(" "); return tempContent; } } //***************************************************************************** class DirectionPathOverlay extends Overlay { private GeoPoint gp1; private GeoPoint gp2; public DirectionPathOverlay(GeoPoint gp1, GeoPoint gp2) { this.gp1 = gp1; this.gp2 = gp2; } @Override public boolean draw(Canvas canvas, MapView mapView, boolean shadow, long when) { // TODO Auto-generated method stub Projection projection = mapView.getProjection(); if (shadow == false) { Paint paint = new Paint(); paint.setAntiAlias(true); Point point = new Point(); projection.toPixels(gp1, point); paint.setColor(Color.BLUE); Point point2 = new Point(); projection.toPixels(gp2, point2); paint.setStrokeWidth(2); canvas.drawLine((float) point.x, (float) point.y, (float) point2.x,(float) point2.y, paint); } return super.draw(canvas, mapView, shadow, when); } @Override public void draw(Canvas canvas, MapView mapView, boolean shadow) { // TODO Auto-generated method stub super.draw(canvas, mapView, shadow); } }

Espero que ayude a otros usuarios de


Esto funcionó para mí. Con el método mencionado aquí, pude dibujar polilíneas en Google Maps V2. Dibujé una nueva línea cada vez que cambiaba la ubicación del usuario, por lo que la polilínea se parece a la ruta seguida por el usuario en el mapa.

Código fuente en. Github: prasang7 / eTaxi-Meter

Ignore otros módulos de este proyecto relacionados con el cálculo de distancia y la interfaz de usuario si no está interesado en ellos.


Esto se puede hacer mediante el uso de intenciones también:

final Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse( "http://maps.google.com/maps?" + "saddr="+YOUR_START_LONGITUDE+","+YOUR_START_LATITUDE+"&daddr="YOUR_END_LONGITUDE+","+YOUR_END_LATITUDE)); intent.setClassName( "com.google.android.apps.maps", "com.google.android.maps.MapsActivity"); startActivity(intent);


Gracias por tu ayuda. Por fin podría dibujar una línea en el mapa. Así es como lo hice:

/** Called when the activity is first created. */ private List<Overlay> mapOverlays; private Projection projection; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); linearLayout = (LinearLayout) findViewById(R.id.zoomview); mapView = (MapView) findViewById(R.id.mapview); mapView.setBuiltInZoomControls(true); mapOverlays = mapView.getOverlays(); projection = mapView.getProjection(); mapOverlays.add(new MyOverlay()); } @Override protected boolean isRouteDisplayed() { return false; } class MyOverlay extends Overlay{ public MyOverlay(){ } public void draw(Canvas canvas, MapView mapv, boolean shadow){ super.draw(canvas, mapv, shadow); Paint mPaint = new Paint(); mPaint.setDither(true); mPaint.setColor(Color.RED); mPaint.setStyle(Paint.Style.FILL_AND_STROKE); mPaint.setStrokeJoin(Paint.Join.ROUND); mPaint.setStrokeCap(Paint.Cap.ROUND); mPaint.setStrokeWidth(2); GeoPoint gP1 = new GeoPoint(19240000,-99120000); GeoPoint gP2 = new GeoPoint(37423157, -122085008); Point p1 = new Point(); Point p2 = new Point(); Path path = new Path(); Projection projection=mapv.getProjection(); projection.toPixels(gP1, p1); projection.toPixels(gP2, p2); path.moveTo(p2.x, p2.y); path.lineTo(p1.x,p1.y); canvas.drawPath(path, mPaint); }



Puede obtener la proyección del objeto MapView que se pasa al método draw (): mapv.getProjection (). ToPixels (gP1, p1);


Sí, necesitas usar superposiciones.

Debe obtener las superposiciones de MapView y agregar su nueva superposición.

Su clase extiende Overlay, que es un lienzo transparente en el que puede dibujar sobre él como cualquier otro lienzo.

Puede usar mapView.getProjection () para obtener una proyección de vista de mapa.

...

Más información encontrada aquí: http://blogoscoped.com/archive/2008-12-15-n14.html


Solo encontraré dibujar con un rectángulo en la vista de mapview solo queremos cambiar la pintura como nos gusta

EmptyOverlay.java

public class EmptyOverlay extends Overlay { private float x1,y1; private MapExampleActivity mv = null; private Overlay overlay = null; public EmptyOverlay(MapExampleActivity mapV){ mv = mapV; } @Override public boolean draw(Canvas canvas, MapView mapView, boolean shadow, long when) { // TODO Auto-generated method stub return super.draw(canvas, mapView, shadow, when); } @Override public boolean onTouchEvent(MotionEvent e, MapView mapView) { if(mv.isEditMode()){ if(e.getAction() == MotionEvent.ACTION_DOWN){ //when user presses the map add a new overlay to the map //move events will be catched by newly created overlay x1 = y1 = 0; x1 = e.getX(); y1 = e.getY(); overlay = new MapOverlay(mv, x1, y1); mapView.getOverlays().add(overlay); } if(e.getAction() == MotionEvent.ACTION_MOVE){ } //---when user lifts his finger--- if (e.getAction() == MotionEvent.ACTION_UP) { } return true; } return false; } }

MapExampleActivity.java

public class MapExampleActivity extends MapActivity { private MapView mapView; private boolean isEditMode = false; private Button toogle; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); toogle = (Button)findViewById(R.id.toogleMap); toogle.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { toogleEditMode(); } }); mapView = (MapView)findViewById(R.id.mapview); mapView.setBuiltInZoomControls(true); //display zoom controls //add one empty overlay acting as a overlay loader. This will catch press events and will add the actual overlays mapView.getOverlays().add(new EmptyOverlay(this)); mapView.postInvalidate(); } //toogle edit mode for drawing or navigating the map private void toogleEditMode(){ isEditMode = !isEditMode; } @Override protected boolean isRouteDisplayed() { // TODO Auto-generated method stub return false; } @Override protected boolean isLocationDisplayed() { return false; } public boolean isEditMode(){ return this.isEditMode; } public MapView getMapView(){ return this.mapView; } }

MapOverlay.java

public class MapOverlay extends Overlay { private float x1,y1,x2,y2; private GeoPoint p1=null,p2=null; private MapExampleActivity mv = null; private Paint paint = new Paint(); private boolean isUp = false; //constructor receiving the initial point public MapOverlay(MapExampleActivity mapV,float x,float y){ paint.setStrokeWidth(2.0f); x1 = x; y1 = y; mv = mapV; p1 = mapV.getMapView().getProjection().fromPixels((int)x1,(int)y1); } //override draw method to add our custom drawings @Override public boolean draw(Canvas canvas, MapView mapView, boolean shadow, long when) { if(p1 != null && p2 != null){ //get the 2 geopoints defining the area and transform them to pixels //this way if we move or zoom the map rectangle will follow accordingly Point screenPts1 = new Point(); mapView.getProjection().toPixels(p1, screenPts1); Point screenPts2 = new Point(); mapView.getProjection().toPixels(p2, screenPts2); //draw inner rectangle paint.setColor(0x4435EF56); paint.setStyle(Style.FILL); canvas.drawRect(screenPts1.x, screenPts1.y, screenPts2.x, screenPts2.y, paint); //draw outline rectangle paint.setColor(0x88158923); paint.setStyle(Style.STROKE); canvas.drawRect(screenPts1.x, screenPts1.y, screenPts2.x, screenPts2.y, paint); } return true; } @Override public boolean onTouchEvent(MotionEvent e, MapView mapView) { if(mv.isEditMode() && !isUp){ if(e.getAction() == MotionEvent.ACTION_DOWN){ x1 = y1 = 0; x1 = e.getX(); y1 = e.getY(); p1 = mapView.getProjection().fromPixels((int)x1,(int)y1); } //here we constantly change geopoint p2 as we move out finger if(e.getAction() == MotionEvent.ACTION_MOVE){ x2 = e.getX(); y2 = e.getY(); p2 = mapView.getProjection().fromPixels((int)x2,(int)y2); } //---when user lifts his finger--- if (e.getAction() == MotionEvent.ACTION_UP) { isUp = true; } return true; } return false; } }

vea esto http://n3vrax.wordpress.com/2011/08/13/drawing-overlays-on-android-map-view/


// This Activity will draw a line between two selected points on Map public class MainActivity extends MapActivity { MapView myMapView = null; MapController myMC = null; GeoPoint geoPoint = null; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); myMapView = (MapView) findViewById(R.id.mapview); geoPoint = null; myMapView.setSatellite(false); String pairs[] = getDirectionData("ahmedabad", "vadodara"); String[] lngLat = pairs[0].split(","); // STARTING POINT GeoPoint startGP = new GeoPoint( (int) (Double.parseDouble(lngLat[1]) * 1E6), (int) (Double .parseDouble(lngLat[0]) * 1E6)); myMC = myMapView.getController(); geoPoint = startGP; myMC.setCenter(geoPoint); myMC.setZoom(15); myMapView.getOverlays().add(new DirectionPathOverlay(startGP, startGP)); // NAVIGATE THE PATH GeoPoint gp1; GeoPoint gp2 = startGP; for (int i = 1; i < pairs.length; i++) { lngLat = pairs[i].split(","); gp1 = gp2; // watch out! For GeoPoint, first:latitude, second:longitude gp2 = new GeoPoint((int) (Double.parseDouble(lngLat[1]) * 1E6), (int) (Double.parseDouble(lngLat[0]) * 1E6)); myMapView.getOverlays().add(new DirectionPathOverlay(gp1, gp2)); Log.d("xxx", "pair:" + pairs[i]); } // END POINT myMapView.getOverlays().add(new DirectionPathOverlay(gp2, gp2)); myMapView.getController().animateTo(startGP); myMapView.setBuiltInZoomControls(true); myMapView.displayZoomControls(true); } @Override protected boolean isRouteDisplayed() { // TODO Auto-generated method stub return false; } private String[] getDirectionData(String srcPlace, String destPlace) { String urlString = "http://maps.google.com/maps?f=d&hl=en&saddr=" + srcPlace + "&daddr=" + destPlace + "&ie=UTF8&0&om=0&output=kml"; Log.d("URL", urlString); Document doc = null; HttpURLConnection urlConnection = null; URL url = null; String pathConent = ""; try { url = new URL(urlString.toString()); urlConnection = (HttpURLConnection) url.openConnection(); urlConnection.setRequestMethod("GET"); urlConnection.setDoOutput(true); urlConnection.setDoInput(true); urlConnection.connect(); DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder db = dbf.newDocumentBuilder(); doc = db.parse(urlConnection.getInputStream()); } catch (Exception e) { } NodeList nl = doc.getElementsByTagName("LineString"); for (int s = 0; s < nl.getLength(); s++) { Node rootNode = nl.item(s); NodeList configItems = rootNode.getChildNodes(); for (int x = 0; x < configItems.getLength(); x++) { Node lineStringNode = configItems.item(x); NodeList path = lineStringNode.getChildNodes(); pathConent = path.item(0).getNodeValue(); } } String[] tempContent = pathConent.split(" "); return tempContent; } } //***************************************************************************** DirectionPathOverlay public class DirectionPathOverlay extends Overlay { private GeoPoint gp1; private GeoPoint gp2; public DirectionPathOverlay(GeoPoint gp1, GeoPoint gp2) { this.gp1 = gp1; this.gp2 = gp2; } @Override public boolean draw(Canvas canvas, MapView mapView, boolean shadow, long when) { // TODO Auto-generated method stub Projection projection = mapView.getProjection(); if (shadow == false) { Paint paint = new Paint(); paint.setAntiAlias(true); Point point = new Point(); projection.toPixels(gp1, point); paint.setColor(Color.BLUE); Point point2 = new Point(); projection.toPixels(gp2, point2); paint.setStrokeWidth(2); canvas.drawLine((float) point.x, (float) point.y, (float) point2.x, (float) point2.y, paint); } return super.draw(canvas, mapView, shadow, when); } @Override public void draw(Canvas canvas, MapView mapView, boolean shadow) { // TODO Auto-generated method stub super.draw(canvas, mapView, shadow); } }


Try this one: Add itemizedOverlay class: public class AndroidGoogleMapsActivity extends MapActivity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // Displaying Zooming controls MapView mapView = (MapView) findViewById(R.id.mapview); mapView.setBuiltInZoomControls(true); MapController mc = mapView.getController(); double lat = Double.parseDouble("48.85827758964043"); double lon = Double.parseDouble("2.294543981552124"); GeoPoint geoPoint = new GeoPoint((int)(lat * 1E6), (int)(lon * 1E6)); mc.animateTo(geoPoint); mc.setZoom(15); mapView.invalidate(); /** * Placing Marker * */ List<Overlay> mapOverlays = mapView.getOverlays(); Drawable drawable = this.getResources().getDrawable(R.drawable.mark_red); AddItemizedOverlay itemizedOverlay = new AddItemizedOverlay(drawable, this); OverlayItem overlayitem = new OverlayItem(geoPoint, "Hello", "Sample Overlay item"); itemizedOverlay.addOverlay(overlayitem); mapOverlays.add(itemizedOverlay); } @Override protected boolean isRouteDisplayed() { return false; } }


public class MainActivity extends FragmentActivity { List<Overlay> mapOverlays; GeoPoint point1, point2; LocationManager locManager; Drawable drawable; Document document; GMapV2GetRouteDirection v2GetRouteDirection; LatLng fromPosition; LatLng toPosition; GoogleMap mGoogleMap; MarkerOptions markerOptions; Location location ; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); v2GetRouteDirection = new GMapV2GetRouteDirection(); SupportMapFragment supportMapFragment = (SupportMapFragment) getSupportFragmentManager() .findFragmentById(R.id.map); mGoogleMap = supportMapFragment.getMap(); // Enabling MyLocation in Google Map mGoogleMap.setMyLocationEnabled(true); mGoogleMap.getUiSettings().setZoomControlsEnabled(true); mGoogleMap.getUiSettings().setCompassEnabled(true); mGoogleMap.getUiSettings().setMyLocationButtonEnabled(true); mGoogleMap.getUiSettings().setAllGesturesEnabled(true); mGoogleMap.setTrafficEnabled(true); mGoogleMap.animateCamera(CameraUpdateFactory.zoomTo(12)); markerOptions = new MarkerOptions(); fromPosition = new LatLng(11.663837, 78.147297); toPosition = new LatLng(11.723512, 78.466287); GetRouteTask getRoute = new GetRouteTask(); getRoute.execute(); } /** * * @author VIJAYAKUMAR M * This class Get Route on the map * */ private class GetRouteTask extends AsyncTask<String, Void, String> { private ProgressDialog Dialog; String response = ""; @Override protected void onPreExecute() { Dialog = new ProgressDialog(MainActivity.this); Dialog.setMessage("Loading route..."); Dialog.show(); } @Override protected String doInBackground(String... urls) { //Get All Route values document = v2GetRouteDirection.getDocument(fromPosition, toPosition, GMapV2GetRouteDirection.MODE_DRIVING); response = "Success"; return response; } @Override protected void onPostExecute(String result) { mGoogleMap.clear(); if(response.equalsIgnoreCase("Success")){ ArrayList<LatLng> directionPoint = v2GetRouteDirection.getDirection(document); PolylineOptions rectLine = new PolylineOptions().width(10).color( Color.RED); for (int i = 0; i < directionPoint.size(); i++) { rectLine.add(directionPoint.get(i)); } // Adding route on the map mGoogleMap.addPolyline(rectLine); markerOptions.position(toPosition); markerOptions.draggable(true); mGoogleMap.addMarker(markerOptions); } Dialog.dismiss(); } } @Override protected void onStop() { super.onStop(); finish(); } }

Clase de ayuda de ruta

public class GMapV2GetRouteDirection { public final static String MODE_DRIVING = "driving"; public final static String MODE_WALKING = "walking"; public GMapV2GetRouteDirection() { } 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"; 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) { 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(); } public int getDurationValue (Document doc) { 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()); } public String getDistanceText (Document doc) { NodeList nl1 = doc.getElementsByTagName("distance"); Node node1 = nl1.item(0); NodeList nl2 = node1.getChildNodes(); Node node2 = nl2.item(getNodeIndex(nl2, "text")); Log.i("DistanceText", node2.getTextContent()); return node2.getTextContent(); } public int getDistanceValue (Document doc) { NodeList nl1 = doc.getElementsByTagName("distance"); Node node1 = nl1.item(0); NodeList nl2 = node1.getChildNodes(); Node node2 = nl2.item(getNodeIndex(nl2, "value")); Log.i("DistanceValue", node2.getTextContent()); return Integer.parseInt(node2.getTextContent()); } public String getStartAddress (Document doc) { NodeList nl1 = doc.getElementsByTagName("start_address"); Node node1 = nl1.item(0); Log.i("StartAddress", node1.getTextContent()); return node1.getTextContent(); } public String getEndAddress (Document doc) { NodeList nl1 = doc.getElementsByTagName("end_address"); Node node1 = nl1.item(0); Log.i("StartAddress", node1.getTextContent()); return node1.getTextContent(); } public String getCopyRights (Document doc) { NodeList nl1 = doc.getElementsByTagName("copyrights"); Node node1 = nl1.item(0); Log.i("CopyRights", node1.getTextContent()); return node1.getTextContent(); } 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; } }