简体   繁体   English

计算Android中两个标记之间的距离

[英]Calculating the distance between two markers in Android

For an app that I'm currently working on I want to set up a button that finds the distance between two markers on a google maps activity and when you click the button it shows the distance between your current location and the other marker I don't have any code in my java class for the button yet but at the moment I'm just wondering how I actually find the distance between my current location and my set up marker. 对于我当前正在使用的应用程序,我想设置一个按钮来查找google maps活动上两个标记之间的距离,当您单击该按钮时,它会显示您当前位置与另一个我不知道的标记之间的距离我的java类中没有用于按钮的任何代码,但是此刻,我只是想知道如何实际找到当前位置和设置标记之间的距离。 Here's my code for finding the users current location and it has a marker set up in a random location. 这是我用于查找用户当前位置的代码,它在随机位置中设置了标记。

package dashpage.example.com.myapplication;

import android.content.IntentSender;
import android.location.Location;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.util.Log;

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

public class MapsActivity extends FragmentActivity implements
        GoogleApiClient.ConnectionCallbacks,
        GoogleApiClient.OnConnectionFailedListener,
        LocationListener {

    public static final String TAG = MapsActivity.class.getSimpleName();

    private final static int CONNECTION_FAILURE_RESOLUTION_REQUEST = 9000;

    private GoogleMap mMap; // Might be null if Google Play services APK is not available.

    private GoogleApiClient mGoogleApiClient;
    private LocationRequest mLocationRequest;

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

        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();
    }

    @Override
    protected void onPause() {
        super.onPause();

        if (mGoogleApiClient.isConnected()) {
            LocationServices.FusedLocationApi.removeLocationUpdates(mGoogleApiClient, this);
            mGoogleApiClient.disconnect();
        }
    }

    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();
            }
        }
    }

    private void setUpMap() {
        mMap.addMarker(new MarkerOptions().position(new LatLng(53.3835, 6.5996)).title("Marker"));
    }

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

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

        LatLng latLng = new LatLng(currentLatitude, currentLongitude);

        //mMap.addMarker(new MarkerOptions().position(new LatLng(currentLatitude, currentLongitude)).title("Current Location"));
        MarkerOptions options = new MarkerOptions()
                .position(latLng)
                .title("I am here!");
        mMap.addMarker(options);
        mMap.moveCamera(CameraUpdateFactory.newLatLng(latLng));
    }

    @Override
    public void onConnected(Bundle bundle) {
        Location location = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient);
        if (location == null) {
            LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this);
        }
        else {
            handleNewLocation(location);
        }
    }

    @Override
    public void onConnectionSuspended(int i) {

    }

    @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);
                /*
                 * Thrown if Google Play services canceled the original
                 * PendingIntent
                 */
            } catch (IntentSender.SendIntentException e) {
                // Log the error
                e.printStackTrace();
            }
        } else {
            /*
             * If no resolution is available, display a dialog to the
             * user with the error.
             */
            Log.i(TAG, "Location services connection failed with code " + connectionResult.getErrorCode());
        }
    }

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

I also know that for finding the distance between two markers in Android Studio you'd use something like 我也知道,要在Android Studio中查找两个标记之间的距离,您可以使用类似

Location loc1 = new Location("");
loc1.setLatitude(lat1);
loc1.setLongitude(lon1);

Location loc2 = new Location("");
loc2.setLatitude(lat2);
loc2.setLongitude(lon2);

float distanceInMeters = loc1.distanceTo(loc2);

So I'm just wondering if anybody would be able to help me implement the code for finding the distance because I'm not sure where it should go in my class or if I'll have to redo some parts of the class to make the distance work 因此,我只是想知道是否有人能够帮助我实现用于查找距离的代码,因为我不确定该距离在我的课堂中应该走到哪里,还是我是否必须重做该课程的某些部分才能制作出距离?远程工作

When trying to find distance between markers, I would recommend to convert them back to Location objects to be able to use the in-built Android method of calculating distance. 尝试查找标记之间的距离时,建议将它们转换回Location对象,以便能够使用内置的Android计算距离的方法。

Given some Marker marker that you have set up and have access through onMarkerClick() or already saved and current position Location currentLocation , inside your onClick(View v) method for the Button : 给定您已设置的一些Marker marker ,并可以通过onMarkerClick()或已经保存的Marker marker以及当前位置Location currentLocation ,在Button onClick(View v)方法中:

LatLng markerLatLng = marker.getPosition();
Location markerLocation = new Location("");
markerLocation.setLatitude(markerLatLng.latitude);
markerLocation.setLongitude(markerLatLng.longitude);

currentLocation.distanceTo(markerLocation);

Hi I made an example and its like your qquestion.But you must customise for your build.You can use Collections class.Its easy and perfectly work. 嗨,我举了一个例子,就像您的qquestion一样,但是您必须为自己的构建进行自定义。您可以使用Collections类,它简单而完美地工作。

   Comparator<Sinemalar> comparator=new Comparator<Sinemalar>() {
            @Override
            public int compare(Sinemalar left, Sinemalar right) {
                return (int)(left.getDistance()-right.getDistance());

            }
        };
        Collections.sort(sinemalarList, comparator);

I hope work for you 我希望为你工作

 public float distanceCounter(String value, Context context) {
    Location cinemaLocation = new Location("CinemaLocation");
    String s = new String(value);
    String[] result = s.split(",");
    List<String> elephantList = Arrays.asList(s.split(","));
    String longitude = elephantList.get(1);
    String latitude = elephantList.get(0);
    cinemaLocation.setLatitude(Double.parseDouble(latitude));
    cinemaLocation.setLongitude(Double.parseDouble(longitude));

 float distance = getCurrrentLocation(context).distanceTo(cinemaLocation)/1000 ;

    return distance;
}

String value=34.54665 , 23.54546 字符串值= 34.54665、23.54546

Full code here you can use with here.Sory i forgot. 您可以在此处使用完整的代码。很抱歉,我忘记了。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM