How to get driving distance between two locations?

后端 未结 2 1009
逝去的感伤
逝去的感伤 2021-01-03 16:27

I am using GoogleMapv2 api in my app. I want to draw a polygon line from source to destination. and show the travel time as well as distance on map activity but I am unable

2条回答
  •  臣服心动
    2021-01-03 16:48

    I think the following code could help.

    Routing.java

    public class Routing extends AsyncTask
    {
    private final GoogleMap map;
    private LatLng start;
    private LatLng dest;
    private final LatLngBounds.Builder builder = new LatLngBounds.Builder();;
    private final int[] lineColor = { Color.GREEN };
    private final int pos;
    
    public Routing(final Activity activity, final GoogleMap map) {
    super();
    this.map = map;
    this.pos = 0;
    }
    
    private TextView txtDistance;
    
    public Routing(final Activity activity, final GoogleMap map, final TextView txtDistance) {
    super();
    this.map = map;
    this.pos = 0;
    this.txtDistance = txtDistance;
    }
    
    @Override
    protected Route doInBackground(final LatLng... points) {
    try {
        start = points[0];
        dest = points[1];
        Parser parser;
        final String jsonURL = "http://maps.googleapis.com/maps/api/directions/json?";
        final StringBuffer sBuf = new StringBuffer(jsonURL);
        sBuf.append("origin=");
        sBuf.append(start.latitude);
        sBuf.append(',');
        sBuf.append(start.longitude);
        sBuf.append("&destination=");
        sBuf.append(dest.latitude);
        sBuf.append(',');
        sBuf.append(dest.longitude);
        sBuf.append("&sensor=true&mode=driving");
        System.out.println("sbuf: " + sBuf.toString());
        parser = new GoogleParser(sBuf.toString());
        final Route route = parser.parse();
        return route;
    } catch (final Exception e) {}
    return null;
    }
    
    @Override
    protected void onPreExecute() {
    /** Empty Method */
    }// end onPreExecute method
    
    @SuppressLint("ResourceAsColor")
    @Override
    protected void onPostExecute(final Route result) {
    try {
        if (result == null) {
        map.moveCamera(CameraUpdateFactory.newLatLngZoom(dest, 15));
        map.animateCamera(CameraUpdateFactory.zoomTo(18), 2000, null);
        } else {
        final String text = result.getTextLength();
        final String startAddress = result.getStartAddress().toString().trim().replaceAll(", ", ",\n");
        final String endAddress = result.getEndAddress().toString().trim().replaceAll(", ", ",\n");
        txtDistance.setVisibility(View.GONE);
        if (text != null) {
            txtDistance.setVisibility(View.VISIBLE);
            txtDistance.setBackgroundResource(android.R.color.holo_orange_light);
            txtDistance.setText(" Total Distance : " + text + "\n Total Duration : " + result.getDuration() + "  ");
        }
        final List directionPoint = result.getPoints();
        final PolylineOptions rectLine = new PolylineOptions().width(10).color(lineColor[pos]);
        for (int i = 0; i < directionPoint.size(); i++) {
            rectLine.add(directionPoint.get(i));
        }
        map.addPolyline(rectLine);
    
        final Marker startLocation = map.addMarker(new MarkerOptions().position(start).title(startAddress).snippet("Main Location").icon(BitmapDescriptorFactory.fromResource(R.drawable.markera)));
        final Marker endLocation = map.addMarker(new MarkerOptions().position(dest).title(endAddress).snippet("Destination Location").icon(BitmapDescriptorFactory.fromResource(R.drawable.markerb)));
        builder.include(startLocation.getPosition());
        builder.include(endLocation.getPosition());
        final LatLngBounds bounds = builder.build();
    
        // Pan to see all markers in view.
        final int padding = 100; // offset from edges of the map in pixels
        final CameraUpdate cup = CameraUpdateFactory.newLatLngBounds(bounds, padding);
    
        map.moveCamera(cup);
        map.animateCamera(cup);
    
        }
    } catch (final Exception e) {
        e.printStackTrace();
    }
    }// end onPostExecute method
    }
    

    In your map activity add the following lines.

      @Override
    protected void onActivityResult(final int requestCode, final int resultCode, final Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (Utils.isGPSTurnOn(getApplicationContext())) {
            onResume();
        }
    }
    @Override
    protected void onResume() {
        super.onResume();
        if (Utils.isConnected(getApplicationContext())) {
            mMap = ((MapFragment) getFragmentManager().findFragmentById(R.id.map)).getMap();
            mMap.setMyLocationEnabled(true);
            final TextView txtDistance = (TextView) findViewById(R.id.txtSpeed);
            new Routing(getParent(), mMap, txtDistance).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, start, end);
        }
    }
    

    Utils.java

    public class Utils
    {
    /**
     * @Method used to checks if device having network connection or not.
     * @param context the context
     * @return true if the phone is connected
     */
    public static boolean isConnected(final Context context) {
    try {
        final ConnectivityManager connMngr = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
    
        final NetworkInfo wifiNetwork = connMngr.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
        if (wifiNetwork != null && wifiNetwork.isConnectedOrConnecting()) { return true; }
    
        final NetworkInfo mobileNetwork = connMngr.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
        if (mobileNetwork != null && mobileNetwork.isConnectedOrConnecting()) { return true; }
    
        final NetworkInfo activeNetwork = connMngr.getActiveNetworkInfo();
        if (activeNetwork != null && activeNetwork.isConnectedOrConnecting()) { return true; }
    } catch (final Exception e) {
        e.printStackTrace();
    }
    return false;
    }
    
    public static boolean isGPSTurnOn(final Context context) {
    final LocationManager manager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
    return manager.isProviderEnabled(LocationManager.GPS_PROVIDER);
    }
    
    }
    

    activity_map.xml

    
    
    
    
    
      
    

提交回复
热议问题