5

sposób wyświetlania czasu podróży między dwoma lokalizacjami w Google Map Android API V2, w moim programie i przy użyciu JSONParse do wyświetlania odległości jazdy, ale nie mogę wyświetlić czas podróży wyświetlacz, ten przykładowy program zrobiłem: DirectionActivity.javaczas podróży między dwiema lokalizacjami w Google Map Android API V2

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; 
} 

} 
+0

ten link pomoże Ci http://wptrafficanalyzer.in/blog/driving-distance-and-travel-time-duration-between-two-locations-in-google-map-android-api-v2/ –

+0

@ Rachel Gallen dziękuje, ale nadal mylę się, jak ustawić czas podróży w moim programie, staram się połączyć mój program z tym samouczkiem, ale wciąż nie mogę –

Odpowiedz

2

Google Kierunki Odpowiedź JSON ma obiekt o nazwie Odległość i czas trwania w ciągu "nogi" tablicą, jak poniżej:

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

Dzięki temu możesz spróbować analizować odległość i czas trwania (jeśli potrzebujesz) do swojej aplikacji. Może tak:

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, i umieścić tablicę nogi parsowania wewnątrz ArrayTempatMakan parsowania. Mogę uzyskać odległość i czas trwania przy użyciu parsera Jackson JSON, więc powinieneś być w stanie to zrobić z parserisem org.JSON.

Powodzenia ^^

EDIT:

W tej metodzie getDirection (JSONObject jObj) pomyślnie odzyskać objLegs tutaj, trzeba uzyskać odległość, czas trwania w ciągu objLegs

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

myślę, że należy dodać poniżej 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. 

Uważam, że powinieneś być w stanie pobrać wartość, po czym możesz po prostu dodać wartość do wyniku na liście.

Jeśli nadal nie możesz wstawić odległości i czasu trwania, dodaj klasę TempatMakan do swojego wpisu.

EDIT 2:

Declare odległość i czas jako ciąg wewnątrz swojej TempatMakan.Java:

private String durasi; 
private String jarak; 

wewnątrz konstruktora:

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; 
} 

następnie zadeklarować odpowiednie pobierające i ustawiające dla jarak i durasi.

wewnątrz JSONHelper.java metoda getTempatMakanAll, dodać te:

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))); 

     } 

po tym, po prostu zmodyfikować zasilacz listview wyświetlanie tych wartości.

Powodzenia i Niestety, nie mogę dać inny kod lub zmodyfikować swój projekt, trzeba by dowiedzieć się :)

P.S: Skripsi lub Tugas Kuliah?

+0

Dziękuję bardzo, spróbuję tego,^^^ –

+0

możesz umieścić swój program w moim programie? wciąż mylić o Json parse –

+0

Zmieniono moją odpowiedź, spróbuj: D – reidzeibel

Powiązane problemy