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