gpt4 book ai didi

android - Google Map Android API V2 中两个位置之间的旅行时间

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:56:58 25 4
gpt4 key购买 nike

如何在 Google Map Android API V2 中显示两个位置之间的旅行时间,在我的程序中,我使用 JSONParse 来显示行驶距离,但我无法显示显示行驶时间,我制作的这个示例程序: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;
}
}

主 Activity .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;
}

}

最佳答案

Google Directions JSON Response 在“LEGS”数组中有一个名为 Distance 和 Duration 的对象,如下所示:

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

因此,您可以尝试将距离和持续时间(如果需要)解析到您的应用中。也许像这样:

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
}

哦,将腿数组解析放在 ArrayTempatMakan 解析中。我可以使用 Jackson JSON 解析器获取距离和持续时间,因此您应该可以使用 org.JSON 解析器来完成。

祝你好运^^

编辑:

在这个getDirection(JSONObject jObj)方法中你成功的获取了objLegs这里,你需要获取objLegs中的Distance和Duration/p>

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

我认为你应该在 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.

在那里,我相信你应该能够获取值,之后,你可以将值添加到你的列表结果中。

如果您仍然无法插入距离和持续时间,请在您的帖子中包含 TempatMakan 类。

编辑 2:

在您的 TempatMakan.Java 中将距离和持续时间声明为字符串:

private String durasi;
private String jarak;

在你的构造函数中:

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

然后为 jarakdurasi 分别声明 getter 和 setter。

在您的 JSONHelper.java 中,getTempatMakanAll 方法中,添加以下内容:

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

}

之后,只需修改您的 ListView 适配器即可显示这些值。

祝你好运,抱歉,我不能给你另一个代码或修改你的项目,你必须自己弄清楚:)

附言:Skripsi 还是 Tugas Kuliah?

关于android - Google Map Android API V2 中两个位置之间的旅行时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16756955/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com