Parcourir la source

support GeoJSON tiles

Maurits van der Schee il y a 5 ans
Parent
révision
14ec22252d

+ 29
- 0
examples/clients/leaflet/GeoJSONGridLayer.js Voir le fichier

@@ -2,6 +2,35 @@
2 2
  * Leaflet.GeoJSONGridLayer 
3 3
  */
4 4
 
5
+
6
+/*
7
+ function long2tile(lon,zoom) { return (Math.floor((lon+180)/360*Math.pow(2,zoom))); }
8
+ 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))); }
9
+
10
+Inverse process:
11
+
12
+ function tile2long(x,z) {
13
+  return (x/Math.pow(2,z)*360-180);
14
+ }
15
+ function tile2lat(y,z) {
16
+  var n=Math.PI-2*Math.PI*y/Math.pow(2,z);
17
+  return (180/Math.PI*Math.atan(0.5*(Math.exp(n)-Math.exp(-n))));
18
+ }
19
+
20
+Example for calculating number of tiles within given extent and zoom-level:
21
+
22
+var zoom        = 9;
23
+var top_tile    = lat2tile(north_edge, zoom); // eg.lat2tile(34.422, 9);
24
+var left_tile   = lon2tile(west_edge, zoom);
25
+var bottom_tile = lat2tile(south_edge, zoom);
26
+var right_tile  = lon2tile(east_edge, zoom);
27
+var width       = Math.abs(left_tile - right_tile) + 1;
28
+var height      = Math.abs(top_tile - bottom_tile) + 1;
29
+
30
+// total tiles
31
+var total_tiles = width * height; // -> eg. 377
32
+*/
33
+
5 34
 (function () {
6 35
 
7 36
     var console = window.console || {

+ 17
- 19
examples/clients/leaflet/geojson-layer.js Voir le fichier

@@ -5,43 +5,41 @@
5 5
 
6 6
         includes: L.Evented.prototype,
7 7
 
8
+        url: null,
8 9
         map: null,
9 10
 
10
-        options: {
11
-        },
12
-
13
-        initialize(extraOptions, options) {
11
+        initialize(url, options) {
12
+            this.url = url;
14 13
             L.GeoJSON.prototype.initialize.call(this, [], options);
15
-            L.Util.setOptions(this, extraOptions);
16 14
         },
17 15
 
18
-        _reload: function() {
16
+        reloadMap: function() {
19 17
             if (this.map) {
20
-                var url = this._expand(this.options.url);
21
-                this._ajax('GET', url, false, this._update.bind(this));
18
+                var url = this.expandUrl(this.url);
19
+                this.ajaxRequest('GET', url, false, this.updateLayers.bind(this));
22 20
             }
23 21
         },
24 22
 
25
-        _update: function(geoData) {
23
+        updateLayers: function(geoData) {
26 24
             this.clearLayers();
27 25
             this.addData(geoData);
28 26
         },
29 27
 
30
-        onAdd: function(map) {
28
+        onAdd(map) {
31 29
             L.GeoJSON.prototype.onAdd.call(this, map); 
32 30
             this.map = map;
33
-            map.on('moveend zoomend refresh', this._reload, this);
34
-            this._reload();
31
+            map.on('moveend zoomend refresh', this.reloadMap, this);
32
+            this.reloadMap();
35 33
         },
36 34
 
37
-        onRemove: function(map) {
38
-            map.off('moveend zoomend refresh', this._reload, this);
35
+        onRemove(map) {
36
+            map.off('moveend zoomend refresh', this.reloadMap, this);
39 37
             this.map = null;
40 38
             L.GeoJSON.prototype.onRemove.call(this, map);
41 39
         },
42 40
 
43
-        _expand: function(template) {
44
-            var bbox = this._map.getBounds();
41
+        expandUrl: function(template) {
42
+            var bbox = this.map.getBounds();
45 43
             var southWest = bbox.getSouthWest();
46 44
             var northEast = bbox.getNorthEast();
47 45
             var bboxStr = bbox.toBBoxString();
@@ -55,7 +53,7 @@
55 53
             return L.Util.template(template, coords);
56 54
         },
57 55
 
58
-        _ajax: function(method, url, data, callback) {
56
+        ajaxRequest: function(method, url, data, callback) {
59 57
             var request = new XMLHttpRequest();
60 58
             request.open(method, url, true);
61 59
             request.onreadystatechange = function() {
@@ -74,8 +72,8 @@
74 72
 
75 73
     });
76 74
 
77
-    L.geoJSONLayer = function (options) {
78
-        return new L.GeoJSONLayer(options);
75
+    L.geoJSONLayer = function (url, options) {
76
+        return new L.GeoJSONLayer(url, options);
79 77
     };
80 78
 
81 79
 })();

+ 81
- 109
examples/clients/leaflet/geojson-tile-layer.js Voir le fichier

@@ -1,114 +1,86 @@
1 1
 /* global L */
2 2
 (function() {
3 3
 
4
-    L.GeoJSONTileLayer = 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.geoJSONTileLayer = function (options) {
111
-    return new L.GeoJSONTileLayer(options);
112
-};
4
+    L.GeoJSONTileLayer = L.GridLayer.extend({
5
+        
6
+        includes: L.Evented.prototype,
7
+
8
+        url: null,
9
+        layer: null,
10
+        features: null,
11
+
12
+        initialize(url, options) {
13
+            this.url = url;
14
+            this.layer = new L.GeoJSON(null, options);
15
+            this.features = {};
16
+            L.GridLayer.prototype.initialize.call(this, options);
17
+        },
18
+
19
+        createTile: function (coords) {
20
+            var tile = L.DomUtil.create('div', 'leaflet-tile');
21
+            var url = L.Util.template(this.url, coords);
22
+            this.ajaxRequest('GET', url, false, this.updateLayers.bind(this));
23
+            return tile;
24
+        },
25
+
26
+        ajaxRequest: function(method, url, data, callback) {
27
+            var request = new XMLHttpRequest();
28
+            request.open(method, url, true);
29
+            request.onreadystatechange = function() {
30
+                if (request.readyState === 4 && request.status === 200) {
31
+                    callback(JSON.parse(request.responseText));
32
+                }
33
+            };
34
+            if (data) {
35
+                request.setRequestHeader('Content-type', 'application/json');
36
+                request.send(JSON.stringify(data));
37
+            } else {
38
+                request.send();
39
+            }		
40
+            return request;
41
+        },
42
+
43
+        updateLayers: function(geoData) {
44
+            this.layer.clearLayers();
45
+            this.layer.addData(geoData);
46
+        },
47
+
48
+        onAdd(map) {
49
+            L.GridLayer.prototype.onAdd.call(this, map); 
50
+            map.addLayer(this.layer);
51
+            this.map = map;
52
+            //map.on('moveend zoomend refresh', this.reloadMap, this);
53
+            //this.reloadMap();
54
+        },
55
+
56
+        onRemove(map) {
57
+            //map.off('moveend zoomend refresh', this.reloadMap, this);
58
+            this.map = null;
59
+            map.removeLayer(this.layer)
60
+            L.GridLayer.prototype.onRemove.call(this, map);
61
+        },
62
+
63
+        ajaxRequest: function(method, url, data, callback) {
64
+            var request = new XMLHttpRequest();
65
+            request.open(method, url, true);
66
+            request.onreadystatechange = function() {
67
+                if (request.readyState === 4 && request.status === 200) {
68
+                    callback(JSON.parse(request.responseText));
69
+                }
70
+            };
71
+            if (data) {
72
+                request.setRequestHeader('Content-type', 'application/json');
73
+                request.send(JSON.stringify(data));
74
+            } else {
75
+                request.send();
76
+            }		
77
+            return request;
78
+        },
79
+
80
+    });
81
+
82
+    L.geoJSONTileLayer = function (options) {
83
+        return new L.GeoJSONTileLayer(options);
84
+    };
113 85
 
114 86
 }).call(this);

+ 5
- 5
examples/clients/leaflet/vanilla.html Voir le fichier

@@ -19,12 +19,12 @@
19 19
 <script>
20 20
 	var mymap = L.map('mapid').setView([20, 30], 3);
21 21
 
22
-	L.tileLayer('https://services.arcgisonline.com/ArcGIS/rest/services/World_Topo_Map/MapServer/tile/{z}/{y}/{x}', {
23
-	 	maxZoom: 18,
24
-	}).addTo(mymap);
22
+	//L.tileLayer('https://services.arcgisonline.com/ArcGIS/rest/services/World_Topo_Map/MapServer/tile/{z}/{y}/{x}', {
23
+	// 	maxZoom: 18,
24
+	//}).addTo(mymap);
25 25
 
26
-	//L.geoJSONLayer({
27
-	//	url: "http://localhost:8000/api.php/geojson/countries/1,2?bbox={bbox}",
26
+	//L.geoJSONLayer('http://localhost:8000/api.php/geojson/countries/1,2?bbox={bbox}', {
27
+	// 	maxZoom: 18,
28 28
 	//}).addTo(mymap);
29 29
 
30 30
 	L.geoJSONTileLayer('http://localhost:8000/api.php/geojson/countries/1,2?tile={z},{y},{x}', {

Loading…
Annuler
Enregistrer