Как рассчитать расстояние между двумя точками, используя их долготу и значение широты

Здесь мой код, который я использовал ниже, чтобы вычислить расстояние между двумя местоположениями, используя их широту и долготу. Это дает неправильное расстояние. Иногда получая право и иногда получая ненужную дистанцию.

Мы получаем lat1 и lng1 из базы данных.

//getting lat2 and lng2 from GPS as below public class MyLocationListener implements LocationListener { @Override public void onLocationChanged(Location loc) { lat2=loc.getLatitude(); lng2=loc.getLongitude(); String Text = "My current location is: " +"Latitud = "+ loc.getLatitude() +"Longitud = " + loc.getLongitude(); //System.out.println("Lat & Lang form Loc"+Text); //Toast.makeText( getApplicationContext(), Text,Toast.LENGTH_SHORT).show(); } @Override public void onProviderDisabled(String provider) { } @Override public void onProviderEnabled(String provider) { } @Override public void onStatusChanged(String provider, int status, Bundle extras) { } //Calculating distance double earthRadius = 3958.75; double dLat = Math.toRadians(lat1-lat2); double dLng = Math.toRadians(lng1-lng2); double a = Math.sin(dLat/2) * Math.sin(dLat/2) + Math.cos(Math.toRadians(lat2)) * Math.cos(Math.toRadians(lat1)) * Math.sin(dLng/2) * Math.sin(dLng/2); double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a)); double dist = earthRadius * c; 

Solutions Collecting From Web of "Как рассчитать расстояние между двумя точками, используя их долготу и значение широты"

Здесь расстояние в километрах (км)

 private double distance(double lat1, double lon1, double lat2, double lon2) { double theta = lon1 - lon2; double dist = Math.sin(deg2rad(lat1)) * Math.sin(deg2rad(lat2)) + Math.cos(deg2rad(lat1)) * Math.cos(deg2rad(lat2)) * Math.cos(deg2rad(theta)); dist = Math.acos(dist); dist = rad2deg(dist); dist = dist * 60 * 1.1515; return (dist); } private double deg2rad(double deg) { return (deg * Math.PI / 180.0); } private double rad2deg(double rad) { return (rad * 180.0 / Math.PI); } 

Существует метод android.location.Location.distanceBetween() который подходит для этого.

Ссылка: – ссылка

Попробуйте этот код.

Функция startPoint.distanceTo (endPoint) возвращает расстояние между этими местами в метрах.

 Location startPoint=new Location("locationA"); startPoint.setLatitude(17.372102); startPoint.setLongitude(78.484196); Location endPoint=new Location("locationA"); endPoint.setLatitude(17.375775); endPoint.setLongitude(78.469218); double distance=startPoint.distanceTo(endPoint); 

Здесь «расстояние» – наш необходимый результат в метрах . Надеюсь, он будет работать на Android.

В build.gradle:

 compile 'com.google.maps.android:android-maps-utils:0.4' 

а потом:

 public static Double distanceBetween(LatLng point1, LatLng point2) { if (point1 == null || point2 == null) { return null; } return SphericalUtil.computeDistanceBetween(point1, point2); } 

Если у вас есть два местоположения Location loc1 и Location loc2 вы делаете

 float distance = loc1.distanceTo(loc2); 

Если у вас есть значения долготы и широты, вы используете статическую функцию distanceBetween()

  float[] results = new float[1]; Location.distanceBetween(startLatitude, startLongitude, endLatitude, endLongitude, results); float distance = results[0]; 
 private String getDistanceOnRoad(double latitude, double longitude, double prelatitute, double prelongitude) { String result_in_kms = ""; String url = "http://maps.google.com/maps/api/directions/xml?origin=" + latitude + "," + longitude + "&destination=" + prelatitute + "," + prelongitude + "&sensor=false&units=metric"; String tag[] = { "text" }; HttpResponse response = null; try { HttpClient httpClient = new DefaultHttpClient(); HttpContext localContext = new BasicHttpContext(); HttpPost httpPost = new HttpPost(url); response = httpClient.execute(httpPost, localContext); InputStream is = response.getEntity().getContent(); DocumentBuilder builder = DocumentBuilderFactory.newInstance() .newDocumentBuilder(); Document doc = builder.parse(is); if (doc != null) { NodeList nl; ArrayList args = new ArrayList(); for (String s : tag) { nl = doc.getElementsByTagName(s); if (nl.getLength() > 0) { Node node = nl.item(nl.getLength() - 1); args.add(node.getTextContent()); } else { args.add(" - "); } } result_in_kms = String.format("%s", args.get(0)); } } catch (Exception e) { e.printStackTrace(); } return result_in_kms; } 

Почему вы пишете код для вычисления расстояния самостоятельно?

Проверьте api в классе Location

 private float distanceFrom_in_Km(float lat1, float lng1, float lat2, float lng2) { if (lat1== null || lng1== null || lat2== null || lng2== null) { return null; } double earthRadius = 6371000; //meters double dLat = Math.toRadians(lat2-lat1); double dLng = Math.toRadians(lng2-lng1); double a = Math.sin(dLat/2) * Math.sin(dLat/2) + Math.cos(Math.toRadians(lat1)) * Math.cos(Math.toRadians(lat2)) * Math.sin(dLng/2) * Math.sin(dLng/2); double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a)); float dist = (float) (earthRadius * c); return dist; } 

Вы должны использовать Формулы расстояния Хаверсина

Формулы Хаверсина используются для расчета большого расстояния между двумя точками на Земле.

  public void haversine(double lat1, double lon1, double lat2, double lon2) { double Rad = 6372.8; //Earth's Radius In kilometers // TODO Auto-generated method stub double dLat = Math.toRadians(lat2 - lat1); double dLon = Math.toRadians(lon2 - lon1); lat1 = Math.toRadians(lat1); lat2 = Math.toRadians(lat2); double a = Math.sin(dLat / 2) * Math.sin(dLat / 2) + Math.sin(dLon / 2) * Math.sin(dLon / 2) * Math.cos(lat1) * Math.cos(lat2); double c = 2 * Math.asin(Math.sqrt(a)); haverdistanceKM = Rad * c; }