Android应用将一组坐标与当前位置进行比较,并提供附近地点的列表

时间:2014-11-18 00:50:51

标签: java android xml gps

请问我一直在尝试开发一个应用程序,可以将地点列表及其坐标与用户的当前位置进行比较,并显示给定列表中附近地点的列表,我能够得到我的应用程序获取当前位置并显示到给定坐标的路线,但我不知道从这里开始的地方,从我将提供的坐标获取附近的地点列表。下面是我的java和xml代码。谢谢

Java文件

import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.net.HttpURLConnection;
    import java.net.URL;
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;

    import org.json.JSONObject;

    import android.graphics.Color;
    import android.location.Criteria;
    import android.location.Location;
    import android.location.LocationManager;
    import android.os.AsyncTask;
    import android.os.Bundle;
    import android.support.v4.app.FragmentActivity;
    import android.util.Log;
    import android.view.Menu;


    import com.google.android.gms.maps.CameraUpdateFactory;
    import com.google.android.gms.maps.GoogleMap;
    import com.google.android.gms.maps.GoogleMap.OnMapClickListener;
    import com.google.android.gms.maps.SupportMapFragment;
    import com.google.android.gms.maps.model.BitmapDescriptorFactory;
    import com.google.android.gms.maps.model.LatLng;
    import com.google.android.gms.maps.model.MarkerOptions;
    import com.google.android.gms.maps.model.PolylineOptions;
    public class MyLefkosa extends FragmentActivity {

        GoogleMap map;
        ArrayList<LatLng> markerPoints;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.mygirne);

            // Initializing
            markerPoints = new ArrayList<LatLng>();

            // Getting reference to SupportMapFragment of the activity_main
            SupportMapFragment fm = (SupportMapFragment)getSupportFragmentManager().findFragmentById(R.id.map);

            // Getting Map for the SupportMapFragment
            map = fm.getMap();

            if(map!=null){

                // Enable MyLocation Button in the Map
                map.setMyLocationEnabled(true);
             // change map type to hybrid
                map.setMapType(GoogleMap.MAP_TYPE_NORMAL);
                // set traffic
                map.setTrafficEnabled(true);
                // get user location
                // Setting onclick event listener for the map
                LocationManager manager=(LocationManager) getSystemService(LOCATION_SERVICE);
                Criteria criteria=new Criteria();
                String provider =manager.getBestProvider(criteria, true);
                Location cloc=manager.getLastKnownLocation(provider);
                double lat=35.177;
                double lng =33.3456;
                 lat =cloc.getLatitude();
                 lng= cloc.getLongitude();
                LatLng latlng = new LatLng (lat,lng);
                map.moveCamera(CameraUpdateFactory.newLatLng(latlng));
               map.animateCamera(CameraUpdateFactory.zoomTo(15));
               map.addMarker(new MarkerOptions()
                .title("Your Current Location")
                .position(latlng));
                LatLng LEFKOSA = 
                        new LatLng(35.166666700000000000,33.366666699999996000);
                map.addMarker(new MarkerOptions()
                .position(LEFKOSA)
                .title("LEFKOSA")
                .snippet("LEFKOSA CITY CENTRE")
                .icon(BitmapDescriptorFactory.defaultMarker(
                          BitmapDescriptorFactory.HUE_AZURE)));


                            // Getting URL to the Google Directions API
                            String url = getDirectionsUrl(latlng, LEFKOSA);

                            DownloadTask downloadTask = new DownloadTask();

                            // Start downloading json data from Google Directions API
                            downloadTask.execute(url);
                        }
                    }




        private String getDirectionsUrl(LatLng latlng,LatLng LEFKOSA){

            // Origin of route
            String str_origin = "origin="+latlng.latitude+","+latlng.longitude;

            // Destination of route
            String str_dest = "destination="+LEFKOSA.latitude+","+LEFKOSA.longitude;

            // Sensor enabled
            String sensor = "sensor=true";

            // Building the parameters to the web service
            String parameters = str_origin+"&"+str_dest+"&"+sensor;

            // 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);

                ParserTask parserTask = new ParserTask();

                // Invokes the thread for parsing the JSON data
                parserTask.execute(result);
            }
        }

        /** 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]);
                    Directions parser = new Directions();

                    // 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) {
                ArrayList<LatLng> points = null;
                PolylineOptions lineOptions = null;
                MarkerOptions markerOptions = new MarkerOptions();

                // 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.CYAN);
                }

                // Drawing polyline in the Google Map for the i-th route
                map.addPolyline(lineOptions);
            }
        }

        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            // Inflate the menu; this adds items to the action bar if it is present.
            getMenuInflater().inflate(R.menu.mygirne, menu);
            return true;
        }
    }

xml文件

 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:paddingBottom="@dimen/activity_vertical_margin"
        android:paddingLeft="@dimen/activity_horizontal_margin"
        android:paddingRight="@dimen/activity_horizontal_margin"
        android:paddingTop="@dimen/activity_vertical_margin"
        tools:context="com.firsttry.cyptour.MyLefkosa" >

      <fragment
            android:id="@+id/map"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            class="com.google.android.gms.maps.SupportMapFragment" />

    </RelativeLayout>

1 个答案:

答案 0 :(得分:0)

尝试使用distnaceBetween()方法查找位置:http://developer.android.com/reference/android/location/Location.html

相关问题