2009-11-15 18 views
8

que tienen la siguiente disposición:¿Cómo se usa la interpolación lineal para estimar la posición actual entre dos coordenadas geográficas?

  • último reporte de lat, lon w/marca de tiempo
  • objetivo lat, lon
  • tiempo estimado para apuntar
  • dirección

Como puedo interpolar una posición estimada en el tiempo?

Sé que es suficiente para calcular la velocidad promedio requerida para el resto del viaje. Dada una distancia en línea recta, es bastante trivial. Sé que tiene que ver con los vectores, pero estoy un poco oxidado y pensé que sería mejor consultar a algunos expertos.

La razón por la que necesito esta tasa de actualización es limitada, por lo que para mostrar una animación fluida necesito adivinar la posición actual entre las actualizaciones.

La plataforma de destino es una aplicación de Google Maps, así que tengo disponible algunas funciones básicas, como la función Geocorrecta para la distancia entre dos coordenadas. El lenguaje no es importante ya que conozco a muchos y puedo exportar o adaptar cualquier ejemplo si es necesario. Sin embargo, se preferirían las soluciones generales.


se trata simplemente de dos cálculos vectoriales independientes?

 
latestimate = latstart + (Δlat * P) 
lonestimate = lonstart + (Δlon * P) 

Where: 
    testimated = the reported estimated time to target 
    telapsed = time since last time estimate 
    P = telapsed/testimated 
    Δlat = latreported - lattarget 
    Δlon = lonreported - lontarget 

Respuesta

8
Lat_to_Travel = CurLat - TargetLat 
Long_to_Travel = CurLong - TargetLong 
Time_to_Travel = ETA - now 

Si las distancias son relativamente pequeñas, es probable que sea bien asumir una progresión lineal en estas tres dimensiones (*). A continuación, deberá decidir sobre un número de posición intermedia para mostrar, por ejemplo, 10, y calcular cada punto intermedio en consecuencia

NbOfIntermediates  = 10 // for example  
Lat_at_Intermediate(n) = CurLat + (1/NbOfIntermediates * Lat_to_travel) 
Long_at_Intermediate(n) = CurLong + (1/NbOfIntermediates * Long_to_travel) 
Time_at_Intermediate(n) = now + (1/NbOfIntermediates * Time_to_travel) 

El más complicado de todo esto es mantener las unidades de bien.

(*) Algunas consideraciones sobre si es aceptable asumir una progresión lineal ...
Obviamente los detalles de la realidad de los elementos físicos (corrientes marinas, el viento, la visibilidad ...) puede importar más en este asunto que las matemáticas geoespaciales.
Suponiendo que el vehículo viaja a una velocidad constante, en línea recta, es [generalmente] bien para suponer linealidad en la dimensión de Latitud [bien técnicamente la tierra no es exactamente una esfera, esto no es del todo cierto, pero maldito cerca]. Sin embargo, en distancias más largas que incluyen un cambio relativamente grande en la latitud, la progresión angular a lo largo de la dimensión de longitud no es lineal. La razón de esto es que a medida que nos alejamos del ecuador, un grado de longitud expresado en millas lineales (o kilómetro ...) disminuye. La siguiente tabla debe dar una idea aproximada de este efecto, para las ubicaciones en diferentes latitudes:

 
Latitude Length of a Degree  Approximate examples 
      (of longitude) in 
      nautical miles 

0   60      Kuala Lumpur, Bogota, Nairobi 
20   56.5     Mexico city, Mecca, Mumbai, Rio de Janeiro 
45   42.5     Geneva, Boston, Seattle, Beijing, Wellington (NZ) 
60   30      Oslo, Stockholm, Anchorage AK, St Petersburg Russia   

ver este handy online calculator para calcular esto para una latitud particular.
Otra forma de tener una idea para esto es ver que viajar hacia el este (u oeste) en la latitud de Jacksonville, Florida, o San Diego, California, toma 52 millas para cubrir un grado de longitud; en la latitud de Montreal o Seattle, toma solo 40 millas.

+0

Lo sentimos, no me notificaron su respuesta mientras agregaba mi comentario. Creo que los dos estamos diciendo lo mismo ... Aceptaré tu respuesta después de un par de votaciones ascendentes para respaldarlo ;-) –

+0

@Mark R, lo siento, no había visto las fórmulas que agregaste a tu pregunta ya sea. Veo que también está asumiendo que puede usar una extrapolación lineal simple. Ver mis ediciones con respecto a esta suposición. – mjv

+0

Creo que porque ya tengo el tiempo estimado (que podemos suponer que es correcto si no hay anomalías) que elimina el aspecto geoespacial de la ecuación ¿verdad? Estoy interpolando con el tiempo para encontrar una posición, sin tratar de calcular el tiempo. –

14

Quiere utilizar un Slerp, o interpolación lineal esférica.

Convertir su latitud y longitud a una unidad 3-vector:

p=(x,y,z)=(cos(lon)*cos(lat), sin(lon)*cos(lat), sin(lat)) 

Entonces, "Slerp" le da una interpolación de velocidad constante a lo largo de la superficie de la esfera unidad:

theta= angle between 3-vectors p0 and p1 (e.g., cos(theta)= p0.p1) 
Slerp(p0,p1,t)= (p0*sin((1-t)*theta) + p1*sin(t*theta))/sin(theta) 

Tenga en cuenta que si theta está muy cerca de 0 o 180 grados, esta fórmula puede ser numéricamente inestable. En el caso de ángulo pequeño, puede recurrir a la interpolación lineal; en el caso de 180 grados, su camino es genuinamente ambiguo.

Cuestiones relacionadas