Adaptation des fichiers GPX de TwoNav (ou autres ?) pour l'importation dans BaseCamp

Aller en bas

Adaptation des fichiers GPX de TwoNav (ou autres ?) pour l'importation dans BaseCamp Empty Adaptation des fichiers GPX de TwoNav (ou autres ?) pour l'importation dans BaseCamp

Message par BenThon Sam 24 Aoû - 9:09

Préambule :
Voici une application Web qui permet de façonner des fichiers GPX, en vue d’une importation dans BaseCamp.

L’entièreté de l’application est dans une page Web, sous la forme d’une page « HTML » que vous mettez en local dans vos fichiers. L’affichage de l’application et son exécution ne nécessite aucune liaison internet. Tout se passe en local !

Cette application, sous forme de page Web, est composée ainsi :
• La structure d’une page « HTML ».
• Une feuille de style (CSS) pour le formatage à l’écran.
• Un script en JavaScript pour réaliser le travail.

Sous l’impulsion du membre du forum « Sorcière Monique GPS », [Vous devez être inscrit et connecté pour voir ce lien], j’ai écrit cette application Web dans le but premier de rendre compatible les fichiers GPX issus de « TwoNav » (TwoNav Cloud) avec BaseCamp.
Dans ces GPX il y a 3 lignes qui sont bloquantes pour l’importation dans BaseCamp. BaseCamp affiche un message d’erreur et refuse l’importation.
Ces 3 lignes :
[Vous devez être inscrit et connecté pour voir cette image]

L’application web permet de, soit de mettre en commentaire ces 3 lignes, soit de les supprimer.
Après avoir choisi un fichier GPX, l’application recherche la présence de ces lignes et signale celles-ci, si elles existent.
[Vous devez être inscrit et connecté pour voir cette image]

Un autre avantage de l’application est de proposer de supprimer certaines données du fichier GPX (en vue d'un partage), notamment des données très personnelles comme la « fréquence cardiaque ».

Il est donc possible de supprimer ces balises :
• « extensions »
• « time »
• « ele »
• « sat »

Autres options :
• La balise « name » est entièrement éditable. Par défaut, elle ajoute « GPX_adapté » au contenu préexistant.
• Possibilité d’ajouter un contenu à la balise « desc » (chaîne vide par défaut).
Indentation du fichier GPX adapté avec un certain nombre d’espaces, offrant une lecture plus aisée (en mode texte) du contenu.

Cette application peut aussi être utile avec des GPX , non issus de TwoNav, afin de supprimer certaines balises inutiles en vue d’un partage.

Vous trouverez, ci-dessous, le texte de toute la page « HTML ». Pour la mettre en local chez vous, vous copiez l’ensemble du texte du code présent ci-dessous et vous le copiez dans un nouveau fichier texte que vous créez, avec le nom que vous souhaitez. Vous changez, ensuite, l’extension « .txt » par « .html ».
Pour exécuter l’application, vous « double-cliquez » sur ce nouveau fichier « HTML ».

Code:
<!DOCTYPE html>
<html lang="fr">
    <head>
        <meta charset="utf-8" />
        <title>TwoNav vers Basecamp</title>
        <meta name="author" content="BenThon & al" />
        <meta name="description" content="Application Web pour adapter les
        traces venant de TwoNav, pour permettre l"importation dans BaseCamp">
        <meta name="revised" content="samedi 23 août 2024" />
        <style>
            #grid {
                display: grid;
                grid-template-columns: auto auto;
            }
            textarea {
                margin-left: 20px;
                margin-right: 20px;
                resize: none;
                vertical-align: top;
            }
            input[type="text"] {
                padding: 6px 12px;
                font-size: 16px;
                font-weight: 400;
                line-height: 1.5;
                color: #212529;
                background-color: #fff;
                background-clip: padding-box;
                border: 1px solid #ced4da;
                appearance: none;
                border-radius: 4px;
                transition: border-color 0.15s ease-in-out,
                    box-shadow 0.15s ease-in-out;
                :focus {
                    color: #212529;
                    background-color: #fff;
                    border-color: #86b7fe;
                    outline: 0;
                    box-shadow: 0 0 0 0.25rem rgb(13 110 253 / 25%);
                }
            }
        </style>
    </head>
    <body>
        <div id="grid">
            <div id="infile">
                <h3>Adaptation des fichiers <i>GPX de TwoNav (ou autres ?)</i> pour <b>BaseCamp</b></h3>
                <p>Choisir un fichier venant de TwoNav (ou autres ?)</p>
                <input
                    id="inputfile"
                    type="file"
                    accept="application/gpx"
                    autocomplete="off"
                />
            </div>
            <div id="outfile">
                <button id="downloadlink">Sauve GPX adapté</button>
                <input
                    type="string"
                    id="outputfile"
                    value="fichier_en_sortie.gpx"
                    autocomplete="off"
                    size="40"
                /><br /><br />
                <input type="checkbox" id="extsup" name="extsup" />
                <label for="extsup"
                    >Supprimer les <i><b>extensions</b></i> (ex :
                    <b>fréquence cardiaque</b> - <b>hr</b>)</label
                ><br />
                <input type="checkbox" id="timesup" name="timesup" />
                <label for="timesup"
                    >Supprimer les
                    <i><b>données temporelles</b></i> (<b>time</b>)</label
                ><br />
                <input type="checkbox" id="altsup" name="altsup" />
                <label for="altsup"
                    >Supprimer les
                    <i><b>données d'altitude</b></i> (<b>ele</b>)</label
                ><br />
                <input type="checkbox" id="satsup" name="satsup" />
                <label for="satsup"
                    >Supprimer les
                    <i><b>données de satellite</b></i> (<b>sat</b>)</label
                ><br /><br />
                <label for="nomgpx"
                    >Balise <<b>name</b>> éditable :
                </label>
                <input
                    type="text"
                    id="nomgpx"
                    name="nomgpx"
                    value="..."
                    size="40"
                /><br /><br />
                <label for="descgpx"
                    >Balise <<b>desc</b>> ajouter :
                </label>
                <input
                    type="text"
                    id="descgpx"
                    name="descgpx"
                    placeholder="Mettre une description ici"
                    size="40"
                /><br /><br />
                <input type="checkbox" id="indentgpx" name="indentgpx" checked />
                <label for="indentgpx"
                    ><i><b>Indenter</b></i> le fichier adapté de
                </label>
                <select id="nb_espaces">
                    <option value="1">1 espace</option>
                    <option value="2">2 espaces</option>
                    <option value="3">3 espaces</option>
                    <option value="4" selected>4 espaces</option>
                    <option value="5">5 espaces</option>
                    <option value="6">6 espaces</option></select
                ><br /><br />
                <fieldset style="width: 300px">
                    <legend>Supprimer ou commenter lignes TwoNav :</legend>

                    <div>
                        <input
                            type="radio"
                            id="commenter"
                            name="choixTN"
                            value="commenter"
                            checked
                        />
                        <label for="commenter">Commenter</label>
                    </div>

                    <div>
                        <input
                            type="radio"
                            id="supprimer"
                            name="choixTN"
                            value="supprimer"
                        />
                        <label for="supprimer">Supprimer</label>
                    </div>
                </fieldset>
            </div>
            <div id="comments"></div>
        </div>
        <script>
            var inputfile = document.getElementById("inputfile");
            var outputfile = document.getElementById("outputfile");
            var checksup = document.getElementById("extsup");
            var checksuptime = document.getElementById("timesup");
            var checksupalt = document.getElementById("altsup");
            var checksupsat = document.getElementById("satsup");
            var downloadlink = document.getElementById("downloadlink");
            var comments = document.getElementById("comments");
            var modif_text;
            var sauve_text;

            inputfile.addEventListener("change", function () {
                if (inputfile.files.length) {
                    handleFile(inputfile.files[0]);
                }
            });
            downloadlink.addEventListener("click", download, false);
            function handleFile(file) {
                var outputfile = document.getElementById("outputfile");
                outputfile.value = file.name.replace(/\.gpx/, "_adapté.gpx");
                file.text().then(postprocess).catch(catchAll);
            }
            function catchAll(val) {
                comments.innerHTML = "error: " + val;
            }

            function postprocess(text) {
                comments.innerHTML = "";
                modif_text = text;

                if (modif_text.search("<author>TwoNavGO</author>") >= 0) {
                    comments.innerHTML +=
                        "<br/>Présence de <b>author= TwoNavGO</b> dans le GPX<br/>";
                }
                if (
                    modif_text.search(
                        '<copyright author="TwoNavGO">Device-TwoNavGO</copyright>'
                    ) >= 0
                ) {
                    comments.innerHTML +=
                        '<br/>Présence de <b>copyright author="TwoNavGO"</b> dans le GPX<br/>';
                }
                if (
                    modif_text.search('<link href="https://go.twonav.com">') >=
                    0
                ) {
                    comments.innerHTML +=
                        '<br/>Présence du lien <b>"https://go.twonav.com"</b> dans le GPX<br/>';
                }

                // Adapter le name et desc

                const parser = new DOMParser();
                const xmlDoc = parser.parseFromString(text, "application/xml");
                var GPXnom = xmlDoc.getElementsByTagName("name")[0].textContent;
                nomgpx.value = "GPX_adapté " + GPXnom.replace(/\.gpx/, "");

                if (modif_text.search("<desc>") >= 0) {
                    descgpx.value =
                        xmlDoc.getElementsByTagName("desc")[0].textContent;
                } else {
                    descgpx.value = "";
                }
            }

            function formatXml(xml, rep) {
                const PADDING = " ".repeat(rep); // taille d'indentation
                const reg = /(>)(<)(\/*)/g;
                let pad = 0;

                xml = xml
                    .replace(/(\r\n|\n|\r)/gm, "\u0020")
                    .replace(/>\s+</g, "><");
                xml = xml.replace(/(>)(<)(\/*)/g, "$1\r\n$2$3");

                return xml
                    .split("\r\n")
                    .map((node, index) => {
                        let indent = 0;
                        if (node.match(/.+<\/\w[^>]*>$/)) {
                            indent = 0;
                        } else if (node.match(/^<\/\w/) && pad > 0) {
                            pad -= 1;
                        } else if (node.match(/^<\w[^>]*[^\/]>.*$/)) {
                            indent = 1;
                        } else {
                            indent = 0;
                        }

                        pad += indent;

                        return PADDING.repeat(pad - indent) + node;
                    })
                    .join("\r\n");
            }

            function download() {
                sauve_text = modif_text;
                sauve_text = sauve_text.replace(
                    /<desc>[\s\S]*?<\/desc>/g,
                    ""
                );
                sauve_text = sauve_text.replace(
                    /<name>[\s\S]*?<\/name>/g,
                    "<name>" +
                        nomgpx.value +
                        "<\/name>\n<desc>" +
                        descgpx.value +
                        "</desc>"
                );

                if (commenter.checked == true) {
                    sauve_text = sauve_text
                        .replace("<author>TwoNavGO</author>", "<!--    <author>TwoNavGO</author> -->")
                        .replace(
                            '<copyright author="TwoNavGO">',
                            '<!--    <copyright author="TwoNavGO">'
                        )
                        .replace(
                            "Device-TwoNavGO</copyright>",
                            "Device-TwoNavGO</copyright> -->"
                        )
                        .replace(
                            '<link href="https://go.twonav.com">https://go.twonav.com</link>',
                            '<!--    <link href="https://go.twonav.com">https://go.twonav.com</link> -->'
                        );
                } else {
                    sauve_text = sauve_text
                        .replace("<author>TwoNavGO</author>", "<!-- *** -->")
                        .replace(
                            '<copyright author="TwoNavGO">Device-TwoNavGO</copyright>',
                            "<!-- *** -->"
                        )
                        .replace(
                            '<link href="https://go.twonav.com">https://go.twonav.com</link>',
                            "<!-- *** -->"
                        );
                }

                // Supprimer les données de fréquence cardiaque et autres extensions spécifiques
                if (checksup.checked == true) {
                    sauve_text = sauve_text.replace(
                        /<extensions>[\s\S]*?<\/extensions>/g,
                        ""
                    );
                }
                // Supprimer les données temporelles
                if (checksuptime.checked == true) {
                    sauve_text = sauve_text.replace(
                        /<time>[\s\S]*?<\/time>/g,
                        ""
                    );
                }
                // Supprimer les données d'altitude
                if (checksupalt.checked == true) {
                    sauve_text = sauve_text.replace(
                        /<ele>[\s\S]*?<\/ele>/g,
                        ""
                    );
                }
                // Supprimer les données de satellite
                if (checksupsat.checked == true) {
                    sauve_text = sauve_text.replace(
                        /<sat>[\s\S]*?<\/sat>/g,
                        ""
                    );
                }

                var el = document.getElementById("nb_espaces");
                var val = el[el.selectedIndex].value;

                if (indentgpx.checked == true) {
                    sauve_text = formatXml(sauve_text, val);
                }

                var hiddenElement = document.createElement("a");
                hiddenElement.href =
                    "data:application/gpx;charset=utf-8," +
                    encodeURI(sauve_text);
                hiddenElement.target = "_blank";
                hiddenElement.download = outputfile.value;
                hiddenElement.click();
            }
        </script>
    </body>
</html>

Pour ceux qui ne sauraient pas réaliser ceci, la « Sorcière Monique » - maîtresse des lieux, ajoutera à la fin de ce « fil », un fichier avec l’extension « .zip » contenant la page « HTML ». Il suffira ensuite de « double-cliquez » sur ce nouveau fichier « HTML ».

Cordialement,
Benoît

[EDIT de Monique : Ajout du ".zip" en fichier-joint ci-dessous]
.
Fichiers joints
Adaptation des fichiers GPX de TwoNav (ou autres ?) pour l'importation dans BaseCamp Attachment
twonav_vers_basecamp_adaptation.zip Vous n'avez pas la permission de télécharger les fichiers joints.(3 Ko) Téléchargé 2 fois
BenThon
BenThon
4 sat
4 sat


Revenir en haut Aller en bas

Revenir en haut

- Sujets similaires

 
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum