source: subversion/applications/editors/potlatch/gps.as @ 7133

Last change on this file since 7133 was 6242, checked in by richard, 12 years ago

Potlatch 0.6a: small bugfixes, read GPX waypoints

  • Property svn:executable set to *
File size: 5.8 KB
Line 
1
2        // ================================================================
3        // GPS functions
4       
5        // loadGPS              - load GPS backdrop from server
6
7        function loadGPS() {
8                _root.map.createEmptyMovieClip('gps',3);
9                if (Key.isDown(Key.SHIFT)) { loadMovie(gpsurl+'?xmin='+(_root.edge_l-0.01)+'&xmax='+(_root.edge_r+0.01)+'&ymin='+(_root.edge_b-0.01)+'&ymax='+(_root.edge_t+0.01)+'&baselong='+_root.baselong+'&basey='+_root.basey+'&masterscale='+_root.masterscale+'&token='+_root.usertoken,_root.map.gps); }
10                                                          else { loadMovie(gpsurl+'?xmin='+(_root.edge_l-0.01)+'&xmax='+(_root.edge_r+0.01)+'&ymin='+(_root.edge_b-0.01)+'&ymax='+(_root.edge_t+0.01)+'&baselong='+_root.baselong+'&basey='+_root.basey+'&masterscale='+_root.masterscale,_root.map.gps); }
11        }
12
13        // parseGPX             - parse GPX file
14        // parsePoint
15       
16        function parseGPX(gpxname) {
17                _root.tracks=new Array();
18                var lastTime=0;
19                _root.curtrack=0; _root.tracks[curtrack]=new Array();
20                var gpxdoc=new XML();
21                gpxdoc.load(gpxurl+gpxname);
22                gpxdoc.onLoad=function() {
23                        _root.map.gpx.createEmptyMovieClip("line",1);
24                        _root.map.gpx.line.lineStyle(1,0x00FFFF,100,false,"none");
25       
26                        var level1=this.childNodes;
27                        for (i=0; i<level1.length; i+=1) {
28                                if (level1[i].nodeName=='gpx') {
29                                        var level2=level1[i].childNodes;
30                                        for (j=0; j<level2.length; j+=1) {
31                                                if (level2[j].nodeName=='trk') {
32                                                        var level3=level2[j].childNodes;
33                                                        for (k=0; k<level3.length; k+=1) {
34                                                                if (level3[k].nodeName=='trkseg') {
35                                                                        var level4=level3[k].childNodes;
36                                                                        for (l=0; l<level4.length; l+=1) {
37                                                                                if (level4[l].nodeName=='trkpt') {
38                                                                                        parsePoint(level4[l]);
39                                                                                }
40                                                                        }
41                                                                }
42                                                        }
43                                                } else if (level2[j].nodeName=='wpt') {
44                                                        _root.map.pois.attachMovie("poi",--newpoiid,++poidepth);
45                                                        _root.map.pois[newpoiid]._x=long2coord(level2[j].attributes['lon']);
46                                                        _root.map.pois[newpoiid]._y= lat2coord(level2[j].attributes['lat']);
47                                                        _root.map.pois[newpoiid].locked=true;
48                                                        _root.map.pois[newpoiid].clean=false;
49                                                        // _root.map.pois[newpoiid].recolour();
50                                                        var level3=level2[j].childNodes;
51                                                        for (k=0; k<level3.length; k+=1) {
52                                                                if (level3[k].nodeName=='name') { _root.map.pois[newpoiid].attr['name']=level3[k].firstChild.nodeValue; }
53                                                                if (level3[k].nodeName=='ele' ) { _root.map.pois[newpoiid].attr['ele' ]=level3[k].firstChild.nodeValue; }
54                                                                if (level3[k].nodeName=='sym' ) { _root.map.pois[newpoiid].attr['wpt_symbol'     ]=level3[k].firstChild.nodeValue; }
55                                                                if (level3[k].nodeName=='desc') { _root.map.pois[newpoiid].attr['wpt_description']=level3[k].firstChild.nodeValue; }
56                                                        }
57                                                        _root.poicount+=1;
58                                                }
59                                        }
60                                }
61                        }
62                };
63        }
64
65        function parsePoint(xmlobj) {
66                var y= lat2coord(xmlobj.attributes['lat']);
67                var x=long2coord(xmlobj.attributes['lon']);
68                var tme=new Date();
69                tme.setTime(0);
70                var xcn=xmlobj.childNodes;
71                for (a in xcn) {
72                        if (xcn[a].nodeName=='time') {
73                                str=xcn[a].firstChild.nodeValue;
74                                if (str.substr( 4,1)=='-' &&
75                                        str.substr(10,1)=='T' &&
76                                        str.substr(19,1)=='Z') {
77                                        tme.setFullYear(str.substr(0,4),str.substr(5,2),str.substr(8,2));
78                                        tme.setHours(str.substr(11,2));
79                                        tme.setMinutes(str.substr(14,2));
80                                        tme.setSeconds(str.substr(17,2));
81                                }
82                        }
83                }
84
85                if (tme==null || tme.getTime()-_root.lastTime<180000) {
86                        _root.map.gpx.line.lineTo(x,y);
87                        _root.tracks[curtrack].push(new Array(x,y));
88                } else {
89                        _root.map.gpx.line.moveTo(x,y);
90                        _root.curtrack+=1;
91                        _root.tracks[curtrack]=new Array();
92                        _root.tracks[curtrack].push(new Array(x,y));
93                }
94                lastTime=tme.getTime();
95        }
96       
97        // gpxToWays    - convert all GPS tracks to ways
98       
99        function gpxToWays() {
100                for (var i=0; i<_root.tracks.length; i+=1) {
101                        _root.tracks[i]=simplifyPath(_root.tracks[i]);
102
103                        _root.newwayid--;
104                        _root.map.ways.attachMovie("way",newwayid,++waydepth);
105                        _root.map.ways[newwayid].xmin= 999999;
106                        _root.map.ways[newwayid].xmax=-999999;
107                        _root.map.ways[newwayid].ymin= 999999;
108                        _root.map.ways[newwayid].ymax=-999999;
109                        for (var j=0; j<_root.tracks[i].length; j+=1) {
110                                _root.map.ways[newwayid].path.push(new Array(_root.tracks[i][j][0],_root.tracks[i][j][1],--newnodeid,Math.min(j,1),new Array(),0));
111                                _root.map.ways[newwayid].xmin=Math.min(_root.tracks[i][j][0],_root.map.ways[newwayid].xmin);
112                                _root.map.ways[newwayid].xmax=Math.max(_root.tracks[i][j][0],_root.map.ways[newwayid].xmax);
113                                _root.map.ways[newwayid].ymin=Math.min(_root.tracks[i][j][1],_root.map.ways[newwayid].ymin);
114                                _root.map.ways[newwayid].ymax=Math.max(_root.tracks[i][j][1],_root.map.ways[newwayid].ymax);
115                        }
116                        _root.map.ways[newwayid].clean=false;
117                        _root.map.ways[newwayid].locked=true;
118                        _root.map.ways[newwayid].redraw();
119                }
120        }
121
122        // ================================================================
123        // Douglas-Peucker code
124
125        function distance(ax,ay,bx,by,l,cx,cy) {
126                // l=length of line
127                // r=proportion along AB line (0-1) of nearest point
128                var r=((cx-ax)*(bx-ax)+(cy-ay)*(by-ay))/(l*l);
129                // now find the length from cx,cy to ax+r*(bx-ax),ay+r*(by-ay)
130                var px=(ax+r*(bx-ax)-cx);
131                var py=(ay+r*(by-ay)-cy);
132                return Math.sqrt(px*px+py*py);
133        }
134
135        function simplifyPath(track) {
136                if (track.length<=2) { return track; }
137               
138                result=new Array();
139                stack=new Array();
140                stack.push(track.length-1);
141                anchor=0;
142               
143                while (stack.length) {
144                        float=stack[stack.length-1];
145                        var xa=track[anchor][0]; var xb=track[float][0];
146                        var ya=track[anchor][1]; var yb=track[float][1];
147                        var l=Math.sqrt((xb-xa)*(xb-xa)+(yb-ya)*(yb-ya));
148                        var furthest=0; var furthdist=0;
149       
150                        // find furthest-out point
151                        for (var i=anchor+1; i<float; i+=1) {
152                                var d=distance(xa,ya,xb,yb,l,track[i][0],track[i][1]);
153                                if (d>furthdist && d>0.2) { furthest=i; furthdist=d; }
154                        }
155                       
156                        if (furthest==0) {
157                                anchor=stack.pop();
158                                result.push(new Array(track[float][0],track[float][1]));
159                        } else {
160                                stack.push(furthest);
161                        }
162                }
163
164                return result;
165        }
166
Note: See TracBrowser for help on using the repository browser.