ekylibre-cartography 0.0.1

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.
Files changed (59) hide show
  1. checksums.yaml +7 -0
  2. data/README.md +3 -0
  3. data/Rakefile +10 -0
  4. data/app/assets/javascripts/cartography.coffee +535 -0
  5. data/app/assets/javascripts/cartography/base.coffee +11 -0
  6. data/app/assets/javascripts/cartography/controls.coffee +463 -0
  7. data/app/assets/javascripts/cartography/events.coffee +36 -0
  8. data/app/assets/javascripts/cartography/layers.coffee +127 -0
  9. data/app/assets/javascripts/cartography/layers/simple.coffee +37 -0
  10. data/app/assets/javascripts/cartography/leaflet/controls.coffee +420 -0
  11. data/app/assets/javascripts/cartography/leaflet/handlers.coffee +461 -0
  12. data/app/assets/javascripts/cartography/leaflet/i18n.coffee +31 -0
  13. data/app/assets/javascripts/cartography/leaflet/layers.coffee +60 -0
  14. data/app/assets/javascripts/cartography/leaflet/toolbars.coffee +450 -0
  15. data/app/assets/javascripts/cartography/patches.js +8 -0
  16. data/app/assets/javascripts/cartography/util.coffee +18 -0
  17. data/app/assets/javascripts/main.js +18 -0
  18. data/app/assets/stylesheets/cartography.css +86 -0
  19. data/app/helpers/cartography_helper.rb +55 -0
  20. data/lib/cartography.rb +1 -0
  21. data/lib/cartography/engine.rb +11 -0
  22. data/lib/cartography/version.rb +3 -0
  23. data/vendor/assets/components/d3-array/dist/d3-array.js +590 -0
  24. data/vendor/assets/components/d3-array/dist/d3-array.min.js +2 -0
  25. data/vendor/assets/components/geojson-equality/dist/geojson-equality.js +295 -0
  26. data/vendor/assets/components/geojson-equality/dist/geojson-equality.js.map +21 -0
  27. data/vendor/assets/components/geojson-equality/dist/geojson-equality.min.js +1 -0
  28. data/vendor/assets/components/leaflet-controlpanel/dist/leaflet.controlpanel.css +29 -0
  29. data/vendor/assets/components/leaflet-controlpanel/dist/leaflet.controlpanel.js +269 -0
  30. data/vendor/assets/components/leaflet-draw-cut/dist/leaflet.draw.cut.css +1 -0
  31. data/vendor/assets/components/leaflet-draw-cut/dist/leaflet.draw.cut.js +8 -0
  32. data/vendor/assets/components/leaflet-draw-merge/dist/leaflet.draw.merge.css +0 -0
  33. data/vendor/assets/components/leaflet-draw-merge/dist/leaflet.draw.merge.js +48026 -0
  34. data/vendor/assets/components/leaflet-draw/dist/leaflet.draw-src.css +326 -0
  35. data/vendor/assets/components/leaflet-draw/dist/leaflet.draw-src.js +4653 -0
  36. data/vendor/assets/components/leaflet-draw/dist/leaflet.draw-src.map +1 -0
  37. data/vendor/assets/components/leaflet-draw/dist/leaflet.draw.css +10 -0
  38. data/vendor/assets/components/leaflet-draw/dist/leaflet.draw.js +10 -0
  39. data/vendor/assets/components/leaflet-geographicutil/dist/leaflet.geographicutil.js +3220 -0
  40. data/vendor/assets/components/leaflet-reactive_measure/dist/reactive_measure.css +30 -0
  41. data/vendor/assets/components/leaflet-reactive_measure/dist/reactive_measure.js +3764 -0
  42. data/vendor/assets/components/leaflet/dist/leaflet-src.js +13609 -0
  43. data/vendor/assets/components/leaflet/dist/leaflet-src.js.map +1 -0
  44. data/vendor/assets/components/leaflet/dist/leaflet-src.map +1 -0
  45. data/vendor/assets/components/leaflet/dist/leaflet.css +632 -0
  46. data/vendor/assets/components/leaflet/dist/leaflet.js +5 -0
  47. data/vendor/assets/components/leaflet/dist/leaflet.js.map +1 -0
  48. data/vendor/assets/components/martinez-polygon-clipping/dist/martinez.min.js +9 -0
  49. data/vendor/assets/components/martinez-polygon-clipping/dist/martinez.umd.js +1716 -0
  50. data/vendor/assets/components/martinez-polygon-clipping/dist/martinez.umd.js.map +1 -0
  51. data/vendor/assets/components/polygon-clipping/dist/polygon-clipping.js +279 -0
  52. data/vendor/assets/components/polygon-clipping/dist/polygon-clipping.min.js +1 -0
  53. data/vendor/assets/components/rtree/dist/rtree.js +911 -0
  54. data/vendor/assets/components/rtree/dist/rtree.min.js +1 -0
  55. data/vendor/assets/components/splaytree/dist/splay.es6.js +765 -0
  56. data/vendor/assets/components/splaytree/dist/splay.es6.js.map +1 -0
  57. data/vendor/assets/components/splaytree/dist/splay.js +797 -0
  58. data/vendor/assets/components/splaytree/dist/splay.js.map +1 -0
  59. metadata +156 -0
@@ -0,0 +1,8 @@
1
+ (function() {
2
+ var originalOnTouch = L.Draw.Polyline.prototype._onTouch;
3
+ L.Draw.Polyline.prototype._onTouch = function( e ) {
4
+ if( e.originalEvent.pointerType != 'mouse' ) {
5
+ return originalOnTouch.call(this, e);
6
+ }
7
+ }
8
+ })();
@@ -0,0 +1,18 @@
1
+ ((C, $, _) ->
2
+ "use strict"
3
+
4
+ class C.Util
5
+
6
+ #Leaflet inspiration, but provides object deep merging
7
+ @extend: (dest, src) ->
8
+ _.merge(dest, src)
9
+
10
+ @setOptions = (obj, options) ->
11
+ if !obj.hasOwnProperty 'options'
12
+ obj.options = if obj.options then L.Util.create(obj.options) else {}
13
+ @extend obj.options, options
14
+
15
+ C.extend = C.Util.extend
16
+ C.setOptions = C.Util.setOptions
17
+
18
+ )(window.Cartography = window.Cartography || {}, jQuery, _)
@@ -0,0 +1,18 @@
1
+ //= require lodash/lodash.js
2
+ //= require pure-uuid/uuid.js
3
+ //= require leaflet/dist/leaflet-src.js
4
+ //= require leaflet-draw/dist/leaflet.draw-src.js
5
+ //= require leaflet-providers/leaflet-providers.js
6
+ //= require rtree/dist/rtree.js
7
+
8
+ //= require cartography/leaflet/i18n.coffee
9
+ //= require leaflet-layerindex/leaflet.layerindex.js
10
+ //= require leaflet-snap/leaflet.snap.js
11
+ //= require leaflet-geometryutil/src/leaflet.geometryutil.js
12
+ //= require leaflet-reactive_measure/dist/reactive_measure.js
13
+
14
+ //= require leaflet-draw-cut/dist/leaflet.draw.cut.js
15
+ // require leaflet-draw-merge/dist/leaflet.draw.merge.js
16
+ //= require leaflet-controlpanel/dist/leaflet.controlpanel.js
17
+
18
+ //= require_tree .
@@ -0,0 +1,86 @@
1
+ /*
2
+ *= require leaflet/dist/leaflet.css
3
+ *= require leaflet-draw/dist/leaflet.draw.css
4
+ *= require leaflet-reactive_measure/dist/reactive_measure.css
5
+ *= require leaflet-controlpanel/dist/leaflet.controlpanel.css
6
+ */
7
+ .leaflet-div-icon, .leaflet-mouse-marker{
8
+ /*background: #fff;*/
9
+ border: 1px solid rgb(44,83,158);
10
+ border-radius: 50%;
11
+ background: rgb(255,255,255); /* Old browsers */
12
+ background: -moz-radial-gradient(center, ellipse cover, rgba(255,255,255,1) 0%, rgba(246,246,246,1) 47%, rgba(237,237,237,1) 100%); /* FF3.6-15 */
13
+ background: -webkit-radial-gradient(center, ellipse cover, rgba(255,255,255,1) 0%,rgba(246,246,246,1) 47%,rgba(237,237,237,1) 100%); /* Chrome10-25,Safari5.1-6 */
14
+ background: radial-gradient(ellipse at center, rgba(255,255,255,1) 0%,rgba(246,246,246,1) 47%,rgba(237,237,237,1) 100%); /* W3C, IE10+, FF16+, Chrome26+, Opera12+, Safari7+ */
15
+ filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#ffffff', endColorstr='#ededed',GradientType=1 ); /* IE6-9 fallback on horizontal gradient */
16
+
17
+ margin-left: -8px !important;
18
+ margin-top: -8px !important;
19
+ width: 16px !important;
20
+ height: 16px !important;
21
+ box-sizing: border-box;
22
+ }
23
+
24
+ .leaflet-draw-guide-dash {
25
+ border-radius: 50%;
26
+ opacity: 1;
27
+ z-index: 1000;
28
+ }
29
+
30
+ .marker-origin {
31
+ animation: beat 1s infinite linear;
32
+ transform-origin: center;
33
+ }
34
+
35
+ @keyframes beat{
36
+ 0% {
37
+ border-width: 1px;
38
+ }
39
+ 50% {
40
+ border-width: 3px;
41
+ }
42
+ 100% {
43
+ border-width: 1px;
44
+ }
45
+ }
46
+
47
+
48
+
49
+ .leaflet-control-controlPanel-title {
50
+ color: black;
51
+ font-weight: bold;
52
+ font-size: small;
53
+ border-bottom: 1px solid rgba(0,0,0,0.2);
54
+ text-align: center;
55
+ }
56
+
57
+ .legend{
58
+ border: 1px solid black;
59
+ width: 20px;
60
+ height: 10px;
61
+ display: inline-block;
62
+ }
63
+
64
+ .legend-area {
65
+ display: inline-block;
66
+ margin-left: 10px;
67
+ }
68
+
69
+
70
+ .leaflet-control-controlPanel-properties {
71
+ padding: 1%;
72
+ width: 98%;
73
+ }
74
+
75
+ .property-title {
76
+ color: grey;
77
+ font-weight: bold;
78
+ font-size: larger;
79
+ }
80
+ .animated-helper {
81
+ width: 100%;
82
+ }
83
+
84
+ .surface-row {
85
+ text-align: middle;
86
+ }
@@ -0,0 +1,55 @@
1
+ module Cartography
2
+ class Configuration
3
+
4
+ def initialize(config = {})
5
+ @config = config
6
+ # @categories_colors = @config.delete(:categories_colors)
7
+ # @config[:backgrounds] = MapLayer.available_backgrounds.collect(&:to_json_object)
8
+ # @config[:overlays] = MapLayer.available_overlays.collect(&:to_json_object)
9
+ # @config[:async_url] = @config.delete(:async_url)
10
+ end
11
+
12
+ def layer(name, serie, options = {})
13
+ unless options[:label]
14
+ options[:label] = name.is_a?(String) ? name : name.tl(default: "attributes.#{name}".to_sym)
15
+ end
16
+ name = name.to_s.parameterize.tr('-', '_') unless name.is_a?(Symbol)
17
+
18
+ @config[:layers] ||= []
19
+ @config[:layers] << { reference: name.to_s.camelcase(:lower) }.merge(options.merge(name: name, serie: serie.to_s.camelcase(:lower)))
20
+ end
21
+
22
+ def simple(name, serie, options = {})
23
+ layer(name, serie, options.merge(type: :simple))
24
+ end
25
+
26
+ # Add a serie of geo data
27
+ def serie(name, feature_collection)
28
+ @config[:series] ||= {}.with_indifferent_access
29
+ @config[:series][name] = feature_collection
30
+ # data.compact.collect do |item|
31
+ # next unless item[:shape]
32
+ # item
33
+ # # .merge(shape: Charta.new_geometry(item[:shape]).transform(:WGS84).to_json_object)
34
+ # # .merge(item[:popup] ? { popup: compile_visualization_popup(item[:popup], item) } : {})
35
+ # end.compact
36
+ end
37
+
38
+ def to_json(options = {})
39
+ @config.jsonize_keys.to_json
40
+ end
41
+ end
42
+ end
43
+
44
+ module CartographyHelper
45
+ def configure_cartography(options = {})
46
+ # config = Cartography::Configuration.new({ categories_colors: theme_colors }.merge(options))
47
+ config = Cartography::Configuration.new(options)
48
+ yield config
49
+ config
50
+ end
51
+ def cartography( options = {}, html_options = {}, &block)
52
+ config = configure_cartography(options, &block)
53
+ content_tag(:div, nil, html_options.deep_merge(data: { cartography: config.to_json }))
54
+ end
55
+ end
@@ -0,0 +1 @@
1
+ require 'cartography/engine'
@@ -0,0 +1,11 @@
1
+ module Cartography
2
+ class Engine < ::Rails::Engine
3
+ initializer 'cartography.assets.precompile' do |app|
4
+ app.config.assets.precompile += %w[cartography.scss cartography.js]
5
+ end
6
+
7
+ initializer :i18n do |app|
8
+ app.config.i18n.load_path += Dir[Cartography::Engine.root.join('config', 'locales', '*.yml')]
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,3 @@
1
+ module Cartography
2
+ VERSION = '0.0.1'.freeze
3
+ end
@@ -0,0 +1,590 @@
1
+ // https://d3js.org/d3-array/ v1.2.4 Copyright 2018 Mike Bostock
2
+ (function (global, factory) {
3
+ typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :
4
+ typeof define === 'function' && define.amd ? define(['exports'], factory) :
5
+ (factory((global.d3 = global.d3 || {})));
6
+ }(this, (function (exports) { 'use strict';
7
+
8
+ function ascending(a, b) {
9
+ return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;
10
+ }
11
+
12
+ function bisector(compare) {
13
+ if (compare.length === 1) compare = ascendingComparator(compare);
14
+ return {
15
+ left: function(a, x, lo, hi) {
16
+ if (lo == null) lo = 0;
17
+ if (hi == null) hi = a.length;
18
+ while (lo < hi) {
19
+ var mid = lo + hi >>> 1;
20
+ if (compare(a[mid], x) < 0) lo = mid + 1;
21
+ else hi = mid;
22
+ }
23
+ return lo;
24
+ },
25
+ right: function(a, x, lo, hi) {
26
+ if (lo == null) lo = 0;
27
+ if (hi == null) hi = a.length;
28
+ while (lo < hi) {
29
+ var mid = lo + hi >>> 1;
30
+ if (compare(a[mid], x) > 0) hi = mid;
31
+ else lo = mid + 1;
32
+ }
33
+ return lo;
34
+ }
35
+ };
36
+ }
37
+
38
+ function ascendingComparator(f) {
39
+ return function(d, x) {
40
+ return ascending(f(d), x);
41
+ };
42
+ }
43
+
44
+ var ascendingBisect = bisector(ascending);
45
+ var bisectRight = ascendingBisect.right;
46
+ var bisectLeft = ascendingBisect.left;
47
+
48
+ function pairs(array, f) {
49
+ if (f == null) f = pair;
50
+ var i = 0, n = array.length - 1, p = array[0], pairs = new Array(n < 0 ? 0 : n);
51
+ while (i < n) pairs[i] = f(p, p = array[++i]);
52
+ return pairs;
53
+ }
54
+
55
+ function pair(a, b) {
56
+ return [a, b];
57
+ }
58
+
59
+ function cross(values0, values1, reduce) {
60
+ var n0 = values0.length,
61
+ n1 = values1.length,
62
+ values = new Array(n0 * n1),
63
+ i0,
64
+ i1,
65
+ i,
66
+ value0;
67
+
68
+ if (reduce == null) reduce = pair;
69
+
70
+ for (i0 = i = 0; i0 < n0; ++i0) {
71
+ for (value0 = values0[i0], i1 = 0; i1 < n1; ++i1, ++i) {
72
+ values[i] = reduce(value0, values1[i1]);
73
+ }
74
+ }
75
+
76
+ return values;
77
+ }
78
+
79
+ function descending(a, b) {
80
+ return b < a ? -1 : b > a ? 1 : b >= a ? 0 : NaN;
81
+ }
82
+
83
+ function number(x) {
84
+ return x === null ? NaN : +x;
85
+ }
86
+
87
+ function variance(values, valueof) {
88
+ var n = values.length,
89
+ m = 0,
90
+ i = -1,
91
+ mean = 0,
92
+ value,
93
+ delta,
94
+ sum = 0;
95
+
96
+ if (valueof == null) {
97
+ while (++i < n) {
98
+ if (!isNaN(value = number(values[i]))) {
99
+ delta = value - mean;
100
+ mean += delta / ++m;
101
+ sum += delta * (value - mean);
102
+ }
103
+ }
104
+ }
105
+
106
+ else {
107
+ while (++i < n) {
108
+ if (!isNaN(value = number(valueof(values[i], i, values)))) {
109
+ delta = value - mean;
110
+ mean += delta / ++m;
111
+ sum += delta * (value - mean);
112
+ }
113
+ }
114
+ }
115
+
116
+ if (m > 1) return sum / (m - 1);
117
+ }
118
+
119
+ function deviation(array, f) {
120
+ var v = variance(array, f);
121
+ return v ? Math.sqrt(v) : v;
122
+ }
123
+
124
+ function extent(values, valueof) {
125
+ var n = values.length,
126
+ i = -1,
127
+ value,
128
+ min,
129
+ max;
130
+
131
+ if (valueof == null) {
132
+ while (++i < n) { // Find the first comparable value.
133
+ if ((value = values[i]) != null && value >= value) {
134
+ min = max = value;
135
+ while (++i < n) { // Compare the remaining values.
136
+ if ((value = values[i]) != null) {
137
+ if (min > value) min = value;
138
+ if (max < value) max = value;
139
+ }
140
+ }
141
+ }
142
+ }
143
+ }
144
+
145
+ else {
146
+ while (++i < n) { // Find the first comparable value.
147
+ if ((value = valueof(values[i], i, values)) != null && value >= value) {
148
+ min = max = value;
149
+ while (++i < n) { // Compare the remaining values.
150
+ if ((value = valueof(values[i], i, values)) != null) {
151
+ if (min > value) min = value;
152
+ if (max < value) max = value;
153
+ }
154
+ }
155
+ }
156
+ }
157
+ }
158
+
159
+ return [min, max];
160
+ }
161
+
162
+ var array = Array.prototype;
163
+
164
+ var slice = array.slice;
165
+ var map = array.map;
166
+
167
+ function constant(x) {
168
+ return function() {
169
+ return x;
170
+ };
171
+ }
172
+
173
+ function identity(x) {
174
+ return x;
175
+ }
176
+
177
+ function range(start, stop, step) {
178
+ start = +start, stop = +stop, step = (n = arguments.length) < 2 ? (stop = start, start = 0, 1) : n < 3 ? 1 : +step;
179
+
180
+ var i = -1,
181
+ n = Math.max(0, Math.ceil((stop - start) / step)) | 0,
182
+ range = new Array(n);
183
+
184
+ while (++i < n) {
185
+ range[i] = start + i * step;
186
+ }
187
+
188
+ return range;
189
+ }
190
+
191
+ var e10 = Math.sqrt(50),
192
+ e5 = Math.sqrt(10),
193
+ e2 = Math.sqrt(2);
194
+
195
+ function ticks(start, stop, count) {
196
+ var reverse,
197
+ i = -1,
198
+ n,
199
+ ticks,
200
+ step;
201
+
202
+ stop = +stop, start = +start, count = +count;
203
+ if (start === stop && count > 0) return [start];
204
+ if (reverse = stop < start) n = start, start = stop, stop = n;
205
+ if ((step = tickIncrement(start, stop, count)) === 0 || !isFinite(step)) return [];
206
+
207
+ if (step > 0) {
208
+ start = Math.ceil(start / step);
209
+ stop = Math.floor(stop / step);
210
+ ticks = new Array(n = Math.ceil(stop - start + 1));
211
+ while (++i < n) ticks[i] = (start + i) * step;
212
+ } else {
213
+ start = Math.floor(start * step);
214
+ stop = Math.ceil(stop * step);
215
+ ticks = new Array(n = Math.ceil(start - stop + 1));
216
+ while (++i < n) ticks[i] = (start - i) / step;
217
+ }
218
+
219
+ if (reverse) ticks.reverse();
220
+
221
+ return ticks;
222
+ }
223
+
224
+ function tickIncrement(start, stop, count) {
225
+ var step = (stop - start) / Math.max(0, count),
226
+ power = Math.floor(Math.log(step) / Math.LN10),
227
+ error = step / Math.pow(10, power);
228
+ return power >= 0
229
+ ? (error >= e10 ? 10 : error >= e5 ? 5 : error >= e2 ? 2 : 1) * Math.pow(10, power)
230
+ : -Math.pow(10, -power) / (error >= e10 ? 10 : error >= e5 ? 5 : error >= e2 ? 2 : 1);
231
+ }
232
+
233
+ function tickStep(start, stop, count) {
234
+ var step0 = Math.abs(stop - start) / Math.max(0, count),
235
+ step1 = Math.pow(10, Math.floor(Math.log(step0) / Math.LN10)),
236
+ error = step0 / step1;
237
+ if (error >= e10) step1 *= 10;
238
+ else if (error >= e5) step1 *= 5;
239
+ else if (error >= e2) step1 *= 2;
240
+ return stop < start ? -step1 : step1;
241
+ }
242
+
243
+ function sturges(values) {
244
+ return Math.ceil(Math.log(values.length) / Math.LN2) + 1;
245
+ }
246
+
247
+ function histogram() {
248
+ var value = identity,
249
+ domain = extent,
250
+ threshold = sturges;
251
+
252
+ function histogram(data) {
253
+ var i,
254
+ n = data.length,
255
+ x,
256
+ values = new Array(n);
257
+
258
+ for (i = 0; i < n; ++i) {
259
+ values[i] = value(data[i], i, data);
260
+ }
261
+
262
+ var xz = domain(values),
263
+ x0 = xz[0],
264
+ x1 = xz[1],
265
+ tz = threshold(values, x0, x1);
266
+
267
+ // Convert number of thresholds into uniform thresholds.
268
+ if (!Array.isArray(tz)) {
269
+ tz = tickStep(x0, x1, tz);
270
+ tz = range(Math.ceil(x0 / tz) * tz, x1, tz); // exclusive
271
+ }
272
+
273
+ // Remove any thresholds outside the domain.
274
+ var m = tz.length;
275
+ while (tz[0] <= x0) tz.shift(), --m;
276
+ while (tz[m - 1] > x1) tz.pop(), --m;
277
+
278
+ var bins = new Array(m + 1),
279
+ bin;
280
+
281
+ // Initialize bins.
282
+ for (i = 0; i <= m; ++i) {
283
+ bin = bins[i] = [];
284
+ bin.x0 = i > 0 ? tz[i - 1] : x0;
285
+ bin.x1 = i < m ? tz[i] : x1;
286
+ }
287
+
288
+ // Assign data to bins by value, ignoring any outside the domain.
289
+ for (i = 0; i < n; ++i) {
290
+ x = values[i];
291
+ if (x0 <= x && x <= x1) {
292
+ bins[bisectRight(tz, x, 0, m)].push(data[i]);
293
+ }
294
+ }
295
+
296
+ return bins;
297
+ }
298
+
299
+ histogram.value = function(_) {
300
+ return arguments.length ? (value = typeof _ === "function" ? _ : constant(_), histogram) : value;
301
+ };
302
+
303
+ histogram.domain = function(_) {
304
+ return arguments.length ? (domain = typeof _ === "function" ? _ : constant([_[0], _[1]]), histogram) : domain;
305
+ };
306
+
307
+ histogram.thresholds = function(_) {
308
+ return arguments.length ? (threshold = typeof _ === "function" ? _ : Array.isArray(_) ? constant(slice.call(_)) : constant(_), histogram) : threshold;
309
+ };
310
+
311
+ return histogram;
312
+ }
313
+
314
+ function quantile(values, p, valueof) {
315
+ if (valueof == null) valueof = number;
316
+ if (!(n = values.length)) return;
317
+ if ((p = +p) <= 0 || n < 2) return +valueof(values[0], 0, values);
318
+ if (p >= 1) return +valueof(values[n - 1], n - 1, values);
319
+ var n,
320
+ i = (n - 1) * p,
321
+ i0 = Math.floor(i),
322
+ value0 = +valueof(values[i0], i0, values),
323
+ value1 = +valueof(values[i0 + 1], i0 + 1, values);
324
+ return value0 + (value1 - value0) * (i - i0);
325
+ }
326
+
327
+ function freedmanDiaconis(values, min, max) {
328
+ values = map.call(values, number).sort(ascending);
329
+ return Math.ceil((max - min) / (2 * (quantile(values, 0.75) - quantile(values, 0.25)) * Math.pow(values.length, -1 / 3)));
330
+ }
331
+
332
+ function scott(values, min, max) {
333
+ return Math.ceil((max - min) / (3.5 * deviation(values) * Math.pow(values.length, -1 / 3)));
334
+ }
335
+
336
+ function max(values, valueof) {
337
+ var n = values.length,
338
+ i = -1,
339
+ value,
340
+ max;
341
+
342
+ if (valueof == null) {
343
+ while (++i < n) { // Find the first comparable value.
344
+ if ((value = values[i]) != null && value >= value) {
345
+ max = value;
346
+ while (++i < n) { // Compare the remaining values.
347
+ if ((value = values[i]) != null && value > max) {
348
+ max = value;
349
+ }
350
+ }
351
+ }
352
+ }
353
+ }
354
+
355
+ else {
356
+ while (++i < n) { // Find the first comparable value.
357
+ if ((value = valueof(values[i], i, values)) != null && value >= value) {
358
+ max = value;
359
+ while (++i < n) { // Compare the remaining values.
360
+ if ((value = valueof(values[i], i, values)) != null && value > max) {
361
+ max = value;
362
+ }
363
+ }
364
+ }
365
+ }
366
+ }
367
+
368
+ return max;
369
+ }
370
+
371
+ function mean(values, valueof) {
372
+ var n = values.length,
373
+ m = n,
374
+ i = -1,
375
+ value,
376
+ sum = 0;
377
+
378
+ if (valueof == null) {
379
+ while (++i < n) {
380
+ if (!isNaN(value = number(values[i]))) sum += value;
381
+ else --m;
382
+ }
383
+ }
384
+
385
+ else {
386
+ while (++i < n) {
387
+ if (!isNaN(value = number(valueof(values[i], i, values)))) sum += value;
388
+ else --m;
389
+ }
390
+ }
391
+
392
+ if (m) return sum / m;
393
+ }
394
+
395
+ function median(values, valueof) {
396
+ var n = values.length,
397
+ i = -1,
398
+ value,
399
+ numbers = [];
400
+
401
+ if (valueof == null) {
402
+ while (++i < n) {
403
+ if (!isNaN(value = number(values[i]))) {
404
+ numbers.push(value);
405
+ }
406
+ }
407
+ }
408
+
409
+ else {
410
+ while (++i < n) {
411
+ if (!isNaN(value = number(valueof(values[i], i, values)))) {
412
+ numbers.push(value);
413
+ }
414
+ }
415
+ }
416
+
417
+ return quantile(numbers.sort(ascending), 0.5);
418
+ }
419
+
420
+ function merge(arrays) {
421
+ var n = arrays.length,
422
+ m,
423
+ i = -1,
424
+ j = 0,
425
+ merged,
426
+ array;
427
+
428
+ while (++i < n) j += arrays[i].length;
429
+ merged = new Array(j);
430
+
431
+ while (--n >= 0) {
432
+ array = arrays[n];
433
+ m = array.length;
434
+ while (--m >= 0) {
435
+ merged[--j] = array[m];
436
+ }
437
+ }
438
+
439
+ return merged;
440
+ }
441
+
442
+ function min(values, valueof) {
443
+ var n = values.length,
444
+ i = -1,
445
+ value,
446
+ min;
447
+
448
+ if (valueof == null) {
449
+ while (++i < n) { // Find the first comparable value.
450
+ if ((value = values[i]) != null && value >= value) {
451
+ min = value;
452
+ while (++i < n) { // Compare the remaining values.
453
+ if ((value = values[i]) != null && min > value) {
454
+ min = value;
455
+ }
456
+ }
457
+ }
458
+ }
459
+ }
460
+
461
+ else {
462
+ while (++i < n) { // Find the first comparable value.
463
+ if ((value = valueof(values[i], i, values)) != null && value >= value) {
464
+ min = value;
465
+ while (++i < n) { // Compare the remaining values.
466
+ if ((value = valueof(values[i], i, values)) != null && min > value) {
467
+ min = value;
468
+ }
469
+ }
470
+ }
471
+ }
472
+ }
473
+
474
+ return min;
475
+ }
476
+
477
+ function permute(array, indexes) {
478
+ var i = indexes.length, permutes = new Array(i);
479
+ while (i--) permutes[i] = array[indexes[i]];
480
+ return permutes;
481
+ }
482
+
483
+ function scan(values, compare) {
484
+ if (!(n = values.length)) return;
485
+ var n,
486
+ i = 0,
487
+ j = 0,
488
+ xi,
489
+ xj = values[j];
490
+
491
+ if (compare == null) compare = ascending;
492
+
493
+ while (++i < n) {
494
+ if (compare(xi = values[i], xj) < 0 || compare(xj, xj) !== 0) {
495
+ xj = xi, j = i;
496
+ }
497
+ }
498
+
499
+ if (compare(xj, xj) === 0) return j;
500
+ }
501
+
502
+ function shuffle(array, i0, i1) {
503
+ var m = (i1 == null ? array.length : i1) - (i0 = i0 == null ? 0 : +i0),
504
+ t,
505
+ i;
506
+
507
+ while (m) {
508
+ i = Math.random() * m-- | 0;
509
+ t = array[m + i0];
510
+ array[m + i0] = array[i + i0];
511
+ array[i + i0] = t;
512
+ }
513
+
514
+ return array;
515
+ }
516
+
517
+ function sum(values, valueof) {
518
+ var n = values.length,
519
+ i = -1,
520
+ value,
521
+ sum = 0;
522
+
523
+ if (valueof == null) {
524
+ while (++i < n) {
525
+ if (value = +values[i]) sum += value; // Note: zero and null are equivalent.
526
+ }
527
+ }
528
+
529
+ else {
530
+ while (++i < n) {
531
+ if (value = +valueof(values[i], i, values)) sum += value;
532
+ }
533
+ }
534
+
535
+ return sum;
536
+ }
537
+
538
+ function transpose(matrix) {
539
+ if (!(n = matrix.length)) return [];
540
+ for (var i = -1, m = min(matrix, length), transpose = new Array(m); ++i < m;) {
541
+ for (var j = -1, n, row = transpose[i] = new Array(n); ++j < n;) {
542
+ row[j] = matrix[j][i];
543
+ }
544
+ }
545
+ return transpose;
546
+ }
547
+
548
+ function length(d) {
549
+ return d.length;
550
+ }
551
+
552
+ function zip() {
553
+ return transpose(arguments);
554
+ }
555
+
556
+ exports.bisect = bisectRight;
557
+ exports.bisectRight = bisectRight;
558
+ exports.bisectLeft = bisectLeft;
559
+ exports.ascending = ascending;
560
+ exports.bisector = bisector;
561
+ exports.cross = cross;
562
+ exports.descending = descending;
563
+ exports.deviation = deviation;
564
+ exports.extent = extent;
565
+ exports.histogram = histogram;
566
+ exports.thresholdFreedmanDiaconis = freedmanDiaconis;
567
+ exports.thresholdScott = scott;
568
+ exports.thresholdSturges = sturges;
569
+ exports.max = max;
570
+ exports.mean = mean;
571
+ exports.median = median;
572
+ exports.merge = merge;
573
+ exports.min = min;
574
+ exports.pairs = pairs;
575
+ exports.permute = permute;
576
+ exports.quantile = quantile;
577
+ exports.range = range;
578
+ exports.scan = scan;
579
+ exports.shuffle = shuffle;
580
+ exports.sum = sum;
581
+ exports.ticks = ticks;
582
+ exports.tickIncrement = tickIncrement;
583
+ exports.tickStep = tickStep;
584
+ exports.transpose = transpose;
585
+ exports.variance = variance;
586
+ exports.zip = zip;
587
+
588
+ Object.defineProperty(exports, '__esModule', { value: true });
589
+
590
+ })));