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

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

some more putway fixes - this actually creates new ways with 0.6 Potlatch now

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