¿Cómo se calcula la distancia entre dos marcadores en Google Maps V3? (Similar a distanceFrom
función en V2.)
Gracias..
waheid
¿Cómo se calcula la distancia entre dos marcadores en Google Maps V3? (Similar a distanceFrom
función en V2.)
Gracias..
mike williams
Si desea calcularlo usted mismo, puede usar la fórmula de Haversine:
var rad = function(x) {
return x * Math.PI / 180;
};
var getDistance = function(p1, p2) {
var R = 6378137; // Earth’s mean radius in meter
var dLat = rad(p2.lat() - p1.lat());
var dLong = rad(p2.lng() - p1.lng());
var a = Math.sin(dLat / 2) * Math.sin(dLat / 2) +
Math.cos(rad(p1.lat())) * Math.cos(rad(p2.lat())) *
Math.sin(dLong / 2) * Math.sin(dLong / 2);
var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
var d = R * c;
return d; // returns the distance in meter
};
¿Por qué sugiere usar Math.atan2(Math.sqrt(a),Math.sqrt(1-a)) en lugar del Math.asin(Math.sqrt(a)) más simple?
–Emanuele Paolini
29 de junio de 2013 a las 12:41
@EmanuelePaolini – Matemáticamente, atan2(sqrt(a),sqrt(1-a)) = asin(sqrt(a)) = acos(sqrt(1-a)), pero la versión atan2 permanece numéricamente mejor condicionada para todos los valores de un.
– ChrisV
19 dic 2014 a las 18:00
Tipo. Pregunta. ¿Por qué le gusta tanto usar nombres de variables de 1 letra para resolver problemas que requieren un poco de imaginación donde un buen nombre de variable podría ser útil? Sólo preguntaba 🙂
– Adam Pietrasiak
26 de abril de 2016 a las 15:32
¿No debería ser var R = 6371; por km?
– Alejandro Fradiani
25/08/2016 a las 16:30
los p1.lat()
y p1.lng()
funciones asumen que sus datos de entrada son google.maps.LatLng
objetos. Si solo tiene datos sin procesar como {lat: __, lon: __}
entonces en su lugar usarías p1.lat
por ejemplo.
– Don McCurdy
24/03/2017 a las 20:12
Emil Badh
De hecho, parece haber un método en GMap3. Es un método estático de la google.maps.geometry.spherical
espacio de nombres
Toma como argumentos dos LatLng
objetos y utilizará un radio terrestre predeterminado de 6378137 metros, aunque el radio predeterminado se puede anular con un valor personalizado si es necesario.
Asegúrate de incluir:
<script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=false&v=3&libraries=geometry"></script>
en la sección de tu cabeza.
La convocatoria será:
google.maps.geometry.spherical.computeDistanceBetween (latLngA, latLngB);
Entonces, ¿por qué hay una diferencia del 1 % en la respuesta dada por el cálculo esférico de Distancia entre Google y la fórmula de distancia de Haversine?
– Matt S.
31 de agosto de 2012 a las 22:41
@RamenRecon No estoy seguro, pero una pregunta sería que usan diferentes valores para el radio de la tierra.
–Emil Badh
11 de octubre de 2012 a las 8:01
@RamenRecon sí, Emil tiene razón en esto. La documentación dice: El radio predeterminado es el radio de la Tierra de 6378137 metros. Pero Mike en el Haversine anterior usa 6371km en lugar de.
– Laszló
17 de julio de 2013 a las 12:13
El enlace de arriba ahora está roto, pero la explicación del método hace que no sea un gran problema.
– GChorn
04/04/2014 a las 22:40
@ABCD.ca No es mi número. Esta pregunta es sobre la versión 3 de Google Maps Library. Usted preguntó por qué su cálculo difería del de ellos. Es porque usan un valor diferente para el radio de la tierra que tú. La referencia para el número? desarrolladores.google.com/maps/documentation/javascript/… Justo debajo del titular.
–Emil Badh
27 de febrero de 2015 a las 9:55
joan16v
Ejemplo usando GPS latitud/longitud de 2 puntos.
var latitude1 = 39.46;
var longitude1 = -0.36;
var latitude2 = 40.40;
var longitude2 = -3.68;
var distance = google.maps.geometry.spherical.computeDistanceBetween(new google.maps.LatLng(latitude1, longitude1), new google.maps.LatLng(latitude2, longitude2));
Los resultados de distancia se expresan en metros.
– joan16v
10 de agosto de 2015 a las 10:51
@ joan16v cómo solicitar google.maps.geometry en node.js. Quiero usar el código anterior en node.js. qué módulo debo instalar y qué archivos debo requerir.
– kisor
12 de diciembre de 2016 a las 11:43
Plamen Todorov
Simplemente agregue esto al comienzo de su código JavaScript:
google.maps.LatLng.prototype.distanceFrom = function(latlng) {
var lat = [this.lat(), latlng.lat()]
var lng = [this.lng(), latlng.lng()]
var R = 6378137;
var dLat = (lat[1]-lat[0]) * Math.PI / 180;
var dLng = (lng[1]-lng[0]) * Math.PI / 180;
var a = Math.sin(dLat/2) * Math.sin(dLat/2) +
Math.cos(lat[0] * Math.PI / 180 ) * Math.cos(lat[1] * Math.PI / 180 ) *
Math.sin(dLng/2) * Math.sin(dLng/2);
var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
var d = R * c;
return Math.round(d);
}
y luego use la función como esta:
var loc1 = new GLatLng(52.5773139, 1.3712427);
var loc2 = new GLatLng(52.4788314, 1.7577444);
var dist = loc2.distanceFrom(loc1);
alert(dist/1000);
Aishwat Singh
//p1 and p2 are google.maps.LatLng(x,y) objects
function calcDistance(p1, p2) {
var d = (google.maps.geometry.spherical.computeDistanceBetween(p1, p2) / 1000).toFixed(2);
console.log(d);
}
Esta es la mejor respuesta. ¿Por qué agregar una función cuando la API de Google ya tiene las funciones?
– felix fbecker
2 de mayo de 2016 a las 8:55
¿Hay una variante de Java disponible para esta API? No pude encontrarlo después de mucho buscar.
– Sanketh
10 de junio de 2018 a las 6:00
@felixfbecker, porque podría estar trabajando en un entorno en el que no puede insertar la API de Google Maps en un script
etiquetar y llamar a esos métodos. Como reaccionar nativo.
– Nnanyielugo
5 de septiembre de 2018 a las 8:26
Naveid Ahmad
Aquí está la implementación c# de esta fórmula
public class DistanceAlgorithm
{
const double PIx = 3.141592653589793;
const double RADIO = 6378.16;
/// <summary>
/// This class cannot be instantiated.
/// </summary>
private DistanceAlgorithm() { }
/// <summary>
/// Convert degrees to Radians
/// </summary>
/// <param name="x">Degrees</param>
/// <returns>The equivalent in radians</returns>
public static double Radians(double x)
{
return x * PIx / 180;
}
/// <summary>
/// Calculate the distance between two places.
/// </summary>
/// <param name="lon1"></param>
/// <param name="lat1"></param>
/// <param name="lon2"></param>
/// <param name="lat2"></param>
/// <returns></returns>
public static double DistanceBetweenPlaces(
double lon1,
double lat1,
double lon2,
double lat2)
{
double dlon = Radians(lon2 - lon1);
double dlat = Radians(lat2 - lat1);
double a = (Math.Sin(dlat / 2) * Math.Sin(dlat / 2)) + Math.Cos(Radians(lat1)) * Math.Cos(Radians(lat2)) * (Math.Sin(dlon / 2) * Math.Sin(dlon / 2));
double angle = 2 * Math.Atan2(Math.Sqrt(a), Math.Sqrt(1 - a));
return (angle * RADIO) * 0.62137;//distance in miles
}
}
Esta es la mejor respuesta. ¿Por qué agregar una función cuando la API de Google ya tiene las funciones?
– felix fbecker
2 de mayo de 2016 a las 8:55
¿Hay una variante de Java disponible para esta API? No pude encontrarlo después de mucho buscar.
– Sanketh
10 de junio de 2018 a las 6:00
@felixfbecker, porque podría estar trabajando en un entorno en el que no puede insertar la API de Google Maps en un script
etiquetar y llamar a esos métodos. Como reaccionar nativo.
– Nnanyielugo
5 de septiembre de 2018 a las 8:26
iwein
Con google puedes hacerlo usando el API esférica, google.maps.geometry.spherical.computeDistanceBetween (latLngA, latLngB);
.
Sin embargo, si la precisión de una proyección esférica o una solución haversine no es lo suficientemente precisa para usted (por ejemplo, si está cerca del polo o calculando distancias más largas), debe usar una biblioteca diferente.
La mayoría de la información sobre el tema que encontré en Wikipedia aquí.
Un truco para ver si la precisión de cualquier algoritmo dado es adecuada es completar el radio máximo y mínimo de la tierra y ver si la diferencia puede causar problemas para su caso de uso. Muchos más detalles se pueden encontrar en Este artículo
Al final, Google API o Haversine servirán para la mayoría de los propósitos sin problemas.
stackoverflow.com/a/7997732/1458162
–Tom Chen
17 de julio de 2014 a las 5:38