Archiv für die Kategorie ‘Technik’

Papierloses Cachen 2: Cachemate

Dirk am 27. März 2008

Im Artikel über papierloses Cachen habe ich bereits ein paar Worte über Cachemate verloren, ein (kommerzielles) Tool wie etwa auch GpxView oder GPXSonar. Es importiert GPX-Dateien oder LOC Dateien z.B. von opencaching.de oder geocaching.com oder von einem der diversen Tools wie Cachewolf, die die o.a. Seiten spidern und zeigt die Informationen über die in den GPX-Dateien an. Erstehen kann man das Tool hier, ich habe gute 5 EUR bezahlt, der Dollar steht für solche Käufe zur Zeit ziemlich gut.

Cachemate ÜbersichtDer nebenstehende Screenshot zeigt die Übersicht des Programms, so siehts nach dem starten aus (zumindest wenn man denn schon ein paar Caches auf den PDA geladen hat). Man sieht eine Liste der Caches. Diese ist eventuell gefiltert, filtern kann man nach Namen oder nach Entfernung zu einem bestimmten Punkt (wenn ein GPS am PDA angeschlossen ist, auch zu der aktuellen Position).

Der Cachemate interpretiert auch spezielle geocaching.com Tags im GPX-Format, z.B. sieht man hier in der ersten Spalte angezeigt, welche Caches Travelbugs enthalten. Der grüne Pfeil zeigt an, dass ich den Cache von der Reihe Kölnopoly Göthestraße bereits gefunden habe.

Unten in der Leiste sieht man einige Logos, unter anderem zwei mit rotem Pfeil. Diese beiden sind zum exportieren und importieren von GPX-Dateien. Den Import möchte ich hier noch etwas genauer beschreiben:

Import von GPX-Dateien

Nach dem Klick auf das Importicon klickt man nochmal auf Start, um den Import von GPX bzw. LOC-Dateien zu bestätigen, und wählt dann eine entsprechende Datei aus (wie im nebenstehenden Bild. Nachdem man die angeklickt hat, erledigt Cachemate den Rest, die in der Datei enthaltenen Waypoints werden importiert und in der internen Datenbank abgelegt.

In der Übersichtsliste erscheinen ab sofort alle in dem Track enthaltenen Caches.

Weiterhin bietet Cachemate die Möglichkeit, die Liste nach der Entfernung zur aktuellen Position zu filtern. Hat man am PDA kein GPS-Gerät angeschlossen, kann man die aktuelle Position auch manuell angeben, es werden dann nur die Caches im Umkreis um die dort angegebene Position angezeigt. Weiterhin kann das Tool natürlich auch nach Namen suchen oder nach bestimmten Kriterien sortieren.

Die verschlüsselten Hints werden auch verschlüsselt angezeigt, können bei Bedarf aber auch entschlüsselt werden.

Google Maps Karte einbinden (Teil 2)

Dirk am 21. März 2008

Im letzten Artikel habe ich beschrieben, wie man eine einfach Google Maps Karte in seine eigene Webseite integriert. Aufbauend auf dem Artikel werden wir nun eine erweiterte Karte generieren, diesmal wird eine Linie mit mehreren Punkte erzeugt.

In dem Artikel erwähnte ich ja bereits, dass man eine Polyline zwischen beliebig vielen Punkten einzeichnen kann. Folgende Methode nutzten wir, um eine Polylines zwischen zwei Punkten einzuzeichnen:

var polyline = new GPolyline([
    new GLatLng(50.864803, 7.003784),
    new GLatLng(50.936255, 6.959152)
], "#ff0000", 10);

Auf ähnliche Weise wollen wir nun eine Tour aus einer GPX-Datei in der Karte anzeigen. Zunächst sehen wir uns dazu einen Ausschnitt aus einer GPX-Datei ein. GPX ist ein XML-basiertes Format, und damit auch menschenlesbar:

  <trk>
    <name>ACTIVE LOG</name>
    <trkseg>
      <trkpt lat="50.8832728" lon="6.9834976">
        <ele>44.3580322</ele>
        <time>2008-03-18T13:13:50Z</time>
      </trkpt>
      <trkpt lat="50.8832509" lon="6.9833117">
        <ele>44.8386230</ele>
        <time>2008-03-18T13:13:59Z</time>
      </trkpt>
      <trkpt lat="50.8832505" lon="6.9832326">
        <ele>44.3580322</ele>
        <time>2008-03-18T13:14:03Z</time>
      </trkpt>
      <trkpt lat="50.8832217" lon="6.9831215">
        <ele>43.3966064</ele>
        <time>2008-03-18T13:14:08Z</time>
      </trkpt>
      [...]
    </trkseg>
  </trk>

Ich habe den Anfang der GPX-Datei weggelassen, wir steigen direkt in das XML-Tag <trk> ein. Dieses Element enthält einen vom GPS aufgezeichneten Track. Innerhalb des <trkseg> Knotens sieht man alle <trkpt> Knoten, dieses sind die einzelnen vom GPS aufgezeichneten Position, inklusive Uhrzeit (diese kann zum Beispiel genutzt werden, um Fotos mit den Koordinaten zu verknüpfen, beim sogenannten Geotagging). Hat man das GPS-Gerät also so konfiguriert, dass solche Tracks aufgezeichnet werden, könnte man sich die Datei in einem Texteditor öffnen, die Koordinaten rauskopieren und dann in Liste von GLatLng Objekte kopieren, etwa so:

var polyline = new GPolyline([
    new GLatLng(50.8832728, 6.9834976),
    new GLatLng(50.8832509, 6.9833117),
    new GLatLng(50.8832505, 6.9832326),
    new GLatLng(50.8832217, 6.9831215)
], "#ff0000", 10);

Das ist natürlich bei langen Tracks recht langwierig, außerdem wird das Skript dadurch sehr lang. Daher bietet Google die Möglichkeit, Polylines über eine andere Methode zu erzeugen. Die Punkte werden dazu nach einem bestimmten Algorithmus enkodiert. Der Algorithmus wird hier erklärt. Das muss man aber nicht unbedingt verstehen, denn hier gibt es ein Tool zum Erzeugen der enkodierten Version. Das Erzeugen der Polyline sieht dann so aus:

var encodedPolyline = new GPolyline.fromEncoded({
    color: "#ff0000",
    weight: 10,
    points: "mcquHy}ri@Bb@?NDT",
    levels: "BBBB",
    zoomFactor: 32,
    numLevels: 4
});

Der fett markierte Teil stellt nun die vier oben definierten Punkte dar. Die Beispieldatei zu diesem Teil gibts hier.

Mit diesem Rüstzeug kann man dann die Umwandlung der GPX-Datei angehen. Manuell ginge das jetzt schon, automatisieren sollte man das jetzt noch irgendwie. Dazu gibt es ziemlich viele Wege. Möglich wäre zum Beispiel eine XSL-Transformation, die die GPX-Datei in eine Reihe von Punkte umwandelt (also quasi alle unnötigen XML-Tags entfernen). Oder man liest die GPX-Datei direkt per Javascript ein und erzeugt damit on the fly die Polyline, ein Beispiel wie man das machen kann findet sich hier. Oder man schreibt sich ein Programm in einer beliebigen Programmiersprache, welches die Umwandlung vornimmt.

Das habe ich gemacht: Mit den Informationen, die ich bereits bei der Recherche für den Artikel über Geotagging gesammelt hatte, ging das Recht schnell. GPX-Datei mit XML-Beans einlesen, eine Klasse zur Encodierung der Polyline ergoogeln und einbinden, ein kleines Webmodul stricken, welches genau die Umwandlung durchführt und in XML aufbereitet, diese XML-Information über JQuery (mit AJAX) einlesen, fertig. Dazu später mehr…

Google Maps Karte einbinden (Teil 1)

Dirk am 19. März 2008

Ich wollte meine Beiträge zu den Geocaching - Touren, die wir so machen, mit eine Grafik der gelaufenen Wege anhübschen. Google Maps bietet dazu gute Möglichkeiten, man braucht nicht viel, nur einen Google-Maps-API Key, und eine Seite, auf der die Tracks aufgebaut werden. Diese Seite integriert man dann einfach in den Beitrag per IFrame oder verlinkt sie, fertig.

Als Referenz für diese Artikelreihe sollen folgende Quellen dienen:

Zunächst braucht man also eine einfache HTML-Seite, die die Karte ausliefert. Der grobe Rahmen sieht so aus:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html 	xmlns="http://www.w3.org/1999/xhtml"
	xmlns:v="urn:schemas-microsoft-com:vml">
<head>
	<title>Google Maps</title>
	<script src="jquery.js"></script>
	<script src="jquery.xpath.js"></script>
	<script src=".../maps?file=api&v=2&key=xxx">
	</script>
	<script type="text/javascript">
		var map;
		function initialize() {
 		if (GBrowserIsCompatible()) {
 			//hier gehts weiter
 		}
 	}
	</script>
</head>
<body onload="initialize()" onunload="GUnload()">
	<div id="map" style="width:500px;height:500px;">
	</div>
</body>
</html>

Eingebunden werden die Hauptbibliothek von JQuery, das XPath Plugin (werden später benötigt) und die Google Maps API.

Dieser Artikel zeigt zunächst einige kurze Beispiele für Google Maps (siehe dazu auch die Developer Guide, dort sind Beispiele für die einzelnen Funktionen angegeben). Der Code kann einfach oben an die Stelle “hier gehts weiter” reinkopiert werden - die Datei kann man lokal einfach abspeichern und öffnen, dafür wird noch kein Google API Code benötigt:

Map anlegen, bei Köln zentrieren und Maßstab festlegen (Zoom gibt quasi den Maßstab an, hohe Zahlen ist weiter weg, kleine Zahlen nah dran)

map = new GMap2(document.getElementById("map"));
map.setCenter(new GLatLng(50.889391,6.977005));
map.setZoom(13);

Karte auf Satellitenansicht umstellen und einige Controller hinzufügen

map.addControl(new GSmallMapControl());
map.addControl(new GMapTypeControl());
map.setMapType(G_SATELLITE_MAP);

Marker hinzufügen

marker=new GMarker(new GLatLng(50.892802,6.96722))
map.addOverlay(marker);

Linie zwischen zwei Punkten (Luftlinie von mir zuhause bis in die Innenstadt)

var polyline = new GPolyline([
    new GLatLng(50.864803, 7.003784),
    new GLatLng(50.936255, 6.959152)
], "#ff0000", 10);
map.addOverlay(polyline);

Mit dem Werkzeug an der Hand ist es eigentlich schon fast fertig. Jetzt könnte man für jede Tour eine solche Seite anlegen, und alle Wegpunkte in eine GPolyline (dem Konstruktur wird ein Array von Punkten übergeben, es kann also eine beliebig lange Linie erzeugt werden) hinzufügen.

Einfacher wäre natürlich, wenn man die GPX-Datei, die von den meisten Navis erzeugt werden, irgendwie direkt einbinden könnte. Dafür braucht man aber etwas Anwendungslogik: Die GPX-Datei muss eingelesen werden und in ein Google-Maps lesbares Format umgewandelt werden (also zum Beispiel in eine Reihe von GLatLng Punkten, oder in eine enkodierte Version dieser Punktmenge). Wie man das machen kann (mithilfe einer kleinen Java-Applikation und JQuery) zeige ich in dem nächsten Artikel.

Hier die oben aufgebaute Beispielseite, eingebunden im IFrame:

Diese Seite könnt ihr auch hier aufrufen, und Euch dort den Source ansehen. Dort ist der API Key von geocologning.de eingebunden, dieser funktioniert natürlich nur unter meiner Domain.

Papierloses Cachen mit dem IPAQ PDA

Dirk am 11. März 2008

Wo ich nun schon so ein hochmodernes Navi besitze, hätte ich eigentlich gedacht, dass man auf dem Vista HCx auch Cachebeschreibungen ablegen kann, damit man zum Geocachen keine Zettel mehr mitnehmen muss. Weit gefehlt, wenn ich das richtig sehe, geht das nicht. Es gibt zwar eine eigene Kategorie für Geocaches, doch das sind auch nur Waypoints, mit nem Namen und ner Position.

Also bin ich alleine mit diesem Gerät doch noch weit entfernt vom papierlosen Cachen, ich bräuchte noch immer die Ausdrücke (oder heißt es im Plural auch Ausdrucke? naja, egal ;) ) der Caches. So hab ich mir das aber nicht vorgestellt, als technikaffiner Cacher möchte ich das natürlich vermeiden. Also muss ein Programm her für meinen PDA, ein IPAQ 3970 (schon etwas betagt, ähnlich wie der 3950, nur mit Bluetooth, noch von Compaq, wurde inzwischen von HP übernommen).

Zwei kostenfreie Programme konnte ich finden, einmal GpxView und GPXSonar (dessen eigentliche Seite wohl schon länger offline ist). Beides eigentlich genau Programme, die die Funktion, die ich haben wollte, unterstützen. Nämlich die GPX-Dateien, die man sich z.B. bei opencaching.de aus Suchanfragen generieren kann (und auf geocaching.com auch, nur braucht man da ne Premiummitgliedschaft, die ich noch nicht habe), auslesen und auf dem PDA anzeigen, mit Beschreibung und Logs und allem. GpxView ist auf meinem PDA leider gar nicht gestartet, GPXSonar zwar schon, das Tool konnte dann aber offenbar weder Cachebeschreibung noch Logs ausgeben.

Ein kommerzieller Anbieter, nämlich smittyware.com , bietet auch eine alternative, nämlich den Cachemate. Das Programm wird für diverse Plattformen angeboten, unter anderem auch für Windows Pocket PC, und das läuft auf meinem PDA (um genau zu sein Windows Mobile 2003). Mit der kostenlosen Variante kann man maximal 10 Caches importieren, dann ist Schluss. Da der Preis des Tools aber grade noch so zu stemmen war (5,49 EUR), habe ich mich zum Kauf hinreißen lassen. Wenige Minuten später besaß ich den Key, und ich konnte die 500-Cache große Datei von opencaching.de importieren (dabei ist GPXSonar übrigens abgeschmiert).

Das ganze sieht dann etwa so aus:

PDA 3970 mit Cachemate

Geotagging - Fotos geokodieren mit Geotag

Dirk am 8. März 2008

Da ich gerne fotografiere, und das auch während meiner ersten Geocashing-Ausflüge gemacht habe, war die Idee, die Koordinaten der aufgezeichneten GPS-Tracks aus dem GPS-Gerät irgendwie anhand der Uhrzeit mit den Fotos zu verknüpfen, schnell geboren. Eine kurze Googlesuche brachte ich mich schnell zu einer Vielzahl von Programmen, die das sogenannte Geotagging ermöglichen. Dabei wird in dem Bild ein zusätzliches EXIF-Tag hinzugefügt, in der die Position des aufgenommenen Bildes abgelegt wird. Dies ermöglicht eine nette Verknüpfung zum Beispiel mit Google Maps oder Google Earth, ohne dass in der Kamera ein GPS-Empfänger eingebaut sein muss.

Als erstes habe ich das Programm GeoRobo gefunden und getestet. Leider ist das Programm nicht kostenlos, in der freien Variante werden die Daten beim Export verfälscht, ist also im Grunde nicht zu gebrauchen. Michi hat dann noch ein paar andere Programme aufgetan (unter anderem Photomapper, recht brauchbar).

Ich bin leidenschaftlicher Programmierer, und dachte, eigentlich kann es ja nicht so schwer sein, ein entsprechendes Programm mit den Funktionen, die ich haben möchte, auch selber zu bauen. Das ganze sollte ein einfaches Kommandzeilenorientiertes Tool auf Javabasis sein.

Das GPX-Format war eine geringe Hürde, dafür habe ich einfach XML-Beans auf die Schemadatei gestürzt, XML-Beans generiert daraus Javaklassen und übernimmt dann auch das Unmarshalling des XML-basierten Formats. EXIF-Daten lesen, um das Datum der aufgenommenen Fotos zu generieren, war auch eine leichte Übung, dies geht mit dem Metadata-Extractor von Drew Noakes. Leider nur lesen. Schreiben von EXIF-Daten scheint eine rechte komplizierte Sache zu sein, diese Bibliothek unterstützt das (noch) nicht. Nach ein bisschen Recherche bin ich dann zu dem Schluss gekommen, dass es nicht so einfach möglich ist. Ich entschied mich dazu, die EXIF-Daten mit einem Betriebssystemaufruf und ExifTool zu schreiben. Als ich soweit war, fand ich dann auch ein Sourceforge Projekt, was im Grunde genau die gleiche Idee verfolgt: Geotag. Und da mir das Tool eigentlich ziemlich gut gefällt, möchte ich es hier etwas genauer vorstellen (und stelle meine Eigenentwicklung damit kurz nach dem Start wieder ein ;-) ).

Geotag arbeitet mit einer grafischen Oberfläche, oben eine Tabelle mit den Bildinformationen, unten ein Preview der Bilder:

Geotag Screenshot

Es lassen sich verschiedene externe Tools einbinden, GPSBabel zum übersetzen von unterschiedlichen Formaten der unterschiedlichen GPS-Geräte, ExifTool eben zum schreiben der EXIF-Daten, DCraw zum anzeigen von diversen RAW-Formaten.

Nachdem man den GPS-Track und die Bilder importiert hat, kann man eine Differenz zwischen dem im Bild gespeicherten EXIF-Datum und der Uhrzeit im GPS-Gerät einstellen (am besten immer ein Foto vom GPS-Gerät mit der Uhrzeit auf dem Display machen, dann geht das sehr genau). Diese Differenz übernimmt man dann auf alle Fotos von dem gleichen Ausflug und lässt das Programm dann eine Geokodierung vornehmen. Diese lässt sich über eine schon relativ mächtige Integration von Google Maps kontrollieren und dann zurück ins Bild schreiben. Fertig ist die Geokodierung.

Ein recht nettes Feature an Geotag ist aber auch das manuelle Geotagging. Man kann im integrierten Google Maps für ein Foto eine Position auswählen, Geotag übernimmt diese dann automatisch in das Bild. Ein Export in das Google-Earth Format KMZ ist ebenfalls möglich. Auch nett ist das Feature, Ortsnamen zu den Koordinaten ermitteln zu lassen (hat bei mir aber nicht so 100% gepasst).

Was mir noch fehlt ist ein Export nach Google Maps (quasi ne HTML-Datei mit dem Track und den Bildern integriert), entweder hab ich das Feature nicht gefunden, oder es gibts noch nicht :-). Alles in allem aber trotzdem ein sehr empfehlenswertes Programm, auch wenn die Bedienung teilweise in meinen Augen noch ein bisschen unintuitiv ist, wenn man sich dran gewöhnt hat, ist es aber für das Geotagging extrem nützlich!