summaryrefslogtreecommitdiff
path: root/gpsviewer.pde
blob: 715c79fcdad38e2e6dd804daf4cfdc0986f3e031 (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
XMLElement kml;
ArrayList points = new ArrayList();

class p3d {
  float x,y,z;
  p3d(float _x,float _y,float _z) {
    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(","));
      }
      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(","));
        }
      }
    }
  }
  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;
  }
  
  
  background(0);
  stroke(255);
}

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