Saya mencoba membuat aplikasi GPS yang dapat menunjukkan arah antara 2 tempat. Untuk mendekode polyline saya menggunakan kode dari sini: Mendekode Polyline dari Google Maps Direction API dengan Java. Saya ingin menunjukkan rute saya lebih akurat dari ini, saya dapat melakukannya melalui kml tetapi ini berfungsi untuk jarak yang sangat kecil hanya setelah ukuran file mencapai batas. Berikut tangkapan layar Boston-Seattle dengan garis di peta tidak mengikuti jalan tetapi memotong jalan
Inilah cara saya menggunakan API petunjuk arah
public void drawRoute(String source, String destination)
{
String strURL = "http://maps.google.com/maps/api/directions/xml?origin=" + source +
"&destination=" + destination + "&sensor=false&mode=driving";
String url = strURL.replace(" ", "%20");
HttpGet get = new HttpGet(url);
String strResult = "";
try {
HttpParams httpParameters = new BasicHttpParams();
HttpConnectionParams.setConnectionTimeout(httpParameters, 3000);
HttpClient httpClient = new DefaultHttpClient(httpParameters);
HttpResponse httpResponse = null;
httpResponse = httpClient.execute(get);
if (httpResponse.getStatusLine().getStatusCode() == 200){
strResult = EntityUtils.toString(httpResponse.getEntity());
}
}
catch (Exception e){ }
if (-1 == strResult.indexOf("<status>OK</status>")){
this.finish();
return;
}
int pos = strResult.indexOf("<overview_polyline>");
pos = strResult.indexOf("<points>", pos + 1);
int pos2 = strResult.indexOf("</points>", pos);
strResult = strResult.substring(pos + 8, pos2);
List<GeoPoint> points = decodePoly(strResult);
RouteOverlay mOverlay = new RouteOverlay(points);
overlayList.add(mOverlay);
if (points.size() >= 2){
controller.animateTo(points.get(0));
}
map.invalidate();
}
Ini kelas RouteOverlay saya:
public class RouteOverlay extends Overlay{
private List<GeoPoint> points;
private Paint paint;
public RouteOverlay(List<GeoPoint> points) {
this.points = points;
paint = new Paint();
paint.setColor(Color.BLUE);
paint.setAlpha(150);
paint.setAntiAlias(true);
paint.setStyle(Paint.Style.FILL_AND_STROKE);
paint.setStrokeWidth(4);
}
@Override
public void draw(Canvas canvas, MapView mapView, boolean shadow)
{
if (!shadow)
{
Projection projection = mapView.getProjection();
if (points != null && points.size() >= 2)
{
Point start = new Point();
projection.toPixels(points.get(0), start);
for (int i = 1; i < points.size(); i++)
{
Point end = new Point();
projection.toPixels(points.get(i), end);
canvas.drawLine(start.x, start.y, end.x, end.y, paint);
start = end;
}
}
}
}
}