2015-12-18 2 views
2

Для приложения, в котором я сейчас работаю Я хочу настроить кнопку, которая находит расстояние между двумя маркерами в активности карт Google и при нажатии кнопки отображает расстояние между вашим текущим местоположением и другим маркером У меня нет кода в моем классе java для кнопки, но на данный момент мне просто интересно, как я на самом деле нахожу расстояние между моим текущим местоположением и моим маркером настройки. Вот мой код для поиска текущего местоположения пользователей, и у него установлен маркер в случайном месте.Расчет расстояния между двумя маркерами в Android

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

Я также знаю, что для нахождения расстояния между двумя маркерами в 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); 

Так что я просто интересно, если кто-нибудь сможет помочь мне реализовать код для нахождения расстояния, потому что я не уверен, куда он должен идти в моем классе, или мне придется переделать некоторые части класса, чтобы сделать дистанцию ​​работой

+0

использование [DistanceMatrix] (https: // разработчиков. google.com/maps/documentation/distance-matrix/intro). Просто введите свои _OriginLatLng_ и _DestinationLatLng_, вы получите результаты в JSON. –

+0

Вы слышали о формуле расстояния? –

+0

Ну, я закончил колледж в прошлом году, и я уже написал код для формулы haversine в java. Я понимаю, как на самом деле найти расстояние и т. Д., Это тем более реализует, что у меня проблемы. то есть. где я включаю в свою деятельность java и т. д. – JMeehan1

ответ

0

Привет, я сделал пример и его пример ваш qquestion.But вы должны cus tomise для вашей сборки. Вы можете использовать класс 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); 

Я надеюсь, что работа для вас

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

Строковое значение = 34,54665, 23,54546

Полный код здесь вы можете использовать с here.Sory я забыл.

+0

Это не связано с вопросом. OP запросил расстояние между маркерами Google Map, а не способом сортировки ... Что такое Sinemalar? – aga

+0

Я сказал вам, что вы должны customesi.Sinemalar является объектом. И у него есть место в. Если вы можете изменить Sinemalar на объект местоположения. –

2

При попытке найти расстояние между маркерами, я рекомендовал бы, чтобы преобразовать их обратно в Location объектов, чтобы иметь возможность использовать встроенный в Android метод расчета расстояния.

Учитывая некоторые Marker marker, что вы создали и иметь доступ через onMarkerClick() или уже сохранены и текущее положение Location currentLocation, внутри метода onClick(View v) для Button:

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

currentLocation.distanceTo(markerLocation); 
Смежные вопросы