
Pada folder src/namapackage, buat file baru dengan nama GetDirectionAsyncTask.java lalu pastekan koding dibawah ini.
GetDirectionsAsyncTask.java
package com.maps; import java.util.ArrayList; import java.util.Map; import org.w3c.dom.Document; import com.google.android.gms.maps.model.LatLng; import android.app.ProgressDialog; import android.os.AsyncTask; import android.widget.Toast; public class GetDirectionsAsyncTask extends AsyncTask<Map<String, String>, Object, ArrayList<LatLng>> { public static final String USER_CURRENT_LAT = "user_current_lat"; public static final String USER_CURRENT_LONG = "user_current_long"; public static final String DESTINATION_LAT = "destination_lat"; public static final String DESTINATION_LONG = "destination_long"; public static final String DIRECTIONS_MODE = "directions_mode"; private MainActivity activity; private Exception exception; private ProgressDialog progressDialog; public GetDirectionsAsyncTask(MainActivity activity) { super(); this.activity = activity; } public void onPreExecute() { progressDialog = new ProgressDialog(activity); progressDialog.setMessage("Calculating directions"); progressDialog.show(); } @Override public void onPostExecute(ArrayList result) { progressDialog.dismiss(); if (exception == null) { activity.handleGetDirectionsResult(result); } else { processException(); } } @Override protected ArrayList<LatLng> doInBackground(Map<String, String>... params) { Map<String, String> paramMap = params[0]; try { LatLng fromPosition = new LatLng(Double.valueOf(paramMap .get(USER_CURRENT_LAT)), Double.valueOf(paramMap .get(USER_CURRENT_LONG))); LatLng toPosition = new LatLng(Double.valueOf(paramMap .get(DESTINATION_LAT)), Double.valueOf(paramMap .get(DESTINATION_LONG))); GMapV2Direction md = new GMapV2Direction(); Document doc = md.getDocument(fromPosition, toPosition, paramMap.get(DIRECTIONS_MODE)); ArrayList<LatLng> directionPoints = md.getDirection(doc); return directionPoints; } catch (Exception e) { exception = e; return null; } } private void processException() { Toast.makeText(activity, "Error retriving data", 3000).show(); } }
GMapV2Direction.java
package com.maps; 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"; 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; } }
Pada MainActivity.java pastekan coding dibawah ini.
MainActivity.java
package com.maps; import java.util.ArrayList; import java.util.HashMap; import java.util.Map; import org.w3c.dom.Document; 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.BitmapDescriptorFactory; import com.google.android.gms.maps.model.CameraPosition; import com.google.android.gms.maps.model.LatLng; import com.google.android.gms.maps.model.MarkerOptions; import com.google.android.gms.maps.model.Polyline; import com.google.android.gms.maps.model.PolylineOptions; import android.app.Activity; import android.app.ProgressDialog; import android.graphics.Color; import android.os.AsyncTask; import android.os.Bundle; public class MainActivity extends Activity { GoogleMap gMaps; private Polyline newPolyline; LatLng toPosition; private GMapV2Direction md; private Polyline route; private Document doc; LatLng from, to; double lat1 = 0.510127; double lng1 = 101.450015; double lat2 = 0.463559; double lng2 = 101.396714; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initMap(); from = new LatLng(lat1, lng1); to = new LatLng(lat2, lng2); gMaps.addMarker(new MarkerOptions() .position(from) .title("location 1") .icon(BitmapDescriptorFactory .fromResource(R.drawable.ic_launcher))); gMaps.addMarker(new MarkerOptions() .position(to) .title("location 2") .icon(BitmapDescriptorFactory .fromResource(R.drawable.ic_launcher))); new getRoute().execute(); } private void initMap() { if (gMaps == null) { gMaps = ((MapFragment) getFragmentManager().findFragmentById( R.id.map)).getMap(); if (gMaps != null) { gMaps.animateCamera(CameraUpdateFactory.zoomTo(18)); gMaps.getUiSettings().setCompassEnabled(true); gMaps.getUiSettings().setZoomControlsEnabled(true); gMaps.getUiSettings().setMyLocationButtonEnabled(true); gMaps.setMyLocationEnabled(false); gMaps.setTrafficEnabled(true); gMaps.setBuildingsEnabled(true); } } } public void handleGetDirectionsResult(ArrayList<LatLng> directionPoints) { PolylineOptions rectLine = new PolylineOptions().width(4).color( Color.GREEN); for (int i = 0; i < directionPoints.size(); i++) { rectLine.add(directionPoints.get(i)); } if (newPolyline != null) { newPolyline.remove(); } newPolyline = gMaps.addPolyline(rectLine); } private class getRoute extends AsyncTask<Void, Void, Void> { private final ProgressDialog dialog = new ProgressDialog( MainActivity.this); protected void onPreExecute() { this.dialog.setMessage("Routing..."); this.dialog.setCancelable(false); this.dialog.setCanceledOnTouchOutside(true); this.dialog.show(); } @Override protected Void doInBackground(Void... arg0) { md = new GMapV2Direction(); doc = md.getDocument(from, to, GMapV2Direction.MODE_DRIVING); // duration = md.getDurationValue(doc); // distance = md.getDistanceText(doc); // start_address = md.getDistanceValue(doc); // String copy_right = md.getCopyRights(doc); return null; } protected void onPostExecute(Void result) { if (dialog.isShowing()) { dialog.dismiss(); } ArrayList<LatLng> directionPoint = md.getDirection(doc); PolylineOptions rectLine = new PolylineOptions().width(5).color( Color.GREEN); for (int i = 0; i < directionPoint.size(); i++) { rectLine.add(directionPoint.get(i)); } route = gMaps.addPolyline(rectLine); } } }
Hasilnya seperti pada gambar dibawah ini.

Demikian Tutorial Membuat Direction Antara Dua Marker di Google Maps Android, semoga bermanfaat bagi anda semua.
download source code
No comments:
Post a Comment