Reputation: 15
In android Google Map , I want to draw a path between two places.
When Iam Using Hardcoded latitude and Longitude Showing Perfectly.
Problem-1
But Latitude and Longitude Getting from other Intent Showing Blue Screen in Map
Then closing that page again opening its Showing path Between Two Points.
Problem-2
then Iam Changing the Latitude and longitude of Both Locations its Showing Previous Location Path.
Here Latitute and Longitude values Iam getting from Previous intent.
How to resolve it. I Have Added my Code
MainActivity .java
public class MainActivity extends FragmentActivity implements OnInfoWindowClickListener{
public double Latitude1_Current_double,Longitutde1_Current_double,Latitude1_Center_double,Longitude1_Center_double;
private int zoomLevel = 11;
LatLng origin1 = new LatLng(Latitude1_Current_double, Longitutde1_Current_double);
LatLng dest1 = new LatLng(Latitude1_Service_double,Longitude1_Service_double);
double lat1=Latitude1_Current_double;
double lang1=Longitutde1_Current_double;
double lat2=Latitude1_Center_double;
double lang2=Longitude1_Center_double;
GoogleMap map;
ArrayList<LatLng> markerPoints;
/*private int zoomLevel1 = 14;
private int zoomLevel2 = 11;*/
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Bundle extras = getIntent().getExtras();
String Latitude1_Current_String=extras.getString("STRING_I_NEED_LATITUDE_Current");
String Longitutde1_Current_String =extras.getString("STRING_I_NEED_LONGITUDE_Current");
String Latitude1_ServiceCenter_String =extras.getString("STRING_I_NEED_LATITUDE_ServiceCenter");
String Longitude1_ServiceCenter_String =extras.getString("STRING_I_NEED_LONGITUDE_ServiceCenter");
Latitude1_Current_double = Double.parseDouble(Latitude1_Current_String);
Longitutde1_Current_double = Double.parseDouble(Longitutde1_Current_String);
Latitude1_ServiceCenter_double = Double.parseDouble(Latitude1_ServiceCenter_String);
Longitude1_ServiceCenter_double = Double.parseDouble(Longitude1_ServiceCenter_String);
Toast.makeText(getApplicationContext(), "Get Direction"+Latitude1_Current_double+","+Longitutde1_Current_double+
Latitude1_Center_double+","+Longitude1_Center_double,Toast.LENGTH_SHORT).show();
// Initializing
markerPoints = new ArrayList<LatLng>();
// Getting reference to SupportMapFragment of the activity_main
SupportMapFragment fm = (SupportMapFragment)getSupportFragmentManager().findFragmentById(R.id.map);
// Getting reference to Button
// Button btnDraw = (Button)findViewById(R.id.btn_draw);
// Getting Map for the SupportMapFragment
map = fm.getMap();
// Enable MyLocation Button in the Map
map.setMyLocationEnabled(true);
map.addMarker(new MarkerOptions().position(origin1)
.title("User Current Location")
.snippet("LatLng"+"("+lat1+","+lang1+")")
.icon(BitmapDescriptorFactory
.defaultMarker(BitmapDescriptorFactory.HUE_GREEN)));
map.addMarker(new MarkerOptions().position(dest1)
.title("Service Center Destination Location")
.snippet("LatLng"+"("+lat2+","+lang2+")")
.icon(BitmapDescriptorFactory
.defaultMarker(BitmapDescriptorFactory.HUE_RED)));
map.moveCamera(CameraUpdateFactory.newLatLngZoom(origin1, zoomLevel));
map.moveCamera(CameraUpdateFactory.newLatLngZoom(dest1, zoomLevel));
markerPoints.add(origin1);
markerPoints.add(dest1);
// Getting URL to the Google Directions API
String url = getDirectionsUrl(origin1, dest1);
DownloadTask downloadTask = new DownloadTask();
// Start downloading json data from Google Directions API
downloadTask.execute(url);
// The map will be cleared on long click
map.setOnMapLongClickListener(new OnMapLongClickListener() {
@Override
public void onMapLongClick(LatLng point) {
// Removes all the points from Google Map
map.clear();
// Removes all the points in the ArrayList
markerPoints.clear();
}
});
}
private String getDirectionsUrl(LatLng origin,LatLng dest){
// Origin of route
String str_origin = "origin="+origin.latitude+","+origin.longitude;
// Destination of route
String str_dest = "destination="+dest.latitude+","+dest.longitude;
// Sensor enabled
String sensor = "sensor=false";
// Waypoints
String waypoints = "";
for(int i=2;i<markerPoints.size();i++)
{
LatLng point = (LatLng) markerPoints.get(i);
if(i==2)
waypoints = "waypoints=";
waypoints += point.latitude + "," + point.longitude + "|";
}
// Building the parameters to the web service
String parameters = str_origin+"&"+str_dest+"&"+sensor+"&"+waypoints;
// Output format
String output = "json";
// Building the url to the web service
String url = "https://maps.googleapis.com/maps/api/directions/"+output+"?"+parameters;
return url;
}
/** A method to download json data from url */
private String downloadUrl(String strUrl) throws IOException{
String data = "";
InputStream iStream = null;
HttpURLConnection urlConnection = null;
try{
URL url = new URL(strUrl);
// Creating an http connection to communicate with url
urlConnection = (HttpURLConnection) url.openConnection();
// Connecting to url
urlConnection.connect();
// Reading data from url
iStream = urlConnection.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(iStream));
StringBuffer sb = new StringBuffer();
String line = "";
while( ( line = br.readLine()) != null){
sb.append(line);
}
data = sb.toString();
br.close();
}catch(Exception e){
Log.d("Exception while downloading url", e.toString());
}finally{
iStream.close();
urlConnection.disconnect();
}
return data;
}
// Fetches data from url passed
private class DownloadTask extends AsyncTask<String, Void, String>{
// Downloading data in non-ui thread
@Override
protected String doInBackground(String... url) {
// For storing data from web service
String data = "";
try{
// Fetching the data from web service
data = downloadUrl(url[0]);
}catch(Exception e){
Log.d("Background Task",e.toString());
}
return data;
}
// Executes in UI thread, after the execution of
// doInBackground()
@Override
protected void onPostExecute(String result)
{
super.onPostExecute(result);
try
{
ParserTask parserTask = new ParserTask();
// Invokes the thread for parsing the JSON data
parserTask.execute(result);
}
catch (Exception e)
{
e.printStackTrace();
Log.i("Exceptoin in DownloadTask onPostExecute", "Errroor");
}
}
}
/** A class to parse the Google Places in JSON format */
private class ParserTask extends AsyncTask<String, Integer, List<List<HashMap<String,String>>> >{
// Parsing the data in non-ui thread
@Override
protected List<List<HashMap<String, String>>> doInBackground(String... jsonData) {
JSONObject jObject;
List<List<HashMap<String, String>>> routes = null;
try{
jObject = new JSONObject(jsonData[0]);
DirectionsJSONParser parser = new DirectionsJSONParser();
// Starts parsing data
routes = parser.parse(jObject);
}catch(Exception e){
e.printStackTrace();
}
return routes;
}
// Executes in UI thread, after the parsing process
@Override
protected void onPostExecute(List<List<HashMap<String, String>>> result)
{
try
{
ArrayList<LatLng> points = null;
PolylineOptions lineOptions = null;
// Traversing through all the routes
for(int i=0;i<result.size();i++){
points = new ArrayList<LatLng>();
lineOptions = new PolylineOptions();
// Fetching i-th route
List<HashMap<String, String>> path = result.get(i);
// Fetching all the points in i-th route
for(int j=0;j<path.size();j++){
HashMap<String,String> point = path.get(j);
double lat = Double.parseDouble(point.get("lat"));
double lng = Double.parseDouble(point.get("lng"));
LatLng position = new LatLng(lat, lng);
points.add(position);
}
// Adding all the points in the route to LineOptions
lineOptions.addAll(points);
lineOptions.width(5);
lineOptions.color(Color.BLUE);
}
// Drawing polyline in the Google Map for the i-th route
map.addPolyline(lineOptions);
}
catch (Exception e)
{
e.printStackTrace();
Log.i("Exceptoin in parsing process onPostExecute", "Errroor");
}
}
}
@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
public void onInfoWindowClick(Marker marker)
{
Intent intent = new Intent(this, NewActivity.class);
intent.putExtra("snippet", marker.getSnippet());
intent.putExtra("title", marker.getTitle());
intent.putExtra("position", marker.getPosition());
startActivity(intent);
}
}
DirectionsJSONParser.java
import com.google.android.gms.maps.model.LatLng;
public class DirectionsJSONParser {
/** Receives a JSONObject and returns a list of lists containing latitude and longitude */
public List<List<HashMap<String,String>>> parse(JSONObject jObject){
List<List<HashMap<String, String>>> routes = new ArrayList<List<HashMap<String,String>>>();
JSONArray jRoutes = null;
JSONArray jLegs = null;
JSONArray jSteps = null;
try {
jRoutes = jObject.getJSONArray("routes");
/** Traversing all routes */
for(int i=0;i<jRoutes.length();i++){
jLegs = ( (JSONObject)jRoutes.get(i)).getJSONArray("legs");
List path = new ArrayList<HashMap<String, String>>();
/** Traversing all legs */
for(int j=0;j<jLegs.length();j++){
jSteps = ( (JSONObject)jLegs.get(j)).getJSONArray("steps");
/** Traversing all steps */
for(int k=0;k<jSteps.length();k++){
String polyline = "";
polyline = (String)((JSONObject)((JSONObject)jSteps.get(k)).get("polyline")).get("points");
List<LatLng> list = decodePoly(polyline);
/** Traversing all points */
for(int l=0;l<list.size();l++){
HashMap<String, String> hm = new HashMap<String, String>();
hm.put("lat", Double.toString(((LatLng)list.get(l)).latitude) );
hm.put("lng", Double.toString(((LatLng)list.get(l)).longitude) );
path.add(hm);
}
}
routes.add(path);
}
}
} catch (JSONException e) {
e.printStackTrace();
}catch (Exception e){
}
return routes;
}
/**
* Method to decode polyline points
* Courtesy : jeffreysambells.com/2010/05/27/decoding-polylines-from-google-maps-direction-api-with-java
* */
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;
}
}
Upvotes: 0
Views: 714
Reputation: 812
Figured out your problem:
public double Latitude1_Current_double,Longitutde1_Current_double,Latitude1_Center_double,Longitude1_Center_double;
private int zoomLevel = 11;
LatLng origin1 = new LatLng(Latitude1_Current_double, Longitutde1_Current_double);
LatLng dest1 = new LatLng(Latitude1_Service_double,Longitude1_Service_double);
double lat1=Latitude1_Current_double;
double lang1=Longitutde1_Current_double;
double lat2=Latitude1_Center_double;
double lang2=Longitude1_Center_double;
The variables origin1 and dest1 does not change even if you change lat1 and lang1, so map.addMarker(new MarkerOptions().position(origin1)
will have origin1 =(0,0) the default value. You need to make sure that variables origin1 and dest1 are modified inside onCreate method so your markers does not placed in the middle of the ocean. Hope this clarifies. I've tested your code and as soon as I put origin1 and dest1 the correct lat/lng info in onCreate method, I've got desired result.
Upvotes: 3