Android-Google Maps V2: отслеживание маршрута от текущего положения до другого пункта назначения

Я начал с этого примера, чтобы нарисовать маршрут между двумя адресами, введенными пользователем. Это работает. http://blog.rolandl.fr/1357-android-des-itineraires-dans-vos-applications-grace-a-lapi-google-direction

Но теперь я хотел бы нарисовать маршрут от моего текущего положения до другого пункта назначения, введенного пользователем. Моя проблема в том, что в этом случае я не знаю, как получить текущую позицию. Я пытался сделать:

LocationManager locationmanager=(LocationManager)this.getSystemService(LOCATION_SERVICE);
final double longitude=locationmanager.getLongitude();
final double latitude=locationmanager.getLatitude();

Но это не сработает... Я думаю, что смешиваю каждый пример, который нашел, и это совсем не хорошо.

Не могли бы вы мне помочь ?

Вот мой MapActivity: получение 2 адресов, введенных пользователем в моем открытом классе MainActivity. MapActivity extends Activity реализует LocationListener { private GoogleMap googlemap;

    protected void onCreate(final Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_map);

        // Recuperation des composants graphiques
        googlemap = ((MapFragment)getFragmentManager().findFragmentById(R.id.map)).getMap();

        //Recuperations des adresses depart-arrivee
        // RETRIEVE DEPARTURE AND DESTINATION ADDRESS
        /*
         * For editDepart, I would like to replace it by my Current location
         */
        final String editDepart = getIntent().getStringExtra("DEPART");
        final String editArrivee = getIntent().getStringExtra("ARRIVEE");       

        /* Appel de la méthode asynchrone // ASYNCHRONOUS METHOD
         * ATTENTION : Il faut que ItineraireTask soit extends AsyncTask<Void, Integer, Boolean>
         * Sinon, on ne pourra pas utilise la methode execute() */
        new ItineraireTask(this, googlemap, editDepart, editArrivee).execute();

    }
}

Вот мой ItineraireTask:

    public class ItineraireTask extends AsyncTask<Void, Integer, Boolean> 
{
    private static final String TOAST_MSG = "Calcul de l'itinéraire en cours";
    private static final String TOAST_ERR_MAJ = "Impossible de trouver un itinéraire";

    private Context context;
    private GoogleMap gMap;
    private String editDepart;
    private String editArrivee;
    private final ArrayList<LatLng> lstLatLng = new ArrayList<LatLng>();

    /** CONSTRUCTEUR **/
    public ItineraireTask(final Context context, final GoogleMap gMap, final String editDepart, final String editArrivee) 
    {
        this.context = context;
        this.gMap= gMap;
        this.editDepart = editDepart;
        this.editArrivee = editArrivee;
    }    

    protected void onPreExecute() 
    {
        Toast.makeText(context, TOAST_MSG, Toast.LENGTH_LONG).show();
    }

    protected Boolean doInBackground(Void... params) 
    {
        try 
        {
            //Construction de l'url à appeler          
            final StringBuilder url = new StringBuilder("http://maps.googleapis.com/maps/api/directions/xml?sensor=false&language=fr");
            url.append("&origin=");
            url.append(editDepart.replace(' ', '+'));
            url.append("&destination=");
            url.append(editArrivee.replace(' ', '+'));

            //Appel du web service
            final InputStream stream = new URL(url.toString()).openStream();

            //Traitement des données
            final DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
            documentBuilderFactory.setIgnoringComments(true);

            final DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();

            final Document document = documentBuilder.parse(stream);
            document.getDocumentElement().normalize();

            //On récupère d'abord le status de la requête
            final String status = document.getElementsByTagName("status").item(0).getTextContent();
            if(!"OK".equals(status)) 
            {
                return false;
            }

            //On récupère les steps
            final Element elementLeg = (Element) document.getElementsByTagName("leg").item(0);
            final NodeList nodeListStep = elementLeg.getElementsByTagName("step");
            final int length = nodeListStep.getLength();

            for(int i=0; i<length; i++) 
            {       
            final Node nodeStep = nodeListStep.item(i); 
                if(nodeStep.getNodeType() == Node.ELEMENT_NODE) 
                {
                    final Element elementStep = (Element) nodeStep;

                    //On décode les points du XML
                    decodePolylines(elementStep.getElementsByTagName("points").item(0).getTextContent());
                }
            }
            return true;           
        }
        catch(final Exception e) 
        {
            return false;
        }
    }


    /** METHODE QUI DECODE LES POINTS EN LAT-LONG**/
    private void decodePolylines(final String encodedPoints) 
    {
        int index = 0;
        int lat = 0, lng = 0;

        while (index < encodedPoints.length()) 
        {
            int b, shift = 0, result = 0;

            do 
            {
                b = encodedPoints.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 = encodedPoints.charAt(index++) - 63;
                result |= (b & 0x1f) << shift;
                shift += 5;
            } while (b >= 0x20);

            int dlng = ((result & 1) != 0 ? ~(result >> 1) : (result >> 1));
            lng += dlng; 
            lstLatLng.add(new LatLng((double)lat/1E5, (double)lng/1E5));
        }
    }


    protected void onPostExecute(final Boolean result) 
    {   
        if(!result) 
        {
            Toast.makeText(context, TOAST_ERR_MAJ, Toast.LENGTH_SHORT).show();
        }
        else 
        {
            //On déclare le polyline, c'est-à-dire le trait (ici bleu) que l'on ajoute sur la carte pour tracer l'itinéraire
            final PolylineOptions polylines = new PolylineOptions();
            polylines.color(Color.BLUE);

            //On construit le polyline
            for(final LatLng latLng : lstLatLng)
            {
                polylines.add(latLng);
            }        
            //On déclare un marker vert que l'on placera sur le départ
            final MarkerOptions markerA = new MarkerOptions();
            markerA.position(lstLatLng.get(0));
            markerA.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_GREEN));

            //On déclare un marker rouge que l'on mettra sur l'arrivée
            final MarkerOptions markerB = new MarkerOptions();
            markerB.position(lstLatLng.get(lstLatLng.size()-1));
            markerB.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_RED));

            //On met à jour la carte
            gMap.moveCamera(CameraUpdateFactory.newLatLngZoom(lstLatLng.get(0), 10));
            gMap.addMarker(markerA);
            gMap.addPolyline(polylines);
            gMap.addMarker(markerB);
        }
    }
}

Спасибо вам заранее!

С наилучшими пожеланиями,

тофу


person Tofuw    schedule 02.12.2013    source источник
comment
вам, вероятно, следует прочитать о том, как получить ваше текущее местоположение developer.android.com/training/location /index.html   -  person tyczj    schedule 02.12.2013


Ответы (1)


Вот сообщение в блоге, которое я написал на эту тему, и оно может помочь вам в этом:

Направления рисования Google Maps API V2< /а>

Существует пример проекта, который вы можете скачать и использовать.

person Emil Adz    schedule 02.12.2013
comment
или вы можете использовать мою библиотеку, которую я создал на основе сообщения в блоге @EminAdz github.com/tyczj/MapNavigator. на самом деле не отвечает на его вопрос, хотя я думаю, поскольку он не знает, как получить свое текущее местоположение - person tyczj; 02.12.2013
comment
Здравствуйте, @Emil Adz, я только что попробовал ваше приложение, и оно работает :) Но я должен указать <meta-data android:name="com.google.android.gms.version" android:value="@integer/google_play_services_version" /> в манифесте, иначе оно выйдет из строя. Но это не совсем то, что я ищу. Вам все равно спасибо! - person Tofuw; 04.12.2013
comment
да, вы должны это сделать, и это упоминается в одном из моих других постов. - person Emil Adz; 04.12.2013
comment
Привет @tyczj! Спасибо за вашу помощь. Пробовал понемногу разные методы. Сейчас попробую твой. Итак, чтобы использовать вашу библиотеку, мне просто нужно реализовать свой фрагмент с помощью OnPathSetListner и создать экземпляр GoogleMap map = getMap(); Navigator nav = new Navigator(map,start,end); nav.findDirections(true, false);. Поскольку мой английский не является свободным, я хотел бы быть уверен, что попрошу у вас подтверждения. Заранее спасибо! - person Tofuw; 05.12.2013
comment
@Tofuw да, это даст вам указания из одной точки в другую и нанесет их на карту, но если вам нужно совершить поездку по текущему местоположению, это не поможет вам в этом, вам нужно посмотреть на горячий, чтобы правильно реализовать диспетчер местоположения - person tyczj; 05.12.2013