计算时间和距离,并在Google地图v2中绘制两个可拖动标记之间的路径

时间:2015-10-14 06:00:19

标签: java android google-maps

需要你的帮助!! ..我正在使用谷歌 API V2 构建一个Android应用程序。我已设法在地图上放置两个标记,并到达那里。我现在主要想做的是像在Google地图中一样计算它们的距离和时间,并在它们之间绘制路径。我怎样才能做到这一点?
a-)我可以不使用JSON吗?我只知道JAVA不是java脚本所以请帮助。
b-)谁回答过,请尽可能详细说明代码注释中采取的步骤?

这是我的地图活动

-

import android.app.ProgressDialog;
import android.content.Intent;
import android.content.IntentSender;
import android.graphics.Color;
import android.location.Address;
import android.location.Geocoder;
import android.location.Location;
import android.os.AsyncTask;
import android.support.v4.app.FragmentActivity;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;
import android.widget.Toast;

import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.api.GoogleApiClient;
import com.google.android.gms.location.LocationListener;
import com.google.android.gms.location.LocationRequest;
import com.google.android.gms.location.LocationServices;
import com.google.android.gms.maps.CameraUpdate;
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 com.google.android.gms.maps.model.Polyline;
import com.google.android.gms.maps.model.PolylineOptions;

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

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;

public class MapsActivity extends FragmentActivity implements
        GoogleApiClient.ConnectionCallbacks,
        GoogleApiClient.OnConnectionFailedListener,LocationListener,GoogleMap.OnMarkerClickListener, GoogleMap.OnInfoWindowClickListener, GoogleMap.OnMapLongClickListener, GoogleMap.OnMarkerDragListener {

    private GoogleApiClient mGoogleApiClient;
    private GoogleMap mMap; // Might be null if Google Play services APK is not available.
    public static final String TAG = MapsActivity.class.getSimpleName();
    private final static int CONNECTION_FAILURE_RESOLUTION_REQUEST = 9000;
    private LocationRequest mLocationRequest;
    private LocationRequest LocationDrop;
   // TextView currentloc;
    String filterAddress = "";
    String DropoffAdress = "";
    String DraggedDroppOff= "";
    String dragendaddress = "";
   // TextView dropOffaddress;
   double currentLatitude;
    double currentLongitude;
    double draglat;
    double draglng;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_maps);
        setUpMapIfNeeded();

     //  tvLocInfo = (TextView) findViewById(R.id.locinfo);
        mMap.setOnMapLongClickListener(this);
        mMap.setOnMarkerDragListener(this);
        mMap.setOnMarkerClickListener(this);
   // LocationDrop = LocationRequest.create().setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY).setInterval(10 * 1000).setFastestInterval(1 * 1000);

        mGoogleApiClient = new GoogleApiClient.Builder(this).addConnectionCallbacks(this).addOnConnectionFailedListener(this).addApi(LocationServices.API).build();

        // Create the LocationRequest object
        mLocationRequest = LocationRequest.create()
                .setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY)
                .setInterval(10 * 1000)        // 10 seconds, in milliseconds
                .setFastestInterval(1 * 1000); // 1 second, in milliseconds





    }

    @Override
    protected void onResume() {
        super.onResume();
        setUpMapIfNeeded();
        mGoogleApiClient.connect();

    }
    protected void onPause() {
        super.onPause();
        if (mGoogleApiClient.isConnected()) {

            LocationServices.FusedLocationApi.removeLocationUpdates(mGoogleApiClient, this);
            mGoogleApiClient.disconnect();
        }
    }
    /**
     * Sets up the map if it is possible to do so (i.e., the Google Play services APK is correctly
     * installed) and the map has not already been instantiated.. This will ensure that we only ever
     * call {@link #setUpMap()} once when {@link #mMap} is not null.
     * <p>
     * If it isn't installed {@link SupportMapFragment} (and
     * {@link com.google.android.gms.maps.MapView MapView}) will show a prompt for the user to
     * install/update the Google Play services APK on their device.
     * <p>
     * A user can return to this FragmentActivity after following the prompt and correctly
     * installing/updating/enabling the Google Play services. Since the FragmentActivity may not
     * have been completely destroyed during this process (it is likely that it would only be
     * stopped or paused), {@link #onCreate(Bundle)} may not be called again so we should call this
     * method in {@link #onResume()} to guarantee that it will be called.
     */
    private void setUpMapIfNeeded() {
        // Do a null check to confirm that we have not already instantiated the map.
        if (mMap == null) {
            // Try to obtain the map from the SupportMapFragment.
            mMap = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map))
                    .getMap();
            // Check if we were successful in obtaining the map.
            if (mMap != null) {
                setUpMap();
            }
        }
    }

    /**
     * This is where we can add markers or lines, add listeners or move the camera. In this case, we
     * just add a marker near Africa.
     * <p>
     * This should only be called once and when we are sure that {@link #mMap} is not null.
     */
    private void setUpMap() {
       // mMap.addMarker(new MarkerOptions().position(new LatLng(0, 0)).title("Pick Me").snippet(filterAddress));

    }

    @Override
    public void onConnected(Bundle bundle) {
        Log.i(TAG, "Location services connected.");

       Location location = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient);

        if (location != null) {
         //   LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this);
            handleNewLocation(location);
        }
        else {

            handleNewLocation(location);
        }

    }




    private void handleNewLocation(Location location) {
        Log.d(TAG, location.toString());




         currentLatitude = location.getLatitude();
        currentLongitude = location.getLongitude();

        LatLng latLng = new LatLng(currentLatitude, currentLongitude);

        MarkerOptions optionsA = new MarkerOptions().position(latLng).title("Pick Me").snippet(filterAddress).icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_AZURE));


        mMap.addMarker(optionsA).setDraggable(false);

        mMap.moveCamera(CameraUpdateFactory.newLatLng(latLng));


        CameraUpdate zoom=CameraUpdateFactory.zoomTo(15);

      //  mMap.moveCamera(center);
        mMap.animateCamera(zoom);

      //  mMap.setOnMarkerDragListener();


        Geocoder geoCoder = new Geocoder(getBaseContext(), Locale.getDefault());

        try {

            List<Address> addresses = geoCoder.getFromLocation(currentLatitude,currentLongitude,1);
        //    List<Address> dropaddress = geoCoder.getFromLocation(laterLongitut,laterlatitude,1);
            if (addresses.size() > 0) {
                for (int i = 0; i < addresses.get(0).getMaxAddressLineIndex(); i++)
                    filterAddress += addresses.get(0).getAddressLine(i) + " ";
                Log.e("My current address is 2", filterAddress );
            }

        }catch (IOException ex){
                  ex.printStackTrace();
        }catch (Exception e2){
            e2.printStackTrace();
        }

       // currentloc = (TextView) findViewById(R.id.txmarker);

       // currentloc.setText("Address" + filterAddress);
        Log.e("My current address is 1", filterAddress);
       // Log.e("My later address is 2", DropoffAdress );
        Toast.makeText(getBaseContext(),filterAddress,Toast.LENGTH_LONG).show();
    }




    @Override
    public void onConnectionSuspended(int i) {
        Log.i(TAG, "Location services suspended. Please reconnect.");
    }

    @Override
    public void onConnectionFailed(ConnectionResult connectionResult) {
        if (connectionResult.hasResolution()) {
            try {
                // Start an Activity that tries to resolve the error
                connectionResult.startResolutionForResult(this, CONNECTION_FAILURE_RESOLUTION_REQUEST);
            } catch (IntentSender.SendIntentException e) {
                e.printStackTrace();
            }
        } else {
            Log.i(TAG, "Location services connection failed with code " + connectionResult.getErrorCode());
        }
    }

    @Override
    public void onLocationChanged(Location location) {
        handleNewLocation(location);

    }


    public void onBackPressed(){
        Intent intent = new Intent(this,TurnOnGps.class);
        startActivity(intent);
        setContentView(R.layout.activity_turn_on_gps);
    }





    @Override
    public void onInfoWindowClick(Marker marker) {
        marker.setTitle(filterAddress);
    }




    @Override
    public void onMapLongClick(LatLng latLng) {

        MarkerOptions options2 = new MarkerOptions();
        options2.position(latLng);
        options2.title("Drop ME").snippet("Dragg Me ");
        options2.draggable(true);
        mMap.addMarker(options2);

        mMap.moveCamera(CameraUpdateFactory.newLatLng(latLng));
        CameraUpdate zoom=CameraUpdateFactory.zoomTo(15);
        Toast.makeText(getBaseContext(),"Please Drag Marker to set your Drop OFF",Toast.LENGTH_LONG).show();
        //  mMap.moveCamera(center);
        mMap.animateCamera(zoom);

      /*  double updateddroplat = latLng.latitude;
        double updateddroplng = latLng.longitude;
        //Converting the latlngs to a string through geoencoder
        LatLng latLng1 = new LatLng(updateddroplat,updateddroplng);

        Geocoder geoCoder = new Geocoder(getBaseContext(), Locale.getDefault());
        try {



            List<Address> addresses = geoCoder.getFromLocation(updateddroplat,updateddroplng,1);

            if(addresses.size() > 0){
                for (int i=0; i < addresses.get(0).getMaxAddressLineIndex(); i++)
                    DropoffAdress += addresses.get(0).getAddressLine(i) + "";

                Log.e("My DroppOff Location is" , DropoffAdress);

            }

        }catch (IOException ex){
            ex.printStackTrace();
        }catch (Exception e2){
            e2.printStackTrace();
        }
        Log.e("My DropOff Location is" , DropoffAdress);
        Toast.makeText(getBaseContext(),DropoffAdress,Toast.LENGTH_LONG).show();
        */
    }

    @Override
    public void onMarkerDragStart(Marker marker) {
        marker.setSnippet("Please Drag me to set your Drop OFF");
    }

    @Override
    public void onMarkerDrag(Marker marker) {

    }

    @Override
    public void onMarkerDragEnd(Marker marker) {

        DropoffAdress = dragendaddress;
        Log.e("My DroppOff Location is" , DraggedDroppOff);
        LatLng dragposition = marker.getPosition();
        draglat = dragposition.latitude;
        draglng = dragposition.longitude;
        LatLng latLng1 = new LatLng(draglat, draglng);
        marker.getId();
      //  marker.getSnippet();
        marker.setSnippet(dragendaddress);
        marker.setTitle("Drop ME");
        Geocoder geoCoder = new Geocoder(getBaseContext(), Locale.getDefault());
        try {



            List<Address> addresses = geoCoder.getFromLocation(draglat,draglng,1);

            if(addresses.size() > 0){
                for (int i=0; i < addresses.get(0).getMaxAddressLineIndex(); i++){
                    dragendaddress += addresses.get(0).getAddressLine(i) + "";

                Log.e("My DroppOff Location is", dragendaddress);

                }
                Toast.makeText(getBaseContext(),dragendaddress,Toast.LENGTH_LONG).show();
                }

        }catch (IOException ex){
            ex.printStackTrace();
        }catch (Exception e2){
            e2.printStackTrace();
        }

    }
    @Override
    public boolean onMarkerClick(Marker marker ) {

      Log.e("am in markerclick event","");
        String Title = marker.getTitle();
        String Snippet = marker.getSnippet();
        Log.e("I am in onMarkerClick", Title);
        if(Title.equals("Pick Me")){
            marker.setSnippet(filterAddress);
            Toast.makeText(getBaseContext(),filterAddress,Toast.LENGTH_LONG).show();
            Log.e("I am in onMarkerClick", Title);
        }else if(Title.equals("Drop ME")){
            marker.setSnippet(dragendaddress);
            Toast.makeText(getBaseContext(),dragendaddress,Toast.LENGTH_LONG).show();
        }

try {
    Polyline polyline = mMap.addPolyline(new PolylineOptions().add(new LatLng(currentLatitude, currentLongitude), new LatLng(draglat, draglng)).width(10).color(Color.RED));

}catch (Exception e){
    e.printStackTrace();
}



        return false;
    }

3 个答案:

答案 0 :(得分:0)

计算距离::

 public float distance (LatLng point1, LatLng point2 )
    {
        double earthRadius = 3958.75;
        double latDiff = Math.toRadians(point2.latitude - point1.latitude);
        double lngDiff = Math.toRadians(point2.longitude - point2.longitude);
        double a = Math.sin(latDiff /2) * Math.sin(latDiff /2) +
                Math.cos(Math.toRadians(point1.latitude)) * Math.cos(Math.toRadians(point2.latitude)) *
                        Math.sin(lngDiff /2) * Math.sin(lngDiff /2);
        double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
        double distance = earthRadius * c;

        int meterConversion = 1609;

        return new Float(distance).floatValue();
    }

并绘制一条线将点添加到列表中然后使用折线函数。

答案 1 :(得分:0)

好首先要感谢你们所有人的支持。我终于得到了解决我的问题的祝福和一些我自己的RND .. http://wptrafficanalyzer.in/blog/route-between-two-locations-with-waypoints-in-google-map-android-api-v2/

这大大解决了Direction Parsing问题。 我模拟了我的代码并添加了Maps活动和JSON类中的方法。 这解决了这个问题。 快乐:) 感谢您抽出宝贵的时间.. +任何一个有相同问题的人可以在评论中发布问题我会尝试回答它。通过解决这个问题我学到了很多东西。

答案 2 :(得分:-1)

您可以使用代码here。在此代码中,class Foo { private String name; private String id; @Override public int hashCode() { return Objects.hash(name,id); } @Override public boolean equals(Object obj) { if (obj instanceof Foo) { Foo right = (Foo) obj; return Objects.equals(name,right.name) && Objects.equals(id,right.id); } return false; } } 给出了两点之间的距离,distanceText给出了旅行时间。