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

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

Add cycle map

  • Property svn:executable set to *
File size: 4.3 KB
Line 
1
2        // =====================================================================
3        // Tile management functions
4
5        // initTiles - empty all tile layers and queues
6
7        function initTiles() {
8                _root.map.createEmptyMovieClip("tiles",1);
9                for (var i=minscale; i<=maxscale; i+=1) {
10                        _root.map.tiles.createEmptyMovieClip(i,i);
11                }
12                _root.age=0;                                            // current age
13                _root.ages=new Array();                         // hash of ages
14                _root.tilesloaded=0;                            // number of clips loaded
15                _root.tilerequested=new Array();        // what clips have been requested?
16                _root.tilerequests=new Array();         // list of tile requests
17                _root.tiledepth=0;                                      // depth of tile movieclip
18        }
19
20        // updateTiles - load all tiles and select correct zoom level
21       
22        function updateTiles() {
23                for (var i=minscale; i<=maxscale; i+=1) {
24                        _root.map.tiles[i]._visible=(_root.scale==i);
25                }
26                for (var x=_root.tile_l; x<=_root.tile_r; x+=1) {
27                        for (var y=_root.tile_t; y<=_root.tile_b; y+=1) {
28                                if (!_root.tilerequested[_root.scale+','+x+','+y]) { requestTile(x,y); }
29                        }
30                }
31                if (_root.tilesloaded>200) { purgeTiles(); }
32        }
33
34        // loadTile - add tile to end of request queue
35
36        function requestTile(tx,ty) {
37                var a=new Array(tx,ty,_root.scale);
38                tilerequests.push(a);
39                tilerequested[_root.scale+','+tx+','+ty]=true;
40        }
41
42        // serviceTileQueue - fire load requests for four most recent requested
43        //                                      - called onEnterFrame
44        //                                      - splice will cause one of the four to be skipped, but
45        //                                        this will be remedied on the next run through
46
47        function serviceTileQueue() {
48                for (var n=0; n<Math.min(4,tilerequests.length); n++) {
49                        var r=tilerequests[n]; var x=r[0]; var y=r[1]; var sc=r[2];
50                        if (_root.map.tiles[sc][x+','+y]) {
51                                var t=_root.map.tiles[sc][x+','+y];
52                                if (t.getBytesLoaded()==t.getBytesTotal() && t.getBytesLoaded()>0) {
53                                        // tile exists and is fully loaded, so remove from queue
54                                        delete tilerequested[sc+','+x+','+y];
55                                        tilerequests.splice(n,1);
56                                } else {
57                                        // tile not fully loaded, keep in queue unless timed out
58                                        if (r[3]+15000<getTimer()) {
59                                                delete _root.ages[sc+','+x+','+y];
60                                                _root.tilesloaded-=1;
61                                                _root.map.tiles[sc][x+','+y].removeMovieClip();
62                                        }
63                                }
64                        } else {
65                                if (x>=tile_l && x<=tile_r && y>=tile_t && y<=tile_b) {
66                                        // tile doesn't exist but is on-screen, so load
67                                        _root.map.tiles[sc].createEmptyMovieClip(x+","+y,++_root.tiledepth);
68                                        loadMovie(tileURL(x,y),_root.map.tiles[sc][x+","+y]);
69                                        with (_root.map.tiles[sc][x+','+y]) {
70                                                _x=long2coord(tile2long(x));
71                                                _y=lat2coord(tile2lat(y));
72                                                // ** check that this shouldn't be y-1, etc.
73                                                _xscale=_yscale=100/Math.pow(2,sc-13);
74                                        }
75                                        _root.tilesloaded++;
76                                        _root.ages[sc+','+x+','+y]=_root.age;
77                                        tilerequests[n][3]=getTimer();
78                                } else {
79                                        // tile doesn't exist and is now off-screen, so delete
80                                        delete tilerequested[sc+','+x+','+y];
81                                        tilerequests.splice(n,1);
82                                }
83                        }
84                }
85        }
86       
87        function purgeTiles() {
88                for (var i=minscale; i<=maxscale; i+=1) {
89                        for (j in _root.map.tiles[i]) {
90                                var x=j.substr(0,j.indexOf(','));
91                                var y=j.substr(j.indexOf(',')+1);
92                                if (x<tile_l || x>tile_r || y<tile_t || y>tile_b) {
93                                        delete tilerequested[i+','+j];
94                                        removeMovieClip(_root.map.tiles[i][j]);
95                                        _root.tilesloaded--;
96                                }
97                        }
98                }
99        }
100
101
102        // tile co-ordinates
103
104        function long2tile(lon) { return (Math.floor((lon+180)/360*Math.pow(2,_root.scale))); }
105        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))); }
106        function tile2long(t)   { return (t/Math.pow(2,_root.scale)*360-180); }
107        function tile2lat(t)    { var n=Math.PI-2*Math.PI*t/Math.pow(2,_root.scale);
108                                                          return (180/Math.PI*Math.atan(0.5*(Math.exp(n)-Math.exp(-n)))); }
109
110        // tile URLs
111       
112        function tileURL(x,y) { 
113                switch (preferences.data.baselayer) {
114                        case 1: return (tileprefix+"http://tile.openaerialmap.org/tiles/1.0.0/openaerialmap-900913/"+_root.scale+"/"+x+"/"+y+".jpg");
115                        case 3: return (tileprefix+"http://tile.openstreetmap.org/"+_root.scale+"/"+x+"/"+y+".png");
116                        case 4: return (tileprefix+"http://tah.openstreetmap.org/Tiles/tile.php/"+_root.scale+"/"+x+"/"+y+".png");
117                        case 5: return (tileprefix+"http://tah.openstreetmap.org/Tiles/maplint.php/"+_root.scale+"/"+x+"/"+y+".png");
118                        case 6: return (tileprefix+"http://thunderflames.org/tiles/cycle/"+_root.scale+"/"+x+"/"+y+".png");
119                }
120        }
Note: See TracBrowser for help on using the repository browser.