Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

travel time between two locations in Google Map Android API V2

how to display travel time between two locations in Google Map Android API V2, in my program i using JSONParse to display driving distance, but i'm can't to display the display travel time, This example program I made: DirectionActivity.java

public class DirectionActivity extends FragmentActivity implements OnMyLocationChangeListener{

private LatLng          start;
private LatLng          end;
private String          nama;
private final String    URL = "http://maps.googleapis.com/maps/api/directions/json?";
private GoogleMap       map;
private JSONHelper      json;
private ProgressDialog  pDialog;
private List<LatLng>    listDirections;

@Override
protected void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_direction);
    json = new JSONHelper();
    setupMapIfNeeded();

    Bundle b = getIntent().getExtras();
    if (b != null)
    {
        start = new LatLng(b.getDouble(MainActivity.KEY_LAT_ASAL), b.getDouble(MainActivity.KEY_LNG_ASAL));
        end = new LatLng(b.getDouble(MainActivity.KEY_LAT_TUJUAN), b.getDouble(MainActivity.KEY_LNG_TUJUAN));
        nama = b.getString(MainActivity.KEY_NAMA);
    }

    new AsyncTaskDirection().execute();
}

private void setupMapIfNeeded()
{
    if (map == null)
    {
        FragmentManager fragmentManager = getSupportFragmentManager();
        SupportMapFragment supportMapFragment = (SupportMapFragment) fragmentManager
                .findFragmentById(R.id.mapsdirections);
        map = supportMapFragment.getMap();

        if (map != null)
        {
            setupMap();
        }
    }

}

private void setupMap()
{
    map.setMyLocationEnabled(true);
    map.setOnMyLocationChangeListener(this);
    moveToMyLocation();
}

private void moveToMyLocation()
{
    LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
    Criteria criteria = new Criteria();

    Location location = locationManager.getLastKnownLocation(locationManager.getBestProvider(criteria, false));
    if (location != null)
    {
        map.animateCamera(CameraUpdateFactory.newLatLngZoom(
                new LatLng(location.getLatitude(), location.getLongitude()), 13));
    }
}

@Override
public boolean onCreateOptionsMenu(Menu menu)
{
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}

@Override
protected void onResume()
{
    // TODO Auto-generated method stub
    super.onResume();
    int resCode = GooglePlayServicesUtil.isGooglePlayServicesAvailable(getApplicationContext());
    if (resCode != ConnectionResult.SUCCESS)
    {
        GooglePlayServicesUtil.getErrorDialog(resCode, this, 1);
    }
}

private class AsyncTaskDirection extends AsyncTask<Void, Void, Void>
{
    @Override
    protected Void doInBackground(Void... params)
    {
        String uri = URL
                + "origin=" + start.latitude + "," + start.longitude
                + "&destination=" + end.latitude + "," + end.longitude
                + "&sensor=true&units=metric";

        JSONObject jObject = json.getJSONFromURL(uri);
        listDirections = json.getDirection(jObject);

        return null;
    }

    @Override
    protected void onPreExecute()
    {
        // TODO Auto-generated method stub
        super.onPreExecute();
        pDialog = new ProgressDialog(DirectionActivity.this);
        pDialog.setMessage("Loading....");
        pDialog.setCancelable(true);
        pDialog.show();
    }

    @Override
    protected void onPostExecute(Void result)
    {
        // TODO Auto-generated method stub
        super.onPostExecute(result);
        pDialog.dismiss();
        gambarDirection();
    }

}

public void gambarDirection()
{
    PolylineOptions line = new PolylineOptions().width(3).color(Color.BLUE);
    for (int i = 0; i < listDirections.size(); i++)
    {
        line.add(listDirections.get(i));
    }
    map.addPolyline(line);

    // tambah marker di posisi end
    map.addMarker(new MarkerOptions()
            .position(end)
            .title(nama));
}

@Override
public void onMyLocationChange(Location location)
{
    Toast.makeText(this, "Lokasi berubah ke " + location.getLatitude() + "," + location.getLongitude(),
            Toast.LENGTH_SHORT).show();

}

}

JSONHelper.java

public class JSONHelper
{
private InputStream     is              = null;
private JSONObject      jsonObject      = null;
private String          json            = "";

private final String    TAG_TEMPATMAKAN = "tempatmakan";
private final String    TAG_ID          = "id";
private final String    TAG_NAMA        = "nama";
private final String    TAG_ALAMAT      = "alamat";
private final String    TAG_LAT         = "lat";
private final String    TAG_LNG         = "lng";
private final String    TAG_ROUTES      = "routes";
private final String    TAG_LEGS        = "legs";
private final String    TAG_STEPS       = "steps";
private final String    TAG_POLYLINE    = "polyline";
private final String    TAG_POINTS      = "points";
private final String    TAG_START       = "start_location";
private final String    TAG_END         = "end_location";

public JSONObject getJSONFromURL(String url)
{
    try
    {
        DefaultHttpClient httpClient = new DefaultHttpClient();
        HttpGet httpGet = new HttpGet(url);

        HttpResponse httpResponse = httpClient.execute(httpGet);
        HttpEntity httpEntity = httpResponse.getEntity();
        is = httpEntity.getContent();
    } catch (UnsupportedEncodingException e)
    {
        e.printStackTrace();
    } catch (ClientProtocolException e)
    {
        e.printStackTrace();
    } catch (IOException e)
    {
        e.printStackTrace();
    }

    try
    {
        BufferedReader reader = new BufferedReader(new InputStreamReader(
                is, "iso-8859-1"), 8);

        StringBuilder sb = new StringBuilder();
        String line = null;

        while ((line = reader.readLine()) != null)
        {
            sb.append(line + "\n");
        }

        is.close();
        json = sb.toString();
    } catch (Exception e)
    {
        // TODO: handle exception
    }

    try
    {
        jsonObject = new JSONObject(json);

    } catch (JSONException e)
    {
        // TODO: handle exception
    }

    return jsonObject;
}

public ArrayList<TempatMakan> getTempatMakanAll(JSONObject jobj)
{
    ArrayList<TempatMakan> listTempatMakan = new ArrayList<TempatMakan>();

    try
    {
        JSONArray arrayTempatMakan = jobj.getJSONArray(TAG_TEMPATMAKAN);

        for (int i = 0; i < arrayTempatMakan.length(); i++)
        {
            JSONObject jobject = arrayTempatMakan.getJSONObject(i);

            Log.d("log", "muter ke " + i);
            listTempatMakan.add(new TempatMakan(jobject.getInt(TAG_ID), jobject.getString(TAG_NAMA), jobject
                    .getString(TAG_ALAMAT), jobject
                    .getDouble(TAG_LAT), jobject.getDouble(TAG_LNG)));

        }
    } catch (JSONException e)
    {
        e.printStackTrace();
    }
    return listTempatMakan;
}

/*
 * Untuk decode Polyline
 * 
 * @params String
 * 
 * @return List<LatLng>
 */
private List<LatLng> decodePoly(String encoded)
{
    List<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;

}

/*
 * Untuk mendapatkan direction
 * 
 * @params JSONObject
 * 
 * @return List<LatLng>
 */
public List<LatLng> getDirection(JSONObject jObj)
{

    List<LatLng> directions = new ArrayList<LatLng>();

    try
    {
        JSONObject objRoute = jObj.getJSONArray(TAG_ROUTES).getJSONObject(0);
        JSONObject objLegs = objRoute.getJSONArray(TAG_LEGS).getJSONObject(0);
        JSONArray arraySteps = objLegs.getJSONArray(TAG_STEPS);
        for (int wi2t = 0; wi2t < arraySteps.length(); wi2t++)
        {
            JSONObject step = arraySteps.getJSONObject(wi2t);
            JSONObject objStart = step.getJSONObject(TAG_START);
            JSONObject objEnd = step.getJSONObject(TAG_END);
            double latStart = objStart.getDouble(TAG_LAT);
            double lngStart = objStart.getDouble(TAG_LNG);

            directions.add(new LatLng(latStart, lngStart));

            JSONObject poly = step.getJSONObject(TAG_POLYLINE);
            String encodedPoly = poly.getString(TAG_POINTS);

            List<LatLng> decodedPoly = decodePoly(encodedPoly);
            for (int eka = 0; eka < decodedPoly.size(); eka++)
            {
                directions.add(new LatLng(decodedPoly.get(eka).latitude, decodedPoly.get(eka).longitude));
            }

            double latEnd = objEnd.getDouble(TAG_LAT);
            double lngEnd = objEnd.getDouble(TAG_LNG);
            directions.add(new LatLng(latEnd, lngEnd));

        }
    } catch (JSONException e)
    {
        // TODO: handle exception
    }

    return directions;
}
}

MainActivity.java

public class MainActivity extends FragmentActivity implements OnInfoWindowClickListener
{
private GoogleMap           map;
private JSONHelper          json;
private ProgressDialog      pDialog;
private Button      btnGetDirection;

private List<TempatMakan>   listTempatMakan;
private final String        URL_API     = "http://lhocation1203.hostzi.com/dataapi/tempatmakan.php";

public static final String  KEY_NAMA    = "nama";
public static final String  KEY_ALAMAT  = "alamat";
public static final String  KEY_LAT_TUJUAN  = "lat_tujuan";
public static final String  KEY_LNG_TUJUAN  = "lng_tujuan";
public static final String  KEY_LAT_ASAL    = "lat_asal";
public static final String  KEY_LNG_ASAL    = "lng_asal";

@Override
protected void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    json = new JSONHelper();

    new AsynTaskMain().execute();

    setupMapIfNeeded();
}

private void setupMapIfNeeded()
{
    if (map == null)
    {
        FragmentManager fragmentManager = getSupportFragmentManager();
        SupportMapFragment supportMapFragment = (SupportMapFragment) fragmentManager.findFragmentById(R.id.maps);
        map = supportMapFragment.getMap();

        if (map != null)
        {
            setupMap();
        }
    }

}

private void setupMap()
{
    map.setMyLocationEnabled(true);
    map.setOnInfoWindowClickListener(this);
    moveToMyLocation();
}

private void moveToMyLocation()
{
    LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
    Criteria criteria = new Criteria();

    Location location = locationManager.getLastKnownLocation(locationManager.getBestProvider(criteria, false));
    if (location != null)
    {
        map.animateCamera(CameraUpdateFactory.newLatLngZoom(
                new LatLng(location.getLatitude(), location.getLongitude()), 13));
    }
}

@Override
public boolean onCreateOptionsMenu(Menu menu)
{
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}

@Override
protected void onResume()
{
    // TODO Auto-generated method stub
    super.onResume();

    int resCode = GooglePlayServicesUtil.isGooglePlayServicesAvailable(getApplicationContext());
    if (resCode != ConnectionResult.SUCCESS)
    {
        GooglePlayServicesUtil.getErrorDialog(resCode, this, 1);
    }
}

private class AsynTaskMain extends AsyncTask<Void, Void, Void>
{

    @Override
    protected void onPostExecute(Void result)
    {
        // TODO Auto-generated method stub
        pDialog.dismiss();
        runOnUiThread(new Runnable()
        {

            @Override
            public void run()
            {
                // TODO Auto-generated method stub
                for (int i = 0; i < listTempatMakan.size(); i++)
                {

                    map.addMarker(new MarkerOptions()
                            .position(new LatLng(listTempatMakan.get(i).getLat(),
                                    listTempatMakan.get(i).getLng()))
                            .title(listTempatMakan.get(i).getNama())
                            .snippet(listTempatMakan.get(i).getAlamat()));

                }
            }
        });

        super.onPostExecute(result);
    }

    @Override
    protected void onPreExecute()
    {
        // TODO Auto-generated method stub
        super.onPreExecute();
        pDialog = new ProgressDialog(MainActivity.this);
        pDialog.setMessage("Loading....");
        pDialog.setCancelable(true);
        pDialog.show();
    }

    @Override
    protected Void doInBackground(Void... params)
    {
        // TODO Auto-generated method stub

        JSONObject jObject = json.getJSONFromURL(URL_API);
        listTempatMakan = json.getTempatMakanAll(jObject);
        return null;
    }
}

@Override
public void onInfoWindowClick(Marker marker)
{
    // marker id -> m0, m1, m2 dst..
    String id = marker.getId();
    id = id.substring(1);

    LatLng myLocation = new LatLng(map.getMyLocation().getLatitude(), map.getMyLocation().getLongitude());

    if (myLocation != null)
    {
        Bundle bundle = new Bundle();
        bundle.putString(KEY_NAMA, listTempatMakan.get(Integer.parseInt(id)).getNama());
        bundle.putString(KEY_ALAMAT, listTempatMakan.get(Integer.parseInt(id)).getAlamat());
        bundle.putDouble(KEY_LAT_TUJUAN, marker.getPosition().latitude);
        bundle.putDouble(KEY_LNG_TUJUAN, marker.getPosition().longitude);
        bundle.putDouble(KEY_LAT_ASAL, myLocation.latitude);
        bundle.putDouble(KEY_LNG_ASAL, myLocation.longitude);

        Intent i = new Intent(MainActivity.this, InfoTempatMakanActivity.class);
        i.putExtras(bundle);
        startActivity(i);

    } else
    {
        Toast.makeText(this, "Tidak dapat menemukan lokasi anda ", Toast.LENGTH_LONG).show();
    }
}
}

InfoTempatMakanActivity.java

public class InfoTempatMakanActivity extends Activity implements OnClickListener
{

private TextView    tvNama;
private TextView    tvAlamat;
private Button      btnGetDirection;

private LatLng      lokasiTujuan;
private LatLng      lokasiAwal;
private String      nama;
private String      alamat;

@Override
protected void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_info_tempat_makan);

    initialize();

    Bundle bundle = getIntent().getExtras();
    if (bundle != null)
    {
        nama = bundle.getString(MainActivity.KEY_NAMA);
        alamat = bundle.getString(MainActivity.KEY_ALAMAT);
        lokasiTujuan = new LatLng(bundle.getDouble(MainActivity.KEY_LAT_TUJUAN),
                bundle.getDouble(MainActivity.KEY_LNG_TUJUAN));
        lokasiAwal = new LatLng(bundle.getDouble(MainActivity.KEY_LAT_ASAL),
                bundle.getDouble(MainActivity.KEY_LNG_ASAL));
    }

    setTeksView();

}

private void setTeksView()
{
    tvNama.setText(nama);
    tvAlamat.setText(alamat);
}

private void initialize()
{
    tvAlamat = (TextView) findViewById(R.id.alamatTempatMakan);
    tvNama = (TextView) findViewById(R.id.namaTempatMakan);
    btnGetDirection = (Button) findViewById(R.id.btnDirection);
    btnGetDirection.setOnClickListener(this);
}

@Override
public void onClick(View v)
{
    Bundle bundle = new Bundle();
    bundle.putDouble(MainActivity.KEY_LAT_ASAL, lokasiAwal.latitude);
    bundle.putDouble(MainActivity.KEY_LNG_ASAL, lokasiAwal.longitude);
    bundle.putDouble(MainActivity.KEY_LAT_TUJUAN, lokasiTujuan.latitude);
    bundle.putDouble(MainActivity.KEY_LNG_TUJUAN, lokasiTujuan.longitude);
    bundle.putString(MainActivity.KEY_NAMA, nama);

    Intent intent = new Intent(this, DirectionActivity.class);
    intent.putExtras(bundle);

    startActivity(intent);
}

}

TempatMakan.java

public class TempatMakan
{
private int id;
private String  nama;
private String  alamat;
private double  lat;
private double  lng;

public TempatMakan()
{
    // TODO Auto-generated constructor stub
}

public TempatMakan(int id, String nama, String alamat, double lat, double lng)
{
    super();
            this.id = id;
    this.nama = nama;
    this.alamat = alamat;
    this.lat = lat;
    this.lng = lng;
}

public String getNama()
{
    return nama;
}

public void setNama(String nama)
{
    this.nama = nama;
}

public String getAlamat()
{
    return alamat;
}

public void setAlamat(String alamat)
{
    this.alamat = alamat;
}

public double getLat()
{
    return lat;
}

public void setLat(double lat)
{
    this.lat = lat;
}

public double getLng()
{
    return lng;
}

public void setLng(double lng)
{
    this.lng = lng;
}

}
like image 274
Muhammad Agessy Barazi Avatar asked Oct 22 '22 09:10

Muhammad Agessy Barazi


1 Answers

Google Directions JSON Response has an object called Distance and Duration within "LEGS" array, like this :

"legs": [
                {
                    "distance": {
                        "text": "0.3 km", 
                        "value": 263
                    }, 
                    "duration": {
                        "text": "1 min", 
                        "value": 52
                    }, 
                 ....... //omitted value
        ]

Thus you can try parsing the distance and duration (if you need it) into your app. Maybe like this :

JSONArray legs = jobject.getString("legs");
for (int i = 0; i < legs.length(); i++)
    {
        JSONObject legsObject = legs.getJSONObject(i);
        JSONObject distanceObject = legsObject.getString("distance");
        String distanceText = distanceObject.getString("text");
        String distanceValue = String.valueOf(distanceObject.getString("value"));
        //do anything else
    }

oh, and put the legs array parsing inside the ArrayTempatMakan parsing. I can get the distance and duration using Jackson JSON parser, so you should be able to do it with org.JSON parser.

Good luck ^^

EDIT :

In this getDirection (JSONObject jObj) method You successfully retrieve objLegs here, you need to get the Distance and Duration within objLegs

    JSONObject objRoute = jObj.getJSONArray(TAG_ROUTES).getJSONObject(0);
    JSONObject objLegs = objRoute.getJSONArray(TAG_LEGS).getJSONObject(0);
    JSONArray arraySteps = objLegs.getJSONArray(TAG_STEPS);

I think you should add this below objLegs:

JSONObject objDistance = objLegs.getJSONObject("distance");
JSONObject objDuration = objLegs.getJSONObject("duration");
String text_distance = objDistance.getString("text");
Log.d("Distance", text_distance); //adds an entry to the logCat, Check whether the value of Distance is successfully taken.
String text_duration = objDuration.getString("text");
Log.d("Duration", text_duration); //adds an entry to the logCat, Check whether the value of Distance is successfully taken.

There, I believe you should be able to grab the value, after that, you can just add the value into your list result.

If you're still unable to insert distance and duration, please include the TempatMakan class on your post.

EDIT 2 :

Declare distance and duration as string inside your TempatMakan.Java :

private String durasi;
private String jarak;

inside your constructor :

public TempatMakan(int id, String nama, String alamat, String jarak, String durasi, double lat, double lng)
{
    super();
    this.id = id;
    this.nama = nama;
    this.alamat = alamat;
    this.lat = lat;
    this.lng = lng;
    this.jarak = jarak;
    this.durasi = durasi;
}

then declare the respective getters and setters for jarak and durasi.

Inside your JSONHelper.java, the getTempatMakanAll method, add these :

for (int i = 0; i < arrayTempatMakan.length(); i++)
        {
            JSONObject jobject = arrayTempatMakan.getJSONObject(i);
            JSONObject objRoute = jobject.getJSONArray(TAG_ROUTES).getJSONObject(0);
            JSONObject objLegs = objRoute.getJSONArray(TAG_LEGS).getJSONObject(0);
            JSONObject objDistance = objLegs.getJSONObject("distance");
            JSONObject objDuration = objLegs.getJSONObject("duration");

            Log.d("log", "muter ke " + i);
            listTempatMakan.add(
            new TempatMakan(
                    jobject.getInt(TAG_ID),
                    jobject.getString(TAG_NAMA),
                    jobject.getString(TAG_ALAMAT),
                    objDistance.getString("text"),//jarak
                    objDuration.getString("text"),//durasi
                    jobject.getDouble(TAG_LAT),
                    jobject.getDouble(TAG_LNG)));

        }

after that, just modify your listview adapter to display those values.

Good Luck, and Sorry, I can't give you another code or modify your project, you would have to figure out yourself :)

P.S : Skripsi or Tugas Kuliah?

like image 170
reidzeibel Avatar answered Oct 27 '22 09:10

reidzeibel