How can find nearest place from current location from given data.

后端 未结 3 566
-上瘾入骨i
-上瘾入骨i 2021-02-02 03:31

I have list of location address. from my current location, i need to get the nearest place and have to show it on map. How can i get nearest place from my current location. Firs

相关标签:
3条回答
  • 2021-02-02 03:59

    Step by step,

    How to get the list of nearest place of a location.

    Step 1 : Go to API Console for obtaining the Place API

    https://code.google.com/apis/console/

    and select on services tab

    Service

    on the place service

    enter image description here

    now select API Access tab and get the API KEY

    enter image description here

    now you have a API key for getting place


    Now in programming

    *Step 2 * : first create a class named Place.java. This class is used to contain the property of place which are provided by Place api.

    package com.android.code.GoogleMap.NearsetLandmark;
    
    import java.util.logging.Level;
    import java.util.logging.Logger;
    import org.json.JSONException;
    import org.json.JSONObject;
    
    
    public class Place {
        private String id;
        private String icon;
        private String name;
        private String vicinity;
        private Double latitude;
        private Double longitude;
    
        public String getId() {
            return id;
        }
    
        public void setId(String id) {
            this.id = id;
        }
    
        public String getIcon() {
            return icon;
        }
    
        public void setIcon(String icon) {
            this.icon = icon;
        }
    
        public Double getLatitude() {
            return latitude;
        }
    
        public void setLatitude(Double latitude) {
            this.latitude = latitude;
        }
    
        public Double getLongitude() {
            return longitude;
        }
    
        public void setLongitude(Double longitude) {
            this.longitude = longitude;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public String getVicinity() {
            return vicinity;
        }
    
        public void setVicinity(String vicinity) {
            this.vicinity = vicinity;
        }
    
        static Place jsonToPontoReferencia(JSONObject pontoReferencia) {
            try {
                Place result = new Place();
                JSONObject geometry = (JSONObject) pontoReferencia.get("geometry");
                JSONObject location = (JSONObject) geometry.get("location");
                result.setLatitude((Double) location.get("lat"));
                result.setLongitude((Double) location.get("lng"));
                result.setIcon(pontoReferencia.getString("icon"));
                result.setName(pontoReferencia.getString("name"));
                result.setVicinity(pontoReferencia.getString("vicinity"));
                result.setId(pontoReferencia.getString("id"));
                return result;
            } catch (JSONException ex) {
                Logger.getLogger(Place.class.getName()).log(Level.SEVERE, null, ex);
            }
            return null;
        }
    
        @Override
        public String toString() {
            return "Place{" + "id=" + id + ", icon=" + icon + ", name=" + name + ", latitude=" + latitude + ", longitude=" + longitude + '}';
        }
    
    }
    

    Now create a class named PlacesService

    package com.android.code.GoogleMap.NearsetLandmark;
    
    import java.io.BufferedReader;
    import java.io.InputStreamReader;
    import java.net.URL;
    import java.net.URLConnection;
    import java.util.ArrayList;
    import java.util.List;
    import java.util.logging.Level;
    import java.util.logging.Logger;
    import org.json.JSONArray;
    import org.json.JSONException;
    import org.json.JSONObject;
    
    import android.util.Log;
    
    
    public class PlacesService {
    
        private String API_KEY;
    
        public PlacesService(String apikey) {
            this.API_KEY = apikey;
        }
    
        public void setApiKey(String apikey) {
            this.API_KEY = apikey;
        }
    
        public List<Place> findPlaces(double latitude, double longitude,String placeSpacification) 
        {
    
            String urlString = makeUrl(latitude, longitude,placeSpacification);
    
    
            try {
                String json = getJSON(urlString);
    
                System.out.println(json);
                JSONObject object = new JSONObject(json);
                JSONArray array = object.getJSONArray("results");
    
    
                ArrayList<Place> arrayList = new ArrayList<Place>();
                for (int i = 0; i < array.length(); i++) {
                    try {
                        Place place = Place.jsonToPontoReferencia((JSONObject) array.get(i));
    
                        Log.v("Places Services ", ""+place);
    
    
                        arrayList.add(place);
                    } catch (Exception e) {
                    }
                }
                return arrayList;
            } catch (JSONException ex) {
                Logger.getLogger(PlacesService.class.getName()).log(Level.SEVERE, null, ex);
            }
            return null;
        }
    //https://maps.googleapis.com/maps/api/place/search/json?location=28.632808,77.218276&radius=500&types=atm&sensor=false&key=api key
        private String makeUrl(double latitude, double longitude,String place) {
             StringBuilder urlString = new StringBuilder("https://maps.googleapis.com/maps/api/place/search/json?");
    
            if (place.equals("")) {
                    urlString.append("&location=");
                    urlString.append(Double.toString(latitude));
                    urlString.append(",");
                    urlString.append(Double.toString(longitude));
                    urlString.append("&radius=1000");
                 //   urlString.append("&types="+place);
                    urlString.append("&sensor=false&key=" + API_KEY);
            } else {
                    urlString.append("&location=");
                    urlString.append(Double.toString(latitude));
                    urlString.append(",");
                    urlString.append(Double.toString(longitude));
                    urlString.append("&radius=1000");
                    urlString.append("&types="+place);
                    urlString.append("&sensor=false&key=" + API_KEY);
            }
    
    
            return urlString.toString();
        }
    
        protected String getJSON(String url) {
            return getUrlContents(url);
        }
    
        private String getUrlContents(String theUrl) 
        {
            StringBuilder content = new StringBuilder();
    
            try {
                URL url = new URL(theUrl);
                URLConnection urlConnection = url.openConnection();
                BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(urlConnection.getInputStream()), 8);
                String line;
                while ((line = bufferedReader.readLine()) != null) 
                {
                    content.append(line + "\n");
                }
    
                bufferedReader.close();
            }
    
            catch (Exception e)
            {
    
                e.printStackTrace();
    
            }
    
            return content.toString();
        }
    }
    

    Now create a new Activity where you want to get the list of nearest places.

    /** * */

        public class CheckInActivity extends ListActivity{
    
    
    @Override
    protected void onCreate(Bundle arg0) {
        // TODO Auto-generated method stub
        super.onCreate(arg0);
    
        new GetPlaces(this, getListView()).execute();
    
    }
    
    
    
    
    class GetPlaces extends AsyncTask<Void, Void, Void>{
    
            private ProgressDialog dialog;
            private Context context;
            private String[] placeName;
            private String[] imageUrl;
            private ListView listView;
    
            public GetPlaces(Context context, ListView listView) {
                // TODO Auto-generated constructor stub
                this.context = context;
                this.listView = listView;
            }
    
            @Override
            protected void onPostExecute(Void result) {
                // TODO Auto-generated method stub
                super.onPostExecute(result);
                dialog.dismiss();
    
                listView.setAdapter(new ArrayAdapter<String>(context, android.R.layout.simple_expandable_list_item_1,placeName));
            }
    
            @Override
            protected void onPreExecute() {
                // TODO Auto-generated method stub
                super.onPreExecute();
                dialog = new ProgressDialog(context);
                dialog.setCancelable(true);
                dialog.setMessage("Loading..");
                dialog.isIndeterminate();
                dialog.show();
            }
    
            @Override
            protected Void doInBackground(Void... arg0) {
                // TODO Auto-generated method stub
                PlacesService service = new PlacesService("AIzaSyDIRAipDcVMf1FGYHEGDRzvLv0SFH46uRQ");
                  List<Place> findPlaces = service.findPlaces(28.632808,77.218276,"hospital");  // hq for hospital
                                                                                            // atm for ATM
    
                    placeName = new String[findPlaces.size()];
                    imageUrl = new String[findPlaces.size()];
    
                  for (int i = 0; i < findPlaces.size(); i++) {
    
                      Place placeDetail = findPlaces.get(i);
                      placeDetail.getIcon();
    
                    System.out.println(  placeDetail.getName());
                    placeName[i] =placeDetail.getName();
    
                    imageUrl[i] =placeDetail.getIcon();
    
                }
                return null;
            }
    
        }
    
    }
    
    0 讨论(0)
  • 2021-02-02 04:11

    First get your current location Lattitude & Longitude, then get Lattitude & Longitude of each locations you have and find out distance of each place from your current location using distanceTo method of Location class and after that find out least distance from your list.

    0 讨论(0)
  • 2021-02-02 04:13

    You have your current location latitude an longitude so just find out distance between your current location and list of location address geopoints using this formula and display address with shortest distance.

    private double distance(double lat1, double lon1, double lat2, double lon2) {
            // haversine great circle distance approximation, returns meters
            double theta = lon1 - lon2;
            double dist = Math.sin(deg2rad(lat1)) * Math.sin(deg2rad(lat2))
                    + Math.cos(deg2rad(lat1)) * Math.cos(deg2rad(lat2))
                    * Math.cos(deg2rad(theta));
            dist = Math.acos(dist);
            dist = rad2deg(dist);
            dist = dist * 60; // 60 nautical miles per degree of seperation
            dist = dist * 1852; // 1852 meters per nautical mile
            return (dist);
        }
    
        private double deg2rad(double deg) {
            return (deg * Math.PI / 180.0);
        }
    
        private double rad2deg(double rad) {
            return (rad * 180.0 / Math.PI);
        }
    
    0 讨论(0)
提交回复
热议问题