59 votos

El cálculo de Lat/Lng X millas del punto de

Estoy deseando encontrar la latitud y longitud del punto dado un rodamiento, una distancia, y una partida de latitud y longitud.

Esta parece ser la opuesta de esta pregunta (Distancia entre lat/long puntos).

Ya he mirado en la fórmula de haversine y creo que es la aproximación de que el mundo es probablemente lo suficientemente cerca.

Estoy asumiendo que necesito para resolver la fórmula de haversine para mi desconocido lat/long, ¿es correcto esto? Hay buenos sitios web que hablan de este tipo de cosas? Parece que no es común, pero mi google sólo ha subido preguntas similares a la anterior.

Lo que estoy buscando es sólo una fórmula para ello. Me gustaría darle una partida lat/lng, un rodamiento, y a una distancia (millas o kilómetros) y me gustaría salir de un lat/lng par que representa el lugar en que uno se han terminado de ellos viajaron a lo largo de esa ruta.

29voto

saint_groceon Puntos 2696

Tengo curiosidad de cómo los resultados de esta fórmula comparar con Esri pe.dll.

(citación).

Un punto {lat,lon} es una distancia d en la tc radial desde el punto 1 si:

 lat=asin(sin(lat1)*cos(d)+cos(lat1)*sin(d)*cos(tc))
 IF (cos(lat)=0)
    lon=lon1      // endpoint a pole
 ELSE
    lon=mod(lon1-asin(sin(tc)*sin(d)/cos(lat))+pi,2*pi)-pi
 ENDIF

Este algoritmo está limitada a distancias tal que dlon < pi/2.e los que se extienden alrededor de menos de un cuarto de la circunferencia de la tierra en longitud. Una manera completamente general, pero algoritmo más complicado es necesario si las distancias son mayores permitido:

 lat =asin(sin(lat1)*cos(d)+cos(lat1)*sin(d)*cos(tc))
 dlon=atan2(sin(tc)*sin(d)*cos(lat1),cos(d)-sin(lat1)*sin(lat))
 lon=mod( lon1-dlon +pi,2*pi )-pi

He aquí una página html para las pruebas.

25voto

cjstehno Puntos 131

Si usted estuviera en un plano, el punto en el que se r metros de distancia en un rodamiento de un grados al este de norte es desplazada por r * cos(a) en la dirección norte y r * sen(a) en la dirección este. (Estas declaraciones más o menos definir el seno y el coseno.)

Aunque usted no está en un avión-se está trabajando en la superficie de una curva elipsoide que los modelos de la superficie de la Tierra--cualquier distancia de menos de un par de cientos de kilómetros cubre una pequeña parte de la superficie que para la mayoría de propósitos prácticos puede considerarse plana. La única complicación es que un grado de longitud no cubre la misma distancia que un grado de latitud. En una Tierra esférica modelo de un grado de longitud es sólo cos(latitud), mientras que un grado de latitud. (En un modelo elipsoidal, esta es una excelente aproximación, bueno a alrededor de 2,5 cifras significativas.)

Finalmente, un grado de latitud es de aproximadamente 10^7 / 90 = 111,111 metros. Ahora tenemos toda la información necesaria para convertir metros a grados:

El desplazamiento hacia el norte es de r * cos(a) / 111111 grados;

El desplazamiento hacia el este es de r * sen(a) / cos(latitud) / 111111 grados.

Por ejemplo, en una latitud de -0.31399 grados y un rodamiento de una = 30 grados de este a norte, se pueden calcular

cos(a) = cos(30 degrees) = cos(pi/6 radians) = Sqrt(3)/2 = 0.866025.
sin(a) = sin(30 degrees) = sin(pi/6 radians) = 1/2 = 0.5.
cos(latitude) = cos(-0.31399 degrees) = cos(-0.00548016 radian) = 0.999984984.
r = 100 meters.
east displacement = 100 * 0.5 / 0.999984984 / 111111 = 0.000450007 degree.
north displacement = 100 * 0.866025 / 111111 = 0.000779423 degree.

De donde, a partir de (-78.4437, -0.31399), la nueva ubicación es en la (-78.4437 + 0.00045, -0.31399 + 0.0007794) = (-78.4432, -0.313211).

Una respuesta más precisa, en el moderno ITRF00 sistema de referencia, es (-78.4433, -0.313207): este es del 0,43 metros de distancia de aproximada de respuesta, lo que indica la aproximación yerra 0.43% en este caso. Para lograr mayor precisión debe utilizar elipsoidal distancia fórmulas (que son mucho más complicados) o una alta fidelidad de conformación de proyección con cero divergencia (de modo que el rodamiento es correcta).

2voto

BigCheesy Puntos 101

Tengo esta trabajando en ObjectiveC. La clave aquí es saber que usted necesita lat/lng puntos en radianes y necesita volver a convertirlos lat/lng después de la aplicación de la ecuación. También, sabemos que la distancia y la tc son en radianes.

He aquí la ecuación original:

 lat=asin(sin(lat1)*cos(d)+cos(lat1)*sin(d)*cos(tc))
 IF (cos(lat)=0)
    lon=lon1      // endpoint a pole
 ELSE
    lon=mod(lon1-asin(sin(tc)*sin(d)/cos(lat))+pi,2*pi)-pi
 ENDIF

Aquí se lleva a cabo en ObjC donde radian es un radián medido en sentido antihorario a partir de N (por ejemplo, PI / 2 W, PI es S, 2 PI / 3 E) y la distancia en kilómetros.

+ (CLLocationCoordinate2D)displaceLatLng:(CLLocationCoordinate2D)coordinate2D withRadian:(double)radian
                            withDistance:(CGFloat)distance {
  double lat1Radians = coordinate2D.latitude * (M_PI / 180);
  double lon1Radians = coordinate2D.longitude * (M_PI / 180);
  double distanceRadians = distance / 6371;
  double lat = asin(sin(lat1Radians)*cos(distanceRadians)+cos(lat1Radians)*sin(distanceRadians)
      *cos(radian));
  double lon;
  if (cos(lat) == 0) {
    lon = lon1Radians;
  } else {
    lon = fmodf((float) (lon1Radians - asin(sin(radian) * sin(distanceRadians) / cos(lat)) + M_PI),
        (float) (2 * M_PI)) - M_PI;
  }
  double newLat = lat * (180 / M_PI);
  double newLon = lon * (180 / M_PI);
  return CLLocationCoordinate2DMake(newLat, newLon);
}

1voto

Slayd Puntos 111

Si usted está interesado en una mayor precisión, hay Vincenty. (El enlace está en el 'directo', que es exactamente lo que buscas).

Hay muy pocas implementaciones existentes, si usted está después de código.

También, una pregunta: no estás suponiendo que el viajero se mantiene en el mismo rodamiento para todo el viaje, ¿no? Si es así, entonces estos métodos no están respondiendo a la pregunta correcta. (Que estaría mejor fuera de la proyección de mercator, el dibujo de una línea recta, entonces la onu-proyectar el resultado).

0voto

npst Puntos 190

Aquí es una solución Python:

    def displace(self, theta, distance):
    """
    Displace a LatLng theta degrees counterclockwise and some
    meters in that direction.
    Notes:
        http://www.movable-type.co.uk/scripts/latlong.html
        0 DEGREES IS THE VERTICAL Y AXIS! IMPORTANT!
    Args:
        theta:    A number in degrees.
        distance: A number in meters.
    Returns:
        A new LatLng.
    """
    theta = np.float32(theta)

    delta = np.divide(np.float32(distance), np.float32(E_RADIUS))

    def to_radians(theta):
        return np.divide(np.dot(theta, np.pi), np.float32(180.0))

    def to_degrees(theta):
        return np.divide(np.dot(theta, np.float32(180.0)), np.pi)

    theta = to_radians(theta)
    lat1 = to_radians(self.lat)
    lng1 = to_radians(self.lng)

    lat2 = np.arcsin( np.sin(lat1) * np.cos(delta) +
                      np.cos(lat1) * np.sin(delta) * np.cos(theta) )

    lng2 = lng1 + np.arctan2( np.sin(theta) * np.sin(delta) * np.cos(lat1),
                              np.cos(delta) - np.sin(lat1) * np.sin(lat2))

    lng2 = (lng2 + 3 * np.pi) % (2 * np.pi) - np.pi

    return LatLng(to_degrees(lat2), to_degrees(lng2))

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X