c# - servidor - Dispositivos de seguimiento de GPS del vehículo
rastreo gps php (5)
Estoy buscando agregar una función a un sistema de entrada de pedidos para mostrar la distancia en KM entre la ubicación de la orden y la camioneta de entrega asignada en tiempo real.
Las camionetas tienen un sistema de seguimiento GPS de High Point GPS , viene con una API para consultar la ubicación del conductor, devuelve en formato LAT / LONG, y la dirección de ubicación si está disponible.
Una vez que obtengo la ubicación, puedo usar un servicio web para calcular la distancia entre las 2 ubicaciones. ¿Alguien sabe cuál es la mejor manera de obtener la distancia entre 2 ubicaciones usando LAT / LONG para la búsqueda de direcciones y vehículos para la ubicación de entrega?
Cree dos instancias de DbGeography para el punto de origen y destino ( http://msdn.microsoft.com/en-us/library/system.data.spatial.dbgeography.distance(v=vs.110).aspx ). Luego usa el método de distancia de DbGeography para encontrar la distancia entre dos puntos.
Para la unidad de distancia, consulte esta publicación: System.Data.Spatial DbGeography.Distance units?
Depende de los otros servicios que ya está utilizando. Por ejemplo, ya usamos Google Maps para mostrar la ruta, por lo que usamos su servicio de geocodificación para traducir desde una dirección a coordenadas, así como su servicio de distancia para calcular distancias.
He hecho esto pero en Java, probablemente puede portarlo a c # sin mucho esfuerzo.
Esto es muy preciso para distancias inferiores a 2000 kilómetros, luego puede variar un poco desde la distancia real. Esto se debe a la curvatura de la tierra. Pero para distancias pequeñas, puede suponer que es sencillo y que el resultado no tiene ningún impacto o es muy pequeño.
Aquí hay un enlace que encontré útil.
Y otro enlace , una implementación de Haversine en C #.
Espero eso ayude.
Saludos cordiales, Federico.
public String execute(String plat1, String plon1, String plat2, String plon2) {
String distance;
double lat1, lon1, lat2, lon2;
try{
lat1 = Double.parseDouble(plat1);
lon1 = Double.parseDouble(plon1);
lat2 = Double.parseDouble(plat2);
lon2 = Double.parseDouble(plon2);
} catch (Exception e){
lat1 = 0.0d;
lon1 = 0.0d;
lat2 = 0.0d;
lon2 = 0.0d;
}
//theta and distance
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));
//distance
dist = Math.acos(dist);
dist = rad2deg(dist);
dist = dist * 60 * 1.1515;
dist = dist * 1.609344;
//convert to meters
dist = dist * 1000;
//output in meters
distance = Double.toString(dist);
return distance;
}
private double deg2rad(double deg) {
return (deg * Math.PI / 180.0);
}
private double rad2deg(double rad) {
return (rad * 180.0 / Math.PI);
}
Una pequeña explicación:
- (plat1, plon1) es lat y lng del punto 1 u origen
- (plat2, plon2) es lat y lng del punto 2 o destino
- el método "ejecutar" es el que llamas, devuelve una cadena que contiene la distancia en metros (la conversión a otras unidades se puede hacer fácilmente)
- dos funciones de asistencia se declaran como "deg2rad" y "rad2deg".
La respuesta simple que puede encontrar, es una fórmula simple:
Calcula la distancia entre dos puntos en google maps V3
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
};
El uso de google maps api será la mejor solución:
https://developers.google.com/maps/documentation/distancematrix/
Puede usar Google Maps para obtener Lat / Long de la dirección Ver respuesta de Thomas Clayson
Luego puede calcular la distancia entre los dos conjuntos de coordenadas utilizando la Ley de los cosenos o la fórmula de Haversine. Véase Ley de Coseno.