terrestres puntos longitud lineal latitudes latitud google geograficos geograficas entre ecuación distancia coordenadas calcular android

android - puntos - ecuación haversine excel



Cómo calcular la distancia entre dos ubicaciones usando su longitud y valor de latitud (10)

Aquí mi código utilicé el código siguiente para calcular la distancia entre dos ubicaciones usando su latitud y longitud. Está dando una distancia equivocada. a veces acertando y algunas veces obteniendo una distancia irrelevante.

Estamos obteniendo lat1 y lng1 de la base de datos.

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


¿Por qué estás escribiendo el código para calcular la distancia por ti mismo?

Verifique la API en la clase Location



Prueba este código

startPoint.distanceTo(endPoint) devuelve la distancia entre esos lugares en metros.

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

aquí "distancia" es nuestro resultado requerido en Metros . Espero que funcione para Android.


Si tiene dos Ubicación Ubicación de objetos Location loc1 y Location loc2 lo hace

float distance = loc1.distanceTo(loc2);

Si tiene valores de longitud y latitud, usa la función estática distanceBetween()

float[] results = new float[1]; Location.distanceBetween(startLatitude, startLongitude, endLatitude, endLongitude, results); float distance = results[0];


en build.gradle:

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

y entonces:

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


Aquí obteniendo distancia en kilómetros (km)

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


Debe usar fórmulas de distancia de Haversine

Las fórmulas Haversine solían calcular la gran distancia entre dos puntos de la tierra.

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


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


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 float getMesureLatLang(double lat,double lang) { Location loc1 = new Location(""); loc1.setLatitude(getLatitute());// current latitude loc1.setLongitude(getLangitute());//current Longitude Location loc2 = new Location(""); loc2.setLatitude(lat); loc2.setLongitude(lang); return loc1.distanceTo(loc2); // return distance(getLatitute(),getLangitute(),lat,lang); }