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