2011-04-10

Mystify

Även om jag i de flesta fall föredrar Garmin eTrex Legend HCx framför Garmin Oregon, så finns det tillfällen när eTrex Legend inte är bra. Geocaching är ett sådant tillfälle. Den har i princip inget stöd för geocaching, särskilt inte när man jämför med Oregon.

En sak som är dåligt är att alla cacher, oavsett typ, visas med samma symbol. Detta är problematiskt för cacher av typen mystery eftersom man riskerar att leta efter en gömma trots att det inte finns någon på den plats som GPS:en indikerar.

För att råda bot på detta skrev jag ett litet program som byter ut symbolen i GPX-filer för cacher av typen mystery. Detta kombinerat med en "custom symbol" i GPS:en gör att mystery-cacher visas som ett frågetecken istället.

Installation

Det är egentligen ingen installation. Det handlar om att ladda ner och packa upp en ZIP-fil.

  • Ladda ner ZIP-filen och packa upp i godtycklig katalog.
    • Programmet kräver .NET Framework 2.0 (finns att hämta här)
  • För att överföra symbolen för mystery till GPS:en krävs xImage (som man hittar här)
    • Symbolen finns i ZIP-filen
    • Se hjälpen till xImage för ytterligare information om hur det används

Användning

Programmet tar in ett argument, namnet på den GPX-fil som ska mystifieras (se även exemplet i CMD-filen). Resultatet blir en ny GPX-fil. Den får samma namn fast med "-myst" i slutet. Programmet kan köras antingen direkt via kommandoraden (se nedan) eller via CMD-fil.

c:\download\mystify>Mystify exempel.gpx
  1. Kör programmet (t ex via CMD-filen)
  2. En ny GPX-fil skapas
  3. Skicka ner den nya GPX-filen till GPS:en

Det finns flera saker man skulle kunna utöka programmet med, men jag har inga direkta planer på att göra det. Istället lämnas det som en övning till läsaren. Warning: Ugly code ahead.

using System; using System.IO; using System.Xml; namespace Mystify { class Program { static void Main(string[] args) { if (args.Length != 1) { Console.WriteLine("GPX-file not specified"); return; } XmlNameTable nt = new NameTable(); XmlNamespaceManager nsmgr = new XmlNamespaceManager(nt); XmlDocument doc = new XmlDocument(nt); nsmgr.AddNamespace("gpx", "http://www.topografix.com/GPX/1/1"); try { doc.Load(args[0]); } catch (Exception e) { Console.WriteLine("Could not open {0}", args[0]); Console.WriteLine("Error: {0}", e.Message); return; } foreach (XmlElement wpt in doc.DocumentElement.SelectNodes("//gpx:wpt", nsmgr)) { XmlElement sym = (XmlElement)wpt.SelectSingleNode("gpx:sym", nsmgr); XmlElement cmt = (XmlElement)wpt.SelectSingleNode("gpx:cmt", nsmgr); if (sym == null || cmt == null) continue; if (cmt.InnerText.Contains("Unknown Cache")) sym.InnerText = "Custom 0"; } int extensionPos = args[0].LastIndexOf('.'); string filename = args[0].Substring(0, extensionPos); filename += "-myst" + args[0].Substring(extensionPos); doc.Save(filename); } } }

Inga kommentarer: