Belajar Android Menampilkan Direction dengan GoogleMaps Android V2

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

25 comments to Belajar Android Menampilkan Direction dengan GoogleMaps Android V2

  • andreza

    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 ?

  • Agus Haryanto

    @iip, tinggal bagian code yang gambar marker saja dihilangkan.

  • Fian

    Mas Agus ada tidak tutorial untuk mencari nearby lokasi pada goggle map v2 ini ?

  • abdul syukur

    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

  • Agus Haryanto

    @Arif, Bisa, harusnya mudah

  • Rubi

    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

  • Jaohan

    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?

  • delfian

    mas bisa gak lokasi tujuan nya lebih dari satu ??

  • Agus Haryanto

    @delfian, bisa dibuat arraylist saja yang isinya object lokasi tujuan

  • delfian

    kalo nambahin informasi jarak antar titik gimn mas ?

  • delfian

    dikoding mas agus kan dah ada tuh buat jaraknya tp nampilnya dimna mas ??

  • Rachmad Riadi

    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,

  • Agus Haryanto

    @Rachmad Riadi, Pastikan key api googlemapnya benar. dan terkoneksi internet

  • richard

    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?

  • zaezhu

    pak kalau direction antar stasiun kereta api.. jadi sesuai lintasan kereta itu gimana pak apa bisa di buat..?

  • yudha

    – 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…

  • Madinah

    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

  • Ian Firdaus

    pak gimana caranya kalo fromPositionnya berdasarkan lokasi GPS kita??
    Mohon pencerahannya, terima kasih banyak

  • agungs

    mas, kalau mau ganti di posisi jawa timur gimana ya mas? itu kan fokus suatu lokasi di jakarta saja…
    mohon bantuannya mas, thanks 🙂

  • Marhendy

    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

  • michael

    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…

  • velient

    misi mau tanya pak, klo import org.apache.http.HttpResponse;
    merah knapa ya? maaf masih newbie

Leave a Reply

You can use these HTML tags

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>