math - lector - Obtener dirección(brújula) con dos puntos de longitud/latitud
lector de coordenadas (4)
He encontrado algunas fórmulas útiles de coordenadas gps en matemáticas here . Para este caso, aquí mi solución.
private double getDirection(double lat1, double lng1, double lat2, double lng2) {
double PI = Math.PI;
double dTeta = Math.log(Math.tan((lat2/2)+(PI/4))/Math.tan((lat1/2)+(PI/4)));
double dLon = Math.abs(lng1-lng2);
double teta = Math.atan2(dLon,dTeta);
double direction = Math.round(Math.toDegrees(teta));
return direction; //direction in degree
}
Estoy trabajando en una "brújula" para un dispositivo móvil. Tengo los siguientes puntos:
point 1 (current location): Latitude = 47.2246, Longitude = 8.8257
point 2 (target location): Latitude = 50.9246, Longitude = 10.2257
También tengo la siguiente información (de mi teléfono Android):
The compass-direction in degree, wich bears to the north.
For example, when I direct my phone to north, I get 0°
¿Cómo puedo crear una flecha tipo "brújula" que me muestre la dirección al punto?
¿Hay un problema matemático para esto?
¡Gracias!
EDIT: Bueno, encontré una solución, se parece a esto:
/**
* Params: lat1, long1 => Latitude and Longitude of current point
* lat2, long2 => Latitude and Longitude of target point
*
* headX => x-Value of built-in phone-compass
*
* Returns the degree of a direction from current point to target point
*
*/
function getDegrees(lat1, long1, lat2, long2, headX) {
var dLat = toRad(lat2-lat1);
var dLon = toRad(lon2-lon1);
lat1 = toRad(lat1);
lat2 = toRad(lat2);
var y = Math.sin(dLon) * Math.cos(lat2);
var x = Math.cos(lat1)*Math.sin(lat2) -
Math.sin(lat1)*Math.cos(lat2)*Math.cos(dLon);
var brng = toDeg(Math.atan2(y, x));
// fix negative degrees
if(brng<0) {
brng=360-Math.abs(brng);
}
return brng - headX;
}
¡Esto me funciona genial!
Necesitará calcular un vector euclidiano entre su punto de inicio y su punto final, y luego calcular su ángulo (digamos en relación con la X positiva), que sería el ángulo por el que desea rotar su flecha.
No pude entender bien tu solución, calculando la pendiente que funcionó para mí. Para modificar en efwjames ''s y tu respuesta. Esto debería hacer ...
import math
def getDegrees(lat1, lon1, lat2, lon2,head):
dLat = math.radians(lat2-lat1)
dLon = math.radians(lon2-lon1)
bearing = math.degrees(math.atan2(dLon, dLat))
return head-bearing
O se me olvidó decir que encontré la respuesta con el tiempo. La aplicación es para determinar la dirección de la brújula de un vehículo de tránsito y su destino. Esencialmente, matemáticas sofisticadas para adquirir la curvatura de la Tierra, encontrar un ángulo / lectura de brújula y luego hacer coincidir ese ángulo con un valor de brújula genérico. Por supuesto, puede simplemente guardar el Compás de lectura y aplicar eso como una cantidad de rotación para su imagen. Tenga en cuenta que esta es una determinación promediada de la dirección del vehículo hasta el punto final (estación de autobuses), lo que significa que no puede saber qué está haciendo la carretera (por lo que probablemente esto se aplique mejor a los aviones o derby de rodillos).
//example obj data containing lat and lng points
//stop location - the radii end point
endpoint.lat = 44.9631;
endpoint.lng = -93.2492;
//bus location from the southeast - the circle center
startpoint.lat = 44.95517;
startpoint.lng = -93.2427;
function vehicleBearing(endpoint, startpoint) {
endpoint.lat = x1;
endpoint.lng = y1;
startpoint.lat = x2;
startpoint.lng = y2;
var radians = getAtan2((y1 - y2), (x1 - x2));
function getAtan2(y, x) {
return Math.atan2(y, x);
};
var compassReading = radians * (180 / Math.PI);
var coordNames = ["N", "NE", "E", "SE", "S", "SW", "W", "NW", "N"];
var coordIndex = Math.round(compassReading / 45);
if (coordIndex < 0) {
coordIndex = coordIndex + 8
};
return coordNames[coordIndex]; // returns the coordinate value
}
es decir: vehicleBearing (mybus, busstation) podría devolver "NW" significa que viaja hacia el noroeste