How to draw route directions from a marker to another one ? Googlemaps v2 Android
22,165
Solution 1
As you have two points so send it through google json which provides to draw route between two points. See this example.
Route direction between two location
Solution 2
Assuming that you have the coordinates of the two points you want to draw, you can get the route from google using the following methods:
class GetDirection extends AsyncTask<String, String, String> {
@Override
protected void onPreExecute() {
super.onPreExecute();
dialog = new ProgressDialog(MapaAnunciante.this);
dialog.setMessage("Drawing the route, please wait!");
dialog.setIndeterminate(false);
dialog.setCancelable(false);
dialog.show();
}
protected String doInBackground(String... args) {
String stringUrl = "http://maps.googleapis.com/maps/api/directions/json?origin=" + origin+ "&destination=" + destination+ "&sensor=false";
StringBuilder response = new StringBuilder();
try {
URL url = new URL(stringUrl);
HttpURLConnection httpconn = (HttpURLConnection) url
.openConnection();
if (httpconn.getResponseCode() == HttpURLConnection.HTTP_OK) {
BufferedReader input = new BufferedReader(
new InputStreamReader(httpconn.getInputStream()),
8192);
String strLine = null;
while ((strLine = input.readLine()) != null) {
response.append(strLine);
}
input.close();
}
String jsonOutput = response.toString();
JSONObject jsonObject = new JSONObject(jsonOutput);
// routesArray contains ALL routes
JSONArray routesArray = jsonObject.getJSONArray("routes");
// Grab the first route
JSONObject route = routesArray.getJSONObject(0);
JSONObject poly = route.getJSONObject("overview_polyline");
String polyline = poly.getString("points");
pontos = decodePoly(polyline);
} catch (Exception e) {
}
return null;
}
protected void onPostExecute(String file_url) {
for (int i = 0; i < pontos.size() - 1; i++) {
LatLng src = pontos.get(i);
LatLng dest = pontos.get(i + 1);
try{
//here is where it will draw the polyline in your map
Polyline line = map.addPolyline(new PolylineOptions()
.add(new LatLng(src.latitude, src.longitude),
new LatLng(dest.latitude, dest.longitude))
.width(2).color(Color.RED).geodesic(true));
}catch(NullPointerException e){
Log.e("Error", "NullPointerException onPostExecute: " + e.toString());
}catch (Exception e2) {
Log.e("Error", "Exception onPostExecute: " + e2.toString());
}
}
dialog.dismiss();
}
}
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 p = new LatLng((((double) lat / 1E5)),
(((double) lng / 1E5)));
poly.add(p);
}
return poly;
}
Where origin
and destination
are two strings containing the lat and lng of the points, formatted like "-1.0,2.0":
String origin = "64.711696,12.170481";
String destination = "34.711696,2.170481";
To execute it, just call new GetDirection().execute();
Hope it helps!
Solution 3
You Need to use the Directions API in combination with the Android Maps util Lib
- Get the
Encoded Polyline
String from the Directions Api. - Decode the encoded string using Maps Util Lib into a list of lat/lng's (https://developers.google.com/maps/documentation/android/utility/#poly-encoding)
- Draw the Polyline on the map using the lat/lngs!
Comments
-
KingMaker almost 2 years
Here is my code :
public class MyGoogleMapActivity extends FragmentActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.googlemap); GoogleMap map = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map)).getMap(); map.setMyLocationEnabled(true); LatLng Paris= new LatLng(64.711696, 12.170481); map.addMarker(new MarkerOptions().title("LolluSaba").position(Paris)); LatLng Cinema= new LatLng(34.711696, 2.170481); map.addMarker(new MarkerOptions().title("Pseudo").position(Cinema)); } }
And i like to draw a route from Paris to Cinema. How can I do it very simply ?
-
KingMaker about 10 yearsSo i had to create an other class which is Get Direction ? Can I had this to Class MyGoogleMapActivity ?
-
Giacomoni about 10 yearsYes, you can create it inside your MyGoogleMapActivity, I created my GetDirection inside my activity too!
-
KingMaker about 10 yearsI have some errors : dialog cannot be resolved to a variable, MapaAnunciante cannot be resolved to a type, pontos cannot be resolved to a variable and The method decodePoly(String) is undefined for the type GetDirection. What should I do ?
-
Giacomoni about 10 yearsoh sry... MapaAnunciante is your MyGoogleMapActivity, pontos is defined as private List<LatLng> pontos;, the method decodePoly is just under the class, it should work
-
Giacomoni about 10 yearsJust declares a private ProgressDialog dialog;, so there will be a dialog while it draws the route
-
KingMaker about 10 yearsI created this inside of MyGoogleMapActivity and how can i call it because it shows me that -The type GetDirection is never used locally
-
Giacomoni about 10 yearsIt's like I said on the answer, you just call new GetDirection().execute(); when you want to draw the route... but call it after the String origin = "64.711696,12.170481"; String destination = "34.711696,2.170481";
-
KingMaker about 10 yearsI see this on the LogCat - the google play services resources were not found. check your project configuration to ensure that the resources are included. And we i clic on my app i can see "Drawing the route, please wait!" and after 2 sec it's my app close immediately.
-
Giacomoni about 10 yearsOh, that's because you didn't link the google-play-services to your projects. If you don't link it, you cannot use Google Maps in your app. You can check it here: stackoverflow.com/questions/14142496/…, here: stackoverflow.com/questions/14371725/…, and here: stackoverflow.com/questions/13715716/…
-
KingMaker about 10 yearsBefore try to draw the route. I had the possibility of showing the map. And i could mark my current location too. I already linked it.
-
KingMaker about 10 yearsNo. I still have the same problem. (I see this on the LogCat - the google play services resources were not found. check your project configuration to ensure that the resources are included. And we i clic on my app i can see "Drawing the route, please wait!" and after 2 sec it's my app close immediately.)
-
Giacomoni about 10 yearsThat's because you don't have the google play services linked in your project, so your google maps won't work. You need to follow the 3 tutorials I have sent to you on the previous comments
-
KingMaker about 10 yearsBefore I try to do the route, I could see my map and I had already linked google play services in my project.
-
Giacomoni about 10 yearsAnd if you doesn't call the asynctask that show the route, does is show the map? or it throws another exception?
-
KingMaker about 10 yearsif I do only class GetDirection { i have an error which is The method onPreExecute() is undefined for the type Object And if I do this : /*protected void onPreExecute() { super.onPreExecute(); dialog = new ProgressDialog(MyGoogleMapActivity.this); dialog.setMessage("Drawing the route, please wait!"); dialog.setIndeterminate(false); dialog.setCancelable(false); dialog.show(); }*/ I can see the map as before but i don't see the route ...
-
Dr.jacky over 9 years@giacomoni I do exactly like your codes, but it didn't draw anything!
-
Tushar Srivastava about 5 years{ "error_message" : "You must use an API key to authenticate each request to Google Maps Platform APIs. For additional information, please refer to g.co/dev/maps-no-account", "routes" : [], "status" : "REQUEST_DENIED"} Please suggest for this