http://pjgueno.000webhostapp.com/rajko/
Die Feinstaubkarte des OK Lab Stuttgart habe ich weiterentwickelt, damit man die 4 Werte des Sensors einblenden kann:
- PM10
- PM2.5
- Temperatur
- Feuchtigkeit
Zudem habe ich versucht, den Code leichter zu machen. Nur 5 Libraries werden nun geladen:
- Leaflet
- Leaflet.Heat (für die Dichte-Heatmap)
- Leaflet Realtime (für das automatische Updaten der Werte je 5 Minuten)
- D3
- D3-Hexbin
Es ist möglich, direkt auf der Karte ein Ort zu wählen und die Graphiken beim Klicken des Sensor-ID einzublenden.
Leider habe ich es nicht geschafft, Leaflet Heat zu modifizieren, damit sie nicht mehr die Dichte, sondern Mittelwerte der Sensor zeigt. Ich musste beim D3-Hexabin bleiben.
Natürlich bleibt das CSS viel zu verbessern. ich bin gar kein Front End Developer!
CSS
html { font-size: 14px; font-size: 87.5%; } body{ height: 100%; width: 100%; margin: 0; overflow: hidden;} #map { position:absolute; top:0px; left:0px; width: 100vw; height: 100vh; z-index: 0; } #control{ font-family: arial, sans-serif; color:black; font-size: 14px; position:absolute; top:10px; right:10px; width: 250px; height: 100%; background-color: rgba(238,238,238,0.6); } #boutons{ margin-bottom:15px; background:transparent; } #boutons2{ margin-bottom:15px; background:transparent; } #boutons3{ margin-bottom:15px; background:transparent; } #boutons4{ margin-bottom:15px; background:transparent; } button{ background:#CECECE; border-style: solid; border-radius: 5px; border-color:#303030; width: 80px; height: 40px; cursor:pointer; outline: none; } select{ background:rgba(255, 255, 255, 0.5); border: 0px; border-radius: 0px; } #results { background:transparent; margin-top:15px; margin-bottom:15px; max-height:200px; overflow-y: auto; } #graphs { background:transparent; margin-top:15px; margin-bottom:15px; height:210px; overflow-y: auto; overflow-x: hidden; } .legend { font-family: arial, sans-serif; color:black; font-size: 12px; position: fixed; left: 10px; bottom: 10px; height: 225px; width: 100px; z-index: 1000; background-color: rgba(238,238,238,0.6); } #legendpm{visibility: visible} #legendtemp{visibility: hidden} #legendhumi{visibility: hidden} #legend-inner-pm { position: fixed; left: 30px; bottom: 20px; z-index: 1001; pointer-events: none; height: 200px; display: -webkit-box; display: -ms-flexbox; display: flex; } #legend-inner-pm .gradient { opacity: 0.8; width: 20px; background: -webkit-linear-gradient(bottom, #00796b 0%, #00796b 16%, #f9a825 32%, #e65100 48%, #dd2c00 72%, #dd2c00 80%, #8c0084 100%); background: linear-gradient(to top, #00796b 0%, #00796b 16%, #f9a825 32%, #e65100 48%, #dd2c00 72%, #dd2c00 80%, #8c0084 100%); position: relative; } #legend-inner-pm .gradient .limit { height: 2px; width: 42px; background-color: #d50000; position: absolute; left: -10px; bottom: calc(40% - 1px); } #legend-inner-pm .labels { width: 150px; position: relative; } #legend-inner-pm .labels .label { position: absolute; -webkit-transform: translateY(50%); transform: translateY(50%); } #legend-inner-pm .labels .label:before { content: '\2013 '; } #legend-inner-pm .labels .label.limit { color: #d50000; } #legend-inner-temp { position: fixed; left: 30px; bottom: 20px; z-index: 1001; pointer-events: none; height: 200px; display: -webkit-box; display: -ms-flexbox; display: flex; } #legend-inner-temp .gradient { opacity: 0.8; width: 20px; background: -webkit-linear-gradient(bottom, #0022FE 0%, #FFFFFF 30%, #FF0000 100%); background: linear-gradient(to top, #0022FE 0%, #FFFFFF 30%, #FF0000 100%); position: relative; } #legend-inner-temp .labels { width: 150px; position: relative; } #legend-inner-temp .labels .label { position: absolute; -webkit-transform: translateY(50%); transform: translateY(50%); } #legend-inner-temp .labels .label:before { content: '\2013 '; } #legend-inner-humi { position: fixed; left: 30px; bottom: 20px; z-index: 1001; pointer-events: none; height: 200px; display: -webkit-box; display: -ms-flexbox; display: flex; } #legend-inner-humi .gradient { opacity: 0.8; width: 20px; background: -webkit-linear-gradient(bottom, #FFFFFF 0%, #0000FF 100%); background: linear-gradient(to top, #FFFFFF 0%, #0000FF 100%); position: relative; } #legend-inner-humi .labels { width: 150px; position: relative; } #legend-inner-humi .labels .label { position: absolute; -webkit-transform: translateY(50%); transform: translateY(50%); } #legend-inner-humi .labels .label:before { content: '\2013 '; } table{ font-family: arial, sans-serif; width: 100%; margin-right: 1rem; border: 1px solid #000; border-collapse: collapse; background:rgba(255, 255, 255, 1); } td{ background-color: #FFFFFF; height: 20px; text-align: right; padding-right: 5px; border-width: 0px 1px 0px 1px; border-style: solid; } th{ background-color: #FFFFFF; height: 20px; font-weight: bold; border: 1px solid #000; } .leaflet-pane > svg .d3-overlay path{ pointer-events: all;} .d3-tip{ font-family:monospace; font-size: 0.4rem; border-radius: 3px; background-color: $clr-blue-grey-900; color: $clr-grey-50; z-index:500; font-weight: 200; text-align: right;} img.leaflet-tile{ filter: grayscale(85%) saturate(150%) hue-rotate(60deg) contrast(90%) brightness(110%); -webkit-filter: grayscale(85%) saturate(150%) hue-rotate(60deg) contrast(90%) brightness(110%); } select{ background: #CECECE; border: 0px; border-radius: 0px; border-style: solid; border-radius: 5px; border-color:#303030; } select option { background:#CECECE; } .idsens{ cursor:pointer; } .hexbin-hexagon{ cursor:pointer; }
JAVASCRIPT
map.js
var map; var tiles; var heatmap; var hexagonheatmap; map = L.map('map').setView([48.8, 9.2 ], 12); map.options.minZoom = 3; var selector = "PM10"; var hmpoints; var hmpm10; var hmpm25; var hmtemp; var hmhumi; var hmempty = []; var hexahmtest = false; window.onload = function (){document.getElementById('PM10').style.backgroundColor = "#EE1010";}; //POUR LES PM var geoJsonDataPM = L.realtime(function(success, error) { var dataGeojson = {"type":"FeatureCollection","features":[]}; fetch('https://api.luftdaten.info/static/v2/data.dust.min.json') .then(function(response) { return response.json(); }) .then(function(data) { data.forEach(function(item){ var emptyFeature = {"type":"Feature","geometry":{"type":"Point","coordinates":[]},"properties":{"id":0,"PM10":"","PM25":""}}; emptyFeature.geometry.coordinates[0] = item.location.longitude; emptyFeature.geometry.coordinates[1] = item.location.latitude; emptyFeature.properties.id = item.sensor.id; emptyFeature.properties.PM10 = item.sensordatavalues[0].value; emptyFeature.properties.PM25 = item.sensordatavalues[1].value; dataGeojson.features.push(emptyFeature); }); console.log(dataGeojson); success(dataGeojson); }) .catch(error); }, { pointToLayer: function (feature, latlng) { return L.circleMarker(latlng, { radius:5, color: '#FFFFFF', weight: 1, opacity: 0, fillOpacity: 0})}, interval: 300000}).addTo(map); geoJsonDataPM.on('update', function(features) { console.log('Update Data PM'); if(selector == "hmpoints") { hmpoints = []; var dataKeys = Object.keys(features.features); dataKeys.forEach(function(item){ var featureData = features.features[item]; var datahm = [parseFloat(features.features[item].geometry.coordinates[1]),parseFloat(features.features[item].geometry.coordinates[0]),1]; hmpoints.push(datahm); heatmap.setLatLngs(hmpoints).setOptions({maxZoom:13,max:1.0,gradient: {.4:"blue",.6:"cyan",.7:"lime",.8:"yellow",1:"red"}}); }); geoJsonDataPM.eachLayer(function (layer) {layer.setStyle({opacity: 0, fillOpacity: 0});}); document.getElementById('legendtemp').style.visibility='hidden'; document.getElementById('legendhumi').style.visibility='hidden'; document.getElementById('legendpm').style.visibility='hidden'; if(hexahmtest == true){ var hmhexa = []; hexagonheatmap.data(hmhexa); hexagonheatmap._redraw(); }; }; // if(selector == "hmPM10"||selector == "hmPM2.5" ) { heatmap.setLatLngs(hmempty); document.getElementById('legendtemp').style.visibility='hidden'; document.getElementById('legendhumi').style.visibility='hidden'; document.getElementById('legendpm').style.visibility='visible'; var hmhexa = []; geoJsonDataPM.eachLayer(function (layer) { var objecthexa ={"data":{"PM10": parseInt(layer.feature.properties.PM10), "PM25":parseInt( layer.feature.properties.PM25)}, "id":layer.feature.properties.id,"latitude":layer.feature.geometry.coordinates[1],"longitude":layer.feature.geometry.coordinates[0]}; hmhexa.push(objecthexa); }); var options = { valueDomain: [20, 40, 60, 100, 500], colorRange: ['#00796B', '#F9A825', '#E65100', '#DD2C00', '#960084'] }; if(selector == "hmPM10"){ if(hexahmtest == false){ hexahmtest = true; hexagonheatmap = L.hexbinLayer(options).addTo(map); hexagonheatmap.data(hmhexa); }else{ hexagonheatmap.initialize(options); hexagonheatmap.data(hmhexa); hexagonheatmap._redraw(); }; }; if(selector == "hmPM2.5"){ if(hexahmtest == false){ hexahmtest = true; hexagonheatmap = L.hexbinLayer(options).addTo(map); hexagonheatmap.data(hmhexa); }else{ hexagonheatmap.initialize(options); hexagonheatmap.data(hmhexa); hexagonheatmap._redraw(); }; }; geoJsonDataPM.eachLayer(function (layer) {layer.setStyle({opacity: 0, fillOpacity: 0});}); heatmap.setLatLngs(hmempty); }; if(selector == "PM10" || selector == "PM2.5"||selector == "points" ) { document.getElementById('legendtemp').style.visibility='hidden'; document.getElementById('legendhumi').style.visibility='hidden'; document.getElementById('legendpm').style.visibility='visible'; geoJsonDataPM.eachLayer(function (layer) { if(selector == "PM10"){var valCol = layer.feature.properties.PM10;}; if(selector == "PM2.5"){var valCol = layer.feature.properties.PM25;}; if(selector == "points"){var valCol = "points";}; layer.setStyle({fillColor :colorpm(valCol),opacity: 1, fillOpacity: 1}); layer.on('click', function(e) { var htmlContent = "<table id='results'><tr><th class ='titre'>Sensor ID</th><th class = 'titre'>PM10 µg/m³</th><th class ='titre'>PM2.5 µg/m³</th></tr><tr><td class='idsens' onclick='showGraph("+layer.feature.properties.id+")'>"+layer.feature.properties.id+"</td><td class='val1'>"+parseInt(layer.feature.properties.PM10)+"</td><td class='val2'>"+parseInt(layer.feature.properties.PM25)+"</td></tr></table>"; document.getElementById('results').innerHTML = htmlContent; }); }); geoJsonDataPM.bringToFront(); heatmap.setLatLngs(hmempty); geoJsonDataTemp.eachLayer(function (layer) { layer.setStyle({opacity: 0, fillOpacity: 0})}); if(hexahmtest == true){ var hmhexa = []; hexagonheatmap.data(hmhexa); hexagonheatmap._redraw(); }; }; }); //POUR LES TEMP/HUMIs var geoJsonDataTemp = L.realtime(function(success, error) { var dataGeojson = {"type":"FeatureCollection","features":[]}; fetch('https://api.luftdaten.info/static/v2/data.temp.min.json') .then(function(response) { return response.json(); }) .then(function(data) { data.forEach(function(item){ var emptyFeature = {"type":"Feature","geometry":{"type":"Point","coordinates":[]},"properties":{"id":0,"Temp":"","Humi":""}}; emptyFeature.geometry.coordinates[0] = item.location.longitude; emptyFeature.geometry.coordinates[1] = item.location.latitude; emptyFeature.properties.id = item.sensor.id; emptyFeature.properties.Temp = item.sensordatavalues[1].value; emptyFeature.properties.Humi = item.sensordatavalues[0].value; dataGeojson.features.push(emptyFeature); }); console.log(dataGeojson); success(dataGeojson); }) .catch(error); }, { pointToLayer: function (feature, latlng) { return L.circleMarker(latlng, { radius:5, color: '#FFFFFF', weight: 1, opacity: 0, fillOpacity: 0})}, interval: 300000}).addTo(map); geoJsonDataTemp.on('update', function(features) { console.log('Update Data Temp/humi'); // ON PEUT RECUP LES DATA DIRECT DANS LES LAYERS ET NON DANS L'OBJECT FEATURES if(selector == "hmtemp" || selector == "hmhumi" ) { heatmap.setLatLngs(hmempty); var hmhexa = []; var dataKeys = Object.keys(features.features); dataKeys.forEach(function(item){ var featureData = features.features[item]; var objecthexa ={"data":{"Temp": features.features[item].properties.Temp , "Humi": features.features[item].properties.Humi}, "id":features.features[item].properties.id, "latitude":features.features[item].geometry.coordinates[1],"longitude":features.features[item].geometry.coordinates[0]}; hmhexa.push(objecthexa); }); if(selector == "hmtemp"){ document.getElementById('legendtemp').style.visibility='visible'; document.getElementById('legendhumi').style.visibility='hidden'; document.getElementById('legendpm').style.visibility='hidden'; var options = { valueDomain: [-20, 0, 50], colorRange: ['#0022FE', '#FFFFFF', '#FF0000'] }; if(hexahmtest == false){ hexahmtest = true; hexagonheatmap = L.hexbinLayer(options).addTo(map); hexagonheatmap.data(hmhexa); }else{ hexagonheatmap.initialize(options); hexagonheatmap.data(hmhexa); hexagonheatmap._redraw(); }; }; if(selector == "hmhumi"){ document.getElementById('legendtemp').style.visibility='hidden'; document.getElementById('legendhumi').style.visibility='visible'; document.getElementById('legendpm').style.visibility='hidden'; var options = { valueDomain: [0,100], colorRange: ['#FFFFFF', '#0000FF'] }; if(hexahmtest == false){ hexahmtest = true; hexagonheatmap = L.hexbinLayer(options).addTo(map); hexagonheatmap.data(hmhexa); }else{ hexagonheatmap.initialize(options); hexagonheatmap.data(hmhexa); hexagonheatmap._redraw(); }; }; geoJsonDataTemp.eachLayer(function (layer) { layer.setStyle({opacity: 0, fillOpacity: 0}); }); }; if(selector == "temp" || selector == "humi") { geoJsonDataTemp.eachLayer(function (layer) { if(selector == "temp"){var valCol = layer.feature.properties.Temp; layer.setStyle({fillColor :colortemp(valCol),opacity: 1, fillOpacity: 1}); document.getElementById('legendtemp').style.visibility='visible'; document.getElementById('legendhumi').style.visibility='hidden'; document.getElementById('legendpm').style.visibility='hidden'; }; if(selector == "humi"){var valCol = layer.feature.properties.Humi; layer.setStyle({fillColor :colorhumi(valCol),opacity: 1, fillOpacity: 1}); document.getElementById('legendtemp').style.visibility='hidden'; document.getElementById('legendhumi').style.visibility='visible'; document.getElementById('legendpm').style.visibility='hidden'; }; layer.on('click', function(e) { var htmlContent = "<table id='results'><tr><th class ='titre'>Sensor ID</th><th class = 'titre'>Temperatur °</th><th class ='titre'>Humidity %</th></tr><tr><td class='idsens'>"+layer.feature.properties.id+"</td><td class='val1'>"+parseInt(layer.feature.properties.Temp)+"</td><td class='val2'>"+parseInt(layer.feature.properties.Humi)+"</td></tr></table>"; // VOIR SI POSSIBLE GRAPH POUR TEMP ET HUMI // <img src='https://api.luftdaten.info/grafana/render/dashboard-solo/db/single-sensor-view?panelId=1&orgId=1&width=300&height=200&tz=UTC%2B02%3A00&var-node="+layer.feature.properties.id+"'><br><br><img src='https://api.luftdaten.info/grafana/render/dashboard-solo/db/single-sensor-view?orgId=1&panelId=2&width=300&height=200&tz=UTC%2B02%3A00&var-node="+layer.feature.properties.id+"'>"; document.getElementById('results').innerHTML = htmlContent; }); }); geoJsonDataTemp.bringToFront(); heatmap.setLatLngs(hmempty); geoJsonDataPM.eachLayer(function (layer) { layer.setStyle({opacity: 0, fillOpacity: 0})}); if(hexahmtest == true){ var hmhexa = []; hexagonheatmap.data(hmhexa); hexagonheatmap._redraw(); }; }else{geoJsonDataTemp.bringToBack();};}); tiles = L.tileLayer('https://{s}.tiles.madavi.de/{z}/{x}/{y}.png',{ attribution: 'Map data © <a href="https://openstreetmap.org">OpenStreetMap</a> contributors', maxZoom: 18}).addTo(map); heatmap = L.heatLayer(hmempty, {radius: 25}).addTo(map); map.on('zoomend', function() { if(hexahmtest == true){hexagonheatmap._zoomChange();}; }); function showGraph(sensor){ console.log(sensor); var graph = "<img src='https://api.luftdaten.info/grafana/render/dashboard-solo/db/single-sensor-view?panelId=1&orgId=1&width=250&height=200&tz=UTC%2B02%3A00&var-node="+sensor+"'><br><br><img src='https://api.luftdaten.info/grafana/render/dashboard-solo/db/single-sensor-view?orgId=1&panelId=2&width=250&height=200&tz=UTC%2B02%3A00&var-node="+sensor+"'>"; document.getElementById('graphs').innerHTML = graph; }; function interpolColor(a, b, amount) { var ah = parseInt(a.replace(/#/g, ''), 16), ar = ah >> 16, ag = ah >> 8 & 0xff, ab = ah & 0xff, bh = parseInt(b.replace(/#/g, ''), 16), br = bh >> 16, bg = bh >> 8 & 0xff, bb = bh & 0xff, rr = ar + amount * (br - ar), rg = ag + amount * (bg - ag), rb = ab + amount * (bb - ab); return '#' + ((1 << 24) + (rr << 16) + (rg << 8) + rb | 0).toString(16).slice(1); }; function colorpm(val){ if(val == "points"){ return "#000000"; }else{ var col= parseInt(val); if(val>= 0 && val < 25){ return "#00796b";}; if(val>= 25 && val < 50){ var couleur = interpolColor('#00796b','#f9a825',(col-25)/25); return couleur; }; if(val>= 50 && val < 75){ var couleur = interpolColor('#f9a825','#e65100',(col-50)/25); return couleur; }; if(val>= 75 && val < 100){ var couleur = interpolColor('#e65100','#dd2c00',(col-75)/25); return couleur; }; if(val>=100 && val < 500){ var couleur = interpolColor('#dd2c00','#8c0084',(col-100)/400); return couleur; }; if(val>=100 && val < 500){ return "#8c0084";}; }; }; function colortemp(val){ var col= parseInt(val); if(val< -20){ return "#0000FF";}; if(val>= -20 && val < 0){ var couleur = interpolColor('#0000FF','#FFFFFF',(col)/(20)); return couleur; }; if(val>= 0 && val < 50){ var couleur = interpolColor('#FEFEFE','#FF0000',(col-50)/50); return couleur; }; if(val>= 50 ){return "#FF0000";}; }; function colorhumi(val){ var col= parseInt(val); if(val< 0){ return "#FFFFFF";}; if(val>= 0 && val < 100){ var couleur = interpolColor('#FFFFFF','#0000FF',(col-100)/100); return couleur; }; if(val>= 100){return "#FFFFFF";}; }; function reloadStyle(val){ selector = val; console.log(selector); document.getElementById('points').style.backgroundColor = "#CECECE"; document.getElementById('PM10').style.backgroundColor = "#CECECE"; document.getElementById('PM2.5').style.backgroundColor = "#CECECE"; document.getElementById('hmpoints').style.backgroundColor = "#CECECE"; document.getElementById('hmPM10').style.backgroundColor = "#CECECE"; document.getElementById('hmPM2.5').style.backgroundColor = "#CECECE"; document.getElementById('temp').style.backgroundColor = "#CECECE"; document.getElementById('humi').style.backgroundColor = "#CECECE"; document.getElementById('hmtemp').style.backgroundColor = "#CECECE"; document.getElementById('hmhumi').style.backgroundColor = "#CECECE"; document.getElementById(val).style.backgroundColor = "#EE1010"; geoJsonDataPM.update(); geoJsonDataTemp.update(); document.getElementById('graphs').innerHTML = ""; document.getElementById('results').innerHTML = ""; }; function centerMap(val){ var getOptions = window[val]; map.setView(new L.LatLng(getOptions.coordinates[0], getOptions.coordinates[1]), getOptions.zoom); if(hexahmtest == true){hexagonheatmap._zoomChange();}; };
hexbin.js
L.HexbinLayer = L.Layer.extend({ _undef (a) { return typeof a === 'undefined' }, options: { radius: 25, opacity: 0.6, duration: 200, onmouseover: undefined, onmouseout: undefined, click: populateTable, lng: function (d) { return d.longitude }, lat: function (d) { return d.latitude }, value: function (d) { if (selector == "hmPM10"){return d3.mean(d, (o) => o.o.data.PM10)} if (selector == "hmPM2.5"){return d3.mean(d, (o) => o.o.data.PM25)} if (selector == "hmtemp"){return d3.mean(d, (o) => o.o.data.Temp)} if (selector == "hmhumi"){return d3.mean(d, (o) => o.o.data.Humi)} } }, initialize (options) { L.setOptions(this, options) this._data = [] this._colorScale = d3.scaleLinear() .domain(this.options.valueDomain) .range(this.options.colorRange) .clamp(true) }, onAdd (map) { this.map = map let _layer = this // SVG element this._svg = L.svg() map.addLayer(this._svg) this._rootGroup = d3.select(this._svg._rootGroup).classed('d3-overlay', true) this.selection = this._rootGroup // Init shift/scale invariance helper values this._pixelOrigin = map.getPixelOrigin() this._wgsOrigin = L.latLng([0, 0]) this._wgsInitialShift = this.map.latLngToLayerPoint(this._wgsOrigin) this._zoom = this.map.getZoom() this._shift = L.point(0, 0) this._scale = 1 // Create projection object this.projection = { latLngToLayerPoint: function (latLng, zoom) { zoom = _layer._undef(zoom) ? _layer._zoom : zoom let projectedPoint = _layer.map.project(L.latLng(latLng), zoom)._round() return projectedPoint._subtract(_layer._pixelOrigin) }, layerPointToLatLng: function (point, zoom) { zoom = _layer._undef(zoom) ? _layer._zoom : zoom let projectedPoint = L.point(point).add(_layer._pixelOrigin) return _layer.map.unproject(projectedPoint, zoom) }, unitsPerMeter: 256 * Math.pow(2, _layer._zoom) / 40075017, map: _layer.map, layer: _layer, scale: 1 } this.projection._projectPoint = function (x, y) { let point = _layer.projection.latLngToLayerPoint(new L.LatLng(y, x)) this.stream.point(point.x, point.y) } this.projection.pathFromGeojson = d3.geoPath().projection(d3.geoTransform({point: this.projection._projectPoint})) // Compatibility with v.1 this.projection.latLngToLayerFloatPoint = this.projection.latLngToLayerPoint this.projection.getZoom = this.map.getZoom.bind(this.map) this.projection.getBounds = this.map.getBounds.bind(this.map) this.selection = this._rootGroup // ??? // Initial draw this.draw() }, onRemove (map) { if (this._container != null) this._container.remove() // Remove events map.off({'moveend': this._redraw}, this) this._container = null this._map = null // Explicitly will leave the data array alone in case the layer will be shown again // this._data = []; }, addTo (map) { map.addLayer(this) return this }, _disableLeafletRounding () { this._leaflet_round = L.Point.prototype._round L.Point.prototype._round = function () { return this } }, _enableLeafletRounding () { L.Point.prototype._round = this._leaflet_round }, draw () { this._disableLeafletRounding() this._redraw(this.selection, this.projection, this.map.getZoom()) this._enableLeafletRounding() }, getEvents: function () { return {zoomend: this._zoomChange} }, _zoomChange: function () { let mapZoom = map.getZoom() let MapCenter = map.getCenter() this._disableLeafletRounding() let newZoom = this._undef(mapZoom) ? this.map._zoom : mapZoom this._zoomDiff = newZoom - this._zoom this._scale = Math.pow(2, this._zoomDiff) this.projection.scale = this._scale this._shift = this.map.latLngToLayerPoint(this._wgsOrigin) ._subtract(this._wgsInitialShift.multiplyBy(this._scale)) let shift = ["translate(", this._shift.x, ",", this._shift.y, ") "] let scale = ["scale(", this._scale, ",", this._scale,") "] this._rootGroup.attr("transform", shift.concat(scale).join("")) this.draw() this._enableLeafletRounding() }, _redraw(selection, projection, zoom){ // Generate the mapped version of the data let data = this._data.map( (d) => { let lng = this.options.lng(d) let lat = this.options.lat(d) let point = projection.latLngToLayerPoint([lat, lng]) return { o: d, point: point } }); // Select the hex group for the current zoom level. This has // the effect of recreating the group if the zoom level has changed let join = selection.selectAll('g.hexbin') .data([zoom], (d) => d) // enter join.enter().append('g') .attr('class', (d) => 'hexbin zoom-' + d) // exit join.exit().remove() // add the hexagons to the select this._createHexagons(join, data, projection) }, _createHexagons(g, data, projection) { // Create the bins using the hexbin layout let hexbin = d3.hexbin() .radius(this.options.radius / projection.scale) .x( (d) => d.point.x ) .y( (d) => d.point.y ) let bins = hexbin(data) // console.log(bins) // Join - Join the Hexagons to the data let join = g.selectAll('path.hexbin-hexagon') .data(bins) // Update - set the fill and opacity on a transition (opacity is re-applied in case the enter transition was cancelled) join.transition().duration(this.options.duration) .attr('fill', (d) => this._colorScale(this.options.value(d))) .attr('fill-opacity', this.options.opacity) .attr('stroke-opacity', this.options.opacity) // Enter - establish the path, the fill, and the initial opacity join.enter().append('path').attr('class', 'hexbin-hexagon') .attr('d', (d) => 'M' + d.x + ',' + d.y + hexbin.hexagon()) .attr('fill', (d) => this._colorScale(this.options.value(d))) .attr('fill-opacity', 0.01) .attr('stroke-opacity', 0.01) .on('mouseover', this.options.mouseover) .on('mouseout', this.options.mouseout) .on('click', this.options.click) .transition().duration(this.options.duration) .attr('fill-opacity', this.options.opacity) .attr('stroke-opacity', this.options.opacity) // Exit join.exit().transition().duration(this.options.duration) .attr('fill-opacity', 0.01) .attr('stroke-opacity', 0.01) .remove() }, data (data) { this._data = (data != null) ? data : [] this.draw() return this } }); L.hexbinLayer = function(options) { return new L.HexbinLayer(options); }; function populateTable(data){ // console.log(data); if(selector == "hmPM10"||selector == "hmPM2.5"){ var debut = "<table id='results'><tr><th class ='titre'>Sensor ID</th><th class ='titre'>PM10 µg/m³</th><th class ='titre'>PM2.5 µg/m³</th></tr><tr><td class='idsens'>Mean</td><td class='val1'>"; var tabsensor = ""; var tabfin = ""; var meanPM10; var meanPM25; data.forEach(function(element){ stop += 1; var newline = "<tr><td class='idsens' onclick='showGraph("+element.o.id+")'>"+element.o.id+"</td><td class='val1'>"+element.o.data.PM10+"</td><td class='val2'>"+element.o.data.PM10+"</td></tr>"; tabsensor += newline; }); meanPM10 = d3.mean(data, (o) => o.o.data.PM10); meanPM25 = d3.mean(data, (o) => o.o.data.PM25); tabfin = debut + parseInt(meanPM10) + "</td><td class='val2'>" + parseInt(meanPM25) + "</td></tr>" + tabsensor + "</table>"; document.getElementById('results').innerHTML = tabfin; }; if (selector == "hmtemp" || selector == "hmhumi" ){ var debut = "<table id='results'><tr><th class ='titre'>Sensor ID</th><th class ='titre'>Temperatur °</th><th class ='titre'>Humidity %</th></tr><tr><td class='idsens'>Mean</td><td class='val1'>"; var tabsensor = ""; var tabfin = ""; var meanTemp; var meanHumi; data.forEach(function(element){ stop += 1; var newline = "<tr><td class='idsens'>"+element.o.id+"</td><td class='val1'>"+parseInt(element.o.data.Temp)+"</td><td class='val2'>"+parseInt(element.o.data.Humi)+"</td></tr>"; tabsensor += newline; }); meanTemp = d3.mean(data, (o) => o.o.data.Temp); meanHumi = d3.mean(data, (o) => o.o.data.Humi); tabfin = debut + parseInt(meanTemp) + "</td><td class='val2'>" + parseInt(meanHumi) + "</td></tr>" + tabsensor + "</table>"; document.getElementById('results').innerHTML = tabfin; }; };
position.js
var world = {"coordinates":[0,0],"zoom":"2"}; var europe = {"coordinates":[57.5,22],"zoom":"4"}; var chile = {"coordinates":[38,71],"zoom":"4"}; var usa = {"coordinates":[0,100],"zoom":"4"}; var finland = {"coordinates":[65,26],"zoom":"5"}; var thailand = {"coordinates":[15.4,101.3],"zoom":"5"}; var unitedkingdom = {"coordinates":[55,4],"zoom":"5"}; var deutschland = {"coordinates":[51.165,10.4553],"zoom":"6"}; var france = {"coordinates":[46.3167,2.5333],"zoom":"6"}; var germany = {"coordinates":[51.165,10.4553],"zoom":"6"}; var greece = {"coordinates":[39,22],"zoom":"6"}; var italy = {"coordinates":[42,12],"zoom":"6"}; var poland = {"coordinates":[52.1469,19.3781],"zoom":"6"}; var ukraine = {"coordinates":[49,32],"zoom":"6"}; var vietnam = {"coordinates":[16,107],"zoom":"6"}; var austria = {"coordinates":[47.6,13.7833],"zoom":"7"}; var bayern = {"coordinates":[48.949,11.395],"zoom":"7"}; var brandenburg = {"coordinates":[52.3622,13.0078],"zoom":"7"}; var bulgaria = {"coordinates":[42.65,25.4],"zoom":"7"}; var denmark = {"coordinates":[56,11],"zoom":"7"}; var hungary = {"coordinates":[47,20],"zoom":"7"}; var ireland = {"coordinates":[53.1333,8.1167],"zoom":"7"}; var nepal = {"coordinates":[28.25,83.9167],"zoom":"7"}; var oesterreich = {"coordinates":[47.6,13.7833],"zoom":"7"}; var romania = {"coordinates":[46,25],"zoom":"7"}; var serbia = {"coordinates":[44,21],"zoom":"7"}; var uae = {"coordinates":[24,54],"zoom":"7"}; var unitedarabemirates = {"coordinates":[24,54],"zoom":"7"}; var alsace = {"coordinates":[48.24905,7.52806],"zoom":"8"}; var badhomburg = {"coordinates":[50.2292,8.6105],"zoom":"8"}; var czechrepublic = {"coordinates":[49.8,15.5],"zoom":"8"}; var dominicanrepublic = {"coordinates":[19,70.6667],"zoom":"8"}; var mecklenburgvorpommern = {"coordinates":[53.6121,12.7002],"zoom":"8"}; var netherlands = {"coordinates":[51.6,5.5667],"zoom":"8"}; var niedersachsen = {"coordinates":[52.7562,9.3933],"zoom":"8"}; var nordrheinwestfalen = {"coordinates":[51.4783,7.555],"zoom":"8"}; var rheinlandpfalz = {"coordinates":[49.9131,7.4497],"zoom":"8"}; var sachsenanhalt = {"coordinates":[51.9713,11.4697],"zoom":"8"}; var schleswigholstein = {"coordinates":[54.47,9.5142],"zoom":"8"}; var schweiz = {"coordinates":[46.8,8.2333],"zoom":"8"}; var sicily = {"coordinates":[37.5667,14.2667],"zoom":"8"}; var suisse = {"coordinates":[46.8,8.2333],"zoom":"8"}; var thueringen = {"coordinates":[50.8614,11.0522],"zoom":"8"}; var brunei = {"coordinates":[4.6,114.7],"zoom":"9"}; var ruhrgebiet = {"coordinates":[51.5175,7.145],"zoom":"9"}; var sachsen = {"coordinates":[51.0493,13.7381],"zoom":"9"}; var dubai = {"coordinates":[25.2667,55.3],"zoom":"10"}; var london = {"coordinates":[51.5072,0.1275],"zoom":"10"}; var saarland = {"coordinates":[49.3833,6.8333],"zoom":"10"}; var santiago = {"coordinates":[33.46,70.6],"zoom":"10"}; var sofia = {"coordinates":[42.6972,23.3233],"zoom":"12"}; var aachen = {"coordinates":[50.777,6.0836],"zoom":"12"}; var aalen = {"coordinates":[48.8372,10.0936],"zoom":"12"}; var ahlen = {"coordinates":[51.7633,7.8911],"zoom":"12"}; var arnsberg = {"coordinates":[51.3967,8.0647],"zoom":"12"}; var aschaffenburg = {"coordinates":[49.9767,9.1477],"zoom":"12"}; var athens = {"coordinates":[37.9840,23.7278],"zoom":"12"}; var augsburg = {"coordinates":[48.3585,10.8944],"zoom":"12"}; var badkreuznach = {"coordinates":[49.8469,7.8669],"zoom":"12"}; var badoeynhausen = {"coordinates":[52.2,8.8],"zoom":"12"}; var badsalzuflen = {"coordinates":[52.0875,8.7506],"zoom":"12"}; var badenbaden = {"coordinates":[48.76194,8.2408],"zoom":"12"}; var badenwuerttemberg = {"coordinates":[48.53,9.05],"zoom":"12"}; var bamberg = {"coordinates":[49.8917,10.8917],"zoom":"12"}; var basel = {"coordinates":[47.5581,7.5877],"zoom":"12"}; var bayreuth = {"coordinates":[49.9481,11.5783],"zoom":"12"}; var belgium = {"coordinates":[50.8,4],"zoom":"12"}; var belgrade = {"coordinates":[44.8167,20.4667],"zoom":"12"}; var bergheim = {"coordinates":[50.9667,6.65],"zoom":"12"}; var bergischgladbach = {"coordinates":[50.9917,7.136],"zoom":"12"}; var berlin = {"coordinates":[52.5167,13.3833],"zoom":"12"}; var bern = {"coordinates":[46.948,7.4474],"zoom":"12"}; var biel = {"coordinates":[47.1368,7.2467],"zoom":"12"}; var bielefeld = {"coordinates":[52.0167,8.5167],"zoom":"12"}; var bocholt = {"coordinates":[51.8367,6.6108],"zoom":"12"}; var bochum = {"coordinates":[51.4825,7.2169],"zoom":"12"}; var boeblingen = {"coordinates":[48.6851,9.009],"zoom":"12"}; var boeblingen = {"coordinates":[48.6856,9.0153],"zoom":"12"}; var bologna = {"coordinates":[44.4939,11.3428],"zoom":"12"}; var bonn = {"coordinates":[50.734,7.0998],"zoom":"12"}; var bottrop = {"coordinates":[51.5247,6.9228],"zoom":"12"}; var brandenburganderhavel = {"coordinates":[52.4089,12.5631],"zoom":"12"}; var braunschweig = {"coordinates":[52.2692,10.5211],"zoom":"12"}; var bremen = {"coordinates":[53.0769,8.8089],"zoom":"12"}; var bremerhaven = {"coordinates":[53.5419,8.5780],"zoom":"12"}; var bristol = {"coordinates":[51.45,2.5833],"zoom":"12"}; var brussels = {"coordinates":[50.833333,4.4],"zoom":"12"}; var bucharest = {"coordinates":[44.4167,26.1],"zoom":"12"}; var budapest = {"coordinates":[47.5,19.05],"zoom":"12"}; var burgas = {"coordinates":[42.4953,27.4717],"zoom":"12"}; var castroprauxel = {"coordinates":[51.55,7.3167],"zoom":"12"}; var celle = {"coordinates":[52.6261,10.0806],"zoom":"12"}; var chemnitz = {"coordinates":[50.8322,12.9242],"zoom":"12"}; var cottbus = {"coordinates":[51.76056,14.3342],"zoom":"12"}; var cuxhaven = {"coordinates":[53.8617,8.6941],"zoom":"12"}; var darmstadt = {"coordinates":[49.8667,8.65],"zoom":"12"}; var delmenhorst = {"coordinates":[53.0497,8.6339],"zoom":"12"}; var dessaurosslau = {"coordinates":[51.8606,12.2469],"zoom":"12"}; var detmold = {"coordinates":[51.9333,8.8833],"zoom":"12"}; var dimitrovgrad = {"coordinates":[42.05,25.6],"zoom":"12"}; var dinslaken = {"coordinates":[51.5667,6.7333],"zoom":"12"}; var dormagen = {"coordinates":[51.0933,6.8419],"zoom":"12"}; var dorsten = {"coordinates":[51.6604,6.96465],"zoom":"12"}; var dortmund = {"coordinates":[51.5142,7.46389],"zoom":"12"}; var dresden = {"coordinates":[51.0517,13.7310],"zoom":"12"}; var dublin = {"coordinates":[53.3425,6.2658],"zoom":"12"}; var dueren = {"coordinates":[50.8,6.4833],"zoom":"12"}; var duesseldorf = {"coordinates":[51.2256,6.7828],"zoom":"12"}; var duisburg = {"coordinates":[51.4351,6.7627],"zoom":"12"}; var elmshorn = {"coordinates":[53.7547,9.6536],"zoom":"12"}; var emden = {"coordinates":[53.3669,7.2056],"zoom":"12"}; var erftstadt = {"coordinates":[50.8092,6.7758],"zoom":"12"}; var erfurt = {"coordinates":[50.9781,11.0292],"zoom":"12"}; var erlangen = {"coordinates":[49.5964,11.0043],"zoom":"12"}; var eschweiler = {"coordinates":[50.8208,6.2631],"zoom":"12"}; var essen = {"coordinates":[51.4581,7.0148],"zoom":"12"}; var esslingen = {"coordinates":[48.7406,9.3108],"zoom":"12"}; var euskirchen = {"coordinates":[50.6608,6.7858],"zoom":"12"}; var flensburg = {"coordinates":[54.7819,9.4367],"zoom":"12"}; var florence = {"coordinates":[43.7833,11.25],"zoom":"12"}; var frankenthal = {"coordinates":[49.5333,8.35],"zoom":"12"}; var frankfurt = {"coordinates":[50.1106,8.6822],"zoom":"12"}; var frankfurtoder = {"coordinates":[52.3417,14.5508],"zoom":"12"}; var frechen = {"coordinates":[50.9133,6.8139],"zoom":"12"}; var freiburg = {"coordinates":[47.9900,7.8200],"zoom":"12"}; var friedrichshafen = {"coordinates":[47.6542,9.4792],"zoom":"12"}; var fuerth = {"coordinates":[49.4783,10.9903],"zoom":"12"}; var fulda = {"coordinates":[50.552777777778,9.6775],"zoom":"12"}; var garbsen = {"coordinates":[52.4183,9.5981],"zoom":"12"}; var gelsenkirchen = {"coordinates":[51.5111,7.1006],"zoom":"12"}; var genf = {"coordinates":[46.2,6.15],"zoom":"12"}; var gera = {"coordinates":[50.8806,12.0833],"zoom":"12"}; var giessen = {"coordinates":[50.5872,8.6697],"zoom":"12"}; var gladbeck = {"coordinates":[51.573333333333,6.9925],"zoom":"12"}; var goeppingen = {"coordinates":[48.7025,9.6528],"zoom":"12"}; var goerlitz = {"coordinates":[51.1528,14.9872],"zoom":"12"}; var goettingen = {"coordinates":[51.5339,9.9356],"zoom":"12"}; var goslar = {"coordinates":[51.9072,10.43],"zoom":"12"}; var graz = {"coordinates":[47.0667,15.4333],"zoom":"12"}; var greifswald = {"coordinates":[54.096,13.3811],"zoom":"12"}; var greiz = {"coordinates":[50.6536,12.1884],"zoom":"12"}; var grenoble = {"coordinates":[45.2002,5.7222],"zoom":"12"}; var grevenbroich = {"coordinates":[51.0883,6.5875],"zoom":"12"}; var guetersloh = {"coordinates":[51.9,8.3833],"zoom":"12"}; var gummersbach = {"coordinates":[51.0269,7.5678],"zoom":"12"}; var hagen = {"coordinates":[51.3594,7.475],"zoom":"12"}; var halle = {"coordinates":[51.4828,11.97],"zoom":"12"}; var hamburg = {"coordinates":[53.5464,9.9841],"zoom":"12"}; var hameln = {"coordinates":[52.1031,9.36],"zoom":"12"}; var hamm = {"coordinates":[51.6811,7.817117],"zoom":"12"}; var hanau = {"coordinates":[50.1333,8.9167],"zoom":"12"}; var hannover = {"coordinates":[52.3744,9.7386],"zoom":"12"}; var hanoi = {"coordinates":[21.0333,105.85],"zoom":"12"}; var haskovo = {"coordinates":[41.9333,25.5667],"zoom":"12"}; var hattingen = {"coordinates":[51.4011,7.1848],"zoom":"12"}; var heidelberg = {"coordinates":[49.4122,8.71],"zoom":"12"}; var heidenheim = {"coordinates":[48.6761,10.1544],"zoom":"12"}; var heilbronn = {"coordinates":[49.1417,9.2222],"zoom":"12"}; var helsinki = {"coordinates":[60.1667,24.9333],"zoom":"12"}; var herford = {"coordinates":[52.1172,8.6761],"zoom":"12"}; var herne = {"coordinates":[51.5419,7.2239],"zoom":"12"}; var herten = {"coordinates":[51.6,7.1333],"zoom":"12"}; var hessen = {"coordinates":[50.5995,9.0249],"zoom":"12"}; var hilden = {"coordinates":[51.1714,6.9394],"zoom":"12"}; var hildesheim = {"coordinates":[52.15,9.95],"zoom":"12"}; var huerth = {"coordinates":[50.8694,6.8653],"zoom":"12"}; var ibbenbueren = {"coordinates":[52.2778,7.7167],"zoom":"12"}; var ingolstadt = {"coordinates":[48.7656,11.4244],"zoom":"12"}; var innsbruck = {"coordinates":[47.2672,11.3928],"zoom":"12"}; var iserlohn = {"coordinates":[51.3811,7.6956],"zoom":"12"}; var jena = {"coordinates":[50.9272,11.5864],"zoom":"12"}; var kaiserslautern = {"coordinates":[49.4447,7.7689],"zoom":"12"}; var kardzhali = {"coordinates":[41.65,25.3667],"zoom":"12"}; var karlsruhe = {"coordinates":[49.014,8.4043],"zoom":"12"}; var kassel = {"coordinates":[51.3167,9.5],"zoom":"12"}; var kathmandu = {"coordinates":[27.7,85.3167],"zoom":"12"}; var kempten = {"coordinates":[47.7333,10.3167],"zoom":"12"}; var kerpen = {"coordinates":[50.8719,6.6961],"zoom":"12"}; var kiel = {"coordinates":[54.3253,10.1406],"zoom":"12"}; var kiev = {"coordinates":[50.43,30.5233],"zoom":"12"}; var kleve = {"coordinates":[51.7875,6.1353],"zoom":"12"}; var koblenz = {"coordinates":[50.3567,7.5939],"zoom":"12"}; var koeln = {"coordinates":[50.9381,6.9569],"zoom":"12"}; var konstanz = {"coordinates":[47.6633,9.1753],"zoom":"12"}; var krefeld = {"coordinates":[51.3369,6.5642],"zoom":"12"}; var landshut = {"coordinates":[48.5372,12.1522],"zoom":"12"}; var langenfeld = {"coordinates":[51.1131,6.9522],"zoom":"12"}; var langenhagen = {"coordinates":[52.4394,9.74],"zoom":"12"}; var lausanne = {"coordinates":[46.5194,6.6345],"zoom":"12"}; var leipzig = {"coordinates":[51.3403,12.37475],"zoom":"12"}; var leverkusen = {"coordinates":[51.0333,6.9833],"zoom":"12"}; var lingen = {"coordinates":[52.5233,7.3172],"zoom":"12"}; var linz = {"coordinates":[48.3031,14.2906],"zoom":"12"}; var lippstadt = {"coordinates":[51.6667,8.35],"zoom":"12"}; var loerrach = {"coordinates":[47.6156,7.6614],"zoom":"12"}; var ludwigsburg = {"coordinates":[48.8975,9.1922],"zoom":"12"}; var ludwigshafen = {"coordinates":[49.4831,8.4478],"zoom":"12"}; var luebeck = {"coordinates":[53.8661,10.6839],"zoom":"12"}; var luedenscheid = {"coordinates":[51.2183,7.6297],"zoom":"12"}; var lueneburg = {"coordinates":[53.2525,10.4144],"zoom":"12"}; var luenen = {"coordinates":[51.6167,7.5167],"zoom":"12"}; var lugano = {"coordinates":[46.008,8.9557],"zoom":"12"}; var luzern = {"coordinates":[47.0521,8.3059],"zoom":"12"}; var lviv = {"coordinates":[49.83,24.0142],"zoom":"12"}; var magdeburg = {"coordinates":[52.1333,11.6167],"zoom":"12"}; var mainz = {"coordinates":[50,8.2711],"zoom":"12"}; var mannheim = {"coordinates":[49.4836,8.4631],"zoom":"12"}; var marburg = {"coordinates":[50.8075,8.7722],"zoom":"12"}; var marl = {"coordinates":[51.6539,7.0858],"zoom":"12"}; var meerbusch = {"coordinates":[51.2608,6.6778],"zoom":"12"}; var menden = {"coordinates":[51.4392,7.7953],"zoom":"12"}; var minden = {"coordinates":[52.2833,8.9167],"zoom":"12"}; var moenchengladbach = {"coordinates":[51.1911,6.4419],"zoom":"12"}; var moers = {"coordinates":[51.4517,6.6264],"zoom":"12"}; var montana = {"coordinates":[43.4125,23.225],"zoom":"12"}; var muelheimanderruhr = {"coordinates":[51.4331,6.8831],"zoom":"12"}; var muenchen = {"coordinates":[48.1400,11.5600],"zoom":"12"}; var muenster = {"coordinates":[51.9502,7.5911],"zoom":"12"}; var neuulm = {"coordinates":[48.3942,9.9989],"zoom":"12"}; var neubrandenburg = {"coordinates":[53.557,13.261],"zoom":"12"}; var neumuenster = {"coordinates":[54.0714,9.99],"zoom":"12"}; var neuss = {"coordinates":[51.1986,6.6914],"zoom":"12"}; var neustadtanderweinstrasse = {"coordinates":[49.35,8.15],"zoom":"12"}; var neuwied = {"coordinates":[50.4286,7.4614],"zoom":"12"}; var norderstedt = {"coordinates":[53.6956,9.9836],"zoom":"12"}; var nordhorn = {"coordinates":[52.4361,7.0706],"zoom":"12"}; var nuernberg = {"coordinates":[49.4556,11.0786],"zoom":"12"}; var oberhausen = {"coordinates":[51.4703,6.8522],"zoom":"12"}; var offenbach = {"coordinates":[50.0994,8.7708],"zoom":"12"}; var offenburg = {"coordinates":[48.4708,7.9408],"zoom":"12"}; var oldenburg = {"coordinates":[53.1439,8.2139],"zoom":"12"}; var osnabrueck = {"coordinates":[52.2789,8.0431],"zoom":"12"}; var paderborn = {"coordinates":[51.7231,8.7549],"zoom":"12"}; var palermo = {"coordinates":[38.1158,13.3614],"zoom":"12"}; var paris = {"coordinates":[48.8567,2.3517],"zoom":"12"}; var passau = {"coordinates":[48.5733,13.4569],"zoom":"12"}; var peine = {"coordinates":[52.3203,10.2336],"zoom":"12"}; var pernik = {"coordinates":[42.6,23.0333],"zoom":"12"}; var pforzheim = {"coordinates":[48.8911,8.6989],"zoom":"12"}; var plauen = {"coordinates":[50.495,12.1383],"zoom":"12"}; var pleven = {"coordinates":[43.42,24.62],"zoom":"12"}; var plovdiv = {"coordinates":[42.15,24.75],"zoom":"12"}; var portland = {"coordinates":[45.52,122.6819],"zoom":"12"}; var potsdam = {"coordinates":[52.3958,13.0614],"zoom":"12"}; var prague = {"coordinates":[50.0833,14.4167],"zoom":"12"}; var puertoplata = {"coordinates":[19.8030,70.6830],"zoom":"12"}; var pulheim = {"coordinates":[51,6.8],"zoom":"12"}; var rastatt = {"coordinates":[48.8569,8.2028],"zoom":"12"}; var ratingen = {"coordinates":[51.2956,6.8522],"zoom":"12"}; var ravensburg = {"coordinates":[47.7819,9.6136],"zoom":"12"}; var recklinghausen = {"coordinates":[51.6167,7.2],"zoom":"12"}; var regensburg = {"coordinates":[49.0167,12.0833],"zoom":"12"}; var remscheid = {"coordinates":[51.1783,7.1994],"zoom":"12"}; var reutlingen = {"coordinates":[48.4833,9.2167],"zoom":"12"}; var rheine = {"coordinates":[52.2833,7.4333],"zoom":"12"}; var rosenheim = {"coordinates":[47.8561,12.1289],"zoom":"12"}; var rostock = {"coordinates":[54.0833,12.1333],"zoom":"12"}; var ruesselsheim = {"coordinates":[49.995,8.4119],"zoom":"12"}; var ruse = {"coordinates":[43.8564,25.9706],"zoom":"12"}; var saarbruecken = {"coordinates":[49.2333,7],"zoom":"12"}; var salzburg = {"coordinates":[47.8,13.0333],"zoom":"12"}; var salzgitter = {"coordinates":[52.1533,10.4061],"zoom":"12"}; var sanktaugustin = {"coordinates":[50.77,7.1867],"zoom":"12"}; var santodomingo = {"coordinates":[18.4667,69.95],"zoom":"12"}; var schwaebisch_gmuend = {"coordinates":[48.8,9.8],"zoom":"12"}; var schweinfurt = {"coordinates":[50.045,10.2342],"zoom":"12"}; var schwerin = {"coordinates":[53.6333,11.4167],"zoom":"12"}; var siegen = {"coordinates":[50.87444,8.0244],"zoom":"12"}; var silistra = {"coordinates":[44.1167,27.2667],"zoom":"12"}; var sindelfingen = {"coordinates":[48.7133,9.003],"zoom":"12"}; var solingen = {"coordinates":[51.17139,7.0833],"zoom":"12"}; var speyer = {"coordinates":[49.3172,8.4342],"zoom":"12"}; var stgallen = {"coordinates":[47.4236,9.3775],"zoom":"12"}; var starazagora = {"coordinates":[42.42,25.63],"zoom":"12"}; var stolberg = {"coordinates":[50.7667,6.2333],"zoom":"12"}; var stralsund = {"coordinates":[54.3139,13.0897],"zoom":"12"}; var strasbourg = {"coordinates":[48.5836,7.74806],"zoom":"12"}; var stuttgart = {"coordinates":[48.8,9.2],"zoom":"12"}; var szeged = {"coordinates":[46.255,20.145],"zoom":"12"}; var taiwan = {"coordinates":[23.63,121.0532],"zoom":"12"}; var trier = {"coordinates":[49.7596,6.6439],"zoom":"12"}; var troisdorf = {"coordinates":[50.8161,7.1556],"zoom":"12"}; var tuebingen = {"coordinates":[48.52,9.0556],"zoom":"12"}; var turin = {"coordinates":[45.0667,7.7],"zoom":"12"}; var turku = {"coordinates":[60.45,22.2667],"zoom":"12"}; var ulm = {"coordinates":[48.4008,9.9872],"zoom":"12"}; var unna = {"coordinates":[51.5347,7.6889],"zoom":"12"}; var varna = {"coordinates":[43.2103,27.9097],"zoom":"12"}; var velbert = {"coordinates":[51.3333,7.05],"zoom":"12"}; var velikotarnovo = {"coordinates":[43.084,25.6556],"zoom":"12"}; var vidin = {"coordinates":[43.9911,22.8822],"zoom":"12"}; var viersen = {"coordinates":[51.2528,6.3933],"zoom":"12"}; var villingenschwenningen = {"coordinates":[48.0569,8.4917],"zoom":"12"}; var waiblingen = {"coordinates":[48.8303,9.3169],"zoom":"12"}; var weimar = {"coordinates":[50.9794,11.3297],"zoom":"12"}; var wesel = {"coordinates":[51.6586,6.6178],"zoom":"12"}; var wetzlar = {"coordinates":[50.5578,8.5044],"zoom":"12"}; var wien = {"coordinates":[48.2083,16.3731],"zoom":"12"}; var wiesbaden = {"coordinates":[50.0821,8.2414],"zoom":"12"}; var wilhelmshaven = {"coordinates":[53.5219,8.1075],"zoom":"12"}; var willich = {"coordinates":[51.2631,6.5492],"zoom":"12"}; var winterthur = {"coordinates":[47.5,8.75],"zoom":"12"}; var wismar = {"coordinates":[53.8882,11.462],"zoom":"12"}; var witten = {"coordinates":[51.4333,7.3333],"zoom":"12"}; var wolfenbuettel = {"coordinates":[52.1622,10.5369],"zoom":"12"}; var wolfsburg = {"coordinates":[52.4231,10.7872],"zoom":"12"}; var worms = {"coordinates":[49.633055555556,8.3608],"zoom":"12"}; var wroclaw = {"coordinates":[51.11,17.0322],"zoom":"12"}; var wuerzburg = {"coordinates":[49.7944,9.9294],"zoom":"12"}; var wuppertal = {"coordinates":[51.2592,7.2111],"zoom":"12"}; var zuerich = {"coordinates":[47.3717,8.5423],"zoom":"12"}; var zwickau = {"coordinates":[50.7189,12.4922],"zoom":"12"};
HTML
<!doctype html> <html> <head> <title>Feinstaub PJ</title> <link rel="stylesheet" href="https://unpkg.com/leaflet@1.1.0/dist/leaflet.css" /> <script src="https://unpkg.com/leaflet@1.1.0/dist/leaflet-src.js"></script> <script src="js/leaflet-realtime.js"></script> <script src="js/leaflet-heat.js"></script> <script src="data/positions.js"></script> <script src="https://d3js.org/d3.v4.min.js"></script> <script src="https://d3js.org/d3-hexbin.v0.2.min.js"></script> <link rel="stylesheet" href="css/style.css" /> <script src="hexbin.js"></script> </head> <body> <div id="map"></div> <script src="map.js"></script> <div id='control'> <div id='boutons'> <button class="selec" id="points" value="points" onclick="reloadStyle(this.value)">Standorte Sensoren</button> <button class="selec" id="PM10" value="PM10" onclick="reloadStyle(this.value)">Standorte PM10</button> <button class="selec" id="PM2.5" value="PM2.5" onclick="reloadStyle(this.value)">Standorte PM2.5</button> </div> <div id='boutons2'> <button class="selec2" id="hmpoints" value="hmpoints" onclick="reloadStyle(this.value)">Dichte Sensoren</button> <button class="selec2" id="hmPM10" value="hmPM10" onclick="reloadStyle(this.value)">Heatmap PM10</button> <button class="selec2" id="hmPM2.5" value="hmPM2.5" onclick="reloadStyle(this.value)"> Heatmap PM2.5</button> </div> <div id='boutons3'> <button class="selec3" id="temp" value="temp" onclick="reloadStyle(this.value)">Standorte Temp.</button> <button class="selec3" id="humi" value="humi" onclick="reloadStyle(this.value)">Standorte Feucht.</button> </div> <div id='boutons4'> <button class="selec4" id="hmtemp" value="hmtemp" onclick="reloadStyle(this.value)">Heatmap Temp.</button> <button class="selec4" id="hmhumi" value="hmhumi" onclick="reloadStyle(this.value)">Heatmap Feucht.</button> </div> <select name="position" size="1" onchange="centerMap(this.value)"> <option value="" disabled selected>Wählen Sie einen Ort!</option> <option value="europe">Europe</option> <option value="deutschland">Deutschland</option> <option value="germany">Germany</option> <option value="badenwuerttemberg">Baden-Wuüttemberg</option> <option value="bayern">Bayern</option> <option value="brandenburg">Brandenburg</option> <option value="hessen">Hessen</option> <option value="mecklenburgvorpommern">Mecklenburg-Vorpommern</option> <option value="niedersachsen">Niedersachsen</option> <option value="nordrheinwestfalen">Nordrheinwestfalen</option> <option value="rheinlandpfalz">rheinlandpfalz</option> <option value="saarland">Saarland</option> <option value="sachsen">Sachsen</option> <option value="sachsenanhalt">Sachsenanhalt</option> <option value="schleswigholstein">Schleswig-Holstein</option> <option value="thueringen">Thüringen</option> <option value="ruhrgebiet">Ruhrgebiet</option> <option value="aachen">Aachen</option> <option value="aalen">Aalen</option> <option value="ahlen">Ahlen</option> <option value="arnsberg">Arnsberg</option> <option value="aschaffenburg">Aschaffenburg</option> <option value="augsburg">Augsburg</option> <option value="badhomburg">Badhomburg</option> <option value="badkreuznach">Badkreuznach</option> <option value="badoeynhausen">Badoeynhausen</option> <option value="badsalzuflen">Badsalzuflen</option> <option value="badenbaden">Badenbaden</option> <option value="bamberg">Bamberg</option> <option value="bayreuth">Bayreuth</option> <option value="bergheim">Bergheim</option> <option value="bergischgladbach">Bergischgladbach</option> <option value="berlin">Berlin</option> <option value="bielefeld">Bielefeld</option> <option value="bocholt">Bocholt</option> <option value="bochum">Bochum</option> <option value="boeblingen">Böblingen</option> <option value="boeblingen">Böblingen</option> <option value="bonn">Bonn</option> <option value="bottrop">Bottrop</option> <option value="brandenburganderhavel">Brandenburganderhavel</option> <option value="braunschweig">Braunschweig</option> <option value="bremen">Bremen</option> <option value="bremerhaven">Bremerhaven</option> <option value="castroprauxel">Castroprauxel</option> <option value="celle">Celle</option> <option value="chemnitz">Chemnitz</option> <option value="cottbus">Cottbus</option> <option value="cuxhaven">Cuxhaven</option> <option value="darmstadt">Darmstadt</option> <option value="delmenhorst">Delmenhorst</option> <option value="dessaurosslau">Dessaurosslau</option> <option value="detmold">Detmold</option> <option value="dinslaken">Dinslaken</option> <option value="dormagen">Dormagen</option> <option value="dorsten">Dorsten</option> <option value="dortmund">Dortmund</option> <option value="dresden">Dresden</option> <option value="dueren">Düren</option> <option value="duesseldorf">Düsseldorf</option> <option value="duisburg">Duisburg</option> <option value="elmshorn">Elmshorn</option> <option value="emden">Emden</option> <option value="erftstadt">Erftstadt</option> <option value="erfurt">Erfurt</option> <option value="erlangen">Erlangen</option> <option value="eschweiler">Eschweiler</option> <option value="essen">Essen</option> <option value="esslingen">Esslingen</option> <option value="euskirchen">Euskirchen</option> <option value="flensburg">Flensburg</option> <option value="frankenthal">Frankenthal</option> <option value="frankfurt">Frankfurt</option> <option value="frankfurtoder">Frankfurtoder</option> <option value="frechen">Frechen</option> <option value="freiburg">Freiburg</option> <option value="friedrichshafen">Friedrichshafen</option> <option value="fuerth">Fürth</option> <option value="fulda">Fulda</option> <option value="garbsen">Garbsen</option> <option value="gelsenkirchen">Gelsenkirchen</option> <option value="gera">Gera</option> <option value="giessen">Giessen</option> <option value="gladbeck">Gladbeck</option> <option value="goeppingen">Göppingen</option> <option value="goerlitz">Görlitz</option> <option value="goettingen">Göttingen</option> <option value="goslar">Goslar</option> <option value="greifswald">Greifswald</option> <option value="greiz">Greiz</option> <option value="grevenbroich">Grevenbroich</option> <option value="guetersloh">Gütersloh</option> <option value="gummersbach">Gummersbach</option> <option value="hagen">Hagen</option> <option value="halle">Halle</option> <option value="hamburg">Hamburg</option> <option value="hameln">Hameln</option> <option value="hamm">Hamm</option> <option value="hanau">Hanau</option> <option value="hannover">Hannover</option> <option value="hattingen">Hattingen</option> <option value="heidelberg">Heidelberg</option> <option value="heidenheim">Heidenheim</option> <option value="heilbronn">Heilbronn</option> <option value="herford">Herford</option> <option value="herne">Herne</option> <option value="herten">Herten</option> <option value="hilden">Hilden</option> <option value="hildesheim">Hildesheim</option> <option value="huerth">Hürth</option> <option value="ibbenbueren">Ibbenbüren</option> <option value="ingolstadt">Ingolstadt</option> <option value="iserlohn">Iserlohn</option> <option value="jena">Jena</option> <option value="kaiserslautern">Kaiserslautern</option> <option value="karlsruhe">Karlsruhe</option> <option value="kassel">Kassel</option> <option value="kempten">Kempten</option> <option value="kerpen">Kerpen</option> <option value="kiel">Kiel</option> <option value="kleve">Kleve</option> <option value="koblenz">Koblenz</option> <option value="koeln">Köln</option> <option value="konstanz">Konstanz</option> <option value="krefeld">Krefeld</option> <option value="landshut">Landshut</option> <option value="langenfeld">Langenfeld</option> <option value="langenhagen">Langenhagen</option> <option value="leipzig">Leipzig</option> <option value="leverkusen">Leverkusen</option> <option value="lingen">Lingen</option> <option value="lippstadt">Lippstadt</option> <option value="loerrach">Lörrach</option> <option value="ludwigsburg">Ludwigsburg</option> <option value="ludwigshafen">Ludwigshafen</option> <option value="luebeck">Lübeck</option> <option value="luedenscheid">Lüdenscheid</option> <option value="lueneburg">Lüneburg</option> <option value="luenen">Lünen</option> <option value="magdeburg">Magdeburg</option> <option value="mainz">Mainz</option> <option value="mannheim">Mannheim</option> <option value="marburg">Marburg</option> <option value="marl">Marl</option> <option value="meerbusch">Meerbusch</option> <option value="menden">Menden</option> <option value="minden">Minden</option> <option value="moenchengladbach">Mönchengladbach</option> <option value="moers">Moers</option> <option value="muelheimanderruhr">Mülheim an der Ruhr</option> <option value="muenchen">München</option> <option value="muenster">Münster</option> <option value="neuulm">Neuulm</option> <option value="neubrandenburg">Neubrandenburg</option> <option value="neumuenster">Neumünster</option> <option value="neuss">Neuss</option> <option value="neustadtanderweinstrasse">Neustadt an der Weinstrasse</option> <option value="neuwied">Neuwied</option> <option value="norderstedt">Norderstedt</option> <option value="nordhorn">Nordhorn</option> <option value="nuernberg">Nürnberg</option> <option value="oberhausen">Oberhausen</option> <option value="offenbach">Offenbach</option> <option value="offenburg">Offenburg</option> <option value="oldenburg">Oldenburg</option> <option value="osnabrueck">Osnabrück</option> <option value="paderborn">Paderborn</option> <option value="passau">Passau</option> <option value="peine">Peine</option> <option value="pforzheim">Pforzheim</option> <option value="plauen">Plauen</option> <option value="potsdam">Potsdam</option> <option value="pulheim">Pulheim</option> <option value="rastatt">Rastatt</option> <option value="ratingen">Ratingen</option> <option value="ravensburg">Ravensburg</option> <option value="recklinghausen">Recklinghausen</option> <option value="regensburg">Regensburg</option> <option value="remscheid">Remscheid</option> <option value="reutlingen">Reutlingen</option> <option value="rheine">Rheine</option> <option value="rosenheim">Rosenheim</option> <option value="rostock">Rostock</option> <option value="ruesselsheim">Rüsselsheim</option> <option value="saarbruecken">Saarbrücken</option> <option value="salzgitter">Salzgitter</option> <option value="sanktaugustin">Sanktaugustin</option> <option value="schwaebisch_gmuend">Schwäbisch Gmünd</option> <option value="schweinfurt">Schweinfurt</option> <option value="schwerin">Schwerin</option> <option value="siegen">Siegen</option> <option value="sindelfingen">Sindelfingen</option> <option value="solingen">Solingen</option> <option value="speyer">Speyer</option> <option value="stolberg">Stolberg</option> <option value="stralsund">Stralsund</option> <option value="stuttgart">Stuttgart</option> <option value="trier">Trier</option> <option value="troisdorf">Troisdorf</option> <option value="tuebingen">Tübingen</option> <option value="ulm">Ulm</option> <option value="unna">Unna</option> <option value="velbert">Velbert</option> <option value="viersen">Viersen</option> <option value="villingenschwenningen">Villingen-Schwenningen</option> <option value="waiblingen">Waiblingen</option> <option value="weimar">Weimar</option> <option value="wesel">Wesel</option> <option value="wetzlar">Wetzlar</option> <option value="wiesbaden">Wiesbaden</option> <option value="wilhelmshaven">Wilhelmshaven</option> <option value="willich">Willich</option> <option value="wismar">Wismar</option> <option value="witten">Witten</option> <option value="wolfenbuettel">Wolfenbüttel</option> <option value="wolfsburg">Wolfsburg</option> <option value="worms">Worms</option> <option value="wuerzburg">Wuerzburg</option> <option value="wuppertal">Wuppertal</option> <option value="zwickau">Zwickau</option> <option value="oesterreich">Österreich</option> <option value="austria">Austria</option> <option value="wien">Wien</option> <option value="graz">Graz</option> <option value="linz">Linz</option> <option value="salzburg">Salzburg</option> <option value="innsbruck">Innsbruck</option> <option value="belgium">Belgium</option> <option value="brussels">Brussels</option> <option value="bulgaria">Bulgaria</option> <option value="sofia">Sofia</option> <option value="pernik">Pernik</option> <option value="varna">Varna</option> <option value="plovdiv">Plovdiv</option> <option value="burgas">Burgas</option> <option value="velikotarnovo">Velikotarnovo</option> <option value="ruse">Ruse</option> <option value="silistra">Silistra</option> <option value="starazagora">Starazagora</option> <option value="vidin">Vidin</option> <option value="montana">Montana</option> <option value="pleven">Pleven</option> <option value="haskovo">Haskovo</option> <option value="kardzhali">Kardzhali</option> <option value="dimitrovgrad">Dimitrovgrad</option> <option value="czechrepublic">Czech Republic</option> <option value="prague">Prague</option> <option value="denmark">Denmark</option> <option value="finland">Finland</option> <option value="helsinki">Helsinki</option> <option value="turku">Turku</option> <option value="france">France</option> <option value="paris">Paris</option> <option value="alsace">Alsace</option> <option value="strasbourg">Strasbourg</option> <option value="grenoble">Grenoble</option> <option value="greece">Greece</option> <option value="athens">Athens</option> <option value="hungary">Hungary</option> <option value="budapest">Budapest</option> <option value="szeged">Szeged</option> <option value="ireland">Ireland</option> <option value="dublin">Dublin</option> <option value="italy">Italy</option> <option value="sicily">Sicily</option> <option value="florence">Florence</option> <option value="palermo">Palermo</option> <option value="bologna">Bologna</option> <option value="turin">Turin</option> <option value="netherlands">Netherlands</option> <option value="poland">Poland</option> <option value="wroclaw">Wroclaw</option> <option value="romania">Romania</option> <option value="bucharest">Bucharest</option> <option value="serbia">Serbia</option> <option value="belgrade">Belgrade</option> <option value="schweiz">Schweiz</option> <option value="suisse">Suisse</option> <option value="basel">Basel</option> <option value="bern">Bern</option> <option value="biel">Biel</option> <option value="lausanne">Lausanne</option> <option value="luzern">Luzern</option> <option value="zuerich">Zürich</option> <option value="genf">Genf</option> <option value="winterthur">Winterthur</option> <option value="stgallen">Stgallen</option> <option value="lugano">Lugano</option> <option value="ukraine">Ukraine</option> <option value="kiev">Kiev</option> <option value="lviv">Lviv</option> <option value="unitedkingdom">United Kingdom</option> <option value="bristol">Bristol</option> <option value="london">London</option> <option value="chile">Chile</option> <option value="santiago">Santiago</option> <option value="dominicanrepublic">Dominicanrepublic</option> <option value="santodomingo">Santodomingo</option> <option value="puertoplata">Puerto Plata</option> <option value="usa">USA</option> <option value="portland">Portland</option> <option value="brunei">Brunei</option> <option value="nepal">Nepal</option> <option value="kathmandu">Kathmandu</option> <option value="taiwan">Taiwan</option> <option value="thailand">Thailand</option> <option value="unitedarabemirates">United Arab Emirates</option> <option value="uae">UAE</option> <option value="dubai">Dubai</option> <option value="vietnam">Vietnam</option> <option value="hanoi">Hanoi</option> <option value="world">World</option> </select> <div id="results"></div> <div id="graphs"></div> </div> <div class ="legend" id="legendpm"> <div id="legend-inner-pm"> <div class="gradient"> <div class="limit"> </div> </div> <div class="labels"> <div class="label" style="bottom: 100%;"><b>500</b></div> <div class="label" style="bottom: 80%;"><b>100</b></div> <div class="label" style="bottom: 60%;"><b>75</b></div> <div class="label limit" style="bottom: 40%;"><b>50</b></div> <div class="label" style="bottom: 20%;"><b>25</b></div> <div class="label" style="bottom: 0%;"><b>0 µg/m³</b></div> </div> </div> </div> <div class ="legend" id="legendtemp"> <div id="legend-inner-temp"> <div class="gradient"> <div class="limit"> </div> </div> <div class="labels"> <div class="label" style="bottom: 100%;"><b>50</b></div> <div class="label" style="bottom: 65%;"><b>25</b></div> <div class="label" style="bottom: 30%;"><b>0</b></div> <div class="label" style="bottom: 0%;"><b>-20 °</b></div> </div> </div> </div> <div class ="legend" id="legendhumi"> <div id="legend-inner-humi"> <div class="gradient"> <div class="limit"> </div> </div> <div class="labels"> <div class="label" style="bottom: 100%;"><b>100</b></div> <div class="label" style="bottom: 80%;"><b>80</b></div> <div class="label" style="bottom: 60%;"><b>60</b></div> <div class="label " style="bottom: 40%;"><b>40</b></div> <div class="label" style="bottom: 20%;"><b>20</b></div> <div class="label" style="bottom: 0%;"><b>0 %</b></div> </div> </div> </div> </body> </html>