From 5c63c491a11ebd7829cc38aef58dc5347c2c4d51 Mon Sep 17 00:00:00 2001 From: HolgerHatGarKeineNode Date: Wed, 8 Feb 2023 10:44:43 +0100 Subject: [PATCH] heatmap changed --- app/Http/Livewire/BookCase/Heatmap.php | 2 +- public/dist/heatmap.min.js | 9 + public/dist/leaflet-heatmap.js | 246 ++++++++++++++++++ resources/views/layouts/app.blade.php | 3 +- resources/views/layouts/guest.blade.php | 3 +- .../livewire/book-case/heatmap.blade.php | 44 +++- 6 files changed, 296 insertions(+), 11 deletions(-) create mode 100644 public/dist/heatmap.min.js create mode 100644 public/dist/leaflet-heatmap.js diff --git a/app/Http/Livewire/BookCase/Heatmap.php b/app/Http/Livewire/BookCase/Heatmap.php index fc9085b2..12a86c7b 100644 --- a/app/Http/Livewire/BookCase/Heatmap.php +++ b/app/Http/Livewire/BookCase/Heatmap.php @@ -12,7 +12,7 @@ class Heatmap extends Component public function render() { $data = BookCase::query() - ->whereHas('orangePills') + //->whereHas('orangePills') ->get()->map(fn($bookCase) => [ 'lat' => $bookCase->latitude, 'lng' => $bookCase->longitude, diff --git a/public/dist/heatmap.min.js b/public/dist/heatmap.min.js new file mode 100644 index 00000000..9004bb3f --- /dev/null +++ b/public/dist/heatmap.min.js @@ -0,0 +1,9 @@ +/* + * heatmap.js v2.0.2 | JavaScript Heatmap Library + * + * Copyright 2008-2016 Patrick Wied - All rights reserved. + * Dual licensed under MIT and Beerware license + * + * :: 2016-02-04 21:25 + */ +(function(a,b,c){if(typeof module!=="undefined"&&module.exports){module.exports=c()}else if(typeof define==="function"&&define.amd){define(c)}else{b[a]=c()}})("h337",this,function(){var a={defaultRadius:40,defaultRenderer:"canvas2d",defaultGradient:{.25:"rgb(0,0,255)",.55:"rgb(0,255,0)",.85:"yellow",1:"rgb(255,0,0)"},defaultMaxOpacity:1,defaultMinOpacity:0,defaultBlur:.85,defaultXField:"x",defaultYField:"y",defaultValueField:"value",plugins:{}};var b=function h(){var b=function d(a){this._coordinator={};this._data=[];this._radi=[];this._min=0;this._max=1;this._xField=a["xField"]||a.defaultXField;this._yField=a["yField"]||a.defaultYField;this._valueField=a["valueField"]||a.defaultValueField;if(a["radius"]){this._cfgRadius=a["radius"]}};var c=a.defaultRadius;b.prototype={_organiseData:function(a,b){var d=a[this._xField];var e=a[this._yField];var f=this._radi;var g=this._data;var h=this._max;var i=this._min;var j=a[this._valueField]||1;var k=a.radius||this._cfgRadius||c;if(!g[d]){g[d]=[];f[d]=[]}if(!g[d][e]){g[d][e]=j;f[d][e]=k}else{g[d][e]+=j}if(g[d][e]>h){if(!b){this._max=g[d][e]}else{this.setDataMax(g[d][e])}return false}else{return{x:d,y:e,value:j,radius:k,min:i,max:h}}},_unOrganizeData:function(){var a=[];var b=this._data;var c=this._radi;for(var d in b){for(var e in b[d]){a.push({x:d,y:e,radius:c[d][e],value:b[d][e]})}}return{min:this._min,max:this._max,data:a}},_onExtremaChange:function(){this._coordinator.emit("extremachange",{min:this._min,max:this._max})},addData:function(){if(arguments[0].length>0){var a=arguments[0];var b=a.length;while(b--){this.addData.call(this,a[b])}}else{var c=this._organiseData(arguments[0],true);if(c){this._coordinator.emit("renderpartial",{min:this._min,max:this._max,data:[c]})}}return this},setData:function(a){var b=a.data;var c=b.length;this._data=[];this._radi=[];for(var d=0;d0){this._drawAlpha(a);this._colorize()}},renderAll:function(a){this._clear();if(a.data.length>0){this._drawAlpha(c(a));this._colorize()}},_updateGradient:function(b){this._palette=a(b)},updateConfig:function(a){if(a["gradient"]){this._updateGradient(a)}this._setStyles(a)},setDimensions:function(a,b){this._width=a;this._height=b;this.canvas.width=this.shadowCanvas.width=a;this.canvas.height=this.shadowCanvas.height=b},_clear:function(){this.shadowCtx.clearRect(0,0,this._width,this._height);this.ctx.clearRect(0,0,this._width,this._height)},_setStyles:function(a){this._blur=a.blur==0?0:a.blur||a.defaultBlur;if(a.backgroundColor){this.canvas.style.backgroundColor=a.backgroundColor}this._width=this.canvas.width=this.shadowCanvas.width=a.width||this._width;this._height=this.canvas.height=this.shadowCanvas.height=a.height||this._height;this._opacity=(a.opacity||0)*255;this._maxOpacity=(a.maxOpacity||a.defaultMaxOpacity)*255;this._minOpacity=(a.minOpacity||a.defaultMinOpacity)*255;this._useGradientOpacity=!!a.useGradientOpacity},_drawAlpha:function(a){var c=this._min=a.min;var d=this._max=a.max;var a=a.data||[];var e=a.length;var f=1-this._blur;while(e--){var g=a[e];var h=g.x;var i=g.y;var j=g.radius;var k=Math.min(g.value,d);var l=h-j;var m=i-j;var n=this.shadowCtx;var o;if(!this._templates[j]){this._templates[j]=o=b(j,f)}else{o=this._templates[j]}var p=(k-c)/(d-c);n.globalAlpha=p<.01?.01:p;n.drawImage(o,l,m);if(lthis._renderBoundaries[2]){this._renderBoundaries[2]=l+2*j}if(m+2*j>this._renderBoundaries[3]){this._renderBoundaries[3]=m+2*j}}},_colorize:function(){var a=this._renderBoundaries[0];var b=this._renderBoundaries[1];var c=this._renderBoundaries[2]-a;var d=this._renderBoundaries[3]-b;var e=this._width;var f=this._height;var g=this._opacity;var h=this._maxOpacity;var i=this._minOpacity;var j=this._useGradientOpacity;if(a<0){a=0}if(b<0){b=0}if(a+c>e){c=e-a}if(b+d>f){d=f-b}var k=this.shadowCtx.getImageData(a,b,c,d);var l=k.data;var m=l.length;var n=this._palette;for(var o=3;o0){r=g}else{if(p>0;return b},getDataURL:function(){return this.canvas.toDataURL()}};return d}();var d=function j(){var b=false;if(a["defaultRenderer"]==="canvas2d"){b=c}return b}();var e={merge:function(){var a={};var b=arguments.length;for(var c=0;c 0) { + var len = pointOrArray.length; + while(len--) { + this.addData(pointOrArray[len]); + } + } else { + var latField = this.cfg.latField || 'lat'; + var lngField = this.cfg.lngField || 'lng'; + var valueField = this.cfg.valueField || 'value'; + var entry = pointOrArray; + var latlng = new L.LatLng(entry[latField], entry[lngField]); + var dataObj = { latlng: latlng }; + + dataObj[valueField] = entry[valueField]; + this._max = Math.max(this._max, dataObj[valueField]); + this._min = Math.min(this._min, dataObj[valueField]); + + if (entry.radius) { + dataObj.radius = entry.radius; + } + this._data.push(dataObj); + this._draw(); + } + }, + _reset: function () { + this._origin = this._map.layerPointToLatLng(new L.Point(0, 0)); + + var size = this._map.getSize(); + if (this._width !== size.x || this._height !== size.y) { + this._width = size.x; + this._height = size.y; + + this._el.style.width = this._width + 'px'; + this._el.style.height = this._height + 'px'; + + this._heatmap._renderer.setDimensions(this._width, this._height); + } + this._draw(); + } + }); + + HeatmapOverlay.CSS_TRANSFORM = (function() { + var div = document.createElement('div'); + var props = [ + 'transform', + 'WebkitTransform', + 'MozTransform', + 'OTransform', + 'msTransform' + ]; + + for (var i = 0; i < props.length; i++) { + var prop = props[i]; + if (div.style[prop] !== undefined) { + return prop; + } + } + return props[0]; + })(); + + return HeatmapOverlay; +}); \ No newline at end of file diff --git a/resources/views/layouts/app.blade.php b/resources/views/layouts/app.blade.php index 4c79b9ef..2bfd9379 100644 --- a/resources/views/layouts/app.blade.php +++ b/resources/views/layouts/app.blade.php @@ -31,7 +31,8 @@ @mapstyles @mapscripts - + + @wireUiScripts diff --git a/resources/views/layouts/guest.blade.php b/resources/views/layouts/guest.blade.php index b3edba71..0ff39919 100644 --- a/resources/views/layouts/guest.blade.php +++ b/resources/views/layouts/guest.blade.php @@ -30,7 +30,8 @@ @mapscripts - + + diff --git a/resources/views/livewire/book-case/heatmap.blade.php b/resources/views/livewire/book-case/heatmap.blade.php index 644baa05..d9f6a2e0 100644 --- a/resources/views/livewire/book-case/heatmap.blade.php +++ b/resources/views/livewire/book-case/heatmap.blade.php @@ -12,17 +12,45 @@ x-data="{ data: @js($heatmap_data), init() { - const map = L.map($refs.map,{maxZoom:8}).setView([51.1642,10.4541194], 6); + var testData = { + max: 8, + data: this.data, + }; - L.tileLayer.provider('Stamen.Toner').addTo(map); + var baseLayer = L.tileLayer( + 'http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png',{ + attribution: '...', + maxZoom: 18 + } + ); - var heat = L.heatLayer(this.data, { - blur: 5, - minOpacity: 0.2, - radius: 25, - gradient: {0.4: '#FABE75', 0.65: '#F9A949', 1: '#F7931A'} - }).addTo(map); + var cfg = { + 'radius': 25, + 'maxOpacity': .6, + // scales the radius based on map zoom + 'scaleRadius': false, + // if set to false the heatmap uses the global maximum for colorization + // if activated: uses the data maximum within the current map boundaries + // (there will always be a red spot with useLocalExtremas true) + 'useLocalExtrema': true, + // which field name in your data represents the latitude - default 'lat' + latField: 'lat', + // which field name in your data represents the longitude - default 'lng' + lngField: 'lng', + // which field name in your data represents the data value - default 'value' + valueField: 'count' + }; + var heatmapLayer = new HeatmapOverlay(cfg); + + var map = new L.Map($refs.map, { + center: new L.LatLng(51.1642,10.4541194), + zoom: 4, + maxZoom: 10, + layers: [baseLayer, heatmapLayer] + }); + + heatmapLayer.setData(testData); } }" >