1
+ /* global L */
2
+ ( function ( ) {
3
+
4
+ L . vectorTileLayer = L . GeoJSON . extend ( {
5
+
6
+ includes : L . Evented . prototype ,
7
+
8
+ map : null ,
9
+
10
+ options : {
11
+ } ,
12
+
13
+ initialize ( extraOptions , options ) {
14
+ L . GeoJSON . prototype . initialize . call ( this , [ ] , options ) ;
15
+ L . Util . setOptions ( this , extraOptions ) ;
16
+ } ,
17
+
18
+
19
+ /*
20
+ function long2tile(lon,zoom) { return (Math.floor((lon+180)/360*Math.pow(2,zoom))); }
21
+ function lat2tile(lat,zoom) { 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,zoom))); }
22
+
23
+ Inverse process:
24
+
25
+ function tile2long(x,z) {
26
+ return (x/Math.pow(2,z)*360-180);
27
+ }
28
+ function tile2lat(y,z) {
29
+ var n=Math.PI-2*Math.PI*y/Math.pow(2,z);
30
+ return (180/Math.PI*Math.atan(0.5*(Math.exp(n)-Math.exp(-n))));
31
+ }
32
+
33
+ Example for calculating number of tiles within given extent and zoom-level:
34
+
35
+ var zoom = 9;
36
+ var top_tile = lat2tile(north_edge, zoom); // eg.lat2tile(34.422, 9);
37
+ var left_tile = lon2tile(west_edge, zoom);
38
+ var bottom_tile = lat2tile(south_edge, zoom);
39
+ var right_tile = lon2tile(east_edge, zoom);
40
+ var width = Math.abs(left_tile - right_tile) + 1;
41
+ var height = Math.abs(top_tile - bottom_tile) + 1;
42
+
43
+ // total tiles
44
+ var total_tiles = width * height; // -> eg. 377
45
+ */
46
+
47
+ _reload : function ( ) {
48
+ if ( this . map ) {
49
+ var urls = this . _expand ( this . options . url ) ;
50
+ for ( var i = 0 ; i < urls . length ; i ++ ) {
51
+ this . _ajax ( 'GET' , urls [ i ] , false , this . _update . bind ( this ) ) ;
52
+ }
53
+ }
54
+ } ,
55
+
56
+
57
+
58
+ _update : function ( geoData ) {
59
+ this . clearLayers ( ) ;
60
+ this . addData ( geoData ) ;
61
+ } ,
62
+
63
+ onAdd : function ( map ) {
64
+ L . GeoJSON . prototype . onAdd . call ( this , map ) ;
65
+ this . map = map ;
66
+ map . on ( 'moveend zoomend refresh' , this . _reload , this ) ;
67
+ this . _reload ( ) ;
68
+ } ,
69
+
70
+ onRemove : function ( map ) {
71
+ map . off ( 'moveend zoomend refresh' , this . _reload , this ) ;
72
+ this . map = null ;
73
+ L . GeoJSON . prototype . onRemove . call ( this , map ) ;
74
+ } ,
75
+
76
+ _expand : function ( template ) {
77
+ var bbox = this . _map . getBounds ( ) ;
78
+ var southWest = bbox . getSouthWest ( ) ;
79
+ var northEast = bbox . getNorthEast ( ) ;
80
+ var bboxStr = bbox . toBBoxString ( ) ;
81
+ var coords = {
82
+ lat1 : southWest . lat ,
83
+ lon1 : southWest . lng ,
84
+ lat2 : northEast . lat ,
85
+ lon2 : northEast . lng ,
86
+ bbox : bboxStr
87
+ } ;
88
+ return [ L . Util . template ( template , coords ) ] ;
89
+ } ,
90
+
91
+ _ajax : function ( method , url , data , callback ) {
92
+ var request = new XMLHttpRequest ( ) ;
93
+ request . open ( method , url , true ) ;
94
+ request . onreadystatechange = function ( ) {
95
+ if ( request . readyState === 4 && request . status === 200 ) {
96
+ callback ( JSON . parse ( request . responseText ) ) ;
97
+ }
98
+ } ;
99
+ if ( data ) {
100
+ request . setRequestHeader ( 'Content-type' , 'application/json' ) ;
101
+ request . send ( JSON . stringify ( data ) ) ;
102
+ } else {
103
+ request . send ( ) ;
104
+ }
105
+ return request ;
106
+ } ,
107
+
108
+ } ) ;
109
+
110
+ L . vectorTileLayer = function ( options ) {
111
+ return new L . vectorTileLayer ( options ) ;
112
+ } ;
113
+
114
+ } ) . call ( this ) ;
0 commit comments