Android Draw route between two geo location MapV2
This post about draw route between two geo location using
google map V2.
When I use the google map V2 its loading two fast.
I hope this post helpful for you
Screen Shot
Activity Source Code
package
com.androidbunch.drawroutev2;
import
java.util.ArrayList;
import java.util.List;
import
org.w3c.dom.Document;
import
com.google.android.gms.maps.CameraUpdateFactory;
import
com.google.android.gms.maps.GoogleMap;
import
com.google.android.gms.maps.SupportMapFragment;
import
com.google.android.gms.maps.model.LatLng;
import
com.google.android.gms.maps.model.MarkerOptions;
import
com.google.android.gms.maps.model.PolylineOptions;
import
com.google.android.maps.GeoPoint;
import
com.google.android.maps.Overlay;
import
android.location.Location;
import
android.location.LocationManager;
import
android.os.AsyncTask;
import
android.os.Bundle;
import
android.app.ProgressDialog;
import
android.graphics.Color;
import
android.graphics.drawable.Drawable;
import
android.support.v4.app.FragmentActivity;
/**
*
* @author VIJAYAKUMAR M
*This class for display route current location
to hotel location on google map V2
*/
public class MainActivity extends
FragmentActivity {
List<Overlay>
mapOverlays;
GeoPoint
point1, point2;
LocationManager
locManager;
Drawable
drawable;
Document
document;
GMapV2GetRouteDirection
v2GetRouteDirection;
LatLng
fromPosition;
LatLng
toPosition;
GoogleMap
mGoogleMap;
MarkerOptions
markerOptions;
Location
location ;
@Override
protected void onCreate(Bundle
savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
v2GetRouteDirection = new
GMapV2GetRouteDirection();
SupportMapFragment supportMapFragment =
(SupportMapFragment) getSupportFragmentManager()
.findFragmentById(R.id.map);
mGoogleMap =
supportMapFragment.getMap();
// Enabling
MyLocation in Google Map
mGoogleMap.setMyLocationEnabled(true);
mGoogleMap.getUiSettings().setZoomControlsEnabled(true);
mGoogleMap.getUiSettings().setCompassEnabled(true);
mGoogleMap.getUiSettings().setMyLocationButtonEnabled(true);
mGoogleMap.getUiSettings().setAllGesturesEnabled(true);
mGoogleMap.setTrafficEnabled(true);
mGoogleMap.animateCamera(CameraUpdateFactory.zoomTo(12));
markerOptions = new
MarkerOptions();
fromPosition = new
LatLng(11.663837, 78.147297);
toPosition = new
LatLng(11.723512, 78.466287);
GetRouteTask
getRoute = new GetRouteTask();
getRoute.execute();
}
/**
*
* @author VIJAYAKUMAR M
* This class Get Route
on the map
*
*/
private class GetRouteTask extends
AsyncTask<String, Void, String> {
private ProgressDialog Dialog;
String
response = "";
@Override
protected void onPreExecute()
{
Dialog = new
ProgressDialog(MainActivity.this);
Dialog.setMessage("Loading
route...");
Dialog.show();
}
@Override
protected String
doInBackground(String... urls) {
//Get All
Route values
document = v2GetRouteDirection.getDocument(fromPosition, toPosition,
GMapV2GetRouteDirection.MODE_DRIVING);
response = "Success";
return response;
}
@Override
protected void
onPostExecute(String result) {
mGoogleMap.clear();
if(response.equalsIgnoreCase("Success")){
ArrayList<LatLng>
directionPoint = v2GetRouteDirection.getDirection(document);
PolylineOptions
rectLine = new PolylineOptions().width(10).color(
Color.RED);
for (int i = 0; i <
directionPoint.size(); i++) {
rectLine.add(directionPoint.get(i));
}
// Adding
route on the map
mGoogleMap.addPolyline(rectLine);
markerOptions.position(toPosition);
markerOptions.draggable(true);
mGoogleMap.addMarker(markerOptions);
}
Dialog.dismiss();
}
}
@Override
protected void onStop() {
super.onStop();
finish();
}
}
Draw Route Helper Class
package
com.androidbunch.drawroutev2;
import
java.io.InputStream;
import
java.util.ArrayList;
import
javax.xml.parsers.DocumentBuilder;
import
javax.xml.parsers.DocumentBuilderFactory;
import
org.apache.http.HttpResponse;
import
org.apache.http.client.HttpClient;
import
org.apache.http.client.methods.HttpPost;
import
org.apache.http.impl.client.DefaultHttpClient;
import
org.apache.http.protocol.BasicHttpContext;
import
org.apache.http.protocol.HttpContext;
import
org.w3c.dom.Document;
import
org.w3c.dom.Node;
import
org.w3c.dom.NodeList;
import
com.google.android.gms.maps.model.LatLng;
import
android.util.Log;
public class
GMapV2GetRouteDirection {
public final static String MODE_DRIVING = "driving";
public final static String MODE_WALKING = "walking";
public
GMapV2GetRouteDirection() { }
public Document
getDocument(LatLng start, LatLng end, String mode) {
String url = "http://maps.googleapis.com/maps/api/directions/xml?"
+ "origin=" + start.latitude + "," + start.longitude
+ "&destination=" + end.latitude + "," + end.longitude
+ "&sensor=false&units=metric&mode=driving";
try {
HttpClient httpClient = new
DefaultHttpClient();
HttpContext localContext = new
BasicHttpContext();
HttpPost httpPost = new HttpPost(url);
HttpResponse response = httpClient.execute(httpPost,
localContext);
InputStream in =
response.getEntity().getContent();
DocumentBuilder builder =
DocumentBuilderFactory.newInstance().newDocumentBuilder();
Document doc = builder.parse(in);
return doc;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
public String
getDurationText (Document doc) {
NodeList nl1 =
doc.getElementsByTagName("duration");
Node node1 = nl1.item(0);
NodeList nl2 = node1.getChildNodes();
Node node2 = nl2.item(getNodeIndex(nl2,
"text"));
Log.i("DurationText",
node2.getTextContent());
return
node2.getTextContent();
}
public int getDurationValue
(Document doc) {
NodeList nl1 =
doc.getElementsByTagName("duration");
Node node1 = nl1.item(0);
NodeList nl2 = node1.getChildNodes();
Node node2 = nl2.item(getNodeIndex(nl2,
"value"));
Log.i("DurationValue",
node2.getTextContent());
return Integer.parseInt(node2.getTextContent());
}
public String
getDistanceText (Document doc) {
NodeList nl1 =
doc.getElementsByTagName("distance");
Node node1 = nl1.item(0);
NodeList nl2 = node1.getChildNodes();
Node node2 = nl2.item(getNodeIndex(nl2,
"text"));
Log.i("DistanceText",
node2.getTextContent());
return
node2.getTextContent();
}
public int
getDistanceValue (Document doc) {
NodeList nl1 = doc.getElementsByTagName("distance");
Node node1 = nl1.item(0);
NodeList nl2 = node1.getChildNodes();
Node node2 = nl2.item(getNodeIndex(nl2,
"value"));
Log.i("DistanceValue",
node2.getTextContent());
return Integer.parseInt(node2.getTextContent());
}
public String
getStartAddress (Document doc) {
NodeList nl1 =
doc.getElementsByTagName("start_address");
Node node1 = nl1.item(0);
Log.i("StartAddress", node1.getTextContent());
return
node1.getTextContent();
}
public String
getEndAddress (Document doc) {
NodeList nl1 =
doc.getElementsByTagName("end_address");
Node node1 = nl1.item(0);
Log.i("StartAddress",
node1.getTextContent());
return
node1.getTextContent();
}
public String
getCopyRights (Document doc) {
NodeList nl1 =
doc.getElementsByTagName("copyrights");
Node node1 = nl1.item(0);
Log.i("CopyRights",
node1.getTextContent());
return
node1.getTextContent();
}
public
ArrayList<LatLng> getDirection (Document doc) {
NodeList nl1, nl2, nl3;
ArrayList<LatLng> listGeopoints =
new
ArrayList<LatLng>();
nl1 = doc.getElementsByTagName("step");
if (nl1.getLength() > 0) {
for (int i = 0; i <
nl1.getLength(); i++) {
Node node1 = nl1.item(i);
nl2 = node1.getChildNodes();
Node locationNode =
nl2.item(getNodeIndex(nl2, "start_location"));
nl3 =
locationNode.getChildNodes();
Node latNode =
nl3.item(getNodeIndex(nl3, "lat"));
double lat = Double.parseDouble(latNode.getTextContent());
Node lngNode =
nl3.item(getNodeIndex(nl3, "lng"));
double lng = Double.parseDouble(lngNode.getTextContent());
listGeopoints.add(new LatLng(lat,
lng));
locationNode =
nl2.item(getNodeIndex(nl2, "polyline"));
nl3 =
locationNode.getChildNodes();
latNode =
nl3.item(getNodeIndex(nl3, "points"));
ArrayList<LatLng> arr =
decodePoly(latNode.getTextContent());
for(int j = 0 ; j <
arr.size() ; j++) {
listGeopoints.add(new
LatLng(arr.get(j).latitude, arr.get(j).longitude));
}
locationNode =
nl2.item(getNodeIndex(nl2, "end_location"));
nl3 =
locationNode.getChildNodes();
latNode =
nl3.item(getNodeIndex(nl3, "lat"));
lat = Double.parseDouble(latNode.getTextContent());
lngNode =
nl3.item(getNodeIndex(nl3, "lng"));
lng = Double.parseDouble(lngNode.getTextContent());
listGeopoints.add(new LatLng(lat,
lng));
}
}
return listGeopoints;
}
private int
getNodeIndex(NodeList nl, String nodename) {
for(int i = 0 ; i <
nl.getLength() ; i++) {
if(nl.item(i).getNodeName().equals(nodename))
return i;
}
return -1;
}
private
ArrayList<LatLng> decodePoly(String encoded) {
ArrayList<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;
}
}
Xml source Code
activity_main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
tools:context=".MainActivity" >
<fragment
android:id="@+id/map"
android:layout_width="match_parent"
android:layout_height="match_parent"
class="com.google.android.gms.maps.SupportMapFragment"
/>
</RelativeLayout>
AndroidManifest.xml
<?xml version="1.0"
encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.androidbunch.drawroutev2"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="16"
/>
<supports-screens
android:anyDensity="true"
android:largeScreens="true"
android:normalScreens="true"
android:resizeable="true"
android:smallScreens="true"
/>
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@android:style/Theme.NoTitleBar" >
<meta-data
android:name="com.google.android.maps.v2.API_KEY"
android:value="AIzaSyBE-ZNBoODzqQoA2BMswmoEWAeHMSvgt3M"
/>
<activity
android:name="com.androidbunch.drawroutev2.MainActivity"
android:label="@string/app_name"
android:screenOrientation="landscape"
>
<intent-filter>
<action android:name="android.intent.action.MAIN"
/>
<category android:name="android.intent.category.LAUNCHER"
/>
</intent-filter>
</activity>
</application>
<permission
android:name="com.androidbunch.drawroutev2.permission.MAPS_RECEIVE"
android:protectionLevel="signature"
/>
<uses-feature
android:glEsVersion="0x00020000"
android:required="true"
/>
<uses-permission android:name="com.androidbunch.drawroutev2.permission.MAPS_RECEIVE"
/>
<uses-permission android:name="android.permission.INTERNET"
/>
<uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES"
/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"
/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"
/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"
/>
</manifest>