summaryrefslogtreecommitdiff
path: root/gpsviewer.pde
diff options
context:
space:
mode:
Diffstat (limited to 'gpsviewer.pde')
-rw-r--r--gpsviewer.pde159
1 files changed, 98 insertions, 61 deletions
diff --git a/gpsviewer.pde b/gpsviewer.pde
index 715c79f..b2a0686 100644
--- a/gpsviewer.pde
+++ b/gpsviewer.pde
@@ -1,87 +1,124 @@
-XMLElement kml;
-ArrayList points = new ArrayList();
+p3d max=new p3d(-1000,-1000,-1000,"");
+p3d min=new p3d(1000,1000,1000,"");
+
+float xOffset,yOffset,spanDegrees,pixelsPerDegree;
+
+trace pts1,pts2;
class p3d {
float x,y,z;
- p3d(float _x,float _y,float _z) {
+ String time;
+ p3d(float _x,float _y,float _z,String _t) {
x=_x;
y=_y;
z=_z;
}
}
-p3d max=new p3d(-1000,-1000,-1000);
-p3d min=new p3d(1000,1000,1000);
-
-float xOffset,yOffset,spanDegrees;
-
-void addPoint(String[] coord) {
- p3d p;
- if (coord.length>2) {
- p=new p3d(float(coord[0]),float(coord[1]),float(coord[2]));
- }
- else p=new p3d(float(coord[0]),float(coord[1]),0.0);
- points.add(p);
- if (p.x>max.x) max.x=p.x;
- if (p.y>max.y) max.y=p.y;
- if (p.z>max.z) max.z=p.z;
- if (p.x<min.x) min.x=p.x;
- if (p.y<min.y) min.y=p.y;
- if (p.z<min.z) min.z=p.z;
-}
-
-void setup() {
- size(512,512);
- kml = new XMLElement(this, "tim-openpaths.kml").getChild("Document");
- //kml = new XMLElement(this, "everytrip-demo.kml").getChild("Document");
- int num = kml.getChildCount();
- for (int i = 0; i < num; i++) {
- if (kml.getChild(i).getName().equals("Placemark")) {
- if (kml.getChild(i).getChildren("Point").length>0) { //element contains a single coordinate
- addPoint(kml.getChild(i).getChild("Point").getChild("coordinates").getContent().split(","));
+class trace {
+ ArrayList points = new ArrayList();
+ PApplet parent;
+ trace(PApplet _this,String filename) {
+ parent=_this;
+ parseXml(filename);
+ }
+ void addPoint(float _x,float _y,float _z,String _t) {
+ p3d p=new p3d(_x,_y,_z,_t);
+ points.add(p);
+ if (p.x>max.x) max.x=p.x;
+ if (p.y>max.y) max.y=p.y;
+ if (p.z>max.z) max.z=p.z;
+ if (p.x<min.x) min.x=p.x;
+ if (p.y<min.y) min.y=p.y;
+ if (p.z<min.z) min.z=p.z;
+ }
+ void draw() {
+ for (int i=0;i<points.size()-1;i++) {
+ float x1=((((p3d)points.get(i)).x-min.x)*pixelsPerDegree)+xOffset;
+ float y1=(height-((((p3d)points.get(i)).y-min.y)*pixelsPerDegree))-yOffset;
+ float x2=((((p3d)points.get(i+1)).x-min.x)*pixelsPerDegree)+xOffset;
+ float y2=(height-((((p3d)points.get(i+1)).y-min.y)*pixelsPerDegree))-yOffset;
+ line(x1,y1,x2,y2);
}
- if (kml.getChild(i).getChildren("coordinates").length>0) { //element contains a table of coordinates
- String[] coords=kml.getChild(i).getChild("coordinates").getContent().split("\\n");
- for (int j=0;j<coords.length;j++) {
- addPoint(coords[j].split(","));
+ }
+ void parseXml(String _file) {
+ ArrayList pts = new ArrayList();
+ //XMLElement gpx = new XMLElement(this, "2012-07-18 11-25-38-gpstrack.gpx");
+ XMLElement gpx = new XMLElement(parent, _file);
+ //read all the tracks
+ int trks = gpx.getChildCount();
+ for (int i = 0; i < trks; i++) {
+ XMLElement trk=gpx.getChild(i);
+ println("trk children: "+str(trk.getChildCount())+": "+trk.getChild(0).getName());
+ if (trk.getName().equals("trk")) {
+ //read all the tracksegs;
+ int trkseqs = trk.getChildCount();
+ for (int j = 0; j < trkseqs; j++) {
+ XMLElement trkseq=trk.getChild(j);
+ if (trkseq.getName().equals("trkseg")) {
+ //read all the trackpts;
+ int trkpts = trkseq.getChildCount();
+ for (int k = 0; k < trkpts; k++) {
+ XMLElement trkpt=trkseq.getChild(k);
+ if (trkpt.getName().equals("trkpt")) {
+ float lat=trkpt.getFloat("lat");
+ float lng=trkpt.getFloat("lon");
+ float elev=0.0;
+ String time="";
+ int trkptchildren = trkpt.getChildCount();
+ for (int l = 0; l < trkptchildren; l++) {
+ if (trkpt.getChild(l).getName().equals("ele")) {
+ elev=Float.parseFloat(trkpt.getChild(l).getContent());
+ }
+ if (trkpt.getChild(l).getName().equals("time")) {
+ time=trkpt.getChild(l).getContent();
+ }
+ }
+ addPoint(lng,lat,elev,time);
+ }
+ }
+ }
+ }
}
}
+ //work out offsets
+ if (max.x-min.x>max.y-min.y) {
+ //scale to X
+ xOffset=0;
+ yOffset=(height/2)-((height*((max.y-min.y)/(max.x-min.x))*0.5)); //
}
+ else {
+ //scale to Y
+ xOffset=(width/2)-((width*((max.x-min.x)/(max.y-min.y))*0.5));
+ println("ratio: "+str((max.x-min.x)/(max.y-min.y)));
+ yOffset=0;
+ }
+ println (_file+" "+str(pts.size())+" data points, bounds: "+str(min.x)+","+str(min.y)+" to "+str(max.x)+","+str(max.y));
}
- println ("found "+str(points.size())+" data points");
-
- //work out offsets
- if (max.x-min.x>max.y-min.y) {
- //scale to X
- xOffset=0;
- yOffset=(height/2)-((height*((max.y-min.y)/(max.x-min.x))*0.5)); //
- }
- else {
- //scale to Y
- xOffset=(width/2)-((width*((max.x-min.x)/(max.y-min.y))*0.5));
- println("ratio: "+str((max.x-min.x)/(max.y-min.y)));
- yOffset=0;
- }
+}
+
+void setup() {
+ size(512,512);
+ pts1 = new trace(this,"2012-07-18 11-25-38-gpstrack.gpx");
+ pts2 = new trace(this,"1667831-gpstrack.gpx");
background(0);
stroke(255);
+
+ spanDegrees=max(max.x-min.x,max.y-min.y);
+ if (max.x-min.x>max.y-min.y) pixelsPerDegree=width/spanDegrees; //maximum span of latitude/longitude
+ else pixelsPerDegree=height/spanDegrees;
}
void draw() {
- spanDegrees=max(max.x-min.x,max.y-min.y);
if (spanDegrees==0.0) println("no movement!");
else {
- float pixelsPerDegree;
- if (max.x-min.x>max.y-min.y) pixelsPerDegree=width/spanDegrees; //maximum span of latitude/longitude
- else pixelsPerDegree=height/spanDegrees;
- for (int i=0;i<points.size()-1;i++) {
- float x1=((((p3d)points.get(i)).x-min.x)*pixelsPerDegree)+xOffset;
- float y1=(height-((((p3d)points.get(i)).y-min.y)*pixelsPerDegree))-yOffset;
- float x2=((((p3d)points.get(i+1)).x-min.x)*pixelsPerDegree)+xOffset;
- float y2=(height-((((p3d)points.get(i+1)).y-min.y)*pixelsPerDegree))-yOffset;
- line(x1,y1,x2,y2);
- }
+ stroke(255,255,0);
+ pts1.draw();
+ stroke(255,128,128);
+ pts2.draw();
}
noLoop();
+ saveFrame();
}