Cálculo de distancia con lista de coordenadas

Un usuario Pregunto ✅

bredn

Hola,

Actualmente tengo un mapa de varios vehículos y sus rutas a lo largo del día. El mapa se traza utilizando estas coordenadas y filtrando la identificación del automóvil. Debo mencionar que tengo una marca de tiempo de cuándo se enviaron las coordenadas. Las coordenadas vienen en momentos aleatorios y no hay ningún orden de eventos por ID de automóvil (lo que significa que la lista de coordenadas contiene todos los ID en diferentes momentos).

Ahora quiero calcular la distancia total que ha recorrido el automóvil durante el día y visualizar esto. He probado varias fórmulas y guías que encontré en este foro, pero sin suerte. ¿Alguno de ustedes sabe cómo hacer esto?

Gracias

——-

Editar:

Dupliqué mis columnas lon / lat y eliminé artificialmente la primera entrada, para así crear un punto inicial / final simulado. Después de haber hecho esto, probé la siguiente fórmula:

Distanse =
VAR R = 6371
VAR Pi = 3,141592

VAR p1 = ‘Spørring1′[latitude]* Pi / 180
VAR q1 = ‘Spørring1′[longitude]* Pi / 180
VAR p2 = ‘Spørring1′[lat2]* Pi / 180
VAR q2 = ‘Spørring1′[lon2]* Pi / 180

VAR DeltaP = ABS (p1-p2)
VAR DeltaQ = ABS (q1-q2)

REGRESO
SI(
p1 = EN BLANCO () || p2 = EN BLANCO () || q1 = EN BLANCO () || q2 = EN BLANCO ()
;BLANCO()
; ACOS (SIN (p1) * SIN (p2) + COS (p1) * COS (p2) * COS (DeltaQ)) * R
)

Cuando intento ejecutar esta fórmula, aparece el siguiente mensaje de error: Un argumento de la función ACOS tiene el tipo de datos incorrecto o es demasiado grande o pequeño.

Todas las columnas tienen el mismo tipo de datos, y no veo por qué serían demasiado grandes o pequeñas, ¿alguna idea de por qué ocurre esto?

@bredn,

Puedes devolver el valor
SIN (p1) * SIN (p2) + COS (p1) * COS (p2) * COS (DeltaQ)
y compruebe si tiene el tipo de datos correcto o es demasiado grande o pequeño.

Saludos,

Charlie Liao

bredn

En respuesta a v-caliao-msft

@ v-caliao-msft

Gracias por la respuesta,

Al devolver la fórmula sin ACOS, obtengo un valor devuelto, por lo que no es un problema de tipo de datos.

¿Sabes cómo puedo hacer que esto funcione para cada vehículo y su distancia total? Ahora obtengo el mismo valor total para todos los vehículos, aunque no hayan recorrido la misma distancia.

bredn

En respuesta a bredn

EDITAR y actualizar:

ranking.pngHe creado una tabla que clasifica cada evento entrante asignado a su vehículo, de modo que puedo obtener todos los eventos ordenados por dispositivo. La tabla y el código para crearlo tienen este aspecto:

Rank = RANKX (
    FILTER (
        'Tracker Status Variables';
        'Tracker Status Variables'[device_id] = EARLIER ( 'Tracker Status Variables'[device_id] )
    );
    RANKX (
        FILTER (
            'Tracker Status Variables';
            'Tracker Status Variables'[device_id] = EARLIER ( 'Tracker Status Variables'[device_id] )
        );
        'Tracker Status Variables'[eventenqueuedutctime];
        ;
        DESC
    )
        + DIVIDE (
            RANKX (
                FILTER (
                    'Tracker Status Variables';
                    'Tracker Status Variables'[device_id] = EARLIER ( 'Tracker Status Variables'[device_id] )
                );
                'Tracker Status Variables'[eventenqueuedutctime];
                ;
                ASC
            );
            (
                COUNTROWS (
                    FILTER (
                        'Tracker Status Variables';
                        'Tracker Status Variables'[device_id] = EARLIER ( 'Tracker Status Variables'[device_id] )
                    )
                )
                    + 1
            )
        )
)

Mi fórmula de cálculo de distancia actual se ve así:

VINCENTY = ACOS(COS(RADIANS(90-'Tracker Status Variables'[latitude]))
*COS(RADIANS(90-'Tracker Status Variables'[lat2]))+
SIN(RADIANS(90-'Tracker Status Variables'[latitude]))*
SIN(RADIANS(90-'Tracker Status Variables'[lat2]))*
COS(RADIANS('Tracker Status Variables'[lon2]-'Tracker Status Variables'[longitude])))*6371

lat2 y lon2 representan copias de los datos de latitud / longitud originales, con el primer registro eliminado. La esperanza era que esto me permitiera crear un cálculo de distancia y ordenarlo por ID. Lamentablemente, esto no está funcionando. ¿Alguno de ustedes sabe lo que podría hacer aquí? Siento que estoy al borde de mi ingenio, cualquier ayuda sería muy apreciada.

bredn

En respuesta a bredn

EDITAR y actualizar:

Como mencioné en la actualización anterior, agregué una copia de las columnas originales de lat / on. Hoy intenté agregar algo de lógica a esto, para que se saltara la primera entrada, creando así un punto de inicio / parada sintético. El código para esto está a continuación (hay varias formas de hacer esto, pero este es el enfoque que seguí).

LongitudeLookup = LOOKUPVALUE('Tracker Status Variables'[longitude];'Tracker Status Variables'[device_id];'Tracker Status Variables'[device_id];'Tracker Status Variables'[Rank];'Tracker Status Variables'[Rank]+1)

Esto usa la variable de rango creada previamente.

El resultado de esto es que obtengo distancias precisas por día. Sin embargo, esto solo funciona para el día anterior. Para los datos que se transmiten ahora, el último punto de entrada se trata como 0, por lo que se informa que la distancia es el radio de la tierra (es decir, unos 6300 KM).

Elijo editar más esta publicación en caso de que alguien más tenga un problema similar, espero que esto pueda ayudar de alguna manera.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *