
Pada folder src/namapackage, buat file baru dengan nama GetDirectionAsyncTask.java lalu pastekan koding dibawah ini.
GetDirectionsAsyncTask.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 | 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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 | 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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 | 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