summaryrefslogtreecommitdiff
path: root/gpsviewer.pde
blob: 6274272c76f7095a4a428b8c788a5aea9c0a90d9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
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;
  String time;
  p3d(float _x,float _y,float _z,String _t) {
    x=_x;
    y=_y;
    z=_z;
  }
}

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);
      }
    }
    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));
  }
}

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() {
  if (spanDegrees==0.0) println("no movement!");
  else {
    stroke(255,255,0);
    pts1.draw();
    stroke(255,128,128);
    pts2.draw();
  }
  noLoop();
  //saveFrame();
}