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

Last change on this file since 15136 was 15136, checked in by richard, 11 years ago

Potlatch 1.0

  • Property svn:executable set to *
File size: 6.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                writeText(_root.windows.pleasewait.box.prompt,iText("Please wait while the GPX track is processed.",'gpxpleasewait'));
18
19                _root.tracks=new Array();
20                _root.curtrack=0; _root.tracks[curtrack]=new Array();
21                _root.map.gpx.createEmptyMovieClip("line",1);
22                _root.map.gpx.line.lineStyle(1,0x00FFFF,100,false,"none");
23                _root.gpxpoints=0;
24
25                var gpxs=gpxname.split(',');
26                for (var g in gpxs) {
27                        var gpxdoc=new XML();
28                        gpxdoc.load(gpxurl+gpxs[g]+gpxsuffix);
29                        gpxdoc.onLoad=function() {
30               
31                                _root.lastTime=0;
32                                var waypoints=new Array();
33                                var level1=this.childNodes;
34                                for (i=0; i<level1.length; i+=1) {
35                                        if (level1[i].nodeName=='gpx') {
36                                                var level2=level1[i].childNodes;
37                                                for (j=0; j<level2.length; j+=1) {
38                                                        if (level2[j].nodeName=='trk') {
39                                                                var level3=level2[j].childNodes;
40                                                                for (k=0; k<level3.length; k+=1) {
41                                                                        if (level3[k].nodeName=='trkseg') {
42                                                                                var level4=level3[k].childNodes;
43                                                                                for (l=0; l<level4.length; l+=1) {
44                                                                                        if (level4[l].nodeName=='trkpt') {
45                                                                                                parsePoint(level4[l]);
46                                                                                        }
47                                                                                }
48                                                                                lastTime=0;
49                                                                        }
50                                                                }
51                                                        } else if (level2[j].nodeName=='wpt') {
52                                                                var wpattr=new Array();
53                                                                var level3=level2[j].childNodes;
54                                                                for (k=0; k<level3.length; k+=1) {
55                                                                        if (level3[k].nodeName=='name') { wpattr['name'                   ]=level3[k].firstChild.nodeValue; }
56                                                                        if (level3[k].nodeName=='ele' ) { wpattr['ele'                    ]=level3[k].firstChild.nodeValue; }
57                                                                        if (level3[k].nodeName=='sym' ) { wpattr['wpt_symbol'     ]=level3[k].firstChild.nodeValue; }
58                                                                        if (level3[k].nodeName=='desc') { wpattr['wpt_description']=level3[k].firstChild.nodeValue; }
59                                                                }
60                                                                waypoints.push(new Array(level2[j].attributes['lon'],level2[j].attributes['lat'],wpattr));
61                                                        }
62                                                }
63                                        }
64                                }
65                                // Do waypoints last, because we might not have the base lat/lon at the start
66                                for (i in waypoints) {
67                                        _root.map.pois.attachMovie("poi",--newnodeid,++poidepth);
68                                        _root.map.pois[newnodeid]._x=long2coord(waypoints[i][0]);
69                                        _root.map.pois[newnodeid]._y=lat2coord (waypoints[i][1]);
70                                        _root.map.pois[newnodeid].attr=waypoints[i][2];
71                                        _root.map.pois[newnodeid].locked=true;
72                                        _root.map.pois[newnodeid].clean=false;
73                                        _root.map.pois[newnodeid].recolour();
74                                        _root.poicount+=1;
75                                }
76                                _root.windows.pleasewait.remove();
77                        };
78                }
79        }
80
81        function parsePoint(xmlobj) {
82                _root.gpxpoints++;
83                if (lat) {
84                } else {                                                                        // Get root co-ords from first point in GPX
85                        lat =xmlobj.attributes['lat'];                  // (was briefly if (gpxpoints>4), but
86                        long=xmlobj.attributes['lon'];                  //  obviously this broke lat2coord for the
87                        startPotlatch();                                                //  first four points... ** need to fix)
88                }
89                var y= lat2coord(xmlobj.attributes['lat']);
90                var x=long2coord(xmlobj.attributes['lon']);
91                var tme=new Date();
92                tme.setTime(0);
93                var xcn=xmlobj.childNodes;
94                for (a in xcn) {
95                        if (xcn[a].nodeName=='time') {
96                                str=xcn[a].firstChild.nodeValue;
97                                if (str.substr( 4,1)=='-' &&
98                                        str.substr(10,1)=='T') {
99                                        tme.setFullYear(str.substr(0,4),str.substr(5,2),str.substr(8,2));
100                                        tme.setHours(str.substr(11,2));
101                                        tme.setMinutes(str.substr(14,2));
102                                        tme.setSeconds(str.substr(17,2));
103                                }
104                        }
105                }
106
107                if (tme==null || tme.getTime()-_root.lastTime<180000) {
108                        _root.map.gpx.line.lineTo(x,y);
109                        _root.tracks[curtrack].push(new Array(x,y));
110                } else {
111                        _root.map.gpx.line.moveTo(x,y);
112                        _root.curtrack+=1;
113                        _root.tracks[curtrack]=new Array();
114                        _root.tracks[curtrack].push(new Array(x,y));
115                }
116                lastTime=tme.getTime();
117        }
118       
119        // gpxToWays    - convert all GPS tracks to ways
120       
121        function gpxToWays() {
122                var tol=0.2; if (Key.isDown(Key.SHIFT)) { tol=0.1; }
123                for (var i=0; i<_root.tracks.length; i+=1) {
124                        _root.tracks[i]=simplifyPath(_root.tracks[i],tol);
125
126                        _root.newwayid--;
127                        _root.map.ways.attachMovie("way",newwayid,++waydepth);
128                        _root.map.ways[newwayid].xmin= 999999;
129                        _root.map.ways[newwayid].xmax=-999999;
130                        _root.map.ways[newwayid].ymin= 999999;
131                        _root.map.ways[newwayid].ymax=-999999;
132                        for (var j=0; j<_root.tracks[i].length; j+=1) {
133                                _root.newnodeid--;
134                                _root.nodes[newnodeid]=new Node(newnodeid,_root.tracks[i][j][0],_root.tracks[i][j][1],new Array(),0);
135                                _root.nodes[newnodeid].addWay(newwayid);
136                                _root.map.ways[newwayid].path.push(_root.nodes[newnodeid]);
137                                _root.map.ways[newwayid].xmin=Math.min(_root.tracks[i][j][0],_root.map.ways[newwayid].xmin);
138                                _root.map.ways[newwayid].xmax=Math.max(_root.tracks[i][j][0],_root.map.ways[newwayid].xmax);
139                                _root.map.ways[newwayid].ymin=Math.min(_root.tracks[i][j][1],_root.map.ways[newwayid].ymin);
140                                _root.map.ways[newwayid].ymax=Math.max(_root.tracks[i][j][1],_root.map.ways[newwayid].ymax);
141                        }
142                        _root.map.ways[newwayid].clean=false;
143                        _root.map.ways[newwayid].locked=true;
144                        _root.map.ways[newwayid].redraw();
145                }
146        }
147
148        // ================================================================
149        // Douglas-Peucker code
150
151        function distance(ax,ay,bx,by,l,cx,cy) {
152                // l=length of line
153                // r=proportion along AB line (0-1) of nearest point
154                var r=((cx-ax)*(bx-ax)+(cy-ay)*(by-ay))/(l*l);
155                // now find the length from cx,cy to ax+r*(bx-ax),ay+r*(by-ay)
156                var px=(ax+r*(bx-ax)-cx);
157                var py=(ay+r*(by-ay)-cy);
158                return Math.sqrt(px*px+py*py);
159        }
160
161        function simplifyPath(track,tolerance) {
162                if (track.length<=2) { return track; }
163               
164                result=new Array();
165                stack=new Array();
166                stack.push(track.length-1);
167                anchor=0;
168               
169                while (stack.length) {
170                        float=stack[stack.length-1];
171                        var xa=track[anchor][0]; var xb=track[float][0];
172                        var ya=track[anchor][1]; var yb=track[float][1];
173                        var l=Math.sqrt((xb-xa)*(xb-xa)+(yb-ya)*(yb-ya));
174                        var furthest=0; var furthdist=0;
175       
176                        // find furthest-out point
177                        for (var i=anchor+1; i<float; i+=1) {
178                                var d=distance(xa,ya,xb,yb,l,track[i][0],track[i][1]);
179                                if (d>furthdist && d>tolerance) { furthest=i; furthdist=d; }
180                        }
181                       
182                        if (furthest==0) {
183                                anchor=stack.pop();
184                                result.push(new Array(track[float][0],track[float][1]));
185                        } else {
186                                stack.push(furthest);
187                        }
188                }
189
190                return result;
191        }
192
Note: See TracBrowser for help on using the repository browser.