kirti Hudda
kirti Hudda

Reputation: 304

How can we calculate distance between current location to lots of destination places in android?

I want to calculate the distance Between two location(i.e current location of user and destination location). I have latitude and longitude of destination places in my database and current location(i do find by Location Manager class). I need to display that calculated distance in a listview. if i calculate it by any Mathematical formulae or DistanceTo() and DistanceBetween() method of Location class then I don't get accurate distance as over map. and if i calculate the distance by Distance Matrix API of Google then its taking too much time to calculate the distance and in loading the list.(as there are lots of destination places with one current location of user) Please anyone suggest me the best way to calculate it.. i am stuck in this problem from last few days..Help me Thanks in advance...

Upvotes: 1

Views: 6618

Answers (3)

TharakaNirmana
TharakaNirmana

Reputation: 10353

If there are many locations use a loop. Only a few lines of code to get this done:

Location l1=new Location("One");
l1.setLatitude(location.getLatitude());
l1.setLongitude(location.getLongitude());

Location l2=new Location("Two");
l2.setLatitude(Double.parseDouble(frnd_lat));
l2.setLongitude(Double.parseDouble(frnd_longi));

float distance_bw_one_and_two=l1.distanceTo(l2);

Upvotes: 1

kirti Hudda
kirti Hudda

Reputation: 304

Finally after lots of googling I have done my task.I tried it by Asynchronous Task.. Here is my code..

public View getView(int position, View convertView, ViewGroup Parent) 
  {
 final ViewHolder holder=new ViewHolder();
 View view=convertView;
 if (view==null) {
     convertView= inflater.inflate(R.layout.layout_row, null);
 }



holder.textdistance=(TextView) convertView.findViewById(R.id.textView_Distance);

   holder.position = position;


  if(data.size()<=0)
   {

   Toast.makeText(activity, "No data", Toast.LENGTH_LONG).show();
  }
  else
  {
   **new ThumbnailTask(position, holder)
   .executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, null);**
   }
 return convertView;



  }
   //Thumbnail Class
 private static class ThumbnailTask extends AsyncTask {
    private int mPosition;
    private ViewHolder mHolder;

    public ThumbnailTask(int position, ViewHolder holder) {
        mPosition = position;
        mHolder = holder;
    }



    /* (non-Javadoc)
     * @see android.os.AsyncTask#doInBackground(Params[])
     */
    @Override
    protected Object doInBackground(Object... params) {
        // TODO Auto-generated method stub
        String Distance="3";
         String uri="https://maps.googleapis.com/maps/api/distancematrix/json?  origins=(Your source Addres like XYZ,South Delhi-110064),&mode=deriving&sensor=false&key=(Your API Key)";


            String result= GET(uri);
            Log.d("result","res="+result);

             try {

                    //jArray = new JSONObject(result);
                     JSONObject object = (JSONObject) new JSONTokener(result).nextValue();
                     JSONArray array = object.getJSONArray("rows");
                    // Log.d("JSON","array: "+array.toString());

                 //Routes is a combination of objects and arrays
                 JSONObject rows = array.getJSONObject(0);
                     //Log.d("JSON","routes: "+routes.toString());
                 JSONArray elements = rows.getJSONArray("elements");
                // Log.d("JSON","legs: "+legs.toString());

                JSONObject steps = elements.getJSONObject(0);
                     //Log.d("JSON","steps: "+steps.toString());

                JSONObject distance = steps.getJSONObject("distance");
                 Log.d("JSON","distance: "+distance.toString());

                   Distance = distance.getString("text");
                    Log.d("final value","tot dis="+Distance);
                    JSONObject duration=steps.getJSONObject("duration");
                 // MyDuration=duration.getString("text");


                 }
                 catch(JSONException e)
                         {
                     Log.d("JSONEXCeption","my exce"+e.getMessage());
                         }
             return Distance;
    }



    @Override
    protected void onPostExecute(Object result) {
        // TODO Auto-generated method stub
    mHolder.textdistance.setText(result.toString());
    }


}

 //method to execute Url

 private static  String GET(String url)
   {
    InputStream inputStream = null;
   String result = "";
    try {

     // create HttpClient
     HttpClient httpclient = new DefaultHttpClient();

     // make GET request to the given URL
     HttpResponse httpResponse = httpclient.execute(new HttpGet(url));


     // receive response as inputStream
     inputStream = httpResponse.getEntity().getContent();



     // convert inputstream to string
     if(inputStream != null)
         result = convertInputStreamToString(inputStream);

//     Log.i("Result",result);

     else
         result = "Did not work!";

 } catch (Exception e) {
     Log.d("InputStream", "hello"+e);
 }

 return result;




   }


 private static  String convertInputStreamToString(InputStream inputStream) throws   IOException{
        BufferedReader bufferedReader = new BufferedReader( new InputStreamReader(inputStream));
        String line = "";
        String result = "";
        while((line = bufferedReader.readLine()) != null)
            result += line;

        inputStream.close();
        return result;

    }


 }  

Reference Links are-

http://lucasr.org/2012/04/05/performance-tips-for-androids-listview/ https://developers.google.com/maps/documentation/distancematrix/

I am not good in explaining but i am trying my best.Hope it would help to others people like me as i got stuck in this task.

Upvotes: 2

IntelliJ Amiya
IntelliJ Amiya

Reputation: 75788

Try this .I add this in my old application. It works for me .By the way Initialize R=Radius . Read this article carefully

 public double CalculationByDistance(GeoPoint StartP, GeoPoint EndP) {
      double lat1 = StartP.getLatitudeE6()/1E6;
      double lat2 = EndP.getLatitudeE6()/1E6;
      double lon1 = StartP.getLongitudeE6()/1E6;
      double lon2 = EndP.getLongitudeE6()/1E6;
      double dLat = Math.toRadians(lat2-lat1);
      double dLon = Math.toRadians(lon2-lon1);
      double a = Math.sin(dLat/2) * Math.sin(dLat/2) +
         Math.cos(Math.toRadians(lat1)) * Math.cos(Math.toRadians(lat2)) *
         Math.sin(dLon/2) * Math.sin(dLon/2);
      double c = 2 * Math.asin(Math.sqrt(a));
      return Radius * c;
   }

Upvotes: 1

Related Questions