Úno 072012
 
Tento příspěvek je 2. částí série Live tracking

Rychlost, čas a profil

Minule jsem s pomocí wiki předvedl, jak je možné přenášet data o pozici do Google dokumentů a na konci článku jsme se s mírným zpožděním dozvěděli, že byl i opraven bug s omezením rozlišení, což zase ale navíc přineslo problém s desetinnou tečkou. S tím jsme se ale už poprali v minulém článku. Dnes se podívejme, jak si výstup na mapu ještě vylepšit.

Co už máme *

Nejdříve se podíváme kde jsme skončili v minulém článku.

 function doGet(e) {
    var app = UiApp.createApplication();
    var sp = SpreadsheetApp.openById("0Ana.........");
    // insert new row
    sp.insertRowBefore(1);
    if(e) {
        sp.getRange("A1").setValue(e.parameter.lat);
        sp.getRange("B1").setValue(e.parameter.lon);
        sp.getRange("C1").setValue(e.parameter.altitude);
        sp.getRange("D1").setValue(e.parameter.speed);
        sp.getRange("E1").setValue(e.parameter.hdop);
        sp.getRange("F1").setValue(e.parameter.timestamp);
    }
    return app;
}

Rychlost v km/h *

Skript sice není špatný, ale má několik nevýhod. Především nelze použít rychlost. Lépe řečeno, je pro nás špatně čitelná, jelikož je v m/sec, proto bude lépe jí převést na km/h. To provedeme jednoduše ve skriptu.

        sp.getRange("D1").setValue(e.parameter.speed/1000*60*60);

Rychlost také rovnou přehodím do sloupce C, jelikož jí budu chtít ve finální mapě zobrazovat v popisku mapy. V minulé mapě byly jako popisky výškové body, to v dnešní ukázce změním za rychlost.

function doGet(e) {
    var app = UiApp.createApplication();
    var sp = SpreadsheetApp.openById("0Ana.........");
    // insert new row
    sp.insertRowBefore(1);
    if(e) {
        sp.getRange("A1").setValue(e.parameter.lat);
        sp.getRange("B1").setValue(e.parameter.lon);
        sp.getRange("C1").setValue(e.parameter.speed/1000*60*60);
        sp.getRange("D1").setValue(e.parameter.altitude);
        sp.getRange("E1").setValue(e.parameter.hdop);
        sp.getRange("F1").setValue(e.parameter.timestamp);
    }
    return app;
}

Tohle už vypadá mnohem lépe, ale osobně se mi nelíbí ta halda desetinných míst. Jako rychlost mi stačí celá čísla a proto bude lépe hodnotu zaokrouhlit.

 function doGet(e) {
    var app = UiApp.createApplication();
    var sp = SpreadsheetApp.openById("0Ana.........");
    // insert new row
    sp.insertRowBefore(1);
    if(e) {
        sp.getRange("A1").setValue(e.parameter.lat);
        sp.getRange("B1").setValue(e.parameter.lon);
        sp.getRange("C1").setValue(Math.round(e.parameter.speed/1000*60*60));
        sp.getRange("D1").setValue(e.parameter.altitude);
        sp.getRange("E1").setValue(e.parameter.hdop);
        sp.getRange("F1").setValue(e.parameter.timestamp);
    }
    return app;
}

Protože se třetím sloupcem už nebudu nijak dále počítat, přidám si k němu jednotku, aby to v popisku vypadalo lépe.

function doGet(e) {
    var app = UiApp.createApplication();
    var sp = SpreadsheetApp.openById("0Ana.........");
    // insert new row
    sp.insertRowBefore(1);
    if(e) {
        sp.getRange("A1").setValue(e.parameter.lat);
        sp.getRange("B1").setValue(e.parameter.lon);
        sp.getRange("C1").setValue(Math.round(e.parameter.speed/1000*60*60) + " km/h");
        sp.getRange("D1").setValue(e.parameter.altitude);
        sp.getRange("E1").setValue(e.parameter.hdop);
        sp.getRange("F1").setValue(Date(e.parameter.timestamp));
    }
    return app;
}

Čitelný čas *

Pro úplnost bude také dobré převést timestamp v posledním sloupci do lidsky čitelnější podoby. Zařídím to zase rovnou ve skriptu. To bude mít samozřejmě jistou nevýhodu. Na konci minulého článku jsme nastavili lokalizaci dokumentu na US, aby nám nedělaly problémy desetinné tečky. To samozřejmě způsobí i zobrazení pro nás nestandardního formátu data. Jistě by bylo možné jednotky upravit přímo ve skriptu, ale počkáme si s čím přijdou vývojáři (mají to ode mě nahlášené) a teprve pak se podle toho zařídíme. Finální skript s datem pak vypadá takto. Třetí sloupec si pak naberte jako minule do popisků a mapa pak bude vypadat jako na posledním obrázku dole.

function doGet(e) {
    var app = UiApp.createApplication();
    var sp = SpreadsheetApp.openById("0Ana.........");
    // insert new row
    sp.insertRowBefore(1);
    if(e) {
        sp.getRange("A1").setValue(e.parameter.lat);
        sp.getRange("B1").setValue(e.parameter.lon);
        sp.getRange("C1").setValue(Math.round(e.parameter.speed/1000*60*60) + " km/h");
        sp.getRange("D1").setValue(e.parameter.altitude);
        sp.getRange("E1").setValue(e.parameter.hdop);
        sp.getRange("F1").setValue(Date(e.parameter.timestamp));
    }
    return app;
}

 

Výškový profil *

Ještě mě napadlo, že by nebylo špatné udělat si výškový profil trasy. Stačí tedy nabrat data ze sloupce s výškou do grafu a máme hned pěkný výškový profil trasy. Trošku popíši jak na to, i když si asi každý s grafem hravě poradí. Stiskněte tlačítko pro vytvoření grafu a vyplňte rozsah dat. Jako typ grafu vyberte spojnicový.

Tlačítko vložit graf Rozsah a typ grafu

 

Dále si zvolte název, vypněte legendu, nastavte převrácení aby byl logicky zleva doprava a můžete zapnout vyhlazení. Na posledním obrázku je výsledek. Na mapě je možné kliknout na bod a ukáže se rychlost v daném místě, po kliknutí na spojnici grafu, pak výška v metrech. Mapu i graf je možné si dát do samostatných listů, já jsem to dělal takto kvůli lepšímu přehledu.

 

Přizpůsobení grafu Finální stav

 

Závěr *

Možná bylo lepší původní data sloupců ponechat nedotčené a upravené hodnoty vkládat do nových, berte to tedy jen jako nástřel a upravte si skript dle své potřeby.

QR Code Business Card