Auflisten von POIs aus Openstreetmap mit XAPI und XSL

August 24, 2010

Vor einiger Zeit wurde ich auf das Schorndorfer Stadtwiki Schopedia aufmerksam, dass von ein paar Freiwilligen betreut wird. Mir fiel auf, dass im Wiki einige Seiten mit Listen von z.B. Gastätten oder Museen angelegt wurden.

Als aktiver Openstreetmap Mapper habe ich mich natürlich gleich gefragt, ob es nicht möglich wäre die Daten einfach aus Openstreetmap auszulesen, da diese dort größtenteils schon vorhanden sind. Damit könnte man sich das aufwendige Pflegen der Daten im Wiki sparen.

Für die Abfragen von POIs aus Openstreetmap kann man die XAPI verwenden. An die API-Server kann man über http sehr leicht Anfragen schicken. Als Antwort erhält man die gewünschten Daten im XML Format.

Beispiel:

Folgender Link liefert alle Nodes vom Typ amenity=restaurant im XML-Format zurück. Die bounding box (bbox) schränkt das Gebiet auf Schorndorf ein:

http://xapi.openstreetmap.org/api/0.6/node[amenity=restaurant][bbox=9.4908142,48.7810801,9.5660019,48.8387351]

Hier ein Ausschnitt aus den zurückgelieferten Daten:

<?xml version='1.0' standalone='no'?>
<osm version='0.6' generator='xapi: OSM Extended API 2.0' xmlns:xapi='http://www.informationfreeway.org/xapi/0.6' xapi:uri='/api/0.6/node[amenity=restaurant|fast_food|pub|cafe][bbox=9.4908142,48.7810801,9.5660019,48.8387351]' xapi:planetDate='20100824' xapi:copyright='2010 OpenStreetMap contributors' xapi:license='Creative commons CC-BY-SA 2.0' xapi:bugs='For assistance or to report bugs contact 80n80n@gmail.com' xapi:instance='zappyOsm'>
 <node id='721241970' lat='48.830856' lon='9.5116892' user='mabe75' timestamp='2010-05-04T19:01:28Z' uid='260302' version='1' changeset='4607010'>
 <tag k='amenity' v='restaurant'/>
 <tag k='name' v='Lamm'/>
 </node>
 <node id='392682646' lat='48.8315734' lon='9.5468864' user='MattGPS' timestamp='2010-05-11T19:00:20Z' uid='12973' version='3' changeset='4671372'>
 <tag k='amenity' v='restaurant'/>
 <tag k='name' v='Gasthaus an der Wieslauf'/>
 </node>
 <node id='319597380' lat='48.8277913' lon='9.5477029' timestamp='2008-12-17T21:13:15Z' version='1' changeset='444629'>
 <tag k='amenity' v='restaurant'/>
 <tag k='name' v='Gasthaus zur Linde'/>
 </node>
[...]

Nun haben wir die Daten im XML Format. Die Daten lassen sich nun mit Hilfe einer XSL Transformation (XSLT) z.B. in ansprechenden HTML-Code umwandeln.

Hierfür habe ich ein einfaches XSL Stylesheet (nodes.xsl) erstellt. Dieses erzeugt eine einfache HTML-Datei, die eine Openlayer Karte und eine Tabelle mit allen gefundenen Nodes enthält. Für jede Node befindet sich in der Karte ein Marker. Ich verwende zum Durchführen der XSL-Transformation die Anwendung xsltproc.

wget 'http://xapi.openstreetmap.org/api/0.6/node[amenity=restaurant][bbox=9.4908142,48.7810801,9.5660019,48.8387351]'
xsltproc nodes.xsl nodes.xml  > nodes.html

Den Quellcode für das XSL Stylesheet gibts hier als PDF: nodes.xsl.

Doku über die XAPI von Openstreetmap findet ihr hier: http://wiki.openstreetmap.org/wiki/Xapi

Hier ist ein einfaches Beispiel zum Anzeigen einer Karte mit Markern (wird auch in meinem XSL Code verwendet): http://wiki.openstreetmap.org/wiki/OpenLayers_Marker

Update: Inzwischen gibt es hier eine Demo Seite mit obigem Beispiel

<?xml version=’1.0′ standalone=’no’?>
<osm version=’0.6′ generator=’xapi: OSM Extended API 2.0′ xmlns:xapi=’http://www.informationfreeway.org/xapi/0.6&#8242; xapi:uri=’/api/0.6/node[amenity=restaurant|fast_food|pub|cafe][bbox=9.4908142,48.7810801,9.5660019,48.8387351]’ xapi:planetDate=’20100824′ xapi:copyright=’2010 OpenStreetMap contributors’ xapi:license=’Creative commons CC-BY-SA 2.0′ xapi:bugs=’For assistance or to report bugs contact 80n80n@gmail.com’ xapi:instance=’zappyOsm’>
<node id=’721241970′ lat=’48.830856′ lon=’9.5116892′ user=’mabe75′ timestamp=’2010-05-04T19:01:28Z’ uid=’260302′ version=’1′ changeset=’4607010′>
<tag k=’amenity’ v=’restaurant’/>
<tag k=’name’ v=’Lamm’/>
</node>
<node id=’392682646′ lat=’48.8315734′ lon=’9.5468864′ user=’MattGPS’ timestamp=’2010-05-11T19:00:20Z’ uid=’12973′ version=’3′ changeset=’4671372′>
<tag k=’amenity’ v=’restaurant’/>
<tag k=’name’ v=’Gasthaus an der Wieslauf’/>
</node>
<node id=’319597380′ lat=’48.8277913′ lon=’9.5477029′ timestamp=’2008-12-17T21:13:15Z’ version=’1′ changeset=’444629′>
<tag k=’amenity’ v=’restaurant’/>
<tag k=’name’ v=’Gasthaus zur Linde’/>
</node>


Device notifier script for updating OSM map on Garmin device

December 30, 2009

I am regularly mapping things in Openstreetmap with my Garmin Nüvi 205 and a second GPS Tracker (iBlue 747a+).

It is very usefull to have a current version of the OSM map on the Garmin device, so that you see what is actually missing in the map when you are in the field.

I used to manually download the map file from http://dev.openstreetmap.de/aio/ and then uncompressing it to the garmin device. But I was getting tired of doing this repetitive task and so I wrote a script for this….

The script can be executed via the device notifier in KDE4 (more infos about device notifier can be found in an older blogpost of mine: Adding actions to the Device Notifier widget in KDE 4.3).


After selecting “Update OSM map on Garmin device” in the device notifier the script downloads the map and shows a progressbar.

When it is finished a pop-up appears and the device can be removed via device notifier.

I have attached the script (update_map.sh)  and the device notifier config (update_map.desktop) to this post.

The script needs the package “pv” (pipe viewer). It can be installed in kubuntu with “apt-get install pv“.

update_map.sh (place it in /usr/local/bin)

#!/bin/bash

url=http://dev.openstreetmap.de/aio/germany/gmapsupp.img.bz2
path=$1
target_dir=$path/Garmin
target_file=$target_dir/gmapsupp.img

progressfile=/tmp/progress_$$
echo 0 > $progressfile

function watch_progress {
dbusRef=$1
while [ true ]
do
sleep 1
# check if dbus object exists
qdbus $dbusRef 1>/dev/null 2>&1
if [ “$?” -ne “0” ]
then
# dbus Object does not exist (anymore)
exit 0
fi

# read current progress
progress=`tail -n1 $progressfile`

# set progress to progressbar
qdbus $dbusRef Set “” “value” $progress
done

}

if [ ! -d $target_dir ]
then
kdialog –msgbox “$target_dir does not exist!”
exit 1
fi

kdialog –yesno “Update OSM Map on $target_dir ?”
ret=$?

if [ “$ret” -eq “0” ]
then

# get file size
size=`curl -sI $url | grep Content-Length | cut -d ‘ ‘ -f 2 | sed “s/[^0-9]//g”`
kbsize=$((size/1024))k

dbusRef=`kdialog –progressbar “Downloading OSM Map” 100`
watch_progress “$dbusRef” &

wget -qO- $url | pv -s $kbsize -n 2>$progressfile | bunzip2 > $target_file
sync
sync

qdbus $dbusRef close
rm -f $progressfile

error=0
#check return codes in pipe
for rc in ${PIPESTATUS[*]}
do

if [ “$rc” -ne “0” ]
then
error=1
fi
done

if [ “$error” -ne “0” ]
then
kdialog –msgbox “There was an error updating the map”;
else
kdialog –msgbox “The map was updated successfully – You may now disconnect the device”;
fi

else
kdialog –msgbox “cancelled…”
fi

update_map.desktop (place it in e.g. /usr/share/kde4/apps/solid/actions)

[Desktop Entry]
X-KDE-Solid-Predicate=[[ StorageVolume.ignored == false AND StorageVolume.usage == ‘FileSystem’ ] OR [ IS StorageAccess AND StorageDrive.driveType == ‘Floppy’ ]]
Type=Service
Actions=open;

[Desktop Action open]
Name=Update OSM map on Garmin device
Exec=/usr/local/bin/update_map.sh %f
Icon=system-file-manager
X-Ubuntu-Gettext-Domain=desktop_kdebase-workspace


Digikam 1.0.0-beta5 verwendet Openstreetmap Karten

November 3, 2009

Digikam kann schon ein ganze Weile Fotos auf einer Karte darstellen. Hierfür gibt es die Geolocation Ansicht, welche auf marble aufsetzt. Bisher wurde an dieser Stelle eine ungenaue und wenig detailierte Karte angezeigt. In der aktuellen Version können die Fotos nun auch auf der Openstreetmap Karte dargestellt werden.

digikam_with_osm

Beim herauszoomen aus der Karte werden nebeneinander liegende Bilder zu einem einzelnen zusammengefasst. Auf diesem wird wiederum die Anzahl der zusammengefassten Bilder angezeigt.  Somit wirkt die Karte auch dann nicht überladen, wenn sehr viele Fotos in einem kleinen Gebiet geschossen wurden.

Besonders praktisch finde ich, dass man das Feature mit der digikam Suche kombinieren kann. So kann man sich ganz einfach anzeigen lassen, wo man an einem bestimmten Tag gewandert ist (siehe Screenshot) oder sich z.B. alle mit “Strand” getaggten Fotos auf der Karte anzeigen lassen.

digikam_osm_search

Ein Feature vermisse ich leider noch in der Kartenansicht: Praktisch fände ich es, wenn beim Klick auf ein Foto in der Karte das Foto vergrößert dargestellt würde. Leider passiert beim Klicken auf ein Bild im Moment gar nichts.
Ich werde gleich mal auf kde.org einen Feature Request eintragen (http://bugs.kde.org/show_bug.cgi?id=212967).


%d bloggers like this: