source: subversion/applications/editors/potlatch/tiles.as @ 34348

Last change on this file since 34348 was 23171, checked in by richard, 9 years ago

remove NearMap? at their request

File size: 4.5 KB
Line 
1
2        // =====================================================================
3        // Tile management functions
4
5        // tileListener - MovieClipLoader class
6        //                                on complete or error, remove from queue
7       
8        tileListener.onLoadError=function(tile,errorCode) {
9                _root.tilesloaded-=1;
10                delete tilerequested[tile._parent._name+','+tile._name];
11                delete    _root.ages[tile._parent._name+','+tile._name];
12                removeFromTileRequests(tile);
13                tile.removeMovieClip();
14        };
15        tileListener.onLoadComplete=function(tile) {
16                delete tilerequested[tile._parent._name+','+tile._name];
17                removeFromTileRequests(tile);
18        };
19       
20        function removeFromTileRequests(tile) {
21                var sc=tile._parent._name;
22                var x =tile._name.split(',')[0];
23                var y =tile._name.split(',')[1];
24                for (var i=0; i<tilerequests.length; i++) {
25                        if (tilerequests[i][0]==x &&
26                                tilerequests[i][1]==y &&
27                                tilerequests[i][2]==sc) {
28                                tilerequests.splice(i,1); i--;
29                        }
30                }
31        }
32               
33
34
35        // initTiles - empty all tile layers and queues
36
37        function initTiles() {
38                _root.map.createEmptyMovieClip("tiles",1);
39                for (var i=minscale; i<=maxscale; i+=1) {
40                        _root.map.tiles.createEmptyMovieClip(i,i);
41                }
42                _root.age=0;                                            // current age
43                _root.ages=new Array();                         // hash of ages
44                _root.tilesloaded=0;                            // number of clips loaded
45                _root.tilerequested=new Array();        // what clips have been requested?
46                _root.tilerequests=new Array();         // list of tile requests
47                _root.tiledepth=0;                                      // depth of tile movieclip
48        }
49
50        // updateTiles - load all tiles and select correct zoom level
51       
52        function updateTiles() {
53                for (var i=minscale; i<=maxscale; i+=1) {
54                        _root.map.tiles[i]._visible=(_root.scale==i);
55                }
56                for (var x=_root.tile_l; x<=_root.tile_r; x+=1) {
57                        for (var y=_root.tile_t; y<=_root.tile_b; y+=1) {
58                                if (!_root.tilerequested[_root.scale+','+x+','+y] &&
59                                        !_root.map.tiles[_root.scale][x+','+y]) { requestTile(x,y); }
60                        }
61                }
62                if (_root.tilesloaded>200) { purgeTiles(); }
63        }
64
65        // loadTile - add tile to end of request queue
66
67        function requestTile(tx,ty) {
68                var a=new Array(tx,ty,_root.scale);
69                tilerequests.push(a);
70                tilerequested[_root.scale+','+tx+','+ty]=true;
71        }
72
73        // serviceTileQueue - fire load requests for four most recent requested
74        //                                      - called onEnterFrame
75        //                                      - splice will cause one of the four to be skipped, but
76        //                                        this will be remedied on the next run through
77
78        function serviceTileQueue() {
79                for (var n=0; n<Math.min(4,tilerequests.length); n++) {
80                        var r=tilerequests[n]; var x=r[0]; var y=r[1]; var sc=r[2];
81                        if (_root.map.tiles[sc][x+','+y]) {
82                                // tile exists
83                        } else if (x>=tile_l && x<=tile_r && y>=tile_t && y<=tile_b) {
84                                // tile doesn't exist but is on-screen, so load
85                                _root.map.tiles[sc].createEmptyMovieClip(x+","+y,++_root.tiledepth);
86                                _root.tileLoader.loadClip(tileURL(x,y),_root.map.tiles[sc][x+","+y]);
87                                with (_root.map.tiles[sc][x+','+y]) {
88                                        _x=long2coord(tile2long(x));
89                                        _y=lat2coord(tile2lat(y));
90                                        // ** check that this shouldn't be y-1, etc.
91                                        _xscale=_yscale=100/Math.pow(2,sc-_root.flashscale);
92                                }
93                                _root.tilesloaded++;
94                                _root.ages[sc+','+x+','+y]=_root.age;
95                                tilerequests[n][3]=getTimer();
96                        } else {
97                                // tile doesn't exist and is now off-screen, so delete
98                                delete tilerequested[sc+','+x+','+y];
99                                tilerequests.splice(n,1);
100                        }
101                }
102        }
103       
104        function purgeTiles() {
105                var z;
106                for (var i=minscale; i<=maxscale; i+=1) {
107                        z=_root.map.tiles[i]; for (j in z) {
108                                var x=j.substr(0,j.indexOf(','));
109                                var y=j.substr(j.indexOf(',')+1);
110                                if (x<tile_l || x>tile_r || y<tile_t || y>tile_b) {
111                                        delete tilerequested[i+','+j];
112                                        removeMovieClip(_root.map.tiles[i][j]);
113                                        _root.tilesloaded--;
114                                }
115                        }
116                }
117        }
118
119
120        // tile co-ordinates
121
122        function long2tile(lon) { return (Math.floor((lon+180)/360*Math.pow(2,_root.scale))); }
123        function lat2tile(lat)  { return (Math.floor((1-Math.log(Math.tan(lat*Math.PI/180) + 1/Math.cos(lat*Math.PI/180))/Math.PI)/2 *Math.pow(2,_root.scale))); }
124        function tile2long(t)   { return (t/Math.pow(2,_root.scale)*360-180); }
125        function tile2lat(t)    { var n=Math.PI-2*Math.PI*t/Math.pow(2,_root.scale);
126                                                          return (180/Math.PI*Math.atan(0.5*(Math.exp(n)-Math.exp(-n)))); }
127
128        // tile URLs
129       
130        function tileURL(x,y) { 
131                var c;
132                if (preferences.data.bgtype==1) {
133                        c=tileurls[preferences.data.tileset];
134                } else {
135                        c=preferences.data.tilecustom;
136                        if (c.toLowerCase().indexOf('google')>-1) { c='http://tile.openstreetmap.org/16/18222/24892.png?!!!'; }
137                        else if (c.toLowerCase().indexOf('nearmap')>-1) { c='http://tile.openstreetmap.org/17/31017/50324.png?!!!'; }
138                }
139                var a=c.split('!');
140                return tileprefix+a[0]+_root.scale+a[1]+x+a[2]+y+a[3];
141        }
Note: See TracBrowser for help on using the repository browser.