Pada Tutorial sebelumnya kita sudah membahas tentang menampilkan Map dan Marker dengan menggunakan GoogleMaps Api V2. Sekarang yang sudah banyak ditunggunih oleh para pembaca yaitu menampilkan direction dengan menggunakan GoogleMaps android V2.
Oke kita mulai saja
1. Buka lagi project PetaLokasi
2. Buat Class baru dengan nama GoogleMapV2Direction.java lalu ketikan kode berikut.
package net.agusharyanto.petalokasi; 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 android.util.Log; import com.google.android.gms.maps.model.LatLng; public class GoogleMapV2Direction { public final static String MODE_DRIVING = "driving"; public final static String MODE_WALKING = "walking"; public GoogleMapV2Direction() { } 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; } }
Class inilah yang mengirim request ke server google dan mengolah responsenya untuk mengenerate direction dari dua buah titik yang kita kirimkan.
3. Edit Class MainActivity.java lalu ketikan kode berikut
package net.agusharyanto.petalokasi; import java.util.ArrayList; import org.w3c.dom.Document; import android.app.Activity; import android.graphics.Color; import android.os.AsyncTask; import android.os.Bundle; 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; import com.google.android.gms.maps.model.PolylineOptions; public class MainActivity extends Activity { GoogleMap mMap; GoogleMapV2Direction md; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); LatLng fromPosition = new LatLng(-6.3039, 106.8267); LatLng toPosition = new LatLng(-6.29436, 106.8859); md = new GoogleMapV2Direction(); mMap = ((MapFragment) getFragmentManager().findFragmentById(R.id.map)) .getMap(); LatLng coordinates = new LatLng(-6.3039, 106.8267); mMap.animateCamera(CameraUpdateFactory.newLatLngZoom(coordinates, 11)); mMap.addMarker(new MarkerOptions().position(fromPosition) .title("Start")); mMap.addMarker(new MarkerOptions().position(toPosition).title("End")); getDirectionMap(fromPosition, toPosition); } private void getDirectionMap(LatLng from, LatLng to) { LatLng fromto[] = { from, to }; new LongOperation().execute(fromto); } private class LongOperation extends AsyncTask<LatLng, Void, Document> { @Override protected Document doInBackground(LatLng... params) { Document doc = md.getDocument(params[0], params[1], GoogleMapV2Direction.MODE_DRIVING); return doc; } @Override protected void onPostExecute(Document result) { setResult(result); } @Override protected void onPreExecute() { } @Override protected void onProgressUpdate(Void... values) { } } public void setResult(Document doc) { int duration = md.getDurationValue(doc); String distance = md.getDistanceText(doc); String start_address = md.getStartAddress(doc); String copy_right = md.getCopyRights(doc); 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)); } mMap.addPolyline(rectLine); } }
Pada method onCreate, kita deklarasikan dan set nilai lokasi Sumber (fromPosition) dan lokasi tujuan (toPosition). Nilai lokasi ini kita kirim ke method getDirectionMap dari sini kita gunakan asynctask untuk eksekusi method getDocument pada class GoogleMapV2Direction, method ini akan mengembalikan Nilai dalam type data Document. Nah Di nilai yang dikirim inilah terdapat nilai seperti distance (jarak) dan kumpulan titik directionya.
4. Saatnya kita lihat hasil kerja kita dengan me run projectnya.
Oh ia insya Allah tanggal 18 Mei nanti saya akan mengisi WorkShop Android di Politeknik Indramayu.
Bagi yang mau ikut bisa menghubungi panitia disana.
Semoga Bermanfaat
Salam Hangat
Agus Haryanto
referensi
http://stackoverflow.com
cara buat direction posisi kita di GPS ke lokasi yang dituju bagaimana ya?
pak saya ingin bertanya, kalau ingin membuat line seperti itu namun tidak ada lambang yang menunjukkan start point dan end point seperti warna merah itu bagaimana yah pak ? apa menggunakan polyline ?
@iip, tinggal bagian code yang gambar marker saja dihilangkan.
Mas Agus ada tidak tutorial untuk mencari nearby lokasi pada goggle map v2 ini ?
cara buat direction posisi kita di GPS ke lokasi yang dituju bagaimana ya?
Pak saya ingin tanya, saya punya projek membuat koridor transjakarta. Untuk membedakan antara koridor 1 dengan koridor lainnya, saya ingin direction tersebut mempunyai beberapa warna yang berbeda apa bisa? Caranya gimana ya pak? Terimakasih
@Arif, Bisa, harusnya mudah
Mas cara membuat lbs dengan google api V2 gimana caranya ?
apakah codingannya hampir mirip dengan api V1 ?
kalau punya tutorialnya bisa dikirim ke email saya mas
mas kan di tutor di atas longlat awal dan akhirnya udah di tentuin sama GPS nah, gmana kalo hanya posisi awalnya saja yang di tentuin sama gps nya, jdai longlat awal dari gps, longlat akhir di inputkan…
Bisa gk mas?
mas bisa gak lokasi tujuan nya lebih dari satu ??
@delfian, bisa dibuat arraylist saja yang isinya object lokasi tujuan
kalo nambahin informasi jarak antar titik gimn mas ?
dikoding mas agus kan dah ada tuh buat jaraknya tp nampilnya dimna mas ??
Pak, saya sudah coba dengan codingan di atas, tapi tidak ada gambar petanya, itu kenapa pak?
halamannya putih saja pak dan hanya ada zoom in dan out.
Terima kasih,
@Rachmad Riadi, Pastikan key api googlemapnya benar. dan terkoneksi internet
pak agus, saya sudah pastikan apikeynya sama dengan yang ada di saya dan sudah terkoneksi dengan internet tetapi masih putih.
saya sudah coba generate keystore menggunakan debug.keystore dan release keystore tetapi masih [putih
kita” kenapa ya pak aagus?
pak kalau direction antar stasiun kereta api.. jadi sesuai lintasan kereta itu gimana pak apa bisa di buat..?
– pak cara nampilin nilai kilometer yang di gambarkan direction gimana ya pak?
– semisal nilai asal kita buat otomatis mengambil dari long+lang kita gimana ya pak?
mohon pencerahanya… sebelumnya trimakasih…
mas saya mau bertanya ,,
Kalo gps dihubungkan ke alat sensor yang ditaruh di kendaraan gimana mas scriptnya
apakan ada penambahan direcetory nya …
jadi kita tau dimana letak kendaraan yang kita pakai dengan melihat di gps android saja ..
mohon pencerahannya ..
terima kasih
Madinah
pak gimana caranya kalo fromPositionnya berdasarkan lokasi GPS kita??
Mohon pencerahannya, terima kasih banyak
mas, kalau mau ganti di posisi jawa timur gimana ya mas? itu kan fokus suatu lokasi di jakarta saja…
mohon bantuannya mas, thanks 🙂
Pak kenapa saya ada error di
mMap = ((MapFragment) getFragmentManager().findFragmentById(R.id.map))
.getMap();
isi errornya Call requires API level 11 (current min is 8): android.app.Activity#getFragmentManager
pak, mau tanya saya siswa di jurusan rpl, kalau misalnya kita ingin membuat direction dari satu lokasi ke lokasi yg lain tapi lokasi tersebut di input oleh kita nya sendiri seperti google maps versi desktop, apa mungkin? lalu bagaimana caranya? terimakasih
maaf Pak saya ada error di
mMap = ((MapFragment) getFragmentManager().findFragmentById(R.id.map))
“getFragmentManager(). findFragmentById” ada garis merah di bawah…mohon bantuannya pak, tinggal itu mi errornya…
misi mau tanya pak, klo import org.apache.http.HttpResponse;
merah knapa ya? maaf masih newbie