TIP: Parsování GPX v Excelu

Diskuze o software, který má mnoho společného s touto značkou (MapSource, BaseCamp, POI Loader, WebUpdater a ostatní).

TIP: Parsování GPX v Excelu

Odeslatod Path » 03.03.09 21:42 (Út)

Obsah:
1. Úvod
2. Validujeme soubor GPX
3. Počítáme základní elementy v GPX
4. Import Waypointů z GPX do XLS
5. Import Stop z GPX do XLS



Úvod

Většina zařízení Garmin umožňuje zaznamenává oblíbené položky (waypointy), trasy a stopy (tracklogy) do souboru gpx, se kterým můžete pracovat např. v aplikaci MapSource. GPX soubor je v podstatě dokument XML, který má pevně danou strukturu, která není nijak komplikovaná - zkuste si GPX soubor prohlédnout například v textovém editoru. Pokud máte potřebu data ze souboru GPX analyzovat podrobněji a nevíte jak na to, můžete například využít tabulkový procesor MS Excel, který je pro analýzu ideální.

Otázkou je, jak data z GPX souboru do Excelu přenést. Na výběr máte několik možností. Například využijete konverzní program GPSBabel a soubor převedete do jiného formátu, např. CSV. Také samotný MapSource umožňuje GPX soubor uložit do TXT. Cest je vždy několik, ale není nad vlastní řešení.

V následujícím si ukážeme možnosti parsování GPX přímo v aplikaci MS Excel. Budeme k tomu potřebovat alespoň základní znalosti o skriptování ve VBA (začátečníci zvládnou také) a XML parser od společnosti Microsoft, který je volně dostupný ke stažení.


Nutné podmínky pro parsování XML v Excelu

Pro parsování gpx v Excelu je nutné splnit tyto tři základní podmínky:

1) Povolte v Excelu makra:

Excel 2007: Tlačítko Office > Možnosti aplikace Excel > Centrum Zabezpečení > Nastavení Centra Zabezpečení > Nastavení Maker > Zakázat všechna makra s oznámením
Excel 2003: Nástroje > Makro > Zabezpečení… a zvolte "Střední"

Obrázek


2. Nainstalujte poslední verzi Microsoft XML parser v6 (MSXML6.0):

Zde je odkaz: MSXML 6.0


3. V MS Excel nastavte reference na Microsoft XML parser::

- spusťte Excel a přejděte do editoru VBA (ALT + F11)
- v editoru VBA zvolte v nástrojové liště Tools > References... a zatrhněte Microsoft XML, v6.0

Obrázek

Tímto jsou tři základní podmínky splněny a můžeme se pustit do práce. V následujícím příspěvku si ukážeme, jak lze pomocí MSXML validoval soubor GPX.


Začátečníci: Pokud jste ještě nikdy nepsali skript ve VBA (Visual Basic for Applications), zkuste si teď vytvořit obligátní první program, který zobrazí zprávu "Ahoj Světe". Spusťte Excel a přejděte do editoru VBA (klávesy ALT + F11) a z nabídky zvolte Insert > Module a vložte následující kód:

vba Code: Vybrat vše
Sub MujPrvniProgram()
  ' deklarace proměnné sText (řetězec)
 Dim sText As String
   
  ' do proměné sText vložíme řetězec (string) Ahoj Světe!
 sText = "Ahoj Světe!"
 
  ' zobrazíme dialogové okno MsgBox s námi definovaným textem
 MsgBox sText, , "Moje první zpráva"
End Sub


Procedury začínají klíčovým slovem Sub a pak následuje samotný název procedury, který musí být jedinečný a bez mezer. Konec procedury končí klíčovým slovem End Sub. Tento program spustíte tak, že umístíte kurzor do těla procedury a stisknete klávesu F5. Pro krokování (řádek po řádku) použijte klávesu F8. V Excelu jsou tyto procedury označované jako Makra. Nyní máte alespoň základní představu, jak makra fungují.
Obrázek uživatele
Path
Site Admin
 
Příspěvků: 3406
Registrace: 15.05.07 23:15 (Út)

Re: TIP: Parsování GPX v Excelu

Odeslatod Path » 03.03.09 21:44 (Út)

Úvod k validaci

Pokud chceme pracovat se souborem GPX, musíme zajistit jeho validitu (obvykle ručním zásahem). Určitě znáte případy, kdy MapSource odmítá načít GPX soubor s hláškou nelze naimportovat, ale už neoznámí z jakého důvodu. Validace se skládá ze dvou kontrol. Kontroluje se jak formát dokumentu (struktura), tak i hodnoty jednotlivých elementů na základě definice v souborech XSD (numerické bodnoty, boolean hodnoty, desetinné formáty apod.)

Odkazy na schéma XSD (XML Schema Definition) pro daný dokument se uvádějí v kořenovém elementu (root). Pokud například exportujete waypointy či trasy z MapSource do GPX a tento soubor otevřete v textovém editoru, najdete tam zhruba tuto definici:

vba Code: Vybrat vše
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<gpx xmlns="http://www.topografix.com/GPX/1/1" creator="MapSource 6.13.4" version="1.1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.garmin.com/xmlschemas/GpxExtensions/v3/ http://www.garmin.com/xmlschemas/GpxExt ... ionsv3.xsd http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd">


Zde je ovšem chybný odkaz na XSD soubor:
xml Code: Vybrat vše
http://www.garmin.com/xmlschemas/GpxExt ... ionsv3.xsd

Správně by měl být odkaz definován takto:
xml Code: Vybrat vše
http://www8.garmin.com/xmlschemas/GpxEx ... ionsv3.xsd
 
nebo
 
http://www8.garmin.com/xmlschemas/GpxExtensionsv3.xsd


Aplikaci MapSource je to úplně jedno. MapSource netahá XDS soubor z webu, ale má jej uložený přímo v sobě - v exe souboru. Že exportuje odkaz chybně už neřeší a sám validuje na základě vlastního XSD. Nám to samozřejmě komplikuje život, pokud chceme provést validaci vlastní. Buďto upravíme odkaz na XSD v gpx souboru ručně nebo mu jej vnutíme natvrdo.

Pojďme zkusit vlastní validaci gpx souboru...


Validujeme soubor GPX

V Excelu přejděte do editoru VBA (ALT + F11) a vložte nový modul (Insert > Module). V levém dolním okně (Properties > Name) jej pojmenujte např. ValidaceGPX. Nyní do tohoto modulu zkopírujte následující proceduru (začíná SUB a končí End Sub):

vba Code: Vybrat vše
'==================================================
' Validace Souboru Gpx
' * proceduru lze spustit klávesou F5 (kurzor umístěte mezi SUB a END SUB)
'==================================================
Sub ValidaceSouboruGpx()
Dim sFile       ' deklarace string > cesta k souboru
Dim bolResult ' deklarace pro výsledek validace

'dialogové okno pro výběr GPX souboru
sFile = Application.GetOpenFilename("GPX (*.gpx), *.gpx")
If sFile = False Then Exit Sub 'při stornu ukončíme

' voláme fci fceValidaceGpxSouboru, které předáme 2 parametry:
' 1 parametr: cesta k souboru gpx
' 2 parametr: zda chceme zobrazit hlášení o nevalidním souboru (True)
bolResult = fceValidaceGpxSouboru(sFile, True)
 
' další možný postup po vyhodnocení validity GPX
If bolResult = True Then
   ' validní... nějaký kód
  MsgBox "Soubor gpx je validní:" & vbCrLf & vbCrLf & sFile, vbInformation, "Validace souboru GPX"
Else
   ' nevalidní... nějaký kód
End If
 
End Sub


Kód jsem se snažit dostatečně komentovat (řádky začínají apostrofem), tak předpokládám, že je vše jasné. Pokud zběžně prohlédnete kód, uvidíte, že je zde volána funkce fceValidaceGpxSouboru, která ověří validitu GPX souboru a vrátí hodnotu True (soubor je validní) nebo False (soubor není validní).

Funkci předáme dva parametry, kde první je cesta k souboru GPX a druhý parametr typu boolean (Ano/Ne = True/False), kterým určíme, zda chceme zobrazit výsledek o případné chybě v gpx.

Nyní pod proceduru zkopírujte funkci fceValidaceGpxSouboru:

vba Code: Vybrat vše
'==================================================
' Volaná fce pro samotnou validaci GPX
' Pozor, je nutno mít nastavenou referenci na Microsoft XML!
' Tools > References... > Microsoft XML, v6 (v4, v3)
'==================================================
Function fceValidaceGpxSouboru(sFile, Optional bolMessage As Boolean = False)
Dim oGPX As New DOMDocument60   ' deklarace nového objektu (Document Object Model)- MSXML
Dim GarminSchema As Msxml2.XMLSchemaCache60 ' deklarace objektu SchemaCache60
Dim sResult, bolValid As Boolean
 
' přidáme korektní xsd pro schema Garmin (www8...),
' který MapSource bohužel do gpx nevkládá
Set GarminSchema = New Msxml2.XMLSchemaCache60
GarminSchema.Add "http://www.garmin.com/xmlschemas/GpxExtensions/v3", _
                           "http://www8.garmin.com/xmlschemas/GpxExtensionsv3.xsd"
 
With oGPX
   .async = False
   Set .Schemas = GarminSchema   ' přidáme vlastní schema
   .resolveExternals = False    ' načtení externích entit z DTD deklarace    >> zakázáno
   .validateOnParse = True        ' načtení a validace                                        >> povoleno
   .Load sFile                      ' načtení souboru GPX
 
   If .parseError.ErrorCode <> 0 Then  ' kontejner parsingu vrací poslední nalezenou chybu
         sResult = "Pozor, kontrolovaný soubor není validní!" & vbCrLf & vbCrLf & _
         "Soubor: " & vbTab & sFile & vbCrLf & _
         "Chyba č.:" & vbTab & .parseError.ErrorCode & vbCrLf & _
         "Příčina: " & vbTab & .parseError.reason & vbCrLf & _
         "Zdroj: " & vbTab & Trim(.parseError.srcText) & vbCrLf & vbCrLf & _
         "Řádek: " & vbTab & .parseError.Line & vbCrLf & _
         "Pozice: " & vbTab & .parseError.linepos & vbCrLf & _
         "Znak: " & vbTab & .parseError.filepos
         bolValid = False
         
         ' pokud je žádáno hlášení o validaci, zobrazíme výsledek s chybou
         If bolMessage = True Then
            MsgBox sResult, vbExclamation, "Problém se souborem GPX"
         End If
   Else
         bolValid = True   ' soubor je validní
   End If                       ' konec validace
End With
 
' funkce vrátí True (soubor je validní) nebo False (nevalidní)
fceValidaceGpxSouboru = bolValid
End Function


V této funkci deklarujeme objekt oGPX jako MSXML parser (DOMDocument60) včetně XMLSchemaCache60, který nám umožní vnutit GPX souboru nový odkaz na definici XSD (www8.garmin... ...xsd). Jakým způsobem lze přidat nové schema můžete vidět na začátku funkce. Pokud bychom nevnutili objektu oGPX schema http://www8.garmin.com/... ... .xsd, mohli bychom validovat pouze strukturu dokumentu i za předpokladu, že povolíme načtení všech definic z webu parametrem .resolveExternals = True. K ověření hodnot by však nedošlo a XML parser by nenašel případnou chybu.

Funkci validace souboru budeme nyní využívat i v dalších ukázkách

Zkuste nyní umístit kurzor do procedury ValidaceSouboruGpx() mezi Sub a End Sub a stiskněte klávesu F5. Připravil jsem ukázku nevalidního GPX souboru, na kterém si proceduru můžete vyzkoušet. Najdete chybu v tomto souboru?

Ukázkový GPX:
testovaci_soubor.rar


V následujícím příspěvku spočítáme základní elementy gpx souboru.
Nemáte oprávnění prohlížet přílohy.
Obrázek uživatele
Path
Site Admin
 
Příspěvků: 3406
Registrace: 15.05.07 23:15 (Út)

Re: TIP: Parsování GPX v Excelu

Odeslatod Path » 03.03.09 22:11 (Út)

Počítáme základní elementy v GPX

V GPX souboru jsou waypointy definovány tagem wpt, trasy tagem rte, stopy tagem trk. Pojďme nyní spočítat, kolik waypointů, tras a stop je v gpx souboru uvedeno. Opět využijeme objekt MSXML.

Deklarujeme oGPX jako DOMDocument, ze kterého budeme získávat elementy na základě jejich názvu. Waypointy jsou v gpx definovány tagem wpt, který dále obsahuje atributy lat a lon:

xml Code: Vybrat vše
 <wpt lat="50.0725393" lon="14.5426628">
    <ele>290.0000000</ele>
    <name>Europark Štěrboholy</name>
    <cmt>Europark Sterboholy</cmt>
  </wpt>


Nás ale nyní zajímá pouze celkový počet tagů wpt, které v gpx souboru spočítáme takto:

oGPX.getElementsByTagName("wpt").Length

Obdobně budeme postupovat u ostatních tagů <rte> a <trk>.

Připravil jsem proceduru, která všechny tyto tagy spočítá. V Excelu přejděte do editoru VBA (ALT+ F11) a vložte nový modul (Insert > Module), který pojmenujte např.: PocetElementuGPX. Do tohoto modulu zkopírujte následující proceduru:

vba Code: Vybrat vše
'==================================================
' Počet základních elementů (wpt, trk, rte)
' * proceduru lze spustit klávesou F5 (kurzor umístěte mezi SUB a END SUB)
'==================================================
Sub PocetZakladnichElementu()
Dim oGPX As New DOMDocument 'DOMDocument60
Dim sFile                ' deklarace string > cesta k souboru
Dim bolResult     ' deklarace pro výsledek validace
Dim iWPT As Integer
Dim iTRK As Integer
Dim iTRKSG As Integer
Dim iRTE As Integer
 
' dialogové okno pro výběr GPX souboru
sFile = Application.GetOpenFilename("GPX (*.gpx), *.gpx")
If sFile = False Then Exit Sub 'nebyl zvolen soubor (ukončíme)

' ověříme zda je GPX soubor validní. Ukončíme, když není validní
If fceValidaceGpxSouboru(sFile, True) = False Then Exit Sub
 
' pomocí MSXML načíst GPX soubor (sFile)
With oGPX
   .resolveExternals = False  ' načtení externích entity z DTD deklarace >>zakázáno
  .validateOnParse = True
   .Load (sFile)                    ' načtení dat

   ' spočítáme waypointy - element <wpt>
  iWPT = .getElementsByTagName("wpt").Length
   
   ' spočítáme trasy - element <rte>
  iRTE = .getElementsByTagName("rte").Length
   
   ' spočítáme tracklogy (stopy) - element <trk>
  iTRK = .getElementsByTagName("trk").Length
   
   ' spočítáme také segmenty stopy <trkseg>.
  ' Dílčích segmentů stopy může být více než
  ' elementů <trk>. Obvykle se to týká kontinuálního
  ' záznamu stopy u outdoorových přístrojů
  iTRKSG = .getElementsByTagName("trkseg").Length
   
   ' závěrečná zpráva
  sMsg = "Počet waypoitů:" & vbTab & vbTab & iWPT & vbCrLf & _
            "Počet tras" & vbTab & vbTab & iRTE & vbCrLf & _
            "Počet stop:" & vbTab & vbTab & iTRK & vbCrLf & _
            "Počet dílčích stop:" & vbTab & vbTab & iTRKSG & vbCrLf & vbCrLf & _
            "Soubor: " & sFile & scode
   MsgBox sMsg, vbInformation, "Počet jednotlivých elementů v souboru gpx"
End With
End Sub


Pozorný uživatel si všiml, že i v této proceduře se volá funkce fceValidaceGpxSouboru. Pokud není soubor GPX validní, procedura bude ukončena.

Pokud se vám nechce procedury kopírovat, připravil jsem ukázkový soubor XLS, který všechny dosud uvedené procedury obsahuje. Všechny se obsluhují pomocí tlačítek.

GPX_a_XLS_v01.rar

Příště si ukážeme, jak s využitím MSXML lze snadno a rychle do Excelu naimportovat waypointy.
Nemáte oprávnění prohlížet přílohy.
Obrázek uživatele
Path
Site Admin
 
Příspěvků: 3406
Registrace: 15.05.07 23:15 (Út)

Re: TIP: Parsování GPX v Excelu

Odeslatod Path » 03.03.09 23:46 (Út)

Import Waypointů z GPX do XLS

Za pomocí parseru MS XML je načtení všech waypointů ze souboru GPX celkem jednoduché. Tentokrát zde nebudu uvádět jednotlivé procedury, které by vás zbytečně zahltily, ale principiálně naznačím (finální soubor bude níže ke stažení).

Nadefinujeme objekt oGpx jako DOM a k tomu definujeme Element:
vba Code: Vybrat vše
Dim oGPX As New DOMDocument
Dim Element As IXMLDOMElement


po validaci pokračujeme načtením celého GPX dokumentu:

vba Code: Vybrat vše
...
With oGPX
   .resolveExternals = False
   .Load (sFile)
   .Validate  
End With


Nyní budeme jednotlivě procházet všechny tagy wpt:

vba Code: Vybrat vše
For Each Element In oGPX.SelectNodes("//wpt")
   sLat = Element.getAttribute("lat") ' vrátí atribut latitude tagu wpt
  sLon = Element.getAttribute("lon") ' vrátí atribut longitude tagu wpt
  sEle = Element.SelectSingleNode("ele").Text ' vrátí obsah elementu elevation do proměnné sEle
  ' ... a tak dále
Next


Velmi jednoduché a hlavně rychlé. Více práce však budeme mít se zápisem všech údajů do listu v Excelu. Stavební kámen procedury by mohl vypadat takto:

1) validujeme vybraný soubor GPX
2) vytvoříme nový list a pojmenujeme jej např. dle názvu gpx
3) tento nový list podle potřeb zformátujeme
4) vytvoříme si záhlaví tabulky
5) vložíme hodnoty waypointu řádek po řádku


Známé problémy

Časový údaj

Pokud waypoint obsahuje časový údaj (formát ISO), bude do excelu vložen jako text. Příklad:

2009-03-01T00:35:59Z

První problém tohoto údaje je jeho podoba, kterou Excel nezná a neumí s ní pracovat. Velmi těžko budeme s podobný údajem provádět analýzu např. u tracklogů. Druhý problém je, že GPS ukládá časové údaje v UTC (Světový koordinovaný čas) a my k němu musíme připočíst časové pásmo (u nás +1 hod), ale také případný letní čas.

Pokud bychom chtěli tento časový údaj pouze zformátovat do platné hodnoty, můžeme si napsat jednoduchou funkci:

vba Code: Vybrat vše
'-----------------------------------------------------------------
' Funce formátuje čas v GPX na číselný formát (beze změny)
'-----------------------------------------------------------------
Function fceFormatDate(sISODate)
Dim tmpDate, tmpTime
If sISODate = "" Then
   fceFormatDate = ""
   Exit Function
End If
sISODate = Replace(sISODate, "Z", "")
sISODate = Replace(sISODate, "T", " ")
tmpDate = Format(sISODate, "dd/mm/yyyy hh:mm:ss")
fceFormatDate = tmpDate
End Function


My však potřebujeme přičíst časové pásmo a letní čas. V přiloženém souboru využívám pro získání aktuálního časového pásma počítače Win Api a pro letní/zimní čas vlastní funkci. Neděste se, prosím, pokud budete procházet kód.

Nyní si stáhněte připravený soubor XLS a zkuste naimportovat waypointy z některého GPX dokumentu. Pokud chcete jednotlivé kroky procedury procházet, umístěte v editoru VBA kurzor do procedury ImportWaypointuZeSouboruGPX() a stiskněte klávesu F8, další krok F8 atd.


Soubor ke stažení:
GPX_a_XLS_v02.rar


Příště si ukážeme, jak do Excelu importovat tracklogy (Stopy).


Začátečníci: Odkaz na buňku je v této proceduře uveden jako ThisWorkbook.Sheets("název listu").Cells(řádek, sloupec). Chceme-li například v listu "List1" zapsat hodnotu "ahoj světe"do buňky A2, měl by zápis vypadat takto:

vba Code: Vybrat vše
ThisWorkbook.Sheets("List1").Cells(2, 1).Value = "Ahoj Světe"


ThisWorkbook (Sešit XLS, v kterém pracujete)
Sheets("název") (Název Listu, ve kterém provádíte změny)
Cells(2,1) (buňka A2 = řádek 2, sloupec 1)

Zápis lze zkrátit klíčovým slovem With:

vba Code: Vybrat vše
With ThisWorkbook.Sheets("List1")
    .Cells(1, 1).Value = "Ahoj Světe"
    .Cells(1, 2).Value = "Ahoj Světe"
    .Cells(1, 3).Value = "Ahoj Světe"
End With


Cyklus lze provést takto (ve sloupci 1 zapíše do řádků 1 až 100: 1., 2., 3. atd):

vba Code: Vybrat vše
For i = 1 to 100
   ThisWorkbook.Sheets("List1").Cells(i, 1).Value = i & "."
Next

Nemáte oprávnění prohlížet přílohy.
Obrázek uživatele
Path
Site Admin
 
Příspěvků: 3406
Registrace: 15.05.07 23:15 (Út)

Re: TIP: Parsování GPX v Excelu

Odeslatod Path » 04.03.09 17:36 (St)

Ještě jednou se vracím k validaci GPX... Pokud máte problém s přístupem k webu přes proxy, je možné, že vám funkce validace bude hlásit chybu:

Runtime error '-2147024891 (80070005)':

Přístup byl odepřen


jakmile proces dojde k tomuto řádku:

vba Code: Vybrat vše
GarminSchema.Add "http://www.garmin.com/xmlschemas/GpxExtensions/v3", _
   "http://www8.garmin.com/xmlschemas/GpxExtensionsv3.xsd"


Zkuste tedy soubor xsd uložit v PC, např. na disk C:\ s názvem: C:\GpxExtensionsv3.xsd a změňte řádek ve VBA takto:

vba Code: Vybrat vše
GarminSchema.Add "http://www.garmin.com/xmlschemas/GpxExtensions/v3", _
   "C:\GpxExtensionsv3.xsd"


Nyní se bude schema načítat z lokálního disku, což je zajedno rychlejší a za druhé nenarazíme na problémy s proxy.
Obrázek uživatele
Path
Site Admin
 
Příspěvků: 3406
Registrace: 15.05.07 23:15 (Út)

Re: TIP: Parsování GPX v Excelu

Odeslatod Path » 06.03.09 15:51 (Pá)

Import Stop z GPX do XLS

Dostáváme se k poslední a asi nejzajímavější části, ve které budeme importovat Tracklogy do Excelu. Princip načítání (parsování) GPX bude s menšími rozdíly podobný jako u waypointů. Nejprve musíme vyřešit otázku, jak budeme tracklogy v excelu členit. Tracklog začíná a končí elementy <trk>...</trk>. Následuje element <trkseg> ... <trkseg>, do kterého se zapisují údaje dílčí stopy <trkpt>... <trkpt>.

Jedna stopa <trk> standardně obsahuje jeden segment stopy <trkseg>. Stopa se ale také může skládat z několika dalších segmentů, které můžeme chápat jako další samostatné stopy. Nejčastěji se s tímto zápisem setkáme u kontinuálního záznamu stopy, např. u outdoorových přístrojů. Příklad:

<trk>
<name>ACTIVE LOG: 22 LIS 2007 16:13</name>
<extensions>
<gpxx:TrackExtension xmlns:gpxx="http://www.garmin.com/xmlschemas/GpxExtensions/v3">
<gpxx:DisplayColor>Red</gpxx:DisplayColor>
</gpxx:TrackExtension>
</extensions>
<trkseg>
<trkpt lat="51.0422420" lon="13.7361380">
<ele>120.7800000</ele>
<time>2007-12-01T14:28:01Z</time>
</trkpt>
<trkpt lat="51.0414040" lon="13.7352660">
<ele>121.2600000</ele>
<time>2007-12-01T14:28:12Z</time>
</trkpt>
<trkpt lat="51.0404170" lon="13.7343160">
<ele>121.7400000</ele>
<time>2007-12-01T14:28:26Z</time>
</trkpt>
</trkseg>

<trkseg>
<trkpt lat="51.0385440" lon="13.7316830">
<ele>115.0100000</ele>
<time>2007-12-01T14:32:39Z</time>
</trkpt>
<trkpt lat="51.0386670" lon="13.7318040">
<ele>112.6100000</ele>
<time>2007-12-01T14:32:43Z</time>
</trkpt>
</trkseg>

</trk>


Řešením může být import každého segmentu stopy do samostatného listu (2 segmenty = 2 listy apod.) Abychom se v importovaných listech neztratili automaticky pojmenujeme každý jednotlivý list prvním časovým údajem segmentu stopy (element <time>).

Parsování stopy může vypadat následovně:

vba Code: Vybrat vše
Dim oGPX As New DOMDocument
Dim objNode As IXMLDOMNode               ' pro stopy <trk>
Dim objNodeSeg As IXMLDOMNode   ' pro segmenty stopy <trkseg>
Dim objEleTrkpt As IXMLDOMElement  ' pro body segmentu <trkpt>
...
For Each objNode In oGPX.SelectNodes("//trk")
  ... ' každý jednotlivý element <trk>
 For Each objNodeSeg In objNode.SelectNodes("trkseg")
  ... ' každý jednotlivý vnořený element <trkseg>
        For Each objEleTrkpt In objNodeSeg.ChildNodes
        ...  ' všechny podřízené elementy <trkseg>
        Next
   Next
Next


Nezahlťme se. Celé řešení máte k dispozici v XLS souboru, který si můžete na konci tohoto příspěvku stáhnout.

Popíšu pouze základní kroky celého řešení:
(makro je v přiloženém souboru)

1) deklarujeme objekt MSXML
2) vybereme soubor GPX pomocí dialogu
3) ověříme validaci souboru
4) projedeme jednotlivé elementy <trk> (cyklus):
- načteme název stopy, případně i její barevné vyznačení v MapSource
5) projedeme každý jednotlivý segment stopy (cyklus):
- vytvoříme nový list, pojmenujeme jej podle data a zformátujeme jej (vyšší čitelnost)
- každý jednotlivý podřízený element vypíšeme do nového listu
- dokončíme formát listu a vložíme základní statistiku o stopě, stejně jako MapSource

Použitých vzorců typu celkový čas, celková vzdálenost apod. se nelekejte, nemají vliv na import stopy. Tyto vzorce slouží pouze pro informaci. Pro Excel 2003 a 2007 je nutné použít jiný vzorec informující o průměrné rychlosti.

Pokud vlastníte snímač tepové frekvence (např. v kombinaci s Garmin Oregon), můžete zkusit načít ze souboru GPX i tyto hodnoty, které se budou zapisovat do sloupce HR (Heart rate). Překvapivě MapSource neumí s údajem HR pracovat, takže v něm tyto údaje ani nezobrazíte.

Celý proces Importu stopy si můžete odkrokovat klávesou F8, čímž získáte lepší představu o celém kódu. Zdrojový kód zde nebudu vypisovat, ale snažil jsem se jednotlivé kroky dostatečně okomentovat. Koho makro nezajímá, tem vystačí s tlačítky na stránce MENU. Myslím, že tímto můžeme kapitolu o parsování GPX v Excelu uzavřít.

Ukázkový soubor:
GPX_a_XLS_v03.xls

Poznámka: Soubor XLS obsahuje také předchozí ukázky.

Obrázek Obrázek Obrázek
Nemáte oprávnění prohlížet přílohy.
Obrázek uživatele
Path
Site Admin
 
Příspěvků: 3406
Registrace: 15.05.07 23:15 (Út)


Zpět na Garmin: Software

Kdo je online

Online uživatelé v tomto fóru: CommonCrawl [Bot] a 10 návštevníků.