aboutsummaryrefslogtreecommitdiff
path: root/articles/2011-06-14_darstellen_von_gps_daten_mit_gnuplot.md
diff options
context:
space:
mode:
authorAdrian Kummerlaender2014-08-10 13:09:42 +0200
committerAdrian Kummerlaender2014-08-10 13:09:42 +0200
commitf4043ec1e9f02efc7f653274b9e4e22ef2782a51 (patch)
tree7094d038dd30eef441b6895a2ac99daf5720e7d4 /articles/2011-06-14_darstellen_von_gps_daten_mit_gnuplot.md
parent8d7f2c536f3c48d17b1de244fe6713f4d4499fd5 (diff)
downloadblog_content-f4043ec1e9f02efc7f653274b9e4e22ef2782a51.tar
blog_content-f4043ec1e9f02efc7f653274b9e4e22ef2782a51.tar.gz
blog_content-f4043ec1e9f02efc7f653274b9e4e22ef2782a51.tar.bz2
blog_content-f4043ec1e9f02efc7f653274b9e4e22ef2782a51.tar.lz
blog_content-f4043ec1e9f02efc7f653274b9e4e22ef2782a51.tar.xz
blog_content-f4043ec1e9f02efc7f653274b9e4e22ef2782a51.tar.zst
blog_content-f4043ec1e9f02efc7f653274b9e4e22ef2782a51.zip
Switched content formatter to kramdown
* implemented language selection for automatic syntax highlighting ** language selection requires the language to be used to be passed as a class of the code element ** kramdown enables easy definition of this class attribute * kramdown offers more functionality such as table and class attribute support * updated all articles accordingly
Diffstat (limited to 'articles/2011-06-14_darstellen_von_gps_daten_mit_gnuplot.md')
-rw-r--r--articles/2011-06-14_darstellen_von_gps_daten_mit_gnuplot.md114
1 files changed, 65 insertions, 49 deletions
diff --git a/articles/2011-06-14_darstellen_von_gps_daten_mit_gnuplot.md b/articles/2011-06-14_darstellen_von_gps_daten_mit_gnuplot.md
index 8687ba1..83202a3 100644
--- a/articles/2011-06-14_darstellen_von_gps_daten_mit_gnuplot.md
+++ b/articles/2011-06-14_darstellen_von_gps_daten_mit_gnuplot.md
@@ -4,43 +4,53 @@ Bei meiner letzten Wanderung in den Schweizer Alpen habe ich spaßeshalber das N
Die Daten der Messpunkte sind im XML als `trkpt`-Tags gespeichert. Enthalten sind jeweils der Längen- und Breitengrad, die Uhrzeit, der Modus (3d / 2d), die Höhe über Null und die Anzahl der zur Positionsbestimmung genutzten Satelliten. Aussehen tut das ganze dann z.B. so:
- <trkpt lat="47.320591" lon="9.329439">
- <time>2011-06-12T07:57:39Z</time>
- <fix>3d</fix>
- <ele>870</ele>
- <sat>6</sat>
- </trkpt>
+~~~
+<trkpt lat="47.320591" lon="9.329439">
+ <time>2011-06-12T07:57:39Z</time>
+ <fix>3d</fix>
+ <ele>870</ele>
+ <sat>6</sat>
+</trkpt>
+~~~
+{: .language-xml}
Diese Daten lassen sich nun sehr einfach Verarbeiten – ich habe das Python `xml.dom.minidom` Modul verwendet. Um die Positionen einfacher verwenden zu können, werden sie mit dieser Funktion in Listenform gebracht:
- def getPositions(xml):
- doc = minidom.parse(xml)
- node = doc.documentElement
- rawTrkPt = doc.getElementsByTagName("trkpt")
- positions = []
- for TrkPt in rawTrkPt:
- pos = {}
- pos["lat"] = TrkPt.getAttribute("lat")
- pos["lon"] = TrkPt.getAttribute("lon")
- pos["ele"] = int(TrkPt.getElementsByTagName("ele")[0].childNodes[0].nodeValue)
- positions.append(pos)
- return positions
+~~~
+def getPositions(xml):
+ doc = minidom.parse(xml)
+ node = doc.documentElement
+ rawTrkPt = doc.getElementsByTagName("trkpt")
+ positions = []
+ for TrkPt in rawTrkPt:
+ pos = {}
+ pos["lat"] = TrkPt.getAttribute("lat")
+ pos["lon"] = TrkPt.getAttribute("lon")
+ pos["ele"] = int(TrkPt.getElementsByTagName("ele")[0].childNodes[0].nodeValue)
+ positions.append(pos)
+ return positions
+~~~
+{: .language-python}
Aus dieser Liste kann ich jetzt schon einige Kennzahlen ziehen:
- def printStats(gpxPositions):
- highEle = gpxPositions[0]["ele"]
- lowEle = gpxPositions[0]["ele"]
- for pos in gpxPositions:
- if pos["ele"] > highEle:
- highEle = pos["ele"]
- if pos["ele"] < lowEle:
- lowEle = pos["ele"]
- eleDiv = highEle - lowEle
- print "Measure points: " + str(len(gpxPositions))
- print "Lowest elevation: " + str(lowEle)
- print "Highest elevation: " + str(highEle)
- print "Height difference: " + str(eleDiv)
+~~~
+def printStats(gpxPositions):
+ highEle = gpxPositions[0]["ele"]
+ lowEle = gpxPositions[0]["ele"]
+ for pos in gpxPositions:
+ if pos["ele"] > highEle:
+ highEle = pos["ele"]
+ if pos["ele"] < lowEle:
+ lowEle = pos["ele"]
+ eleDiv = highEle - lowEle
+ print "Measure points: " + str(len(gpxPositions))
+ print "Lowest elevation: " + str(lowEle)
+ print "Highest elevation: " + str(highEle)
+ print "Height difference: " + str(eleDiv)
+~~~
+{: .language-python}
+
Die Kennzahlen für meine Testdaten wären:
@@ -51,10 +61,13 @@ Die Kennzahlen für meine Testdaten wären:
Da die Daten ja, wie schon im Titel angekündigt, mit gnuplot dargestellt werden sollen werden sie mit dieser Funktion in für gnuplot lesbares CSV gebracht:
- def printCsv(gpxPositions):
- separator = ';'
- for pos in gpxPositions:
- print pos["lat"] + separator + pos["lon"] + separator + str(pos["ele"])
+~~~
+def printCsv(gpxPositions):
+ separator = ';'
+ for pos in gpxPositions:
+ print pos["lat"] + separator + pos["lon"] + separator + str(pos["ele"])
+~~~
+{: .language-python}
### Plotten mit gnuplot
@@ -62,20 +75,23 @@ Da die Daten ja, wie schon im Titel angekündigt, mit gnuplot dargestellt werden
Eine solche, dreidimensionale Ausgabe der GPS Daten zu erzeugen ist mit der `splot`-Funktion sehr einfach.
- #!/usr/bin/gnuplot
- set terminal png size 1280,1024
- set output "output.png"
- set multiplot
- set yrange [9.365:9.31]
- set xrange [47.325:47.28]
- set zrange [800:1700]
- set view 28,272,1,1
- set ticslevel 0
- set grid
- set datafile separator ';'
- splot "/home/adrian/projects/gpxplot/wanderung_120611.csv" with impulses lt 3 lw 1
- splot "/home/adrian/projects/gpxplot/wanderung_120611.csv" with lines lw 2
- unset multiplot
+~~~
+#!/usr/bin/gnuplot
+set terminal png size 1280,1024
+set output "output.png"
+set multiplot
+set yrange [9.365:9.31]
+set xrange [47.325:47.28]
+set zrange [800:1700]
+set view 28,272,1,1
+set ticslevel 0
+set grid
+set datafile separator ';'
+splot "/home/adrian/projects/gpxplot/wanderung_120611.csv" with impulses lt 3 lw 1
+splot "/home/adrian/projects/gpxplot/wanderung_120611.csv" with lines lw 2
+unset multiplot
+~~~
+{: .language-sh}
Mit `set terminal png size 1280,1024` und `set output "output.png"` werden zuerst das Ausgabemedium, die Größe und der Dateiname der Ausgabe definiert. Dannach aktiviert `set multiplot` den gnuplot-Modus, bei dem mehrere Plots in einer Ausgabe angezeigt werden können. Dieses Verhalten brauchen wir hier, um sowohl die Strecke selbst als rote Line, als auch die zur Verdeutlichung verwendeten blauen Linien gleichzeitig anzuzeigen.
Mit `set [y,x,z]range` werden die Außengrenzen des zu plottenden Bereichs gesetzt. Dies ließe sich natürlich auch über ein Script automatisch erledigen. Als Nächstes wird mit `set view 28,272,1,1` die Blickrichtung und Skalierung definiert. `set ticslevel 0` sorgt dafür, dass die Z-Achse direkt auf der Grundebene beginnt. Um ein Gitter auf der Grundfläche anzuzeigen, gibt es `set grid`.