Android 如何在谷歌地图上的标记之间显示路线 [英] Android How to show route between markers on googlemaps

查看:24
本文介绍了Android 如何在谷歌地图上的标记之间显示路线的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在创建一个应用程序,它将显示用户的位置并在该位置放置一个标记.用户移动后.将删除标记并创建新标记.现在.我想在 A 点和 B 点上制作标记以硬编码到应用程序中并在地图上显示路线.它应使用地图上最近的道路.我做了一些研究,但只找到了 5 年前的旧代码.任何人都可以指导我完成这个.

I'm creating an App that will show the location of the user and put a marker to that position. After the user moves. The marker would be removed and a new marker would be created. Now. I want to make markers on Point A and Point B to be hardcoded into the app and show the route on the map. It shall use the nearest road on the map. I've done some research but only find old code which dated 5 years back. Could anyone be kind enough to guide me through this.

A 点和 B 点在 LocationChanged 方法上.

The Point A and Point B is on LocationChanged method.

import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
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.Marker;
import com.google.android.gms.maps.model.MarkerOptions;

import android.content.Context;
import android.content.Intent;
import android.location.Criteria;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.provider.Settings;
import android.support.v4.app.FragmentActivity;
import android.widget.Toast;

public class MainActivity extends FragmentActivity implements LocationListener {
    private GoogleMap map;
    private LocationManager locationManager;
    private String provider;
    LatLng coordinate;
    Marker startPerc;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);


        LocationManager service = (LocationManager) getSystemService(LOCATION_SERVICE);
        boolean enabledGPS = service
                .isProviderEnabled(LocationManager.GPS_PROVIDER);
        boolean enabledWiFi = service
                .isProviderEnabled(LocationManager.NETWORK_PROVIDER);

        // Check if enabled and if not send user to the GSP settings
        // Better solution would be to display a dialog and suggesting to 
        // go to the settings
        if (!enabledGPS) {
            Toast.makeText(this, "GPS signal not found", Toast.LENGTH_LONG).show();
            Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
            startActivity(intent);
        }
    locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
    // Define the criteria how to select the location provider -> use
    // default
    Criteria criteria = new Criteria();
    provider = locationManager.getBestProvider(criteria, false);
    Location location = locationManager.getLastKnownLocation(provider);

    // Initialize the location fields
    if (location != null) {
        Toast.makeText(this, "Selected Provider " + provider,
                Toast.LENGTH_SHORT).show();
        onLocationChanged(location);
    } else {

        //do something
    }


}

/* Request updates at startup */
@Override
protected void onResume() {
    super.onResume();
    locationManager.requestLocationUpdates(provider, 300, 1, this);
}

/* Remove the locationlistener updates when Activity is paused */
@Override
protected void onPause() {
    super.onPause();
    locationManager.removeUpdates(this);
}

@Override
public void onLocationChanged(Location location) {

    double lat =  location.getLatitude();
    double lng = location.getLongitude();
    Toast.makeText(this, "Location " + lat+","+lng,
            Toast.LENGTH_LONG).show();
    LatLng coordinate = new LatLng(lat, lng);
    Toast.makeText(this, "Location " + coordinate.latitude+","+coordinate.longitude,
            Toast.LENGTH_LONG).show();
    if(map!=null){
        map.clear();
    }
    //map.clear();
    GoogleMap map;
    if(startPerc!=null){
        startPerc.remove();
    }
    map = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map)).getMap();
    startPerc = map.addMarker(new MarkerOptions()
    .position(coordinate)
      .title("Start")
      .snippet("Your Position")
      .icon(BitmapDescriptorFactory.fromResource(R.drawable.ic_launcher)));
    map.moveCamera(CameraUpdateFactory.newLatLngZoom(coordinate, 20));



    map.addMarker(new MarkerOptions()
                    .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_AZURE))
                    .position(new LatLng(3.214732, 101.747047))
                    .title("Point A")
                    .snippet("Bus Stop")
                    .flat(true));

    map.addMarker(new MarkerOptions()
                    .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_AZURE))
                    .position(new LatLng(3.214507, 101.749697))
                    .title("Point B")
                    .snippet("Bus Stop")
                    .flat(true));



startPerc.setIcon(BitmapDescriptorFactory.fromResource(R.drawable.ic_launcher));

}


@ Override
public void onProviderDisabled(String provider) {
    Toast.makeText(this, "Enabled new provider " + provider,
            Toast.LENGTH_SHORT).show();

}


@Override
public void onProviderEnabled(String provider) {
    Toast.makeText(this, "Disabled provider " + provider,
            Toast.LENGTH_SHORT).show();

}


@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
    // TODO Auto-generated method stub

}
void Delay(int Seconds){
    long Time = 0;
    Time = System.currentTimeMillis();
    while(System.currentTimeMillis() < Time+(Seconds*1000));
}
}

K Neeraj 提供的新代码.遗憾的是它仍然崩溃,请检查.

New code provided by K Neeraj. It still crash sadly please check.

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 com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.OnMapReadyCallback;
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.Marker;
import com.google.android.gms.maps.model.MarkerOptions;
import com.google.android.gms.maps.model.PolylineOptions;

import android.content.Context;
import android.content.Intent;
import android.graphics.Color;
import android.location.Criteria;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.AsyncTask;
import android.os.Bundle;
import android.provider.Settings;
import android.support.v4.app.FragmentActivity;
import android.util.Log;
import android.widget.Toast;

public class MainActivity extends FragmentActivity implements LocationListener {
    private GoogleMap map;
    private LocationManager locationManager;
    private String provider;
    LatLng coordinate;
    Marker startPerc;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);



        LocationManager service = (LocationManager) getSystemService(LOCATION_SERVICE);
        boolean enabledGPS = service
                .isProviderEnabled(LocationManager.GPS_PROVIDER);
        boolean enabledWiFi = service
                .isProviderEnabled(LocationManager.NETWORK_PROVIDER);

        // Check if enabled and if not send user to the GSP settings
        // Better solution would be to display a dialog and suggesting to 
        // go to the settings
        if (!enabledGPS) {
            Toast.makeText(this, "GPS signal not found", Toast.LENGTH_LONG).show();
            Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
            startActivity(intent);
        }

        locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
        // Define the criteria how to select the location provider -> use
        // default
        Criteria criteria = new Criteria();
        provider = locationManager.getBestProvider(criteria, false);
        Location location = locationManager.getLastKnownLocation(provider);



        // Initialize the location fields
        if (location != null) {
            Toast.makeText(this, "Selected Provider " + provider,
                    Toast.LENGTH_SHORT).show(); 
            onLocationChanged(location);
        } else {

        //do something
    }


}


/* Request updates at startup */
@Override
protected void onResume() {
    super.onResume();
    locationManager.requestLocationUpdates(provider, 300, 1, this);
}

/* Remove the locationlistener updates when Activity is paused */
@Override
protected void onPause() {
    super.onPause();
    locationManager.removeUpdates(this);
}

@Override
public void onLocationChanged(Location location) {

    double lat =  location.getLatitude();
    double lng = location.getLongitude();
    Toast.makeText(this, "Location " + lat+","+lng,
            Toast.LENGTH_LONG).show();
    LatLng coordinate = new LatLng(lat, lng);
    Toast.makeText(this, "Location " + coordinate.latitude+","+coordinate.longitude,
            Toast.LENGTH_LONG).show();



    if(map!=null){
        map.clear();
    }

    GoogleMap map;
    if(startPerc!=null){
        startPerc.remove();
    }
    map = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map)).getMap();
    startPerc = map.addMarker(new MarkerOptions()
    .position(coordinate)
      .title("Start")
      .snippet("Your Position")
      .icon(BitmapDescriptorFactory.fromResource(R.drawable.ic_launcher)));
    map.moveCamera(CameraUpdateFactory.newLatLngZoom(coordinate, 12));




    startPerc.setIcon(BitmapDescriptorFactory.fromResource(R.drawable.ic_launcher));

 // Assign your origin and destination
 // These points are your markers coordinates
 LatLng origin = new LatLng(3.214732, 101.747047);
 LatLng dest = new LatLng(3.214507, 101.749697);

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

 DownloadTask downloadTask = new DownloadTask();

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


 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";

     // 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]);
             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) {
         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(2);
             lineOptions.color(Color.RED);
         }

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




@ Override
public void onProviderDisabled(String provider) {
    Toast.makeText(this, "Enabled new provider " + provider,
            Toast.LENGTH_SHORT).show();

}


@Override
public void onProviderEnabled(String provider) {
    Toast.makeText(this, "Disabled provider " + provider,
            Toast.LENGTH_SHORT).show();

}


@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
    // TODO Auto-generated method stub

}
void Delay(int Seconds){
    long Time = 0;
    Time = System.currentTimeMillis();
    while(System.currentTimeMillis() < Time+(Seconds*1000));
}
}

然后我创建了一个新的 DirectionJSONParser.java

Then I created a new DirectionJSONParser.java

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

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 : http://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;
}
}

推荐答案

@Override
public void onLocationChanged(Location location) {
....
 startPerc.setIcon(BitmapDescriptorFactory.fromResource(R.drawable.ic_launcher));

// Assign your origin and destination
// These points are your markers coordinates
LatLng origin = new LatLng(3.214732, 101.747047);
LatLng dest = new LatLng(3.214507, 101.749697);

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

DownloadTask downloadTask = new DownloadTask();

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


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";

    // 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]);
            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) {
        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(2);
            lineOptions.color(Color.RED);
        }

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

看看这个教程,

使用 Google Maps Android Api v2 中的 Google 路线绘制两个地点之间的行车路线路线

它展示了如何在两点之间绘制路线图.

It shows how to draw Route map between two points.

这篇关于Android 如何在谷歌地图上的标记之间显示路线的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆