marinus 0.0.1 → 0.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- ZjU0MzBmNGE0NjliNDU5NTE2Mzk2N2ZkYTY1NDk0MTE1NzhhYjExMg==
4
+ YWYyOTVkNzM2ZTkwNjVkOTNkMDZiOWNmOWQ0ZTZjMDI2YTgyNzZjMA==
5
5
  data.tar.gz: !binary |-
6
- Y2RkZmNiZWNmMzc3ZjAzZjJhODEwN2I5ZDBmNDg3OWMwNGM4NmU2Zg==
6
+ MDQ3OTU0ZjQ0YzMyYzgyMjI2MDhmMzFjOTk4YjZkZTkwZjNiYjRkZQ==
7
7
  !binary "U0hBNTEy":
8
8
  metadata.gz: !binary |-
9
- ZTVlYmViZmZkMThkNmIwMGQxYjA3ZGQyY2U5ODgxNzliYzM3ZWUzNTg1N2Nj
10
- NDIzMGU4MjZiMjhhNmI1MjNiNmMyNDUwMWVhZDk3YTEzZjlkODhlMzA5Nzhl
11
- M2JiNTA2YWU0YjZjMDNiYTM3ODgyMWMxNjA3NGY1NjRjMDQwMGY=
9
+ YzQ3OTFhZTg1OGFiNjUyODU3MjIyYWE2YjFhZjk3YWM1OWVhODY0MjNhNDhk
10
+ YzQ2MTg4ZGU1MjY1YmY1OTYyZTA3N2JiMWVlZjM1YmI0ZGNiYzMwYTFmNjVi
11
+ MTZlYWZhMWQzMTZkZTQ3MWJhZjAxMmUyNTUyMGJlM2E5Njk4YTg=
12
12
  data.tar.gz: !binary |-
13
- ZjBjYjEzMzkxYTg4ZGI0M2NlZDUyOTZkYjJkOGY5ZmVkMjQzMWI3M2U1NTdj
14
- ZGE4NDYyMzQyZjY4MzEwNGI4MDBkZmQ5NzIxMGM5YWNhMzkzZGUxZGJkOTg5
15
- YmY1MmNkMzRhNjlhZGNjMjYyMzAyNmY2Y2I2ZGJiMjA2ZmY3NjA=
13
+ Y2YxYWQzNTBkN2QxMDk0ZWFiM2I2YjNhYWFmMjBlYjVjOTE4MTU0MWU1MTk5
14
+ MGJlYjI4YmM3MDY4ZWMxNjFkYzYwZWQ2YTdjYjVjYTFjNzdlOTU1MTE2MDk3
15
+ NjVjZDhhMzBiMzNiZDgyMDM1MGQ1M2IxNzJmYWVmZmY0ZWJhZGU=
data/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # Marinus
2
2
 
3
- TODO: Write a gem description
3
+ A Rails gem for cartograhy assets
4
4
 
5
5
  ## Installation
6
6
 
@@ -18,8 +18,6 @@ Or install it yourself as:
18
18
 
19
19
  ## Usage
20
20
 
21
- TODO: Write usage instructions here
22
-
23
21
  ## Contributing
24
22
 
25
23
  1. Fork it
@@ -0,0 +1,54 @@
1
+ .leaflet-label {
2
+ background: rgb(255, 255, 255);
3
+ background: rgba(255, 255, 255, 0.99);
4
+ background-clip: padding-box;
5
+ border-color: #777;
6
+ border-color: rgba(0,0,0,0.1);
7
+ border-radius: 4px;
8
+ border-style: solid;
9
+ border-width: 4px;
10
+ color: #111;
11
+ display: block;
12
+ font: 12px/20px "Helvetica Neue", Arial, Helvetica, sans-serif;
13
+ font-weight: bold;
14
+ padding: 1px 6px;
15
+ position: absolute;
16
+ -webkit-user-select: none;
17
+ -moz-user-select: none;
18
+ -ms-user-select: none;
19
+ user-select: none;
20
+ pointer-events: none;
21
+ white-space: nowrap;
22
+ z-index: 6;
23
+ }
24
+
25
+ .leaflet-label.leaflet-clickable {
26
+ cursor: pointer;
27
+ pointer-events: auto;
28
+ }
29
+
30
+ .leaflet-label:before,
31
+ .leaflet-label:after {
32
+ border-top: 6px solid transparent;
33
+ border-bottom: 6px solid transparent;
34
+ content: none;
35
+ position: absolute;
36
+ top: 5px;
37
+ }
38
+
39
+ .leaflet-label:before {
40
+ border-right: 6px solid black;
41
+ border-right-color: inherit;
42
+ left: -10px;
43
+ }
44
+
45
+ .leaflet-label:after {
46
+ border-left: 6px solid black;
47
+ border-left-color: inherit;
48
+ right: -10px;
49
+ }
50
+
51
+ .leaflet-label-right:before,
52
+ .leaflet-label-left:after {
53
+ content: "";
54
+ }
@@ -0,0 +1,159 @@
1
+ #map {
2
+ width: 100%;
3
+ height: 100%;
4
+ z-index: 100;
5
+ }
6
+
7
+ .leaflet-container {
8
+ cursor: pointer;
9
+ }
10
+
11
+ .leaflet-bar {
12
+ background-color: rgba(100, 100,100, .11)
13
+ }
14
+
15
+ .leaflet-control-fullscreen {
16
+ background-image: url(/images/expand.png);
17
+ background-size: 15px;
18
+ background-position:center;
19
+ }
20
+
21
+ .expand {
22
+ background-image: url(/images/expand.png);
23
+ }
24
+
25
+ .compress {
26
+ background-image: url(/images/compress.png);
27
+ }
28
+
29
+ .leaflet-bar a, .leaflet-bar a:hover {
30
+ background-color: rgba(100, 100,100, .11)
31
+ }
32
+
33
+ .leaflet-bar, .leaflet-touch .leaflet-bar {
34
+ border: 0px solid rgba(255, 255, 255, 1);
35
+ }
36
+ .leaflet-left .leaflet-control {
37
+ margin-top: 15px;
38
+ margin-left: 15px;
39
+ }
40
+
41
+ .leaflet-popup-content {
42
+ padding: 5px 20px;
43
+ }
44
+
45
+ .leaflet-popup-content, .leaflet-popup-content p {
46
+ margin: 8px 0px;
47
+ font-size: 12px;
48
+ line-height: 1.2em;
49
+ }
50
+
51
+ .leaflet-cluster-anim .leaflet-marker-icon, .leaflet-cluster-anim .leaflet-marker-shadow {
52
+ -webkit-transition: -webkit-transform 0.3s ease-out, opacity 0.3s ease-in;
53
+ -moz-transition: -moz-transform 0.3s ease-out, opacity 0.3s ease-in;
54
+ -o-transition: -o-transform 0.3s ease-out, opacity 0.3s ease-in;
55
+ transition: transform 0.3s ease-out, opacity 0.3s ease-in;
56
+ }
57
+
58
+ .marker-cluster-small {
59
+ background-color: rgba(72, 128, 192, 0.6);
60
+ }
61
+ .marker-cluster-small div {
62
+ background-color: rgba(85, 150, 225, 0.6);
63
+ }
64
+
65
+ .marker-cluster-medium {
66
+ background-color: rgba(43, 43, 43, 0.7);
67
+ }
68
+ .marker-cluster-medium div {
69
+ background-color: rgba(63, 63, 63, 0.7);
70
+ }
71
+
72
+ .marker-cluster-large {
73
+ background-color: rgba(80,80,80, 0.6);
74
+ }
75
+ .marker-cluster-large div {
76
+ background-color: rgba(68, 68, 68, 0.6);
77
+ }
78
+
79
+ .marker-cluster {
80
+ background-clip: padding-box;
81
+ border-radius: 20px;
82
+ }
83
+ .marker-cluster div {
84
+ color: white;
85
+ width: 30px;
86
+ height: 30px;
87
+ margin-left: 5px;
88
+ margin-top: 5px;
89
+
90
+ text-align: center;
91
+ border-radius: 15px;
92
+ font: 12px "Helvetica Neue", Arial, Helvetica, sans-serif;
93
+ }
94
+
95
+ .marker-cluster span {
96
+ line-height: 30px;
97
+ }
98
+
99
+ .map-legends .map-legend {
100
+ padding: 7px 10px 10px;
101
+ }
102
+
103
+ .legend-content {
104
+ }
105
+
106
+ .legend-title {
107
+ text-align: left;
108
+ margin-bottom: 8px;
109
+ font-weight: bold;
110
+ font-size: 13px;
111
+ }
112
+
113
+ .legend-item {
114
+ margin-bottom: -4px;
115
+ }
116
+
117
+ .legend-item-marker {
118
+ border-radius: 50%;
119
+ width: 8px;
120
+ height: 8px;
121
+ background-color: gray;
122
+ float: left;
123
+ margin-top: 6px;
124
+ }
125
+
126
+ .legend-item-text {
127
+ margin-left: 7px;
128
+ font-weight: 500;
129
+ font-size: 11px;
130
+ }
131
+
132
+ .legend-source {
133
+ font-size: 10px;
134
+ color: #999;
135
+ clear: both;
136
+ margin-top: 5px;
137
+ }
138
+
139
+ .legend a {
140
+ color: #777;
141
+ }
142
+
143
+ .mapbox-info-toggle {
144
+ display: none;
145
+ }
146
+
147
+ .fullscreen-map {
148
+ z-index: 1040;
149
+ }
150
+
151
+ .map-date {
152
+ float: right;
153
+ margin-top: 5px;
154
+ }
155
+
156
+ .map-animate-control {
157
+ float: right;
158
+ margin: 0px 0px 10px 10px;
159
+ }
@@ -0,0 +1,73 @@
1
+
2
+ RegExp.escape=function(s){return s.replace(/[-\/\\^$*+?.()|[\]{}]/g,'\\$&');};(function($){'use strict'
3
+ $.csv={defaults:{separator:',',delimiter:'"',headers:true},hooks:{castToScalar:function(value,state){var hasDot=/\./;if(isNaN(value)){return value;}else{if(hasDot.test(value)){return parseFloat(value);}else{var integer=parseInt(value);if(isNaN(integer)){return null;}else{return integer;}}}}},parsers:{parse:function(csv,options){var separator=options.separator;var delimiter=options.delimiter;if(!options.state.rowNum){options.state.rowNum=1;}
4
+ if(!options.state.colNum){options.state.colNum=1;}
5
+ var data=[];var entry=[];var state=0;var value=''
6
+ var exit=false;function endOfEntry(){state=0;value='';if(options.start&&options.state.rowNum<options.start){entry=[];options.state.rowNum++;options.state.colNum=1;return;}
7
+ if(options.onParseEntry===undefined){data.push(entry);}else{var hookVal=options.onParseEntry(entry,options.state);if(hookVal!==false){data.push(hookVal);}}
8
+ entry=[];if(options.end&&options.state.rowNum>=options.end){exit=true;}
9
+ options.state.rowNum++;options.state.colNum=1;}
10
+ function endOfValue(){if(options.onParseValue===undefined){entry.push(value);}else{var hook=options.onParseValue(value,options.state);if(hook!==false){entry.push(hook);}}
11
+ value='';state=0;options.state.colNum++;}
12
+ var escSeparator=RegExp.escape(separator);var escDelimiter=RegExp.escape(delimiter);var match=/(D|S|\n|\r|[^DS\r\n]+)/;var matchSrc=match.source;matchSrc=matchSrc.replace(/S/g,escSeparator);matchSrc=matchSrc.replace(/D/g,escDelimiter);match=RegExp(matchSrc,'gm');csv.replace(match,function(m0){if(exit){return;}
13
+ switch(state){case 0:if(m0===separator){value+='';endOfValue();break;}
14
+ if(m0===delimiter){state=1;break;}
15
+ if(m0==='\n'){endOfValue();endOfEntry();break;}
16
+ if(/^\r$/.test(m0)){break;}
17
+ value+=m0;state=3;break;case 1:if(m0===delimiter){state=2;break;}
18
+ value+=m0;state=1;break;case 2:if(m0===delimiter){value+=m0;state=1;break;}
19
+ if(m0===separator){endOfValue();break;}
20
+ if(m0==='\n'){endOfValue();endOfEntry();break;}
21
+ if(/^\r$/.test(m0)){break;}
22
+ throw new Error('CSVDataError: Illegal State [Row:'+options.state.rowNum+'][Col:'+options.state.colNum+']');case 3:if(m0===separator){endOfValue();break;}
23
+ if(m0==='\n'){endOfValue();endOfEntry();break;}
24
+ if(/^\r$/.test(m0)){break;}
25
+ if(m0===delimiter){throw new Error('CSVDataError: Illegal Quote [Row:'+options.state.rowNum+'][Col:'+options.state.colNum+']');}
26
+ throw new Error('CSVDataError: Illegal Data [Row:'+options.state.rowNum+'][Col:'+options.state.colNum+']');default:throw new Error('CSVDataError: Unknown State [Row:'+options.state.rowNum+'][Col:'+options.state.colNum+']');}});if(entry.length!==0){endOfValue();endOfEntry();}
27
+ return data;},splitLines:function(csv,options){var separator=options.separator;var delimiter=options.delimiter;if(!options.state.rowNum){options.state.rowNum=1;}
28
+ var entries=[];var state=0;var entry='';var exit=false;function endOfLine(){state=0;if(options.start&&options.state.rowNum<options.start){entry='';options.state.rowNum++;return;}
29
+ if(options.onParseEntry===undefined){entries.push(entry);}else{var hookVal=options.onParseEntry(entry,options.state);if(hookVal!==false){entries.push(hookVal);}}
30
+ entry='';if(options.end&&options.state.rowNum>=options.end){exit=true;}
31
+ options.state.rowNum++;}
32
+ var escSeparator=RegExp.escape(separator);var escDelimiter=RegExp.escape(delimiter);var match=/(D|S|\n|\r|[^DS\r\n]+)/;var matchSrc=match.source;matchSrc=matchSrc.replace(/S/g,escSeparator);matchSrc=matchSrc.replace(/D/g,escDelimiter);match=RegExp(matchSrc,'gm');csv.replace(match,function(m0){if(exit){return;}
33
+ switch(state){case 0:if(m0===separator){entry+=m0;state=0;break;}
34
+ if(m0===delimiter){entry+=m0;state=1;break;}
35
+ if(m0==='\n'){endOfLine();break;}
36
+ if(/^\r$/.test(m0)){break;}
37
+ entry+=m0;state=3;break;case 1:if(m0===delimiter){entry+=m0;state=2;break;}
38
+ entry+=m0;state=1;break;case 2:var prevChar=entry.substr(entry.length-1);if(m0===delimiter&&prevChar===delimiter){entry+=m0;state=1;break;}
39
+ if(m0===separator){entry+=m0;state=0;break;}
40
+ if(m0==='\n'){endOfLine();break;}
41
+ if(m0==='\r'){break;}
42
+ throw new Error('CSVDataError: Illegal state [Row:'+options.state.rowNum+']');case 3:if(m0===separator){entry+=m0;state=0;break;}
43
+ if(m0==='\n'){endOfLine();break;}
44
+ if(m0==='\r'){break;}
45
+ if(m0===delimiter){throw new Error('CSVDataError: Illegal quote [Row:'+options.state.rowNum+']');}
46
+ throw new Error('CSVDataError: Illegal state [Row:'+options.state.rowNum+']');default:throw new Error('CSVDataError: Unknown state [Row:'+options.state.rowNum+']');}});if(entry!==''){endOfLine();}
47
+ return entries;},parseEntry:function(csv,options){var separator=options.separator;var delimiter=options.delimiter;if(!options.state.rowNum){options.state.rowNum=1;}
48
+ if(!options.state.colNum){options.state.colNum=1;}
49
+ var entry=[];var state=0;var value='';function endOfValue(){if(options.onParseValue===undefined){entry.push(value);}else{var hook=options.onParseValue(value,options.state);if(hook!==false){entry.push(hook);}}
50
+ value='';state=0;options.state.colNum++;}
51
+ if(!options.match){var escSeparator=RegExp.escape(separator);var escDelimiter=RegExp.escape(delimiter);var match=/(D|S|\n|\r|[^DS\r\n]+)/;var matchSrc=match.source;matchSrc=matchSrc.replace(/S/g,escSeparator);matchSrc=matchSrc.replace(/D/g,escDelimiter);options.match=RegExp(matchSrc,'gm');}
52
+ csv.replace(options.match,function(m0){switch(state){case 0:if(m0===separator){value+='';endOfValue();break;}
53
+ if(m0===delimiter){state=1;break;}
54
+ if(m0==='\n'||m0==='\r'){break;}
55
+ value+=m0;state=3;break;case 1:if(m0===delimiter){state=2;break;}
56
+ value+=m0;state=1;break;case 2:if(m0===delimiter){value+=m0;state=1;break;}
57
+ if(m0===separator){endOfValue();break;}
58
+ if(m0==='\n'||m0==='\r'){break;}
59
+ throw new Error('CSVDataError: Illegal State [Row:'+options.state.rowNum+'][Col:'+options.state.colNum+']');case 3:if(m0===separator){endOfValue();break;}
60
+ if(m0==='\n'||m0==='\r'){break;}
61
+ if(m0===delimiter){throw new Error('CSVDataError: Illegal Quote [Row:'+options.state.rowNum+'][Col:'+options.state.colNum+']');}
62
+ throw new Error('CSVDataError: Illegal Data [Row:'+options.state.rowNum+'][Col:'+options.state.colNum+']');default:throw new Error('CSVDataError: Unknown State [Row:'+options.state.rowNum+'][Col:'+options.state.colNum+']');}});endOfValue();return entry;}},toArray:function(csv,options,callback){var options=(options!==undefined?options:{});var config={};config.callback=((callback!==undefined&&typeof(callback)==='function')?callback:false);config.separator='separator'in options?options.separator:$.csv.defaults.separator;config.delimiter='delimiter'in options?options.delimiter:$.csv.defaults.delimiter;var state=(options.state!==undefined?options.state:{});var options={delimiter:config.delimiter,separator:config.separator,onParseEntry:options.onParseEntry,onParseValue:options.onParseValue,state:state}
63
+ var entry=$.csv.parsers.parseEntry(csv,options);if(!config.callback){return entry;}else{config.callback('',entry);}},toArrays:function(csv,options,callback){var options=(options!==undefined?options:{});var config={};config.callback=((callback!==undefined&&typeof(callback)==='function')?callback:false);config.separator='separator'in options?options.separator:$.csv.defaults.separator;config.delimiter='delimiter'in options?options.delimiter:$.csv.defaults.delimiter;var data=[];var options={delimiter:config.delimiter,separator:config.separator,onParseEntry:options.onParseEntry,onParseValue:options.onParseValue,start:options.start,end:options.end,state:{rowNum:1,colNum:1}};data=$.csv.parsers.parse(csv,options);if(!config.callback){return data;}else{config.callback('',data);}},toObjects:function(csv,options,callback){var options=(options!==undefined?options:{});var config={};config.callback=((callback!==undefined&&typeof(callback)==='function')?callback:false);config.separator='separator'in options?options.separator:$.csv.defaults.separator;config.delimiter='delimiter'in options?options.delimiter:$.csv.defaults.delimiter;config.headers='headers'in options?options.headers:$.csv.defaults.headers;options.start='start'in options?options.start:1;if(config.headers){options.start++;}
64
+ if(options.end&&config.headers){options.end++;}
65
+ var lines=[];var data=[];var options={delimiter:config.delimiter,separator:config.separator,onParseEntry:options.onParseEntry,onParseValue:options.onParseValue,start:options.start,end:options.end,state:{rowNum:1,colNum:1},match:false};var headerOptions={delimiter:config.delimiter,separator:config.separator,start:1,end:1,state:{rowNum:1,colNum:1}}
66
+ var headerLine=$.csv.parsers.splitLines(csv,headerOptions);var headers=$.csv.toArray(headerLine[0],options);var lines=$.csv.parsers.splitLines(csv,options);options.state.colNum=1;if(headers){options.state.rowNum=2;}else{options.state.rowNum=1;}
67
+ for(var i=0,len=lines.length;i<len;i++){var entry=$.csv.toArray(lines[i],options);var object={};for(var j in headers){object[headers[j]]=entry[j];}
68
+ data.push(object);options.state.rowNum++;}
69
+ if(!config.callback){return data;}else{config.callback('',data);}},fromArrays:function(arrays,options,callback){var options=(options!==undefined?options:{});var config={};config.callback=((callback!==undefined&&typeof(callback)==='function')?callback:false);config.separator='separator'in options?options.separator:$.csv.defaults.separator;config.delimiter='delimiter'in options?options.delimiter:$.csv.defaults.delimiter;config.escaper='escaper'in options?options.escaper:$.csv.defaults.escaper;config.experimental='experimental'in options?options.experimental:false;if(!config.experimental){throw new Error('not implemented');}
70
+ var output=[];for(i in arrays){output.push(arrays[i]);}
71
+ if(!config.callback){return output;}else{config.callback('',output);}},fromObjects2CSV:function(objects,options,callback){var options=(options!==undefined?options:{});var config={};config.callback=((callback!==undefined&&typeof(callback)==='function')?callback:false);config.separator='separator'in options?options.separator:$.csv.defaults.separator;config.delimiter='delimiter'in options?options.delimiter:$.csv.defaults.delimiter;config.experimental='experimental'in options?options.experimental:false;if(!config.experimental){throw new Error('not implemented');}
72
+ var output=[];for(i in objects){output.push(arrays[i]);}
73
+ if(!config.callback){return output;}else{config.callback('',output);}}};$.csvEntry2Array=$.csv.toArray;$.csv2Array=$.csv.toArrays;$.csv2Dictionary=$.csv.toObjects;})(jQuery);
@@ -0,0 +1,11 @@
1
+ /*
2
+ (c) 2014, Vladimir Agafonkin
3
+ simpleheat, a tiny JavaScript library for drawing heatmaps with Canvas
4
+ https://github.com/mourner/simpleheat
5
+ */
6
+ !function(){"use strict";function t(i){return this instanceof t?(this._canvas=i="string"==typeof i?document.getElementById(i):i,this._ctx=i.getContext("2d"),this._width=i.width,this._height=i.height,this._max=1,void this.clear()):new t(i)}t.prototype={defaultRadius:25,defaultGradient:{.4:"blue",.6:"cyan",.7:"lime",.8:"yellow",1:"red"},data:function(t){return this._data=t,this},max:function(t){return this._max=t,this},add:function(t){return this._data.push(t),this},clear:function(){return this._data=[],this},radius:function(t,i){i=i||15;var a=this._circle=document.createElement("canvas"),e=a.getContext("2d"),s=this._r=t+i;return a.width=a.height=2*s,e.shadowOffsetX=e.shadowOffsetY=200,e.shadowBlur=i,e.shadowColor="black",e.beginPath(),e.arc(s-200,s-200,t,0,2*Math.PI,!0),e.closePath(),e.fill(),this},gradient:function(t){var i=document.createElement("canvas"),a=i.getContext("2d"),e=a.createLinearGradient(0,0,0,256);i.width=1,i.height=256;for(var s in t)e.addColorStop(s,t[s]);return a.fillStyle=e,a.fillRect(0,0,1,256),this._grad=a.getImageData(0,0,1,256).data,this},draw:function(t){this._circle||this.radius(this.defaultRadius),this._grad||this.gradient(this.defaultGradient);var i=this._ctx;i.clearRect(0,0,this._width,this._height);for(var a,e=0,s=this._data.length;s>e;e++)a=this._data[e],i.globalAlpha=Math.max(a[2]/this._max,t||.05),i.drawImage(this._circle,a[0]-this._r,a[1]-this._r);var n=i.getImageData(0,0,this._width,this._height);return this._colorize(n.data,this._grad),i.putImageData(n,0,0),this},_colorize:function(t,i){for(var a,e=3,s=t.length;s>e;e+=4)a=4*t[e],a&&(t[e-3]=i[a],t[e-2]=i[a+1],t[e-1]=i[a+2])}},window.simpleheat=t}(),/*
7
+ (c) 2014, Vladimir Agafonkin
8
+ Leaflet.heat, a tiny and fast heatmap plugin for Leaflet.
9
+ https://github.com/Leaflet/Leaflet.heat
10
+ */
11
+ L.HeatLayer=L.Class.extend({initialize:function(t,i){this._latlngs=t,L.setOptions(this,i)},setLatLngs:function(t){return this._latlngs=t,this.redraw()},addLatLng:function(t){return this._latlngs.push(t),this.redraw()},setOptions:function(t){return L.setOptions(this,t),this._heat&&this._updateOptions(),this.redraw()},redraw:function(){return this._heat&&!this._frame&&(this._frame=L.Util.requestAnimFrame(this._redraw,this)),this},onAdd:function(t){this._map=t,this._canvas||this._initCanvas(),t._panes.overlayPane.appendChild(this._canvas),t.on("moveend",this._reset,this),t.options.zoomAnimation&&L.Browser.any3d&&t.on("zoomanim",this._animateZoom,this),this._reset()},onRemove:function(t){t.getPanes().overlayPane.removeChild(this._canvas),t.off("moveend",this._reset,this),t.options.zoomAnimation&&t.off("zoomanim",this._animateZoom,this)},addTo:function(t){return t.addLayer(this),this},_initCanvas:function(){var t=this._canvas=L.DomUtil.create("canvas","leaflet-heatmap-layer"),i=this._map.getSize();t.width=i.x,t.height=i.y;var a=this._map.options.zoomAnimation&&L.Browser.any3d;L.DomUtil.addClass(t,"leaflet-zoom-"+(a?"animated":"hide")),this._heat=simpleheat(t),this._updateOptions()},_updateOptions:function(){this._heat.radius(this.options.radius||this._heat.defaultRadius,this.options.blur),this.options.gradient&&this._heat.gradient(this.options.gradient),this.options.max&&this._heat.max(this.options.max)},_reset:function(){var t=this._map.containerPointToLayerPoint([0,0]);L.DomUtil.setPosition(this._canvas,t);var i=this._map.getSize();this._heat._width!==i.x&&(this._canvas.width=this._heat._width=i.x),this._heat._height!==i.y&&(this._canvas.height=this._heat._height=i.y),this._redraw()},_redraw:function(){var t,i,a,e,s,n,h,o,r,d=[],_=this._heat._r,l=this._map.getSize(),m=new L.LatLngBounds(this._map.containerPointToLatLng(L.point([-_,-_])),this._map.containerPointToLatLng(l.add([_,_]))),c=void 0===this.options.maxZoom?this._map.getMaxZoom():this.options.maxZoom,u=1/Math.pow(2,Math.max(0,Math.min(c-this._map.getZoom(),12))),g=_/2,f=[],p=this._map._getMapPanePos(),v=p.x%g,w=p.y%g;for(t=0,i=this._latlngs.length;i>t;t++)m.contains(this._latlngs[t])&&(a=this._map.latLngToContainerPoint(this._latlngs[t]),s=Math.floor((a.x-v)/g)+2,n=Math.floor((a.y-w)/g)+2,r=(this._latlngs[t].alt||1)*u,f[n]=f[n]||[],e=f[n][s],e?(e[0]=(e[0]*e[2]+a.x*r)/(e[2]+r),e[1]=(e[1]*e[2]+a.y*r)/(e[2]+r),e[2]+=r):f[n][s]=[a.x,a.y,r]);for(t=0,i=f.length;i>t;t++)if(f[t])for(h=0,o=f[t].length;o>h;h++)e=f[t][h],e&&d.push([Math.round(e[0]),Math.round(e[1]),Math.min(e[2],1)]);this._heat.data(d).draw(),this._frame=null},_animateZoom:function(t){var i=this._map.getZoomScale(t.zoom),a=this._map._getCenterOffset(t.center)._multiplyBy(-i).subtract(this._map._getMapPanePos());this._canvas.style[L.DomUtil.TRANSFORM]=L.DomUtil.getTranslateString(a)+" scale("+i+")"}}),L.heatLayer=function(t,i){return new L.HeatLayer(t,i)};
@@ -0,0 +1,9 @@
1
+ /*
2
+ Leaflet.label, a plugin that adds labels to markers and vectors for Leaflet powered maps.
3
+ (c) 2012-2013, Jacob Toye, Smartrak
4
+
5
+ https://github.com/Leaflet/Leaflet.label
6
+ http://leafletjs.com
7
+ https://github.com/jacobtoye
8
+ */
9
+ (function(){L.labelVersion="0.2.2-dev",L.Label=L.Class.extend({includes:L.Mixin.Events,options:{className:"",clickable:!1,direction:"right",noHide:!1,offset:[12,-15],opacity:1,zoomAnimation:!0},initialize:function(t,e){L.setOptions(this,t),this._source=e,this._animated=L.Browser.any3d&&this.options.zoomAnimation,this._isOpen=!1},onAdd:function(t){this._map=t,this._pane=this._source instanceof L.Marker?t._panes.markerPane:t._panes.popupPane,this._container||this._initLayout(),this._pane.appendChild(this._container),this._initInteraction(),this._update(),this.setOpacity(this.options.opacity),t.on("moveend",this._onMoveEnd,this).on("viewreset",this._onViewReset,this),this._animated&&t.on("zoomanim",this._zoomAnimation,this),L.Browser.touch&&!this.options.noHide&&L.DomEvent.on(this._container,"click",this.close,this)},onRemove:function(t){this._pane.removeChild(this._container),t.off({zoomanim:this._zoomAnimation,moveend:this._onMoveEnd,viewreset:this._onViewReset},this),this._removeInteraction(),this._map=null},setLatLng:function(t){return this._latlng=L.latLng(t),this._map&&this._updatePosition(),this},setContent:function(t){return this._previousContent=this._content,this._content=t,this._updateContent(),this},close:function(){var t=this._map;t&&(L.Browser.touch&&!this.options.noHide&&L.DomEvent.off(this._container,"click",this.close),t.removeLayer(this))},updateZIndex:function(t){this._zIndex=t,this._container&&this._zIndex&&(this._container.style.zIndex=t)},setOpacity:function(t){this.options.opacity=t,this._container&&L.DomUtil.setOpacity(this._container,t)},_initLayout:function(){this._container=L.DomUtil.create("div","leaflet-label "+this.options.className+" leaflet-zoom-animated"),this.updateZIndex(this._zIndex)},_update:function(){this._map&&(this._container.style.visibility="hidden",this._updateContent(),this._updatePosition(),this._container.style.visibility="")},_updateContent:function(){this._content&&this._map&&this._prevContent!==this._content&&"string"==typeof this._content&&(this._container.innerHTML=this._content,this._prevContent=this._content,this._labelWidth=this._container.offsetWidth)},_updatePosition:function(){var t=this._map.latLngToLayerPoint(this._latlng);this._setPosition(t)},_setPosition:function(t){var e=this._map,i=this._container,n=e.latLngToContainerPoint(e.getCenter()),o=e.layerPointToContainerPoint(t),s=this.options.direction,a=this._labelWidth,l=L.point(this.options.offset);"right"===s||"auto"===s&&o.x<n.x?(L.DomUtil.addClass(i,"leaflet-label-right"),L.DomUtil.removeClass(i,"leaflet-label-left"),t=t.add(l)):(L.DomUtil.addClass(i,"leaflet-label-left"),L.DomUtil.removeClass(i,"leaflet-label-right"),t=t.add(L.point(-l.x-a,l.y))),L.DomUtil.setPosition(i,t)},_zoomAnimation:function(t){var e=this._map._latLngToNewLayerPoint(this._latlng,t.zoom,t.center).round();this._setPosition(e)},_onMoveEnd:function(){this._animated&&"auto"!==this.options.direction||this._updatePosition()},_onViewReset:function(t){t&&t.hard&&this._update()},_initInteraction:function(){if(this.options.clickable){var t=this._container,e=["dblclick","mousedown","mouseover","mouseout","contextmenu"];L.DomUtil.addClass(t,"leaflet-clickable"),L.DomEvent.on(t,"click",this._onMouseClick,this);for(var i=0;e.length>i;i++)L.DomEvent.on(t,e[i],this._fireMouseEvent,this)}},_removeInteraction:function(){if(this.options.clickable){var t=this._container,e=["dblclick","mousedown","mouseover","mouseout","contextmenu"];L.DomUtil.removeClass(t,"leaflet-clickable"),L.DomEvent.off(t,"click",this._onMouseClick,this);for(var i=0;e.length>i;i++)L.DomEvent.off(t,e[i],this._fireMouseEvent,this)}},_onMouseClick:function(t){this.hasEventListeners(t.type)&&L.DomEvent.stopPropagation(t),this.fire(t.type,{originalEvent:t})},_fireMouseEvent:function(t){this.fire(t.type,{originalEvent:t}),"contextmenu"===t.type&&this.hasEventListeners(t.type)&&L.DomEvent.preventDefault(t),"mousedown"!==t.type?L.DomEvent.stopPropagation(t):L.DomEvent.preventDefault(t)}}),L.BaseMarkerMethods={showLabel:function(){return this.label&&this._map&&(this.label.setLatLng(this._latlng),this._map.showLabel(this.label)),this},hideLabel:function(){return this.label&&this.label.close(),this},setLabelNoHide:function(t){this._labelNoHide!==t&&(this._labelNoHide=t,t?(this._removeLabelRevealHandlers(),this.showLabel()):(this._addLabelRevealHandlers(),this.hideLabel()))},bindLabel:function(t,e){var i=this.options.icon?this.options.icon.options.labelAnchor:this.options.labelAnchor,n=L.point(i)||L.point(0,0);return n=n.add(L.Label.prototype.options.offset),e&&e.offset&&(n=n.add(e.offset)),e=L.Util.extend({offset:n},e),this._labelNoHide=e.noHide,this.label||(this._labelNoHide||this._addLabelRevealHandlers(),this.on("remove",this.hideLabel,this).on("move",this._moveLabel,this).on("add",this._onMarkerAdd,this),this._hasLabelHandlers=!0),this.label=new L.Label(e,this).setContent(t),this},unbindLabel:function(){return this.label&&(this.hideLabel(),this.label=null,this._hasLabelHandlers&&(this._labelNoHide||this._removeLabelRevealHandlers(),this.off("remove",this.hideLabel,this).off("move",this._moveLabel,this).off("add",this._onMarkerAdd,this)),this._hasLabelHandlers=!1),this},updateLabelContent:function(t){this.label&&this.label.setContent(t)},getLabel:function(){return this.label},_onMarkerAdd:function(){this._labelNoHide&&this.showLabel()},_addLabelRevealHandlers:function(){this.on("mouseover",this.showLabel,this).on("mouseout",this.hideLabel,this),L.Browser.touch&&this.on("click",this.showLabel,this)},_removeLabelRevealHandlers:function(){this.off("mouseover",this.showLabel,this).off("mouseout",this.hideLabel,this),L.Browser.touch&&this.off("click",this.showLabel,this)},_moveLabel:function(t){this.label.setLatLng(t.latlng)}},L.Icon.Default.mergeOptions({labelAnchor:new L.Point(9,-20)}),L.Marker.mergeOptions({icon:new L.Icon.Default}),L.Marker.include(L.BaseMarkerMethods),L.Marker.include({_originalUpdateZIndex:L.Marker.prototype._updateZIndex,_updateZIndex:function(t){var e=this._zIndex+t;this._originalUpdateZIndex(t),this.label&&this.label.updateZIndex(e)},_originalSetOpacity:L.Marker.prototype.setOpacity,setOpacity:function(t,e){this.options.labelHasSemiTransparency=e,this._originalSetOpacity(t)},_originalUpdateOpacity:L.Marker.prototype._updateOpacity,_updateOpacity:function(){var t=0===this.options.opacity?0:1;this._originalUpdateOpacity(),this.label&&this.label.setOpacity(this.options.labelHasSemiTransparency?this.options.opacity:t)},_originalSetLatLng:L.Marker.prototype.setLatLng,setLatLng:function(t){return this.label&&!this._labelNoHide&&this.hideLabel(),this._originalSetLatLng(t)}}),L.CircleMarker.mergeOptions({labelAnchor:new L.Point(0,0)}),L.CircleMarker.include(L.BaseMarkerMethods),L.Path.include({bindLabel:function(t,e){return this.label&&this.label.options===e||(this.label=new L.Label(e,this)),this.label.setContent(t),this._showLabelAdded||(this.on("mouseover",this._showLabel,this).on("mousemove",this._moveLabel,this).on("mouseout remove",this._hideLabel,this),L.Browser.touch&&this.on("click",this._showLabel,this),this._showLabelAdded=!0),this},unbindLabel:function(){return this.label&&(this._hideLabel(),this.label=null,this._showLabelAdded=!1,this.off("mouseover",this._showLabel,this).off("mousemove",this._moveLabel,this).off("mouseout remove",this._hideLabel,this)),this},updateLabelContent:function(t){this.label&&this.label.setContent(t)},_showLabel:function(t){this.label.setLatLng(t.latlng),this._map.showLabel(this.label)},_moveLabel:function(t){this.label.setLatLng(t.latlng)},_hideLabel:function(){this.label.close()}}),L.Map.include({showLabel:function(t){return this.addLayer(t)}}),L.FeatureGroup.include({clearLayers:function(){return this.unbindLabel(),this.eachLayer(this.removeLayer,this),this},bindLabel:function(t,e){return this.invoke("bindLabel",t,e)},unbindLabel:function(){return this.invoke("unbindLabel")},updateLabelContent:function(t){this.invoke("updateLabelContent",t)}})})(this,document);
@@ -0,0 +1,6 @@
1
+ /*
2
+ Leaflet.markercluster, Provides Beautiful Animated Marker Clustering functionality for Leaflet, a JS library for interactive maps.
3
+ https://github.com/Leaflet/Leaflet.markercluster
4
+ (c) 2012-2013, Dave Leaver, smartrak
5
+ */
6
+ !function(t,e){L.MarkerClusterGroup=L.FeatureGroup.extend({options:{maxClusterRadius:80,iconCreateFunction:null,spiderfyOnMaxZoom:!0,showCoverageOnHover:!0,zoomToBoundsOnClick:!0,singleMarkerMode:!1,disableClusteringAtZoom:null,removeOutsideVisibleBounds:!0,animateAddingMarkers:!1,spiderfyDistanceMultiplier:1,polygonOptions:{}},initialize:function(t){L.Util.setOptions(this,t),this.options.iconCreateFunction||(this.options.iconCreateFunction=this._defaultIconCreateFunction),this._featureGroup=L.featureGroup(),this._featureGroup.on(L.FeatureGroup.EVENTS,this._propagateEvent,this),this._nonPointGroup=L.featureGroup(),this._nonPointGroup.on(L.FeatureGroup.EVENTS,this._propagateEvent,this),this._inZoomAnimation=0,this._needsClustering=[],this._needsRemoving=[],this._currentShownBounds=null,this._queue=[]},addLayer:function(t){if(t instanceof L.LayerGroup){var e=[];for(var i in t._layers)e.push(t._layers[i]);return this.addLayers(e)}if(!t.getLatLng)return this._nonPointGroup.addLayer(t),this;if(!this._map)return this._needsClustering.push(t),this;if(this.hasLayer(t))return this;this._unspiderfy&&this._unspiderfy(),this._addLayer(t,this._maxZoom);var n=t,s=this._map.getZoom();if(t.__parent)for(;n.__parent._zoom>=s;)n=n.__parent;return this._currentShownBounds.contains(n.getLatLng())&&(this.options.animateAddingMarkers?this._animationAddLayer(t,n):this._animationAddLayerNonAnimated(t,n)),this},removeLayer:function(t){if(t instanceof L.LayerGroup){var e=[];for(var i in t._layers)e.push(t._layers[i]);return this.removeLayers(e)}return t.getLatLng?this._map?t.__parent?(this._unspiderfy&&(this._unspiderfy(),this._unspiderfyLayer(t)),this._removeLayer(t,!0),this._featureGroup.hasLayer(t)&&(this._featureGroup.removeLayer(t),t.setOpacity&&t.setOpacity(1)),this):this:(!this._arraySplice(this._needsClustering,t)&&this.hasLayer(t)&&this._needsRemoving.push(t),this):(this._nonPointGroup.removeLayer(t),this)},addLayers:function(t){var e,i,n,s=this._map,r=this._featureGroup,o=this._nonPointGroup;for(e=0,i=t.length;i>e;e++)if(n=t[e],n.getLatLng){if(!this.hasLayer(n))if(s){if(this._addLayer(n,this._maxZoom),n.__parent&&2===n.__parent.getChildCount()){var a=n.__parent.getAllChildMarkers(),h=a[0]===n?a[1]:a[0];r.removeLayer(h)}}else this._needsClustering.push(n)}else o.addLayer(n);return s&&(r.eachLayer(function(t){t instanceof L.MarkerCluster&&t._iconNeedsUpdate&&t._updateIcon()}),this._topClusterLevel._recursivelyAddChildrenToMap(null,this._zoom,this._currentShownBounds)),this},removeLayers:function(t){var e,i,n,s=this._featureGroup,r=this._nonPointGroup;if(!this._map){for(e=0,i=t.length;i>e;e++)n=t[e],this._arraySplice(this._needsClustering,n),r.removeLayer(n);return this}for(e=0,i=t.length;i>e;e++)n=t[e],n.__parent?(this._removeLayer(n,!0,!0),s.hasLayer(n)&&(s.removeLayer(n),n.setOpacity&&n.setOpacity(1))):r.removeLayer(n);return this._topClusterLevel._recursivelyAddChildrenToMap(null,this._zoom,this._currentShownBounds),s.eachLayer(function(t){t instanceof L.MarkerCluster&&t._updateIcon()}),this},clearLayers:function(){return this._map||(this._needsClustering=[],delete this._gridClusters,delete this._gridUnclustered),this._noanimationUnspiderfy&&this._noanimationUnspiderfy(),this._featureGroup.clearLayers(),this._nonPointGroup.clearLayers(),this.eachLayer(function(t){delete t.__parent}),this._map&&this._generateInitialClusters(),this},getBounds:function(){var t=new L.LatLngBounds;if(this._topClusterLevel)t.extend(this._topClusterLevel._bounds);else for(var e=this._needsClustering.length-1;e>=0;e--)t.extend(this._needsClustering[e].getLatLng());return t.extend(this._nonPointGroup.getBounds()),t},eachLayer:function(t,e){var i,n=this._needsClustering.slice();for(this._topClusterLevel&&this._topClusterLevel.getAllChildMarkers(n),i=n.length-1;i>=0;i--)t.call(e,n[i]);this._nonPointGroup.eachLayer(t,e)},getLayers:function(){var t=[];return this.eachLayer(function(e){t.push(e)}),t},getLayer:function(t){var e=null;return this.eachLayer(function(i){L.stamp(i)===t&&(e=i)}),e},hasLayer:function(t){if(!t)return!1;var e,i=this._needsClustering;for(e=i.length-1;e>=0;e--)if(i[e]===t)return!0;for(i=this._needsRemoving,e=i.length-1;e>=0;e--)if(i[e]===t)return!1;return!(!t.__parent||t.__parent._group!==this)||this._nonPointGroup.hasLayer(t)},zoomToShowLayer:function(t,e){var i=function(){if((t._icon||t.__parent._icon)&&!this._inZoomAnimation)if(this._map.off("moveend",i,this),this.off("animationend",i,this),t._icon)e();else if(t.__parent._icon){var n=function(){this.off("spiderfied",n,this),e()};this.on("spiderfied",n,this),t.__parent.spiderfy()}};t._icon&&this._map.getBounds().contains(t.getLatLng())?e():t.__parent._zoom<this._map.getZoom()?(this._map.on("moveend",i,this),this._map.panTo(t.getLatLng())):(this._map.on("moveend",i,this),this.on("animationend",i,this),this._map.setView(t.getLatLng(),t.__parent._zoom+1),t.__parent.zoomToBounds())},onAdd:function(t){this._map=t;var e,i,n;if(!isFinite(this._map.getMaxZoom()))throw"Map has no maxZoom specified";for(this._featureGroup.onAdd(t),this._nonPointGroup.onAdd(t),this._gridClusters||this._generateInitialClusters(),e=0,i=this._needsRemoving.length;i>e;e++)n=this._needsRemoving[e],this._removeLayer(n,!0);for(this._needsRemoving=[],e=0,i=this._needsClustering.length;i>e;e++)n=this._needsClustering[e],n.getLatLng?n.__parent||this._addLayer(n,this._maxZoom):this._featureGroup.addLayer(n);this._needsClustering=[],this._map.on("zoomend",this._zoomEnd,this),this._map.on("moveend",this._moveEnd,this),this._spiderfierOnAdd&&this._spiderfierOnAdd(),this._bindEvents(),this._zoom=this._map.getZoom(),this._currentShownBounds=this._getExpandedVisibleBounds(),this._topClusterLevel._recursivelyAddChildrenToMap(null,this._zoom,this._currentShownBounds)},onRemove:function(t){t.off("zoomend",this._zoomEnd,this),t.off("moveend",this._moveEnd,this),this._unbindEvents(),this._map._mapPane.className=this._map._mapPane.className.replace(" leaflet-cluster-anim",""),this._spiderfierOnRemove&&this._spiderfierOnRemove(),this._hideCoverage(),this._featureGroup.onRemove(t),this._nonPointGroup.onRemove(t),this._featureGroup.clearLayers(),this._map=null},getVisibleParent:function(t){for(var e=t;e&&!e._icon;)e=e.__parent;return e||null},_arraySplice:function(t,e){for(var i=t.length-1;i>=0;i--)if(t[i]===e)return t.splice(i,1),!0},_removeLayer:function(t,e,i){var n=this._gridClusters,s=this._gridUnclustered,r=this._featureGroup,o=this._map;if(e)for(var a=this._maxZoom;a>=0&&s[a].removeObject(t,o.project(t.getLatLng(),a));a--);var h,_=t.__parent,u=_._markers;for(this._arraySplice(u,t);_&&(_._childCount--,!(_._zoom<0));)e&&_._childCount<=1?(h=_._markers[0]===t?_._markers[1]:_._markers[0],n[_._zoom].removeObject(_,o.project(_._cLatLng,_._zoom)),s[_._zoom].addObject(h,o.project(h.getLatLng(),_._zoom)),this._arraySplice(_.__parent._childClusters,_),_.__parent._markers.push(h),h.__parent=_.__parent,_._icon&&(r.removeLayer(_),i||r.addLayer(h))):(_._recalculateBounds(),i&&_._icon||_._updateIcon()),_=_.__parent;delete t.__parent},_isOrIsParent:function(t,e){for(;e;){if(t===e)return!0;e=e.parentNode}return!1},_propagateEvent:function(t){if(t.layer instanceof L.MarkerCluster){if(t.originalEvent&&this._isOrIsParent(t.layer._icon,t.originalEvent.relatedTarget))return;t.type="cluster"+t.type}this.fire(t.type,t)},_defaultIconCreateFunction:function(t){var e=t.getChildCount(),i=" marker-cluster-";return i+=10>e?"small":100>e?"medium":"large",new L.DivIcon({html:"<div><span>"+e+"</span></div>",className:"marker-cluster"+i,iconSize:new L.Point(40,40)})},_bindEvents:function(){var t=this._map,e=this.options.spiderfyOnMaxZoom,i=this.options.showCoverageOnHover,n=this.options.zoomToBoundsOnClick;(e||n)&&this.on("clusterclick",this._zoomOrSpiderfy,this),i&&(this.on("clustermouseover",this._showCoverage,this),this.on("clustermouseout",this._hideCoverage,this),t.on("zoomend",this._hideCoverage,this))},_zoomOrSpiderfy:function(t){var e=this._map;e.getMaxZoom()===e.getZoom()?this.options.spiderfyOnMaxZoom&&t.layer.spiderfy():this.options.zoomToBoundsOnClick&&t.layer.zoomToBounds(),t.originalEvent&&13===t.originalEvent.keyCode&&e._container.focus()},_showCoverage:function(t){var e=this._map;this._inZoomAnimation||(this._shownPolygon&&e.removeLayer(this._shownPolygon),t.layer.getChildCount()>2&&t.layer!==this._spiderfied&&(this._shownPolygon=new L.Polygon(t.layer.getConvexHull(),this.options.polygonOptions),e.addLayer(this._shownPolygon)))},_hideCoverage:function(){this._shownPolygon&&(this._map.removeLayer(this._shownPolygon),this._shownPolygon=null)},_unbindEvents:function(){var t=this.options.spiderfyOnMaxZoom,e=this.options.showCoverageOnHover,i=this.options.zoomToBoundsOnClick,n=this._map;(t||i)&&this.off("clusterclick",this._zoomOrSpiderfy,this),e&&(this.off("clustermouseover",this._showCoverage,this),this.off("clustermouseout",this._hideCoverage,this),n.off("zoomend",this._hideCoverage,this))},_zoomEnd:function(){this._map&&(this._mergeSplitClusters(),this._zoom=this._map._zoom,this._currentShownBounds=this._getExpandedVisibleBounds())},_moveEnd:function(){if(!this._inZoomAnimation){var t=this._getExpandedVisibleBounds();this._topClusterLevel._recursivelyRemoveChildrenFromMap(this._currentShownBounds,this._zoom,t),this._topClusterLevel._recursivelyAddChildrenToMap(null,this._map._zoom,t),this._currentShownBounds=t}},_generateInitialClusters:function(){var t=this._map.getMaxZoom(),e=this.options.maxClusterRadius;this.options.disableClusteringAtZoom&&(t=this.options.disableClusteringAtZoom-1),this._maxZoom=t,this._gridClusters={},this._gridUnclustered={};for(var i=t;i>=0;i--)this._gridClusters[i]=new L.DistanceGrid(e),this._gridUnclustered[i]=new L.DistanceGrid(e);this._topClusterLevel=new L.MarkerCluster(this,-1)},_addLayer:function(t,e){var i,n,s=this._gridClusters,r=this._gridUnclustered;for(this.options.singleMarkerMode&&(t.options.icon=this.options.iconCreateFunction({getChildCount:function(){return 1},getAllChildMarkers:function(){return[t]}}));e>=0;e--){i=this._map.project(t.getLatLng(),e);var o=s[e].getNearObject(i);if(o)return o._addChild(t),t.__parent=o,void 0;if(o=r[e].getNearObject(i)){var a=o.__parent;a&&this._removeLayer(o,!1);var h=new L.MarkerCluster(this,e,o,t);s[e].addObject(h,this._map.project(h._cLatLng,e)),o.__parent=h,t.__parent=h;var _=h;for(n=e-1;n>a._zoom;n--)_=new L.MarkerCluster(this,n,_),s[n].addObject(_,this._map.project(o.getLatLng(),n));for(a._addChild(_),n=e;n>=0&&r[n].removeObject(o,this._map.project(o.getLatLng(),n));n--);return}r[e].addObject(t,i)}this._topClusterLevel._addChild(t),t.__parent=this._topClusterLevel},_enqueue:function(t){this._queue.push(t),this._queueTimeout||(this._queueTimeout=setTimeout(L.bind(this._processQueue,this),300))},_processQueue:function(){for(var t=0;t<this._queue.length;t++)this._queue[t].call(this);this._queue.length=0,clearTimeout(this._queueTimeout),this._queueTimeout=null},_mergeSplitClusters:function(){this._processQueue(),this._zoom<this._map._zoom&&this._currentShownBounds.contains(this._getExpandedVisibleBounds())?(this._animationStart(),this._topClusterLevel._recursivelyRemoveChildrenFromMap(this._currentShownBounds,this._zoom,this._getExpandedVisibleBounds()),this._animationZoomIn(this._zoom,this._map._zoom)):this._zoom>this._map._zoom?(this._animationStart(),this._animationZoomOut(this._zoom,this._map._zoom)):this._moveEnd()},_getExpandedVisibleBounds:function(){if(!this.options.removeOutsideVisibleBounds)return this.getBounds();var t=this._map,e=t.getBounds(),i=e._southWest,n=e._northEast,s=L.Browser.mobile?0:Math.abs(i.lat-n.lat),r=L.Browser.mobile?0:Math.abs(i.lng-n.lng);return new L.LatLngBounds(new L.LatLng(i.lat-s,i.lng-r,!0),new L.LatLng(n.lat+s,n.lng+r,!0))},_animationAddLayerNonAnimated:function(t,e){if(e===t)this._featureGroup.addLayer(t);else if(2===e._childCount){e._addToMap();var i=e.getAllChildMarkers();this._featureGroup.removeLayer(i[0]),this._featureGroup.removeLayer(i[1])}else e._updateIcon()}}),L.MarkerClusterGroup.include(L.DomUtil.TRANSITION?{_animationStart:function(){this._map._mapPane.className+=" leaflet-cluster-anim",this._inZoomAnimation++},_animationEnd:function(){this._map&&(this._map._mapPane.className=this._map._mapPane.className.replace(" leaflet-cluster-anim","")),this._inZoomAnimation--,this.fire("animationend")},_animationZoomIn:function(t,e){var i,n=this._getExpandedVisibleBounds(),s=this._featureGroup;this._topClusterLevel._recursively(n,t,0,function(r){var o,a=r._latlng,h=r._markers;for(n.contains(a)||(a=null),r._isSingleParent()&&t+1===e?(s.removeLayer(r),r._recursivelyAddChildrenToMap(null,e,n)):(r.setOpacity(0),r._recursivelyAddChildrenToMap(a,e,n)),i=h.length-1;i>=0;i--)o=h[i],n.contains(o._latlng)||s.removeLayer(o)}),this._forceLayout(),this._topClusterLevel._recursivelyBecomeVisible(n,e),s.eachLayer(function(t){t instanceof L.MarkerCluster||!t._icon||t.setOpacity(1)}),this._topClusterLevel._recursively(n,t,e,function(t){t._recursivelyRestoreChildPositions(e)}),this._enqueue(function(){this._topClusterLevel._recursively(n,t,0,function(t){s.removeLayer(t),t.setOpacity(1)}),this._animationEnd()})},_animationZoomOut:function(t,e){this._animationZoomOutSingle(this._topClusterLevel,t-1,e),this._topClusterLevel._recursivelyAddChildrenToMap(null,e,this._getExpandedVisibleBounds()),this._topClusterLevel._recursivelyRemoveChildrenFromMap(this._currentShownBounds,t,this._getExpandedVisibleBounds())},_animationZoomOutSingle:function(t,e,i){var n=this._getExpandedVisibleBounds();t._recursivelyAnimateChildrenInAndAddSelfToMap(n,e+1,i);var s=this;this._forceLayout(),t._recursivelyBecomeVisible(n,i),this._enqueue(function(){if(1===t._childCount){var r=t._markers[0];r.setLatLng(r.getLatLng()),r.setOpacity&&r.setOpacity(1)}else t._recursively(n,i,0,function(t){t._recursivelyRemoveChildrenFromMap(n,e+1)});s._animationEnd()})},_animationAddLayer:function(t,e){var i=this,n=this._featureGroup;n.addLayer(t),e!==t&&(e._childCount>2?(e._updateIcon(),this._forceLayout(),this._animationStart(),t._setPos(this._map.latLngToLayerPoint(e.getLatLng())),t.setOpacity(0),this._enqueue(function(){n.removeLayer(t),t.setOpacity(1),i._animationEnd()})):(this._forceLayout(),i._animationStart(),i._animationZoomOutSingle(e,this._map.getMaxZoom(),this._map.getZoom())))},_forceLayout:function(){L.Util.falseFn(e.body.offsetWidth)}}:{_animationStart:function(){},_animationZoomIn:function(t,e){this._topClusterLevel._recursivelyRemoveChildrenFromMap(this._currentShownBounds,t),this._topClusterLevel._recursivelyAddChildrenToMap(null,e,this._getExpandedVisibleBounds())},_animationZoomOut:function(t,e){this._topClusterLevel._recursivelyRemoveChildrenFromMap(this._currentShownBounds,t),this._topClusterLevel._recursivelyAddChildrenToMap(null,e,this._getExpandedVisibleBounds())},_animationAddLayer:function(t,e){this._animationAddLayerNonAnimated(t,e)}}),L.markerClusterGroup=function(t){return new L.MarkerClusterGroup(t)},L.MarkerCluster=L.Marker.extend({initialize:function(t,e,i,n){L.Marker.prototype.initialize.call(this,i?i._cLatLng||i.getLatLng():new L.LatLng(0,0),{icon:this}),this._group=t,this._zoom=e,this._markers=[],this._childClusters=[],this._childCount=0,this._iconNeedsUpdate=!0,this._bounds=new L.LatLngBounds,i&&this._addChild(i),n&&this._addChild(n)},getAllChildMarkers:function(t){t=t||[];for(var e=this._childClusters.length-1;e>=0;e--)this._childClusters[e].getAllChildMarkers(t);for(var i=this._markers.length-1;i>=0;i--)t.push(this._markers[i]);return t},getChildCount:function(){return this._childCount},zoomToBounds:function(){for(var t,e=this._childClusters.slice(),i=this._group._map,n=i.getBoundsZoom(this._bounds),s=this._zoom+1,r=i.getZoom();e.length>0&&n>s;){s++;var o=[];for(t=0;t<e.length;t++)o=o.concat(e[t]._childClusters);e=o}n>s?this._group._map.setView(this._latlng,s):r>=n?this._group._map.setView(this._latlng,r+1):this._group._map.fitBounds(this._bounds)},getBounds:function(){var t=new L.LatLngBounds;return t.extend(this._bounds),t},_updateIcon:function(){this._iconNeedsUpdate=!0,this._icon&&this.setIcon(this)},createIcon:function(){return this._iconNeedsUpdate&&(this._iconObj=this._group.options.iconCreateFunction(this),this._iconNeedsUpdate=!1),this._iconObj.createIcon()},createShadow:function(){return this._iconObj.createShadow()},_addChild:function(t,e){this._iconNeedsUpdate=!0,this._expandBounds(t),t instanceof L.MarkerCluster?(e||(this._childClusters.push(t),t.__parent=this),this._childCount+=t._childCount):(e||this._markers.push(t),this._childCount++),this.__parent&&this.__parent._addChild(t,!0)},_expandBounds:function(t){var e,i=t._wLatLng||t._latlng;t instanceof L.MarkerCluster?(this._bounds.extend(t._bounds),e=t._childCount):(this._bounds.extend(i),e=1),this._cLatLng||(this._cLatLng=t._cLatLng||i);var n=this._childCount+e;this._wLatLng?(this._wLatLng.lat=(i.lat*e+this._wLatLng.lat*this._childCount)/n,this._wLatLng.lng=(i.lng*e+this._wLatLng.lng*this._childCount)/n):this._latlng=this._wLatLng=new L.LatLng(i.lat,i.lng)},_addToMap:function(t){t&&(this._backupLatlng=this._latlng,this.setLatLng(t)),this._group._featureGroup.addLayer(this)},_recursivelyAnimateChildrenIn:function(t,e,i){this._recursively(t,0,i-1,function(t){var i,n,s=t._markers;for(i=s.length-1;i>=0;i--)n=s[i],n._icon&&(n._setPos(e),n.setOpacity(0))},function(t){var i,n,s=t._childClusters;for(i=s.length-1;i>=0;i--)n=s[i],n._icon&&(n._setPos(e),n.setOpacity(0))})},_recursivelyAnimateChildrenInAndAddSelfToMap:function(t,e,i){this._recursively(t,i,0,function(n){n._recursivelyAnimateChildrenIn(t,n._group._map.latLngToLayerPoint(n.getLatLng()).round(),e),n._isSingleParent()&&e-1===i?(n.setOpacity(1),n._recursivelyRemoveChildrenFromMap(t,e)):n.setOpacity(0),n._addToMap()})},_recursivelyBecomeVisible:function(t,e){this._recursively(t,0,e,null,function(t){t.setOpacity(1)})},_recursivelyAddChildrenToMap:function(t,e,i){this._recursively(i,-1,e,function(n){if(e!==n._zoom)for(var s=n._markers.length-1;s>=0;s--){var r=n._markers[s];i.contains(r._latlng)&&(t&&(r._backupLatlng=r.getLatLng(),r.setLatLng(t),r.setOpacity&&r.setOpacity(0)),n._group._featureGroup.addLayer(r))}},function(e){e._addToMap(t)})},_recursivelyRestoreChildPositions:function(t){for(var e=this._markers.length-1;e>=0;e--){var i=this._markers[e];i._backupLatlng&&(i.setLatLng(i._backupLatlng),delete i._backupLatlng)}if(t-1===this._zoom)for(var n=this._childClusters.length-1;n>=0;n--)this._childClusters[n]._restorePosition();else for(var s=this._childClusters.length-1;s>=0;s--)this._childClusters[s]._recursivelyRestoreChildPositions(t)},_restorePosition:function(){this._backupLatlng&&(this.setLatLng(this._backupLatlng),delete this._backupLatlng)},_recursivelyRemoveChildrenFromMap:function(t,e,i){var n,s;this._recursively(t,-1,e-1,function(t){for(s=t._markers.length-1;s>=0;s--)n=t._markers[s],i&&i.contains(n._latlng)||(t._group._featureGroup.removeLayer(n),n.setOpacity&&n.setOpacity(1))},function(t){for(s=t._childClusters.length-1;s>=0;s--)n=t._childClusters[s],i&&i.contains(n._latlng)||(t._group._featureGroup.removeLayer(n),n.setOpacity&&n.setOpacity(1))})},_recursively:function(t,e,i,n,s){var r,o,a=this._childClusters,h=this._zoom;if(e>h)for(r=a.length-1;r>=0;r--)o=a[r],t.intersects(o._bounds)&&o._recursively(t,e,i,n,s);else if(n&&n(this),s&&this._zoom===i&&s(this),i>h)for(r=a.length-1;r>=0;r--)o=a[r],t.intersects(o._bounds)&&o._recursively(t,e,i,n,s)},_recalculateBounds:function(){var t,e=this._markers,i=this._childClusters;for(this._bounds=new L.LatLngBounds,delete this._wLatLng,t=e.length-1;t>=0;t--)this._expandBounds(e[t]);for(t=i.length-1;t>=0;t--)this._expandBounds(i[t])},_isSingleParent:function(){return this._childClusters.length>0&&this._childClusters[0]._childCount===this._childCount}}),L.DistanceGrid=function(t){this._cellSize=t,this._sqCellSize=t*t,this._grid={},this._objectPoint={}},L.DistanceGrid.prototype={addObject:function(t,e){var i=this._getCoord(e.x),n=this._getCoord(e.y),s=this._grid,r=s[n]=s[n]||{},o=r[i]=r[i]||[],a=L.Util.stamp(t);this._objectPoint[a]=e,o.push(t)},updateObject:function(t,e){this.removeObject(t),this.addObject(t,e)},removeObject:function(t,e){var i,n,s=this._getCoord(e.x),r=this._getCoord(e.y),o=this._grid,a=o[r]=o[r]||{},h=a[s]=a[s]||[];for(delete this._objectPoint[L.Util.stamp(t)],i=0,n=h.length;n>i;i++)if(h[i]===t)return h.splice(i,1),1===n&&delete a[s],!0},eachObject:function(t,e){var i,n,s,r,o,a,h,_=this._grid;for(i in _){o=_[i];for(n in o)for(a=o[n],s=0,r=a.length;r>s;s++)h=t.call(e,a[s]),h&&(s--,r--)}},getNearObject:function(t){var e,i,n,s,r,o,a,h,_=this._getCoord(t.x),u=this._getCoord(t.y),l=this._objectPoint,d=this._sqCellSize,p=null;for(e=u-1;u+1>=e;e++)if(s=this._grid[e])for(i=_-1;_+1>=i;i++)if(r=s[i])for(n=0,o=r.length;o>n;n++)a=r[n],h=this._sqDist(l[L.Util.stamp(a)],t),d>h&&(d=h,p=a);return p},_getCoord:function(t){return Math.floor(t/this._cellSize)},_sqDist:function(t,e){var i=e.x-t.x,n=e.y-t.y;return i*i+n*n}},function(){L.QuickHull={getDistant:function(t,e){var i=e[1].lat-e[0].lat,n=e[0].lng-e[1].lng;return n*(t.lat-e[0].lat)+i*(t.lng-e[0].lng)},findMostDistantPointFromBaseLine:function(t,e){var i,n,s,r=0,o=null,a=[];for(i=e.length-1;i>=0;i--)n=e[i],s=this.getDistant(n,t),s>0&&(a.push(n),s>r&&(r=s,o=n));return{maxPoint:o,newPoints:a}},buildConvexHull:function(t,e){var i=[],n=this.findMostDistantPointFromBaseLine(t,e);return n.maxPoint?(i=i.concat(this.buildConvexHull([t[0],n.maxPoint],n.newPoints)),i=i.concat(this.buildConvexHull([n.maxPoint,t[1]],n.newPoints))):[t[0]]},getConvexHull:function(t){var e,i=!1,n=!1,s=null,r=null;for(e=t.length-1;e>=0;e--){var o=t[e];(i===!1||o.lat>i)&&(s=o,i=o.lat),(n===!1||o.lat<n)&&(r=o,n=o.lat)}var a=[].concat(this.buildConvexHull([r,s],t),this.buildConvexHull([s,r],t));return a}}}(),L.MarkerCluster.include({getConvexHull:function(){var t,e,i=this.getAllChildMarkers(),n=[];for(e=i.length-1;e>=0;e--)t=i[e].getLatLng(),n.push(t);return L.QuickHull.getConvexHull(n)}}),L.MarkerCluster.include({_2PI:2*Math.PI,_circleFootSeparation:25,_circleStartAngle:Math.PI/6,_spiralFootSeparation:28,_spiralLengthStart:11,_spiralLengthFactor:5,_circleSpiralSwitchover:9,spiderfy:function(){if(this._group._spiderfied!==this&&!this._group._inZoomAnimation){var t,e=this.getAllChildMarkers(),i=this._group,n=i._map,s=n.latLngToLayerPoint(this._latlng);this._group._unspiderfy(),this._group._spiderfied=this,e.length>=this._circleSpiralSwitchover?t=this._generatePointsSpiral(e.length,s):(s.y+=10,t=this._generatePointsCircle(e.length,s)),this._animationSpiderfy(e,t)}},unspiderfy:function(t){this._group._inZoomAnimation||(this._animationUnspiderfy(t),this._group._spiderfied=null)},_generatePointsCircle:function(t,e){var i,n,s=this._group.options.spiderfyDistanceMultiplier*this._circleFootSeparation*(2+t),r=s/this._2PI,o=this._2PI/t,a=[];for(a.length=t,i=t-1;i>=0;i--)n=this._circleStartAngle+i*o,a[i]=new L.Point(e.x+r*Math.cos(n),e.y+r*Math.sin(n))._round();return a},_generatePointsSpiral:function(t,e){var i,n=this._group.options.spiderfyDistanceMultiplier*this._spiralLengthStart,s=this._group.options.spiderfyDistanceMultiplier*this._spiralFootSeparation,r=this._group.options.spiderfyDistanceMultiplier*this._spiralLengthFactor,o=0,a=[];for(a.length=t,i=t-1;i>=0;i--)o+=s/n+5e-4*i,a[i]=new L.Point(e.x+n*Math.cos(o),e.y+n*Math.sin(o))._round(),n+=this._2PI*r/o;return a},_noanimationUnspiderfy:function(){var t,e,i=this._group,n=i._map,s=i._featureGroup,r=this.getAllChildMarkers();for(this.setOpacity(1),e=r.length-1;e>=0;e--)t=r[e],s.removeLayer(t),t._preSpiderfyLatlng&&(t.setLatLng(t._preSpiderfyLatlng),delete t._preSpiderfyLatlng),t.setZIndexOffset&&t.setZIndexOffset(0),t._spiderLeg&&(n.removeLayer(t._spiderLeg),delete t._spiderLeg);i._spiderfied=null}}),L.MarkerCluster.include(L.DomUtil.TRANSITION?{SVG_ANIMATION:function(){return e.createElementNS("http://www.w3.org/2000/svg","animate").toString().indexOf("SVGAnimate")>-1}(),_animationSpiderfy:function(t,i){var n,s,r,o,a=this,h=this._group,_=h._map,u=h._featureGroup,l=_.latLngToLayerPoint(this._latlng);for(n=t.length-1;n>=0;n--)s=t[n],s.setOpacity?(s.setZIndexOffset(1e6),s.setOpacity(0),u.addLayer(s),s._setPos(l)):u.addLayer(s);h._forceLayout(),h._animationStart();var d=L.Path.SVG?0:.3,p=L.Path.SVG_NS;for(n=t.length-1;n>=0;n--)if(o=_.layerPointToLatLng(i[n]),s=t[n],s._preSpiderfyLatlng=s._latlng,s.setLatLng(o),s.setOpacity&&s.setOpacity(1),r=new L.Polyline([a._latlng,o],{weight:1.5,color:"#222",opacity:d}),_.addLayer(r),s._spiderLeg=r,L.Path.SVG&&this.SVG_ANIMATION){var c=r._path.getTotalLength();r._path.setAttribute("stroke-dasharray",c+","+c);var m=e.createElementNS(p,"animate");m.setAttribute("attributeName","stroke-dashoffset"),m.setAttribute("begin","indefinite"),m.setAttribute("from",c),m.setAttribute("to",0),m.setAttribute("dur",.25),r._path.appendChild(m),m.beginElement(),m=e.createElementNS(p,"animate"),m.setAttribute("attributeName","stroke-opacity"),m.setAttribute("attributeName","stroke-opacity"),m.setAttribute("begin","indefinite"),m.setAttribute("from",0),m.setAttribute("to",.5),m.setAttribute("dur",.25),r._path.appendChild(m),m.beginElement()}if(a.setOpacity(.3),L.Path.SVG)for(this._group._forceLayout(),n=t.length-1;n>=0;n--)s=t[n]._spiderLeg,s.options.opacity=.5,s._path.setAttribute("stroke-opacity",.5);setTimeout(function(){h._animationEnd(),h.fire("spiderfied")},200)},_animationUnspiderfy:function(t){var e,i,n,s=this._group,r=s._map,o=s._featureGroup,a=t?r._latLngToNewLayerPoint(this._latlng,t.zoom,t.center):r.latLngToLayerPoint(this._latlng),h=this.getAllChildMarkers(),_=L.Path.SVG&&this.SVG_ANIMATION;for(s._animationStart(),this.setOpacity(1),i=h.length-1;i>=0;i--)e=h[i],e._preSpiderfyLatlng&&(e.setLatLng(e._preSpiderfyLatlng),delete e._preSpiderfyLatlng,e.setOpacity?(e._setPos(a),e.setOpacity(0)):o.removeLayer(e),_&&(n=e._spiderLeg._path.childNodes[0],n.setAttribute("to",n.getAttribute("from")),n.setAttribute("from",0),n.beginElement(),n=e._spiderLeg._path.childNodes[1],n.setAttribute("from",.5),n.setAttribute("to",0),n.setAttribute("stroke-opacity",0),n.beginElement(),e._spiderLeg._path.setAttribute("stroke-opacity",0)));setTimeout(function(){var t=0;for(i=h.length-1;i>=0;i--)e=h[i],e._spiderLeg&&t++;for(i=h.length-1;i>=0;i--)e=h[i],e._spiderLeg&&(e.setOpacity&&(e.setOpacity(1),e.setZIndexOffset(0)),t>1&&o.removeLayer(e),r.removeLayer(e._spiderLeg),delete e._spiderLeg);s._animationEnd()},200)}}:{_animationSpiderfy:function(t,e){var i,n,s,r,o=this._group,a=o._map,h=o._featureGroup;for(i=t.length-1;i>=0;i--)r=a.layerPointToLatLng(e[i]),n=t[i],n._preSpiderfyLatlng=n._latlng,n.setLatLng(r),n.setZIndexOffset&&n.setZIndexOffset(1e6),h.addLayer(n),s=new L.Polyline([this._latlng,r],{weight:1.5,color:"#222"}),a.addLayer(s),n._spiderLeg=s;this.setOpacity(.3),o.fire("spiderfied")},_animationUnspiderfy:function(){this._noanimationUnspiderfy()}}),L.MarkerClusterGroup.include({_spiderfied:null,_spiderfierOnAdd:function(){this._map.on("click",this._unspiderfyWrapper,this),this._map.options.zoomAnimation&&this._map.on("zoomstart",this._unspiderfyZoomStart,this),this._map.on("zoomend",this._noanimationUnspiderfy,this),L.Path.SVG&&!L.Browser.touch&&this._map._initPathRoot()},_spiderfierOnRemove:function(){this._map.off("click",this._unspiderfyWrapper,this),this._map.off("zoomstart",this._unspiderfyZoomStart,this),this._map.off("zoomanim",this._unspiderfyZoomAnim,this),this._unspiderfy()},_unspiderfyZoomStart:function(){this._map&&this._map.on("zoomanim",this._unspiderfyZoomAnim,this)},_unspiderfyZoomAnim:function(t){L.DomUtil.hasClass(this._map._mapPane,"leaflet-touching")||(this._map.off("zoomanim",this._unspiderfyZoomAnim,this),this._unspiderfy(t))},_unspiderfyWrapper:function(){this._unspiderfy()},_unspiderfy:function(t){this._spiderfied&&this._spiderfied.unspiderfy(t)},_noanimationUnspiderfy:function(){this._spiderfied&&this._spiderfied._noanimationUnspiderfy()},_unspiderfyLayer:function(t){t._spiderLeg&&(this._featureGroup.removeLayer(t),t.setOpacity(1),t.setZIndexOffset(0),this._map.removeLayer(t._spiderLeg),delete t._spiderLeg)}})}(window,document);
@@ -0,0 +1,104 @@
1
+ /*
2
+ * L.Control.ZoomFS - default Leaflet.Zoom control with an added fullscreen button
3
+ * built to work with Leaflet version 0.5
4
+ * https://github.com/elidupuis/leaflet.zoomfs
5
+ */
6
+
7
+ L.Control.ZoomFS = L.Control.Zoom.extend({
8
+ includes: L.Mixin.Events,
9
+ onAdd: function (map) {
10
+ var zoomName = 'leaflet-control-zoom',
11
+ barName = 'leaflet-bar',
12
+ partName = barName + '-part',
13
+ container = L.DomUtil.create('div', zoomName + ' ' + barName);
14
+
15
+ this._map = map;
16
+ this._isFullscreen = false;
17
+
18
+ this._zoomFullScreenButton = this._createButton('','Full Screen',
19
+ 'leaflet-control-fullscreen ' +
20
+ partName + ' ' +
21
+ partName + '-top',
22
+ container, this.fullscreen, this);
23
+
24
+ this._zoomInButton = this._createButton('+', 'Zoom in',
25
+ zoomName + '-in ' +
26
+ partName + ' ',
27
+ container, this._zoomIn, this);
28
+
29
+ this._zoomOutButton = this._createButton('-', 'Zoom out',
30
+ zoomName + '-out ' +
31
+ partName + ' ' +
32
+ partName + '-bottom',
33
+ container, this._zoomOut, this);
34
+
35
+ map.on('zoomend zoomlevelschange', this._updateDisabled, this);
36
+
37
+ return container;
38
+
39
+ },
40
+ fullscreen: function() {
41
+ // call appropriate internal function
42
+ if (!this._isFullscreen) {
43
+ this._enterFullScreen();
44
+ } else {
45
+ this._exitFullScreen();
46
+ }
47
+
48
+ // force internal resize
49
+ this._map.invalidateSize();
50
+ },
51
+ _enterFullScreen: function() {
52
+ var container = this._map._container;
53
+
54
+ $('.leaflet-control-fullscreen').removeClass('expand').addClass('compress');
55
+
56
+ // apply our fullscreen settings
57
+ container.style.position = 'fixed';
58
+ container.style.left = 0;
59
+ container.style.top = 0;
60
+ container.style.width = '100%';
61
+ container.style.height = '100%';
62
+ container.style.zIndex = 1040;
63
+
64
+ // store state
65
+ L.DomUtil.addClass(container, 'leaflet-fullscreen');
66
+ this._isFullscreen = true;
67
+
68
+ // add ESC listener
69
+ L.DomEvent.addListener(document, 'keyup', this._onKeyUp, this);
70
+
71
+ // fire fullscreen event on map
72
+ this._map.fire('enterFullscreen');
73
+ },
74
+ _exitFullScreen: function() {
75
+ var container = this._map._container;
76
+
77
+ $('.leaflet-control-fullscreen').removeClass('compress').addClass('expand')
78
+
79
+ // update state
80
+ L.DomUtil.removeClass(container, 'leaflet-fullscreen');
81
+ this._isFullscreen = false;
82
+
83
+ // remove fullscreen style; make sure we're still position relative for Leaflet core.
84
+ container.removeAttribute('style');
85
+
86
+ // re-apply position:relative; if user does not have it.
87
+ var position = L.DomUtil.getStyle(container, 'position');
88
+ if (position !== 'absolute' && position !== 'relative') {
89
+ container.style.position = 'relative';
90
+ }
91
+
92
+ // remove ESC listener
93
+ L.DomEvent.removeListener(document, 'keyup', this._onKeyUp);
94
+
95
+ // fire fullscreen event
96
+ this._map.fire('exitFullscreen');
97
+ },
98
+ _onKeyUp: function(e) {
99
+ if (!e) e = window.event;
100
+ if (e.keyCode === 27 && this._isFullscreen === true) {
101
+ this._exitFullScreen();
102
+ }
103
+ }
104
+ });
@@ -0,0 +1,237 @@
1
+ marker_group = null;
2
+ run_animation = false;
3
+
4
+ // Add days to dates
5
+ Date.prototype.addDays = function(days) {
6
+ var new_date = new Date(this.valueOf())
7
+ new_date.setDate(new_date.getDate() + days);
8
+ return new_date;
9
+ }
10
+
11
+ // Create array of dates between two dates
12
+ function getDates(start_date, stop_date) {
13
+ var date_array = new Array();
14
+ var current_date = start_date;
15
+ while (current_date <= stop_date) {
16
+ date_array.push( new Date (current_date) )
17
+ current_date = current_date.addDays(1);
18
+ }
19
+ return date_array;
20
+ }
21
+
22
+ // Group data by date
23
+ function groupByDate(data) {
24
+ var grouped_data = {};
25
+ for (var i = 0; i < data.length; i++) {
26
+ start_date = new Date(data[i].start_date);
27
+ if (grouped_data[start_date] == null) {
28
+ grouped_data[start_date] = [data[i]]; // Create group
29
+ } else {
30
+ grouped_data[start_date].push(data[i]); // Add to existing group
31
+ };
32
+ };
33
+ return grouped_data;
34
+ };
35
+
36
+ // Insert data into the date array
37
+ function combineDateArrayGroupedData(date_array, grouped_data) {
38
+ var markers = {}
39
+ for (var i = 0; i < date_array.length; i++) {
40
+ if (grouped_data[date_array[i]] == null) {
41
+ markers[date_array[i]] = "Zero records";
42
+ } else {
43
+ markers[date_array[i]] = grouped_data[date_array[i]];
44
+ };
45
+ };
46
+ return markers;
47
+ };
48
+
49
+ //convert object to array of values
50
+ function convertToArray(object) {
51
+ var array = new Array();
52
+ for(key in object) {
53
+ array.push([key, object[key]])
54
+ };
55
+ return array
56
+ };
57
+
58
+ // Animate Markers
59
+ function animateMarkers(data, map_id, options) {
60
+ if (marker_group != null) { marker_group.clearLayers(); }
61
+ marker_group = L.layerGroup();
62
+
63
+ var x = 0;
64
+ // Add marker layers to marker cluster
65
+ function animate() {
66
+
67
+ if (data[x][1] != "Zero records" && data[x][1] != undefined) {
68
+ for (var i = 0; i < data[x][1].length; i++) {
69
+ reports = data[x][1];
70
+ if (reports[i].latitude && reports[i].longitude) {
71
+ var latitude = Number(reports[i].latitude);
72
+ var longitude = Number(reports[i].longitude);
73
+ var coordinates = [latitude, longitude];
74
+
75
+ if (options.offset) {
76
+ coordinates = offset_coordinates(latitude, longitude, options.max_offset, options.min_offset);
77
+ }
78
+
79
+ marker = L.circleMarker(coordinates,
80
+ {
81
+ stroke: true,
82
+ color: '#fff',
83
+ weight: 2,
84
+ opacity: 1,
85
+ fill: true,
86
+ fillColor: reports[i].marker_color,
87
+ fillOpacity: 1
88
+ });
89
+ marker.setRadius(6);
90
+ marker_group.addLayer(marker);
91
+
92
+ map_id.addLayer(marker_group);
93
+ };
94
+ };
95
+ };
96
+
97
+ $(".map-date").html(formatDate(data[x][0]))
98
+ if (x++ < data.length) {
99
+ if (run_animation == true) {
100
+ setTimeout(animate, 200);
101
+ };
102
+ };
103
+ };
104
+
105
+ animate();
106
+ };
107
+
108
+ function setupAnimation(csv_url, start_date, end_date, map_id, options) {
109
+ var markers = {};
110
+ $.get(csv_url, function(data) {
111
+ data = $.csv.toObjects(data);
112
+
113
+ // Generate all dates between beginning and end of data
114
+ var date_array = getDates(new Date(start_date), new Date(end_date));
115
+
116
+ // Group data by date
117
+ var grouped_data = groupByDate(data);
118
+
119
+ // combineDateArrayGroupedData
120
+ markers = combineDateArrayGroupedData(date_array, grouped_data);
121
+
122
+ markers = convertToArray(markers)
123
+
124
+ });
125
+ $(".map-animate-control").click( function() {
126
+ if (run_animation) {
127
+ run_animation = false;
128
+ $(".map-animate-control").html("<i class='fa fa-play'></i> Play");
129
+ } else {
130
+ run_animation = true;
131
+ animateMarkers(markers, map_id, options);
132
+ $(".map-animate-control").html("<i class='fa fa-stop'></i> Stop");
133
+ };
134
+ });
135
+ };
136
+
137
+ // Variables
138
+ var month_names = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"];
139
+ var basemap_id = 'ktransier.map-xya6pg28';
140
+
141
+ // Helper functions
142
+ function popup(point) {
143
+ var url = "";
144
+ var start_date = "";
145
+ var summary = "";
146
+ if (point.url && point.id) {url = "<a href=" + point.url + point.id + "' target=_blank>" + point.id + "</a> | "};
147
+ if (point.start_date) { start_date = formatDate(point.start_date) };
148
+ if (point.summary) { summary = "<p class=map-popup-summary>" + point.summary + "</p>"};
149
+ return url + start_date + summary;
150
+ }
151
+
152
+ function formatDate(date) {
153
+ var date = new Date(date);
154
+ var month = month_names[date.getMonth()];
155
+ var day = date.getDate();
156
+ var year = date.getFullYear();
157
+ return month + " " + day + ", " + year;
158
+ };
159
+
160
+ function offset_coordinates(latitude, longitude, min_offset, max_offset){
161
+ min_offset = min_offset / 111.32;
162
+ max_offset = max_offset / 111.32;
163
+ latitude = latitude + Math.random() * (max_offset - min_offset) + min_offset;
164
+ longitude = longitude + Math.random() * (max_offset - min_offset) + min_offset;
165
+ return [latitude, longitude];
166
+ }
167
+
168
+ // Build Map
169
+ function buildMap(options) {
170
+ var map = L.mapbox.map(options.map_id, basemap_id, {
171
+ zoomControl: false,
172
+ scrollWheelZoom: false
173
+ }).setView([options.lat, options.long], options.zoom);
174
+ L.control.scale().addTo(map); // Load scale
175
+ map.addControl(new L.Control.ZoomFS()); // Load map controls
176
+
177
+ // Build legend
178
+ if (options.legend) {
179
+ map.legendControl.addLegend(document.getElementById(options.map_id + '_legend').innerHTML);
180
+ };
181
+ if (options.animate) {
182
+ setupAnimation(options.csv_url, options.start_date, options.end_date, map, options);
183
+ } else if (!options.animate && options.csv_url) {
184
+ $.get(options.csv_url, function(data) {
185
+ data = $.csv.toObjects(data);
186
+ generateMarkers(data, map, options)
187
+ });
188
+ } else {
189
+ };
190
+
191
+ $('.mapbox-control-info').addClass('hide');
192
+ };
193
+
194
+ //todo: build seperate generatemarkers and generatemarkercluster functions
195
+ function generateMarkers(data, map, options) {
196
+ // Set variables
197
+ var markers, marker, marker_radius, latitude_offset, longitude_offset;
198
+
199
+ // Build marker cluster layer
200
+ markers = new L.MarkerClusterGroup({maxClusterRadius: 20, spiderfyOnMaxZoom: true});
201
+ // Add marker layers to marker cluster
202
+ for (i = 0; i < data.length; i++) {
203
+ if (data[i].latitude && data[i].longitude) {
204
+ var latitude = Number(data[i].latitude);
205
+ var longitude = Number(data[i].longitude);
206
+ var coordinates = [latitude, longitude];
207
+
208
+ if (options.offset) {
209
+ coordinates = offset_coordinates(latitude, longitude, options.max_offset, options.min_offset);
210
+ }
211
+
212
+ marker = L.circleMarker(coordinates,
213
+ {
214
+ stroke: true,
215
+ color: '#fff',
216
+ weight: 2,
217
+ opacity: 1,
218
+ fill: true,
219
+ fillColor: data[i].marker_color,
220
+ fillOpacity: 1
221
+ });
222
+ marker.bindPopup(popup(data[i]));
223
+ if (data[i].marker_radius) {
224
+ marker_radius = data[i].marker_radius;
225
+ } else if (options.marker_radius) {
226
+ marker_radius = options.marker_radius
227
+ } else {
228
+ marker_radius = 1;
229
+ };
230
+ marker.setRadius(marker_radius);
231
+ map.addLayer(marker);
232
+ };
233
+ };
234
+
235
+ // Add marker cluster to basemap
236
+ // map.addLayer(markers);
237
+ }
@@ -1,3 +1,3 @@
1
1
  module Marinus
2
- VERSION = "0.0.1"
2
+ VERSION = "0.0.2"
3
3
  end
data/marinus.gemspec CHANGED
@@ -8,9 +8,9 @@ Gem::Specification.new do |spec|
8
8
  spec.version = Marinus::VERSION
9
9
  spec.authors = ["Kenneth Transier"]
10
10
  spec.email = ["ktransier@gmail.com"]
11
- spec.description = "A Rails gem for carotgraphy javascript"
11
+ spec.description = "A Rails gem for cartography assets"
12
12
  spec.summary = "Alpha experiment"
13
- spec.homepage = ""
13
+ spec.homepage = "https://github.com/ktransier/marinus"
14
14
  spec.license = "MIT"
15
15
 
16
16
  spec.files = `git ls-files`.split($/)
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: marinus
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kenneth Transier
@@ -38,7 +38,7 @@ dependencies:
38
38
  - - ! '>='
39
39
  - !ruby/object:Gem::Version
40
40
  version: '0'
41
- description: A Rails gem for carotgraphy javascript
41
+ description: A Rails gem for cartography assets
42
42
  email:
43
43
  - ktransier@gmail.com
44
44
  executables: []
@@ -50,10 +50,18 @@ files:
50
50
  - LICENSE.txt
51
51
  - README.md
52
52
  - Rakefile
53
+ - assets/css/leaflet.label.css
54
+ - assets/css/marinus.css
55
+ - assets/javascripts/jquery.csv-0.71.min.js
56
+ - assets/javascripts/leaflet-heat.js
57
+ - assets/javascripts/leaflet.label.js
58
+ - assets/javascripts/leaflet.markercluster.js
59
+ - assets/javascripts/leaflet.zoomfs.js
60
+ - assets/javascripts/marinus.js
53
61
  - lib/marinus.rb
54
62
  - lib/marinus/version.rb
55
63
  - marinus.gemspec
56
- homepage: ''
64
+ homepage: https://github.com/ktransier/marinus
57
65
  licenses:
58
66
  - MIT
59
67
  metadata: {}