Saltar al contenido

¿Cómo dividir un archivo de seguimiento GPX en varios archivos de N trackpoints cada uno?

Solución:

Sorprendentemente, parece que gpsbabel no puede hacerlo. Pero al menos puede ayudar si primero se convierte a csv. Luego dividí el resultado con Unix ‘ split y vuelva a convertir a gpx con gpsbabel. Una estrategia similar podría funcionar con PowerShell, pero no sé si tiene un split equivalente. Aquí está la función bash que utilicé:

splitTrack() {
  # $1 shall be the gpx file to split
  pfx="${1%.*}-"
  gpsbabel -i gpx -f "$1" -t -o csv -F - 
  | split -d -l 500 --additional-suffix=.csv - "$pfx"

  for f in "$pfx"*.csv; do
    fout=${f%.*}.gpx
    gpsbabel -i csv -f "$f" -x transform,trk=wpt -x nuketypes,waypoints 
             -o gpx -F "$fout"
    rm "$f"
  done
}

EDITAR: Se agregó una pista de los comentarios sobre cómo obtener puntos de seguimiento en lugar de puntos de paso.

¡Gracias por el guión! También es útil para mí porque mi navegador para bicicletas Garmin comienza a tirar puntos de seguimiento después de que se alcanza una cierta cantidad de puntos de seguimiento.

Agregué una separación de waypoints y tracks y un poco de “compresión” al script de Harald (que también funciona en zsh).

splitTrack() {
  # $1 shall be the gpx file to split
  pfx="${1%.*}-"
  # Split tracks off and simplify track (reduce number of trackpoints but keep 
  # sufficient accuracy for bike navigation)
  gpsbabel -i gpx -f "$1" -x nuketypes,waypoints,routes 
  -x simplify,crosstrack,error=0.003k -o gpx -F "${pfx}tracks.gpx"
  # Split waypoints off (import as extra POI gpx to device)
  gpsbabel -i gpx -f "$1" -x nuketypes,tracks,routes -o gpx 
  -F "${pfx}waypoints.gpx"
  # 500 pack from tracks in CSV, start suffix with 01 instead of 00
  gpsbabel -i gpx -f "${pfx}tracks.gpx" -t -o csv -F - 
  | split -d --numeric=1 -l 500 --additional-suffix=.csv - "$pfx"
  rm "${pfx}tracks.gpx"
  # CSV back to gpx
  for f in "$pfx"*.csv; do
    fout=${f%.*}.gpx
    gpsbabel -i csv -f "$f" -x transform,trk=wpt -x nuketypes,waypoints 
         -o gpx -F "$fout"
    rm "$f"
  done
}

Si también desea conservar los datos de elevación, es posible que desee utilizar el formato UNICSV. Ajuste el comando de reimportación al conjunto de campos exportado de GPX a (Uni) CSV. Para obtener más información, consulte https://www.gpsbabel.org/htmldoc-development/fmt_unicsv.html. El siguiente fragmento requiere la instalación del conjunto de herramientas GNU habitual (sed / tail / split).

splitTrack() {
    # ===
    # abort if no file is passed as argument 1

    if ! [[ -f "$1" ]] 
        then
            echo File missing!
            return
    fi
    # ===

    # ===
    # Set prefix for files according to source file name

    pfx="${1%.*}-"
    # ===

    # ===
    # save waypoints in another file

    gpsbabel 
        -i gpx 
        -f "$1" 
        -x nuketypes,tracks,routes 
        -o gpx 
        -F "${pfx}waypoints.gpx"
    # ===

    # ===
    # filter only track
    # simplify track
    # transform simplified track into waypoints
    # print waypoints in UNICSV format
    # pipe
    # ignore UNICSV header
    # pipe
    # take 500 lines and duplicate each 500th line (overlap 1 line)
    # in order to avoid gap in transition from one to next track part
    # credit goes to https://stackoverflow.com/questions/21756040/extract-a-range-of-rows-with-overlap-using-sed/21757062#21757062
    # pipe
    # split/save each block of 500 lines into separated UNICSV files with prefix according to source file

    gpsbabel 
        -i gpx 
        -f "$1" 
        -x nuketypes,waypoints,routes 
        -x simplify,crosstrack,error=0.003k 
        -x transform,wpt=trk 
        -o unicsv 
        -F - 
    | tail 
        -n +2 
    | sed 
        -nr ':a;$!{N;s/[^n]+/&/500;Ta};p;$q;s/.*((n[^n]*){1})$/1/;D' 
    | split 
        -d 
        -a 3 
        --numeric=1 
        -l 500 
        --additional-suffix=.csv 
        - 
        "$pfx"
    # ===

    # ===
    # convert separated UNICSV files back to GPX track files 
    # by transforming UNICSV waypoints back to trackpoints
    # also filter out superfluous name tag

    for f in "$pfx"*.csv; do
        gpsbabel 
            -i unicsv,fields=no+lat+lon+name+ele 
            -f "$f" 
            -x transform,trk=wpt 
            -x nuketypes,waypoints 
            -o gpx 
            -F - 
        | grep 
            -v '<name>.*</name>|<cmt>.*</cmt>|<desc>.*</desc>' 
            > "${f%.*}.gpx"
        rm "$f"
    done
    # ===

    return
}

Esto debería funcionar, por ejemplo, con las pistas GPX generadas por https://brouter.de/brouter-web

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)


Tags : /

Utiliza Nuestro Buscador

Deja una respuesta

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