geojs 1.8.10 → 1.9.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.
- package/.github/workflows/main.yml +1 -1
- package/CHANGELOG.md +7 -0
- package/geo.js +3057 -176
- package/geo.lean.js +3056 -175
- package/geo.lean.min.js +10 -4
- package/geo.min.js +11 -5
- package/package.json +6 -5
- package/src/annotation/annotation.js +19 -2
- package/src/annotation/circleAnnotation.js +8 -1
- package/src/annotation/ellipseAnnotation.js +51 -1
- package/src/annotation/lineAnnotation.js +29 -20
- package/src/annotation/pointAnnotation.js +28 -23
- package/src/annotation/polygonAnnotation.js +52 -22
- package/src/annotation/rectangleAnnotation.js +42 -23
- package/src/annotation/squareAnnotation.js +8 -1
- package/src/annotationLayer.js +188 -2
- package/src/css/cursor-crosshair-difference.svg +4 -0
- package/src/css/cursor-crosshair-intersect.svg +4 -0
- package/src/css/cursor-crosshair-union.svg +4 -0
- package/src/css/cursor-crosshair-xor.svg +4 -0
- package/src/event.js +14 -0
- package/src/lineFeature.js +1 -1
- package/src/main.styl +8 -0
- package/src/polygonFeature.js +50 -0
- package/src/typedef.js +11 -0
- package/src/util/index.js +2 -1
- package/src/util/polyops.js +449 -0
package/geo.lean.js
CHANGED
|
@@ -138,6 +138,12 @@ var editHandleFeatureLevel = 3;
|
|
|
138
138
|
* @property {boolean|string[]} [showLabel=true] `true` to show the annotation
|
|
139
139
|
* label on annotations in done or edit states. Alternately, a list of
|
|
140
140
|
* states in which to show the label. Falsy to not show the label.
|
|
141
|
+
* @property {boolean} [allowBooleanOperations] This defaults to `true` for
|
|
142
|
+
* annotations that have area and `false` for those without area (e.g.,
|
|
143
|
+
* false for lines and points). If it is truthy, then, when the annotation
|
|
144
|
+
* is being created, it checks the metakeys on the first click that defines
|
|
145
|
+
* a coordinate to determine what boolean polygon operation should be
|
|
146
|
+
* performaned on the completion of the annotation.
|
|
141
147
|
*/
|
|
142
148
|
|
|
143
149
|
/**
|
|
@@ -160,9 +166,7 @@ var annotation = function annotation(type, args) {
|
|
|
160
166
|
}
|
|
161
167
|
|
|
162
168
|
var m_this = this,
|
|
163
|
-
m_options = $.extend({}, {
|
|
164
|
-
showLabel: true
|
|
165
|
-
}, args || {}),
|
|
169
|
+
m_options = $.extend(true, {}, this.constructor.defaults, args || {}),
|
|
166
170
|
m_id = m_options.annotationId;
|
|
167
171
|
delete m_options.annotationId;
|
|
168
172
|
|
|
@@ -968,11 +972,16 @@ var annotation = function annotation(type, args) {
|
|
|
968
972
|
value = util.ensureFunction(objStyle[key])();
|
|
969
973
|
|
|
970
974
|
if (value !== undefined) {
|
|
975
|
+
var defvalue = ((m_this.constructor.defaults || {}).style || {})[key];
|
|
976
|
+
|
|
971
977
|
if (key.toLowerCase().match(/color$/)) {
|
|
972
978
|
value = util.convertColorToHex(value, 'needed');
|
|
979
|
+
defvalue = defvalue !== undefined ? util.convertColorToHex(defvalue, 'needed') : defvalue;
|
|
973
980
|
}
|
|
974
981
|
|
|
975
|
-
|
|
982
|
+
if (value !== defvalue) {
|
|
983
|
+
obj.properties[key] = value;
|
|
984
|
+
}
|
|
976
985
|
}
|
|
977
986
|
}
|
|
978
987
|
|
|
@@ -1699,7 +1708,14 @@ function constrainAspectRatio(ratio) {
|
|
|
1699
1708
|
|
|
1700
1709
|
return constraintFunction;
|
|
1701
1710
|
}
|
|
1711
|
+
/**
|
|
1712
|
+
* This object contains the default options to initialize the class.
|
|
1713
|
+
*/
|
|
1702
1714
|
|
|
1715
|
+
|
|
1716
|
+
annotation.defaults = {
|
|
1717
|
+
showLabel: true
|
|
1718
|
+
};
|
|
1703
1719
|
module.exports = {
|
|
1704
1720
|
state: annotationState,
|
|
1705
1721
|
actionOwner: annotationActionOwner,
|
|
@@ -1744,18 +1760,22 @@ var ellipseAnnotation = __webpack_require__(7505);
|
|
|
1744
1760
|
var circleAnnotation = function circleAnnotation(args, annotationName) {
|
|
1745
1761
|
'use strict';
|
|
1746
1762
|
|
|
1747
|
-
args = $.extend({}, args, {
|
|
1748
|
-
constraint: 1
|
|
1749
|
-
});
|
|
1750
|
-
|
|
1751
1763
|
if (!(this instanceof circleAnnotation)) {
|
|
1752
1764
|
return new circleAnnotation(args, annotationName);
|
|
1753
1765
|
}
|
|
1754
1766
|
|
|
1767
|
+
args = $.extend(true, {}, this.constructor.defaults, args, {
|
|
1768
|
+
constraint: 1
|
|
1769
|
+
});
|
|
1755
1770
|
ellipseAnnotation.call(this, args, annotationName || 'circle');
|
|
1756
1771
|
};
|
|
1757
1772
|
|
|
1758
1773
|
inherit(circleAnnotation, ellipseAnnotation);
|
|
1774
|
+
/**
|
|
1775
|
+
* This object contains the default options to initialize the class.
|
|
1776
|
+
*/
|
|
1777
|
+
|
|
1778
|
+
circleAnnotation.defaults = $.extend({}, ellipseAnnotation.defaults, {});
|
|
1759
1779
|
var circleRequiredFeatures = {};
|
|
1760
1780
|
circleRequiredFeatures[markerFeature.capabilities.feature] = true;
|
|
1761
1781
|
registerAnnotation('circle', circleAnnotation, circleRequiredFeatures);
|
|
@@ -1798,6 +1818,7 @@ var ellipseAnnotation = function ellipseAnnotation(args, annotationName) {
|
|
|
1798
1818
|
return new ellipseAnnotation(args, annotationName);
|
|
1799
1819
|
}
|
|
1800
1820
|
|
|
1821
|
+
args = $.extend(true, {}, this.constructor.defaults, args);
|
|
1801
1822
|
rectangleAnnotation.call(this, args, annotationName || 'ellipse');
|
|
1802
1823
|
var m_this = this;
|
|
1803
1824
|
/**
|
|
@@ -1844,9 +1865,68 @@ var ellipseAnnotation = function ellipseAnnotation(args, annotationName) {
|
|
|
1844
1865
|
|
|
1845
1866
|
return features;
|
|
1846
1867
|
};
|
|
1868
|
+
/**
|
|
1869
|
+
* Return this annotation as a polygon list.
|
|
1870
|
+
*
|
|
1871
|
+
* @param {geo.util.polyop.spec} [opts] The ``tolerance`` and
|
|
1872
|
+
* ``pixelTolerance`` parameters are used if set. Otherwise, a polygon is
|
|
1873
|
+
* approximated to 1/10th of a pixel at the map's current maximum zoom
|
|
1874
|
+
* level.
|
|
1875
|
+
* @returns {geo.polygonList} A list of polygons.
|
|
1876
|
+
*/
|
|
1877
|
+
|
|
1878
|
+
|
|
1879
|
+
this.toPolygonList = function (opts) {
|
|
1880
|
+
var coord = m_this._coordinates();
|
|
1881
|
+
|
|
1882
|
+
if (coord.length < 3) {
|
|
1883
|
+
return [];
|
|
1884
|
+
}
|
|
1885
|
+
|
|
1886
|
+
var tolerance = opts && opts.tolerance || 0;
|
|
1887
|
+
|
|
1888
|
+
if (!tolerance) {
|
|
1889
|
+
var map = m_this.layer().map();
|
|
1890
|
+
|
|
1891
|
+
if (opts && opts.pixelTolerance) {
|
|
1892
|
+
tolerance = map.unitsPerPixel(map.zoom()) * opts.pixelTolerance;
|
|
1893
|
+
} else {
|
|
1894
|
+
tolerance = map.unitsPerPixel(map.zoomRange().max) * 0.1;
|
|
1895
|
+
}
|
|
1896
|
+
}
|
|
1897
|
+
|
|
1898
|
+
var w = Math.pow(Math.pow(coord[0].x - coord[1].x, 2) + Math.pow(coord[0].y - coord[1].y, 2), 0.5);
|
|
1899
|
+
var h = Math.pow(Math.pow(coord[0].x - coord[3].x, 2) + Math.pow(coord[0].y - coord[3].y, 2), 0.5);
|
|
1900
|
+
var cx = (coord[0].x + coord[2].x) / 2;
|
|
1901
|
+
var cy = (coord[0].y + coord[2].y) / 2;
|
|
1902
|
+
var radius = Math.max(w, h) / 2;
|
|
1903
|
+
var rotation = -Math.atan2(coord[1].y - coord[0].y, coord[1].x - coord[0].x);
|
|
1904
|
+
var sides = Math.max(12, Math.ceil(Math.PI / Math.acos((radius - tolerance) / (radius + tolerance))));
|
|
1905
|
+
var a = w / 2 * (1 + (1 - Math.cos(Math.PI / sides)) / 2);
|
|
1906
|
+
var b = h / 2 * (1 + (1 - Math.cos(Math.PI / sides)) / 2);
|
|
1907
|
+
var poly = [];
|
|
1908
|
+
var cosr = Math.cos(rotation),
|
|
1909
|
+
sinr = Math.sin(rotation);
|
|
1910
|
+
|
|
1911
|
+
for (var s = 0; s < sides; s += 1) {
|
|
1912
|
+
var sa = Math.PI * 2 * s / sides;
|
|
1913
|
+
var cosa = Math.cos(sa),
|
|
1914
|
+
sina = Math.sin(sa);
|
|
1915
|
+
var x = cx + a * cosr * cosa - b * sinr * sina;
|
|
1916
|
+
var y = cy + a * sinr * cosa + b * cosr * sina;
|
|
1917
|
+
poly.push([x, y]);
|
|
1918
|
+
}
|
|
1919
|
+
|
|
1920
|
+
return [[poly]];
|
|
1921
|
+
};
|
|
1847
1922
|
};
|
|
1848
1923
|
|
|
1849
1924
|
inherit(ellipseAnnotation, rectangleAnnotation);
|
|
1925
|
+
/**
|
|
1926
|
+
* This object contains the default options to initialize the class.
|
|
1927
|
+
*/
|
|
1928
|
+
|
|
1929
|
+
ellipseAnnotation.defaults = $.extend({}, rectangleAnnotation.defaults, {});
|
|
1850
1930
|
var ellipseRequiredFeatures = {};
|
|
1851
1931
|
ellipseRequiredFeatures[markerFeature.capabilities.feature] = true;
|
|
1852
1932
|
registerAnnotation('ellipse', ellipseAnnotation, ellipseRequiredFeatures);
|
|
@@ -1933,7 +2013,7 @@ var lineAnnotation = function lineAnnotation(args) {
|
|
|
1933
2013
|
return new lineAnnotation(args);
|
|
1934
2014
|
}
|
|
1935
2015
|
|
|
1936
|
-
args = $.extend(true, {}, {
|
|
2016
|
+
args = $.extend(true, {}, this.constructor.defaults, {
|
|
1937
2017
|
style: {
|
|
1938
2018
|
line: function line(d) {
|
|
1939
2019
|
/* Return an array that has the same number of items as we have
|
|
@@ -1944,20 +2024,7 @@ var lineAnnotation = function lineAnnotation(args) {
|
|
|
1944
2024
|
},
|
|
1945
2025
|
position: function position(d, i) {
|
|
1946
2026
|
return m_this.options('vertices')[i];
|
|
1947
|
-
}
|
|
1948
|
-
strokeColor: {
|
|
1949
|
-
r: 0,
|
|
1950
|
-
g: 0,
|
|
1951
|
-
b: 0
|
|
1952
|
-
},
|
|
1953
|
-
strokeOpacity: 1,
|
|
1954
|
-
strokeWidth: 3,
|
|
1955
|
-
closed: false,
|
|
1956
|
-
lineCap: 'butt',
|
|
1957
|
-
lineJoin: 'miter'
|
|
1958
|
-
},
|
|
1959
|
-
highlightStyle: {
|
|
1960
|
-
strokeWidth: 5
|
|
2027
|
+
}
|
|
1961
2028
|
},
|
|
1962
2029
|
createStyle: {
|
|
1963
2030
|
line: function line(d) {
|
|
@@ -1969,19 +2036,9 @@ var lineAnnotation = function lineAnnotation(args) {
|
|
|
1969
2036
|
},
|
|
1970
2037
|
position: function position(d, i) {
|
|
1971
2038
|
return m_this.options('vertices')[i];
|
|
1972
|
-
}
|
|
1973
|
-
strokeColor: {
|
|
1974
|
-
r: 0,
|
|
1975
|
-
g: 0,
|
|
1976
|
-
b: 1
|
|
1977
|
-
},
|
|
1978
|
-
strokeOpacity: 1,
|
|
1979
|
-
strokeWidth: 3,
|
|
1980
|
-
closed: false,
|
|
1981
|
-
lineCap: 'butt',
|
|
1982
|
-
lineJoin: 'miter'
|
|
2039
|
+
}
|
|
1983
2040
|
}
|
|
1984
|
-
}, args
|
|
2041
|
+
}, args);
|
|
1985
2042
|
args.vertices = args.vertices || args.coordinates || [];
|
|
1986
2043
|
delete args.coordinates;
|
|
1987
2044
|
annotation.call(this, 'line', args);
|
|
@@ -2277,6 +2334,39 @@ var lineAnnotation = function lineAnnotation(args) {
|
|
|
2277
2334
|
};
|
|
2278
2335
|
|
|
2279
2336
|
inherit(lineAnnotation, annotation);
|
|
2337
|
+
/**
|
|
2338
|
+
* This object contains the default options to initialize the class.
|
|
2339
|
+
*/
|
|
2340
|
+
|
|
2341
|
+
lineAnnotation.defaults = $.extend({}, annotation.defaults, {
|
|
2342
|
+
style: {
|
|
2343
|
+
strokeColor: {
|
|
2344
|
+
r: 0,
|
|
2345
|
+
g: 0,
|
|
2346
|
+
b: 0
|
|
2347
|
+
},
|
|
2348
|
+
strokeOpacity: 1,
|
|
2349
|
+
strokeWidth: 3,
|
|
2350
|
+
closed: false,
|
|
2351
|
+
lineCap: 'butt',
|
|
2352
|
+
lineJoin: 'miter'
|
|
2353
|
+
},
|
|
2354
|
+
highlightStyle: {
|
|
2355
|
+
strokeWidth: 5
|
|
2356
|
+
},
|
|
2357
|
+
createStyle: {
|
|
2358
|
+
strokeColor: {
|
|
2359
|
+
r: 0,
|
|
2360
|
+
g: 0,
|
|
2361
|
+
b: 1
|
|
2362
|
+
},
|
|
2363
|
+
strokeOpacity: 1,
|
|
2364
|
+
strokeWidth: 3,
|
|
2365
|
+
closed: false,
|
|
2366
|
+
lineCap: 'butt',
|
|
2367
|
+
lineJoin: 'miter'
|
|
2368
|
+
}
|
|
2369
|
+
});
|
|
2280
2370
|
var lineRequiredFeatures = {};
|
|
2281
2371
|
lineRequiredFeatures[lineFeature.capabilities.basic] = [annotationState.create];
|
|
2282
2372
|
registerAnnotation('line', lineAnnotation, lineRequiredFeatures);
|
|
@@ -2336,49 +2426,7 @@ var pointAnnotation = function pointAnnotation(args) {
|
|
|
2336
2426
|
return new pointAnnotation(args);
|
|
2337
2427
|
}
|
|
2338
2428
|
|
|
2339
|
-
args = $.extend(true, {},
|
|
2340
|
-
style: {
|
|
2341
|
-
fill: true,
|
|
2342
|
-
fillColor: {
|
|
2343
|
-
r: 0,
|
|
2344
|
-
g: 1,
|
|
2345
|
-
b: 0
|
|
2346
|
-
},
|
|
2347
|
-
fillOpacity: 0.25,
|
|
2348
|
-
radius: 10,
|
|
2349
|
-
scaled: false,
|
|
2350
|
-
stroke: true,
|
|
2351
|
-
strokeColor: {
|
|
2352
|
-
r: 0,
|
|
2353
|
-
g: 0,
|
|
2354
|
-
b: 0
|
|
2355
|
-
},
|
|
2356
|
-
strokeOpacity: 1,
|
|
2357
|
-
strokeWidth: 3
|
|
2358
|
-
},
|
|
2359
|
-
createStyle: {
|
|
2360
|
-
fillColor: {
|
|
2361
|
-
r: 0.3,
|
|
2362
|
-
g: 0.3,
|
|
2363
|
-
b: 0.3
|
|
2364
|
-
},
|
|
2365
|
-
fillOpacity: 0.25,
|
|
2366
|
-
strokeColor: {
|
|
2367
|
-
r: 0,
|
|
2368
|
-
g: 0,
|
|
2369
|
-
b: 1
|
|
2370
|
-
}
|
|
2371
|
-
},
|
|
2372
|
-
highlightStyle: {
|
|
2373
|
-
fillColor: {
|
|
2374
|
-
r: 0,
|
|
2375
|
-
g: 1,
|
|
2376
|
-
b: 1
|
|
2377
|
-
},
|
|
2378
|
-
fillOpacity: 0.5,
|
|
2379
|
-
strokeWidth: 5
|
|
2380
|
-
}
|
|
2381
|
-
}, args || {});
|
|
2429
|
+
args = $.extend(true, {}, this.constructor.defaults, args);
|
|
2382
2430
|
args.position = args.position || (args.coordinates ? args.coordinates[0] : undefined);
|
|
2383
2431
|
delete args.coordinates;
|
|
2384
2432
|
annotation.call(this, 'point', args);
|
|
@@ -2539,6 +2587,53 @@ var pointAnnotation = function pointAnnotation(args) {
|
|
|
2539
2587
|
};
|
|
2540
2588
|
|
|
2541
2589
|
inherit(pointAnnotation, annotation);
|
|
2590
|
+
/**
|
|
2591
|
+
* This object contains the default options to initialize the class.
|
|
2592
|
+
*/
|
|
2593
|
+
|
|
2594
|
+
pointAnnotation.defaults = $.extend({}, annotation.defaults, {
|
|
2595
|
+
style: {
|
|
2596
|
+
fill: true,
|
|
2597
|
+
fillColor: {
|
|
2598
|
+
r: 0,
|
|
2599
|
+
g: 1,
|
|
2600
|
+
b: 0
|
|
2601
|
+
},
|
|
2602
|
+
fillOpacity: 0.25,
|
|
2603
|
+
radius: 10,
|
|
2604
|
+
scaled: false,
|
|
2605
|
+
stroke: true,
|
|
2606
|
+
strokeColor: {
|
|
2607
|
+
r: 0,
|
|
2608
|
+
g: 0,
|
|
2609
|
+
b: 0
|
|
2610
|
+
},
|
|
2611
|
+
strokeOpacity: 1,
|
|
2612
|
+
strokeWidth: 3
|
|
2613
|
+
},
|
|
2614
|
+
createStyle: {
|
|
2615
|
+
fillColor: {
|
|
2616
|
+
r: 0.3,
|
|
2617
|
+
g: 0.3,
|
|
2618
|
+
b: 0.3
|
|
2619
|
+
},
|
|
2620
|
+
fillOpacity: 0.25,
|
|
2621
|
+
strokeColor: {
|
|
2622
|
+
r: 0,
|
|
2623
|
+
g: 0,
|
|
2624
|
+
b: 1
|
|
2625
|
+
}
|
|
2626
|
+
},
|
|
2627
|
+
highlightStyle: {
|
|
2628
|
+
fillColor: {
|
|
2629
|
+
r: 0,
|
|
2630
|
+
g: 1,
|
|
2631
|
+
b: 1
|
|
2632
|
+
},
|
|
2633
|
+
fillOpacity: 0.5,
|
|
2634
|
+
strokeWidth: 5
|
|
2635
|
+
}
|
|
2636
|
+
});
|
|
2542
2637
|
var pointRequiredFeatures = {};
|
|
2543
2638
|
pointRequiredFeatures[pointFeature.capabilities.feature] = true;
|
|
2544
2639
|
registerAnnotation('point', pointAnnotation, pointRequiredFeatures);
|
|
@@ -2603,45 +2698,13 @@ var polygonAnnotation = function polygonAnnotation(args) {
|
|
|
2603
2698
|
return new polygonAnnotation(args);
|
|
2604
2699
|
}
|
|
2605
2700
|
|
|
2606
|
-
args = $.extend(true, {}, {
|
|
2701
|
+
args = $.extend(true, {}, this.constructor.defaults, {
|
|
2607
2702
|
style: {
|
|
2608
|
-
fill: true,
|
|
2609
|
-
fillColor: {
|
|
2610
|
-
r: 0,
|
|
2611
|
-
g: 1,
|
|
2612
|
-
b: 0
|
|
2613
|
-
},
|
|
2614
|
-
fillOpacity: 0.25,
|
|
2615
2703
|
polygon: function polygon(d) {
|
|
2616
2704
|
return d.polygon;
|
|
2617
|
-
}
|
|
2618
|
-
stroke: true,
|
|
2619
|
-
strokeColor: {
|
|
2620
|
-
r: 0,
|
|
2621
|
-
g: 0,
|
|
2622
|
-
b: 0
|
|
2623
|
-
},
|
|
2624
|
-
strokeOpacity: 1,
|
|
2625
|
-
strokeWidth: 3,
|
|
2626
|
-
uniformPolygon: true
|
|
2627
|
-
},
|
|
2628
|
-
highlightStyle: {
|
|
2629
|
-
fillColor: {
|
|
2630
|
-
r: 0,
|
|
2631
|
-
g: 1,
|
|
2632
|
-
b: 1
|
|
2633
|
-
},
|
|
2634
|
-
fillOpacity: 0.5,
|
|
2635
|
-
strokeWidth: 5
|
|
2705
|
+
}
|
|
2636
2706
|
},
|
|
2637
2707
|
createStyle: {
|
|
2638
|
-
closed: false,
|
|
2639
|
-
fillColor: {
|
|
2640
|
-
r: 0.3,
|
|
2641
|
-
g: 0.3,
|
|
2642
|
-
b: 0.3
|
|
2643
|
-
},
|
|
2644
|
-
fillOpacity: 0.25,
|
|
2645
2708
|
line: function line(d) {
|
|
2646
2709
|
var coord = m_this._coordinates();
|
|
2647
2710
|
/* Return an array that has the same number of items as we have
|
|
@@ -2658,15 +2721,9 @@ var polygonAnnotation = function polygonAnnotation(args) {
|
|
|
2658
2721
|
}
|
|
2659
2722
|
|
|
2660
2723
|
return m_this.options('vertices')[i];
|
|
2661
|
-
},
|
|
2662
|
-
stroke: false,
|
|
2663
|
-
strokeColor: {
|
|
2664
|
-
r: 0,
|
|
2665
|
-
g: 0,
|
|
2666
|
-
b: 1
|
|
2667
2724
|
}
|
|
2668
2725
|
}
|
|
2669
|
-
}, args
|
|
2726
|
+
}, args);
|
|
2670
2727
|
args.vertices = args.vertices || args.coordinates || [];
|
|
2671
2728
|
delete args.coordinates;
|
|
2672
2729
|
annotation.call(this, 'polygon', args);
|
|
@@ -2727,6 +2784,37 @@ var polygonAnnotation = function polygonAnnotation(args) {
|
|
|
2727
2784
|
|
|
2728
2785
|
return features;
|
|
2729
2786
|
};
|
|
2787
|
+
/**
|
|
2788
|
+
* Return this annotation as a polygon list.
|
|
2789
|
+
*
|
|
2790
|
+
* @param {geo.util.polyop.spec} [opts] Ignored.
|
|
2791
|
+
* @returns {geo.polygonList} A list of polygons.
|
|
2792
|
+
*/
|
|
2793
|
+
|
|
2794
|
+
|
|
2795
|
+
this.toPolygonList = function (opts) {
|
|
2796
|
+
var coord = m_this._coordinates();
|
|
2797
|
+
|
|
2798
|
+
if (coord.outer) {
|
|
2799
|
+
var result = [[coord.outer.map(function (pt) {
|
|
2800
|
+
return [pt.x, pt.y];
|
|
2801
|
+
})]];
|
|
2802
|
+
(coord.inner || []).forEach(function (h) {
|
|
2803
|
+
return result[0].push(h.map(function (pt) {
|
|
2804
|
+
return [pt.x, pt.y];
|
|
2805
|
+
}));
|
|
2806
|
+
});
|
|
2807
|
+
return result;
|
|
2808
|
+
}
|
|
2809
|
+
|
|
2810
|
+
if (coord.length < 3) {
|
|
2811
|
+
return [];
|
|
2812
|
+
}
|
|
2813
|
+
|
|
2814
|
+
return [[coord.map(function (pt) {
|
|
2815
|
+
return [pt.x, pt.y];
|
|
2816
|
+
})]];
|
|
2817
|
+
};
|
|
2730
2818
|
/**
|
|
2731
2819
|
* Get and optionally set coordinates associated with this annotation in the
|
|
2732
2820
|
* map gcs coordinate system.
|
|
@@ -2926,6 +3014,55 @@ var polygonAnnotation = function polygonAnnotation(args) {
|
|
|
2926
3014
|
};
|
|
2927
3015
|
|
|
2928
3016
|
inherit(polygonAnnotation, annotation);
|
|
3017
|
+
/**
|
|
3018
|
+
* This object contains the default options to initialize the class.
|
|
3019
|
+
*/
|
|
3020
|
+
|
|
3021
|
+
polygonAnnotation.defaults = $.extend({}, annotation.defaults, {
|
|
3022
|
+
style: {
|
|
3023
|
+
fill: true,
|
|
3024
|
+
fillColor: {
|
|
3025
|
+
r: 0,
|
|
3026
|
+
g: 1,
|
|
3027
|
+
b: 0
|
|
3028
|
+
},
|
|
3029
|
+
fillOpacity: 0.25,
|
|
3030
|
+
stroke: true,
|
|
3031
|
+
strokeColor: {
|
|
3032
|
+
r: 0,
|
|
3033
|
+
g: 0,
|
|
3034
|
+
b: 0
|
|
3035
|
+
},
|
|
3036
|
+
strokeOpacity: 1,
|
|
3037
|
+
strokeWidth: 3,
|
|
3038
|
+
uniformPolygon: true
|
|
3039
|
+
},
|
|
3040
|
+
highlightStyle: {
|
|
3041
|
+
fillColor: {
|
|
3042
|
+
r: 0,
|
|
3043
|
+
g: 1,
|
|
3044
|
+
b: 1
|
|
3045
|
+
},
|
|
3046
|
+
fillOpacity: 0.5,
|
|
3047
|
+
strokeWidth: 5
|
|
3048
|
+
},
|
|
3049
|
+
createStyle: {
|
|
3050
|
+
closed: false,
|
|
3051
|
+
fillColor: {
|
|
3052
|
+
r: 0.3,
|
|
3053
|
+
g: 0.3,
|
|
3054
|
+
b: 0.3
|
|
3055
|
+
},
|
|
3056
|
+
fillOpacity: 0.25,
|
|
3057
|
+
stroke: false,
|
|
3058
|
+
strokeColor: {
|
|
3059
|
+
r: 0,
|
|
3060
|
+
g: 0,
|
|
3061
|
+
b: 1
|
|
3062
|
+
}
|
|
3063
|
+
},
|
|
3064
|
+
allowBooleanOperations: true
|
|
3065
|
+
});
|
|
2929
3066
|
var polygonRequiredFeatures = {};
|
|
2930
3067
|
polygonRequiredFeatures[polygonFeature.capabilities.feature] = true;
|
|
2931
3068
|
polygonRequiredFeatures[lineFeature.capabilities.basic] = [annotationState.create];
|
|
@@ -2996,51 +3133,7 @@ var rectangleAnnotation = function rectangleAnnotation(args, annotationName) {
|
|
|
2996
3133
|
return new rectangleAnnotation(args, annotationName);
|
|
2997
3134
|
}
|
|
2998
3135
|
|
|
2999
|
-
args = $.extend(true, {},
|
|
3000
|
-
style: {
|
|
3001
|
-
fill: true,
|
|
3002
|
-
fillColor: {
|
|
3003
|
-
r: 0,
|
|
3004
|
-
g: 1,
|
|
3005
|
-
b: 0
|
|
3006
|
-
},
|
|
3007
|
-
fillOpacity: 0.25,
|
|
3008
|
-
polygon: function polygon(d) {
|
|
3009
|
-
return d.polygon;
|
|
3010
|
-
},
|
|
3011
|
-
stroke: true,
|
|
3012
|
-
strokeColor: {
|
|
3013
|
-
r: 0,
|
|
3014
|
-
g: 0,
|
|
3015
|
-
b: 0
|
|
3016
|
-
},
|
|
3017
|
-
strokeOpacity: 1,
|
|
3018
|
-
strokeWidth: 3,
|
|
3019
|
-
uniformPolygon: true
|
|
3020
|
-
},
|
|
3021
|
-
highlightStyle: {
|
|
3022
|
-
fillColor: {
|
|
3023
|
-
r: 0,
|
|
3024
|
-
g: 1,
|
|
3025
|
-
b: 1
|
|
3026
|
-
},
|
|
3027
|
-
fillOpacity: 0.5,
|
|
3028
|
-
strokeWidth: 5
|
|
3029
|
-
},
|
|
3030
|
-
createStyle: {
|
|
3031
|
-
fillColor: {
|
|
3032
|
-
r: 0.3,
|
|
3033
|
-
g: 0.3,
|
|
3034
|
-
b: 0.3
|
|
3035
|
-
},
|
|
3036
|
-
fillOpacity: 0.25,
|
|
3037
|
-
strokeColor: {
|
|
3038
|
-
r: 0,
|
|
3039
|
-
g: 0,
|
|
3040
|
-
b: 1
|
|
3041
|
-
}
|
|
3042
|
-
}
|
|
3043
|
-
}, args || {});
|
|
3136
|
+
args = $.extend(true, {}, this.constructor.defaults, args);
|
|
3044
3137
|
args.corners = args.corners || args.coordinates || [];
|
|
3045
3138
|
delete args.coordinates;
|
|
3046
3139
|
annotation.call(this, annotationName || 'rectangle', args);
|
|
@@ -3156,6 +3249,23 @@ var rectangleAnnotation = function rectangleAnnotation(args, annotationName) {
|
|
|
3156
3249
|
|
|
3157
3250
|
return features;
|
|
3158
3251
|
};
|
|
3252
|
+
/**
|
|
3253
|
+
* Return this annotation as a polygon list.
|
|
3254
|
+
*
|
|
3255
|
+
* @param {geo.util.polyop.spec} [opts] Ignored.
|
|
3256
|
+
* @returns {geo.polygonList} A list of polygons.
|
|
3257
|
+
*/
|
|
3258
|
+
|
|
3259
|
+
|
|
3260
|
+
this.toPolygonList = function (opts) {
|
|
3261
|
+
if (m_this._coordinates().length < 3) {
|
|
3262
|
+
return [];
|
|
3263
|
+
}
|
|
3264
|
+
|
|
3265
|
+
return [[m_this._coordinates().map(function (pt) {
|
|
3266
|
+
return [pt.x, pt.y];
|
|
3267
|
+
})]];
|
|
3268
|
+
};
|
|
3159
3269
|
/**
|
|
3160
3270
|
* Get and optionally set coordinates associated with this annotation in the
|
|
3161
3271
|
* map gcs coordinate system.
|
|
@@ -3431,6 +3541,56 @@ var rectangleAnnotation = function rectangleAnnotation(args, annotationName) {
|
|
|
3431
3541
|
};
|
|
3432
3542
|
|
|
3433
3543
|
inherit(rectangleAnnotation, annotation);
|
|
3544
|
+
/**
|
|
3545
|
+
* This object contains the default options to initialize the class.
|
|
3546
|
+
*/
|
|
3547
|
+
|
|
3548
|
+
rectangleAnnotation.defaults = $.extend({}, annotation.defaults, {
|
|
3549
|
+
style: {
|
|
3550
|
+
fill: true,
|
|
3551
|
+
fillColor: {
|
|
3552
|
+
r: 0,
|
|
3553
|
+
g: 1,
|
|
3554
|
+
b: 0
|
|
3555
|
+
},
|
|
3556
|
+
fillOpacity: 0.25,
|
|
3557
|
+
polygon: function polygon(d) {
|
|
3558
|
+
return d.polygon;
|
|
3559
|
+
},
|
|
3560
|
+
stroke: true,
|
|
3561
|
+
strokeColor: {
|
|
3562
|
+
r: 0,
|
|
3563
|
+
g: 0,
|
|
3564
|
+
b: 0
|
|
3565
|
+
},
|
|
3566
|
+
strokeOpacity: 1,
|
|
3567
|
+
strokeWidth: 3,
|
|
3568
|
+
uniformPolygon: true
|
|
3569
|
+
},
|
|
3570
|
+
highlightStyle: {
|
|
3571
|
+
fillColor: {
|
|
3572
|
+
r: 0,
|
|
3573
|
+
g: 1,
|
|
3574
|
+
b: 1
|
|
3575
|
+
},
|
|
3576
|
+
fillOpacity: 0.5,
|
|
3577
|
+
strokeWidth: 5
|
|
3578
|
+
},
|
|
3579
|
+
createStyle: {
|
|
3580
|
+
fillColor: {
|
|
3581
|
+
r: 0.3,
|
|
3582
|
+
g: 0.3,
|
|
3583
|
+
b: 0.3
|
|
3584
|
+
},
|
|
3585
|
+
fillOpacity: 0.25,
|
|
3586
|
+
strokeColor: {
|
|
3587
|
+
r: 0,
|
|
3588
|
+
g: 0,
|
|
3589
|
+
b: 1
|
|
3590
|
+
}
|
|
3591
|
+
},
|
|
3592
|
+
allowBooleanOperations: true
|
|
3593
|
+
});
|
|
3434
3594
|
var rectangleRequiredFeatures = {};
|
|
3435
3595
|
rectangleRequiredFeatures[polygonFeature.capabilities.feature] = true;
|
|
3436
3596
|
registerAnnotation('rectangle', rectangleAnnotation, rectangleRequiredFeatures);
|
|
@@ -3467,18 +3627,22 @@ var rectangleAnnotation = __webpack_require__(3442);
|
|
|
3467
3627
|
var squareAnnotation = function squareAnnotation(args, annotationName) {
|
|
3468
3628
|
'use strict';
|
|
3469
3629
|
|
|
3470
|
-
args = $.extend({}, args, {
|
|
3471
|
-
constraint: 1
|
|
3472
|
-
});
|
|
3473
|
-
|
|
3474
3630
|
if (!(this instanceof squareAnnotation)) {
|
|
3475
3631
|
return new squareAnnotation(args, annotationName);
|
|
3476
3632
|
}
|
|
3477
3633
|
|
|
3634
|
+
args = $.extend(true, {}, this.constructor.defaults, args, {
|
|
3635
|
+
constraint: 1
|
|
3636
|
+
});
|
|
3478
3637
|
rectangleAnnotation.call(this, args, annotationName || 'square');
|
|
3479
3638
|
};
|
|
3480
3639
|
|
|
3481
3640
|
inherit(squareAnnotation, rectangleAnnotation);
|
|
3641
|
+
/**
|
|
3642
|
+
* This object contains the default options to initialize the class.
|
|
3643
|
+
*/
|
|
3644
|
+
|
|
3645
|
+
squareAnnotation.defaults = $.extend({}, rectangleAnnotation.defaults, {});
|
|
3482
3646
|
var squareRequiredFeatures = {};
|
|
3483
3647
|
squareRequiredFeatures[polygonFeature.capabilities.feature] = true;
|
|
3484
3648
|
registerAnnotation('square', squareAnnotation, squareRequiredFeatures);
|
|
@@ -3489,6 +3653,20 @@ module.exports = squareAnnotation;
|
|
|
3489
3653
|
/***/ 836:
|
|
3490
3654
|
/***/ (function(module, __unused_webpack_exports, __webpack_require__) {
|
|
3491
3655
|
|
|
3656
|
+
function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); }
|
|
3657
|
+
|
|
3658
|
+
function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
|
|
3659
|
+
|
|
3660
|
+
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
|
|
3661
|
+
|
|
3662
|
+
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
|
|
3663
|
+
|
|
3664
|
+
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
|
|
3665
|
+
|
|
3666
|
+
function _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
|
|
3667
|
+
|
|
3668
|
+
function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
|
|
3669
|
+
|
|
3492
3670
|
var inherit = __webpack_require__(5699);
|
|
3493
3671
|
|
|
3494
3672
|
var featureLayer = __webpack_require__(3715);
|
|
@@ -3722,6 +3900,56 @@ var annotationLayer = function annotationLayer(arg) {
|
|
|
3722
3900
|
|
|
3723
3901
|
m_this._updateFromEvent(update);
|
|
3724
3902
|
};
|
|
3903
|
+
/**
|
|
3904
|
+
* Check if there is a current boolean operation.
|
|
3905
|
+
*
|
|
3906
|
+
* @returns {string?} Either undefined for no current boolean operation or
|
|
3907
|
+
* the name of the operation.
|
|
3908
|
+
*/
|
|
3909
|
+
|
|
3910
|
+
|
|
3911
|
+
this.currentBooleanOperation = function () {
|
|
3912
|
+
var op;
|
|
3913
|
+
|
|
3914
|
+
if (m_this._currentBooleanClass) {
|
|
3915
|
+
op = m_this._currentBooleanClass.split('-')[1];
|
|
3916
|
+
}
|
|
3917
|
+
|
|
3918
|
+
return op;
|
|
3919
|
+
};
|
|
3920
|
+
/**
|
|
3921
|
+
* Check if the map is currently in a mode where we are adding an annotation
|
|
3922
|
+
* with a boolean operation. If so, remove the current annotation from the
|
|
3923
|
+
* layer, then apply it via the boolean operation.
|
|
3924
|
+
*/
|
|
3925
|
+
|
|
3926
|
+
|
|
3927
|
+
this._handleBooleanOperation = function () {
|
|
3928
|
+
var op = m_this.currentBooleanOperation();
|
|
3929
|
+
|
|
3930
|
+
if (!op || !m_this.currentAnnotation || !m_this.currentAnnotation.toPolygonList) {
|
|
3931
|
+
return;
|
|
3932
|
+
}
|
|
3933
|
+
|
|
3934
|
+
var newAnnot = m_this.currentAnnotation;
|
|
3935
|
+
m_this.removeAnnotation(m_this.currentAnnotation, false);
|
|
3936
|
+
|
|
3937
|
+
if (m_this.annotations().length || op !== 'difference' && op !== 'intersect') {
|
|
3938
|
+
var evt = {
|
|
3939
|
+
annotation: newAnnot,
|
|
3940
|
+
operation: op
|
|
3941
|
+
};
|
|
3942
|
+
m_this.geoTrigger(geo_event.annotation.boolean, evt);
|
|
3943
|
+
|
|
3944
|
+
if (evt.cancel !== false) {
|
|
3945
|
+
util.polyops[op](m_this, newAnnot.toPolygonList(), {
|
|
3946
|
+
correspond: {},
|
|
3947
|
+
keepAnnotations: 'exact',
|
|
3948
|
+
style: m_this
|
|
3949
|
+
});
|
|
3950
|
+
}
|
|
3951
|
+
}
|
|
3952
|
+
};
|
|
3725
3953
|
/**
|
|
3726
3954
|
* Handle updating the current annotation based on an update state.
|
|
3727
3955
|
*
|
|
@@ -3740,6 +3968,8 @@ var annotationLayer = function annotationLayer(arg) {
|
|
|
3740
3968
|
break;
|
|
3741
3969
|
|
|
3742
3970
|
case 'done':
|
|
3971
|
+
m_this._handleBooleanOperation();
|
|
3972
|
+
|
|
3743
3973
|
m_this.mode(null);
|
|
3744
3974
|
break;
|
|
3745
3975
|
}
|
|
@@ -3749,6 +3979,30 @@ var annotationLayer = function annotationLayer(arg) {
|
|
|
3749
3979
|
m_this.draw();
|
|
3750
3980
|
}
|
|
3751
3981
|
};
|
|
3982
|
+
/**
|
|
3983
|
+
* Check the state of the modifier keys and apply them if appropriate.
|
|
3984
|
+
*
|
|
3985
|
+
* @param {geo.event} evt The mouse move or click event.
|
|
3986
|
+
*/
|
|
3987
|
+
|
|
3988
|
+
|
|
3989
|
+
this._handleMouseMoveModifiers = function (evt) {
|
|
3990
|
+
if (m_this.mode() !== m_this.modes.edit && m_this.currentAnnotation.options('allowBooleanOperations') && m_this.currentAnnotation._coordinates().length < 2) {
|
|
3991
|
+
if (evt.modifiers) {
|
|
3992
|
+
var mod = (evt.modifiers.shift ? 's' : '') + (evt.modifiers.ctrl ? 'c' : '') + (evt.modifiers.meta || evt.modifiers.alt ? 'a' : '');
|
|
3993
|
+
|
|
3994
|
+
if (m_this._currentBooleanClass === m_this._booleanClasses[mod]) {
|
|
3995
|
+
return;
|
|
3996
|
+
}
|
|
3997
|
+
|
|
3998
|
+
m_this._currentBooleanClass = m_this._booleanClasses[mod];
|
|
3999
|
+
var mapNode = m_this.map().node();
|
|
4000
|
+
Object.values(m_this._booleanClasses).forEach(function (c) {
|
|
4001
|
+
mapNode.toggleClass(c, m_this._booleanClasses[mod] === c);
|
|
4002
|
+
});
|
|
4003
|
+
}
|
|
4004
|
+
}
|
|
4005
|
+
};
|
|
3752
4006
|
/**
|
|
3753
4007
|
* Handle mouse movement. If there is a current annotation, the movement
|
|
3754
4008
|
* event is sent to it.
|
|
@@ -3759,6 +4013,8 @@ var annotationLayer = function annotationLayer(arg) {
|
|
|
3759
4013
|
|
|
3760
4014
|
this._handleMouseMove = function (evt) {
|
|
3761
4015
|
if (m_this.mode() && m_this.currentAnnotation) {
|
|
4016
|
+
m_this._handleMouseMoveModifiers(evt);
|
|
4017
|
+
|
|
3762
4018
|
var update = m_this.currentAnnotation.mouseMove(evt);
|
|
3763
4019
|
|
|
3764
4020
|
if (update) {
|
|
@@ -3881,6 +4137,8 @@ var annotationLayer = function annotationLayer(arg) {
|
|
|
3881
4137
|
});
|
|
3882
4138
|
retrigger = true;
|
|
3883
4139
|
} else if (m_this.mode() && m_this.currentAnnotation) {
|
|
4140
|
+
m_this._handleMouseMoveModifiers(evt);
|
|
4141
|
+
|
|
3884
4142
|
update = m_this.currentAnnotation.mouseClick(evt);
|
|
3885
4143
|
|
|
3886
4144
|
m_this._updateFromEvent(update);
|
|
@@ -4118,6 +4376,15 @@ var annotationLayer = function annotationLayer(arg) {
|
|
|
4118
4376
|
this.modes = {
|
|
4119
4377
|
edit: 'edit'
|
|
4120
4378
|
};
|
|
4379
|
+
/* Keys are short-hand for preferred event modifiers. Values are classes to
|
|
4380
|
+
* apply to the map node. */
|
|
4381
|
+
|
|
4382
|
+
this._booleanClasses = {
|
|
4383
|
+
s: 'annotation-union',
|
|
4384
|
+
sc: 'annotation-intersect',
|
|
4385
|
+
c: 'annotation-difference',
|
|
4386
|
+
sa: 'annotation-xor'
|
|
4387
|
+
};
|
|
4121
4388
|
/**
|
|
4122
4389
|
* Get or set the current mode.
|
|
4123
4390
|
*
|
|
@@ -4139,7 +4406,7 @@ var annotationLayer = function annotationLayer(arg) {
|
|
|
4139
4406
|
return m_mode;
|
|
4140
4407
|
}
|
|
4141
4408
|
|
|
4142
|
-
if (arg !== m_mode || arg === m_this.modes.edit && editAnnotation !== m_this.editAnnotation) {
|
|
4409
|
+
if (arg !== m_mode || arg === m_this.modes.edit && editAnnotation !== m_this.editAnnotation || arg !== m_this.modes.edit && arg && !m_this.currentAnnotation) {
|
|
4143
4410
|
var createAnnotation,
|
|
4144
4411
|
actions,
|
|
4145
4412
|
mapNode = m_this.map().node(),
|
|
@@ -4147,6 +4414,13 @@ var annotationLayer = function annotationLayer(arg) {
|
|
|
4147
4414
|
m_mode = arg;
|
|
4148
4415
|
mapNode.toggleClass('annotation-input', !!(m_mode && m_mode !== m_this.modes.edit));
|
|
4149
4416
|
|
|
4417
|
+
if (!m_mode || m_mode === m_this.modes.edit) {
|
|
4418
|
+
Object.values(m_this._booleanClasses).forEach(function (c) {
|
|
4419
|
+
return mapNode.toggleClass(c, false);
|
|
4420
|
+
});
|
|
4421
|
+
m_this._currentBooleanClass = undefined;
|
|
4422
|
+
}
|
|
4423
|
+
|
|
4150
4424
|
if (!m_keyHandler) {
|
|
4151
4425
|
m_keyHandler = Mousetrap(mapNode[0]);
|
|
4152
4426
|
}
|
|
@@ -4238,7 +4512,10 @@ var annotationLayer = function annotationLayer(arg) {
|
|
|
4238
4512
|
this.geojson = function (geojson, clear, gcs, includeCrs) {
|
|
4239
4513
|
if (geojson !== undefined) {
|
|
4240
4514
|
var reader = registry.createFileReader('geojsonReader', {
|
|
4241
|
-
layer: m_this
|
|
4515
|
+
layer: m_this,
|
|
4516
|
+
lineStyle: (__webpack_require__(3984).defaults.style),
|
|
4517
|
+
pointStyle: (__webpack_require__(8296).defaults.style),
|
|
4518
|
+
polygonStyle: (__webpack_require__(56).defaults.style)
|
|
4242
4519
|
});
|
|
4243
4520
|
|
|
4244
4521
|
if (!reader.canRead(geojson)) {
|
|
@@ -4887,6 +5164,150 @@ var annotationLayer = function annotationLayer(arg) {
|
|
|
4887
5164
|
s_draw.call(m_this);
|
|
4888
5165
|
return m_this;
|
|
4889
5166
|
};
|
|
5167
|
+
/**
|
|
5168
|
+
* Return any annotation that has area as a polygon list: an array of
|
|
5169
|
+
* polygons, each of which is an array of polylines, each of which is an
|
|
5170
|
+
* array of points, each of which is a 2-tuple of numbers.
|
|
5171
|
+
*
|
|
5172
|
+
* @param {geo.util.polyop.spec} [opts] Ignored.
|
|
5173
|
+
* @returns {geo.polygonList} A list of polygons.
|
|
5174
|
+
*/
|
|
5175
|
+
|
|
5176
|
+
|
|
5177
|
+
this.toPolygonList = function (opts) {
|
|
5178
|
+
var poly = [];
|
|
5179
|
+
opts = opts || {};
|
|
5180
|
+
opts.annotationIndices = [];
|
|
5181
|
+
m_annotations.forEach(function (annotation, idx) {
|
|
5182
|
+
if (annotation.toPolygonList) {
|
|
5183
|
+
annotation.toPolygonList(opts).forEach(function (p) {
|
|
5184
|
+
return poly.push(p);
|
|
5185
|
+
});
|
|
5186
|
+
opts.annotationIndices.push(idx);
|
|
5187
|
+
}
|
|
5188
|
+
});
|
|
5189
|
+
return poly;
|
|
5190
|
+
};
|
|
5191
|
+
/**
|
|
5192
|
+
* Replace appropriate annotations with a list of polygons.
|
|
5193
|
+
*
|
|
5194
|
+
* @param {geo.polygonList} poly A list of polygons.
|
|
5195
|
+
* @param {geo.util.polyop.spec} [opts] This contains annotationIndices and
|
|
5196
|
+
* correspondence used to track annotations.
|
|
5197
|
+
* @returns {this}
|
|
5198
|
+
*/
|
|
5199
|
+
|
|
5200
|
+
|
|
5201
|
+
this.fromPolygonList = function (poly, opts) {
|
|
5202
|
+
if (!poly || !poly.length) {
|
|
5203
|
+
return m_this;
|
|
5204
|
+
}
|
|
5205
|
+
/* One of 'all', 'exact', 'none'; default is 'exact' */
|
|
5206
|
+
|
|
5207
|
+
|
|
5208
|
+
var keep = opts.keepAnnotations;
|
|
5209
|
+
var keepIds = {};
|
|
5210
|
+
var reusedIds = {};
|
|
5211
|
+
var correspond, exact, annot;
|
|
5212
|
+
|
|
5213
|
+
if (opts.annotationIndices && opts.correspond && opts.correspond.poly1 && opts.annotationIndices.length === opts.correspond.poly1.length) {
|
|
5214
|
+
correspond = opts.correspond.poly1;
|
|
5215
|
+
exact = opts.correspond.exact1;
|
|
5216
|
+
annot = m_this.annotations();
|
|
5217
|
+
}
|
|
5218
|
+
|
|
5219
|
+
if (keep !== 'all' && keep !== 'none') {
|
|
5220
|
+
annot.forEach(function (oldAnnot, idx) {
|
|
5221
|
+
if (opts.annotationIndices.indexOf(idx) < 0) {
|
|
5222
|
+
keepIds[oldAnnot.id()] = true;
|
|
5223
|
+
}
|
|
5224
|
+
});
|
|
5225
|
+
}
|
|
5226
|
+
|
|
5227
|
+
var polyAnnot = [];
|
|
5228
|
+
poly.forEach(function (p, idx) {
|
|
5229
|
+
p = p.map(function (h) {
|
|
5230
|
+
return h.map(function (pt) {
|
|
5231
|
+
return {
|
|
5232
|
+
x: pt[0],
|
|
5233
|
+
y: pt[1]
|
|
5234
|
+
};
|
|
5235
|
+
});
|
|
5236
|
+
});
|
|
5237
|
+
var result = {
|
|
5238
|
+
vertices: p.length === 1 ? p[0] : {
|
|
5239
|
+
outer: p[0],
|
|
5240
|
+
inner: p.slice(1)
|
|
5241
|
+
}
|
|
5242
|
+
};
|
|
5243
|
+
|
|
5244
|
+
if (correspond) {
|
|
5245
|
+
for (var i = 0; i < correspond.length; i += 1) {
|
|
5246
|
+
if (correspond[i] && correspond[i].indexOf(idx) >= 0) {
|
|
5247
|
+
var _ret = function () {
|
|
5248
|
+
var orig = annot[opts.annotationIndices[i]];
|
|
5249
|
+
|
|
5250
|
+
if (keep !== 'all' && keep !== 'none' && exact && exact[i] && exact[i].indexOf(idx) >= 0) {
|
|
5251
|
+
keepIds[orig.id()] = true;
|
|
5252
|
+
return {
|
|
5253
|
+
v: void 0
|
|
5254
|
+
};
|
|
5255
|
+
}
|
|
5256
|
+
|
|
5257
|
+
if (keep !== 'all' && reusedIds[orig.id()] === undefined) {
|
|
5258
|
+
result.annotationId = orig.id();
|
|
5259
|
+
reusedIds[orig.id()] = true;
|
|
5260
|
+
}
|
|
5261
|
+
|
|
5262
|
+
['name', 'description', 'label'].forEach(function (k) {
|
|
5263
|
+
if (orig[k](undefined, true)) {
|
|
5264
|
+
result[k] = orig[k](undefined, true);
|
|
5265
|
+
}
|
|
5266
|
+
});
|
|
5267
|
+
Object.entries(orig.options()).forEach(function (_ref) {
|
|
5268
|
+
var _ref2 = _slicedToArray(_ref, 2),
|
|
5269
|
+
key = _ref2[0],
|
|
5270
|
+
value = _ref2[1];
|
|
5271
|
+
|
|
5272
|
+
if (['showLabel', 'style'].indexOf(key) >= 0 || key.endsWith('Style')) {
|
|
5273
|
+
result[key] = value;
|
|
5274
|
+
}
|
|
5275
|
+
});
|
|
5276
|
+
return "break";
|
|
5277
|
+
}();
|
|
5278
|
+
|
|
5279
|
+
if (_ret === "break") break;
|
|
5280
|
+
if (_typeof(_ret) === "object") return _ret.v;
|
|
5281
|
+
}
|
|
5282
|
+
}
|
|
5283
|
+
}
|
|
5284
|
+
|
|
5285
|
+
polyAnnot.push(result);
|
|
5286
|
+
});
|
|
5287
|
+
var update = false; // delete extant annotations
|
|
5288
|
+
|
|
5289
|
+
if (keep !== 'all' && annot) {
|
|
5290
|
+
annot.filter(function (oldAnnot) {
|
|
5291
|
+
return keepIds[oldAnnot.id()] === undefined;
|
|
5292
|
+
}).forEach(function (oldAnnot) {
|
|
5293
|
+
m_this.removeAnnotation(oldAnnot, false);
|
|
5294
|
+
update = true;
|
|
5295
|
+
});
|
|
5296
|
+
} // add new annotations
|
|
5297
|
+
|
|
5298
|
+
|
|
5299
|
+
polyAnnot.forEach(function (p) {
|
|
5300
|
+
m_this.addAnnotation(registry.createAnnotation('polygon', p), m_this.gcs(), false);
|
|
5301
|
+
update = true;
|
|
5302
|
+
});
|
|
5303
|
+
|
|
5304
|
+
if (update) {
|
|
5305
|
+
m_this.modified();
|
|
5306
|
+
m_this.draw();
|
|
5307
|
+
}
|
|
5308
|
+
|
|
5309
|
+
return m_this;
|
|
5310
|
+
};
|
|
4890
5311
|
/**
|
|
4891
5312
|
* Initialize.
|
|
4892
5313
|
*
|
|
@@ -9418,6 +9839,20 @@ geo_event.annotation.state = 'geo_annotation_state';
|
|
|
9418
9839
|
*/
|
|
9419
9840
|
|
|
9420
9841
|
geo_event.annotation.mode = 'geo_annotation_mode';
|
|
9842
|
+
/**
|
|
9843
|
+
* Triggered when an annotation can be combined via a boolean operation (union,
|
|
9844
|
+
* intersect, difference, xor).
|
|
9845
|
+
*
|
|
9846
|
+
* @event geo.event.annotation.boolean
|
|
9847
|
+
* @type {geo.event.base}
|
|
9848
|
+
* @property {geo.annotation} annotation The annotation that is being operated
|
|
9849
|
+
* on.
|
|
9850
|
+
* @property {string} operation The operation being performed.
|
|
9851
|
+
* @property {boolean} [cancel] If the handle sets this to false, don't apply
|
|
9852
|
+
* the operation to the annotation layer.
|
|
9853
|
+
*/
|
|
9854
|
+
|
|
9855
|
+
geo_event.annotation.boolean = 'geo_annotation_boolean';
|
|
9421
9856
|
module.exports = geo_event;
|
|
9422
9857
|
|
|
9423
9858
|
/***/ }),
|
|
@@ -15293,7 +15728,10 @@ var lineFeature = function lineFeature(arg) {
|
|
|
15293
15728
|
var p = posFunc(current, j, d, index);
|
|
15294
15729
|
|
|
15295
15730
|
if (onlyInvertedY) {
|
|
15296
|
-
p
|
|
15731
|
+
p = {
|
|
15732
|
+
x: p.x,
|
|
15733
|
+
y: -p.y
|
|
15734
|
+
};
|
|
15297
15735
|
} else if (gcs !== mapgcs) {
|
|
15298
15736
|
p = transform.transformCoordinates(gcs, mapgcs, p);
|
|
15299
15737
|
}
|
|
@@ -25090,6 +25528,72 @@ var polygonFeature = function polygonFeature(arg) {
|
|
|
25090
25528
|
evt.over.found[idx] = data[di];
|
|
25091
25529
|
});
|
|
25092
25530
|
};
|
|
25531
|
+
/**
|
|
25532
|
+
* Return the polygons as a polygon list: an array of polygons, each of which
|
|
25533
|
+
* is an array of polylines, each of which is an array of points, each of
|
|
25534
|
+
* which is a 2-tuple of numbers.
|
|
25535
|
+
*
|
|
25536
|
+
* @param {geo.util.polyop.spec} [opts] Ignored.
|
|
25537
|
+
* @returns {geo.polygonList} A list of polygons.
|
|
25538
|
+
*/
|
|
25539
|
+
|
|
25540
|
+
|
|
25541
|
+
this.toPolygonList = function (opts) {
|
|
25542
|
+
var polyFunc = m_this.style.get('polygon');
|
|
25543
|
+
var posFunc = m_this.style.get('position');
|
|
25544
|
+
return m_this.data().map(function (d, i) {
|
|
25545
|
+
var polygon = polyFunc(d, i);
|
|
25546
|
+
var outer = polygon.outer || (Array.isArray(polygon) ? polygon : []);
|
|
25547
|
+
|
|
25548
|
+
if (outer.length < 3) {
|
|
25549
|
+
return [];
|
|
25550
|
+
}
|
|
25551
|
+
|
|
25552
|
+
var resp = [outer.map(function (p, j) {
|
|
25553
|
+
var pos = posFunc(p, j, d, i);
|
|
25554
|
+
return [pos.x, pos.y];
|
|
25555
|
+
})];
|
|
25556
|
+
|
|
25557
|
+
if (polygon.inner) {
|
|
25558
|
+
polygon.inner.forEach(function (h) {
|
|
25559
|
+
resp.push(h.map(function (p, j) {
|
|
25560
|
+
var pos = posFunc(p, j, d, i);
|
|
25561
|
+
return [pos.x, pos.y];
|
|
25562
|
+
}));
|
|
25563
|
+
});
|
|
25564
|
+
}
|
|
25565
|
+
|
|
25566
|
+
return resp;
|
|
25567
|
+
});
|
|
25568
|
+
};
|
|
25569
|
+
/**
|
|
25570
|
+
* Set the data, position accessor, and polygon accessor to use a list of
|
|
25571
|
+
* polygons.
|
|
25572
|
+
*
|
|
25573
|
+
* @param {geo.polygonList} poly A list of polygons.
|
|
25574
|
+
* @param {geo.util.polyop.spec} [opts] Ignored.
|
|
25575
|
+
* @returns {this}
|
|
25576
|
+
*/
|
|
25577
|
+
|
|
25578
|
+
|
|
25579
|
+
this.fromPolygonList = function (poly, opts) {
|
|
25580
|
+
m_this.style({
|
|
25581
|
+
position: function position(p) {
|
|
25582
|
+
return {
|
|
25583
|
+
x: p[0],
|
|
25584
|
+
y: p[1]
|
|
25585
|
+
};
|
|
25586
|
+
},
|
|
25587
|
+
polygon: function polygon(p) {
|
|
25588
|
+
return {
|
|
25589
|
+
outer: p[0],
|
|
25590
|
+
inner: p.slice(1)
|
|
25591
|
+
};
|
|
25592
|
+
}
|
|
25593
|
+
});
|
|
25594
|
+
m_this.data(poly);
|
|
25595
|
+
return m_this;
|
|
25596
|
+
};
|
|
25093
25597
|
/**
|
|
25094
25598
|
* Destroy.
|
|
25095
25599
|
*/
|
|
@@ -27059,7 +27563,7 @@ module.exports = sceneObject;
|
|
|
27059
27563
|
* @constant
|
|
27060
27564
|
* @type {string}
|
|
27061
27565
|
*/
|
|
27062
|
-
module.exports = "
|
|
27566
|
+
module.exports = "c77ab7869ca682dfc42f6a12a7ad2121687e94b8";
|
|
27063
27567
|
|
|
27064
27568
|
/***/ }),
|
|
27065
27569
|
|
|
@@ -34006,6 +34510,17 @@ module.exports = transform;
|
|
|
34006
34510
|
* @property {number} [z=0] Altitude coordinate.
|
|
34007
34511
|
*/
|
|
34008
34512
|
|
|
34513
|
+
/**
|
|
34514
|
+
* General represention of a point on the earth. The coordinates are most
|
|
34515
|
+
* commonly in longitude and latitude, but the coordinate system is changed
|
|
34516
|
+
* by the interface gcs. This is a list of numbers consisting of either [x, y]
|
|
34517
|
+
* or [x, y, z], where therse are the horizontal, vertical, and altitude
|
|
34518
|
+
* coordinates.
|
|
34519
|
+
*
|
|
34520
|
+
* @typedef geo.geoPositionFlat
|
|
34521
|
+
* @type {number[]}
|
|
34522
|
+
*/
|
|
34523
|
+
|
|
34009
34524
|
/**
|
|
34010
34525
|
* General represention of a two-dimensional point in any coordinate system.
|
|
34011
34526
|
*
|
|
@@ -38828,7 +39343,8 @@ __webpack_require__(7566), __webpack_require__(9215), __webpack_require__(895),
|
|
|
38828
39343
|
{
|
|
38829
39344
|
DistanceGrid: __webpack_require__(5844),
|
|
38830
39345
|
ClusterGroup: __webpack_require__(9808),
|
|
38831
|
-
mesh: __webpack_require__(9244)
|
|
39346
|
+
mesh: __webpack_require__(9244),
|
|
39347
|
+
polyops: __webpack_require__(6771)
|
|
38832
39348
|
});
|
|
38833
39349
|
|
|
38834
39350
|
/***/ }),
|
|
@@ -39205,6 +39721,592 @@ module.exports.restoreWebglRenderer = function () {
|
|
|
39205
39721
|
|
|
39206
39722
|
/***/ }),
|
|
39207
39723
|
|
|
39724
|
+
/***/ 6771:
|
|
39725
|
+
/***/ (function(module, __unused_webpack_exports, __webpack_require__) {
|
|
39726
|
+
|
|
39727
|
+
function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }
|
|
39728
|
+
|
|
39729
|
+
function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
|
|
39730
|
+
|
|
39731
|
+
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
|
|
39732
|
+
|
|
39733
|
+
function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); }
|
|
39734
|
+
|
|
39735
|
+
function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }
|
|
39736
|
+
|
|
39737
|
+
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
|
|
39738
|
+
|
|
39739
|
+
var PolyBool = __webpack_require__(3291);
|
|
39740
|
+
|
|
39741
|
+
var geo_map = __webpack_require__(2804);
|
|
39742
|
+
/**
|
|
39743
|
+
* A list of flat polygon lists.
|
|
39744
|
+
*
|
|
39745
|
+
* @typedef {Array.<Array.<Array.<geo.geoPositionFlat>>>} geo.polygonList
|
|
39746
|
+
*/
|
|
39747
|
+
|
|
39748
|
+
/**
|
|
39749
|
+
* A polygon in any of a variety of formats.
|
|
39750
|
+
*
|
|
39751
|
+
* This can be any object with a ``toPolygonList`` and ``fromPolygonList``
|
|
39752
|
+
* method.
|
|
39753
|
+
*
|
|
39754
|
+
* @typedef {geo.polygonFlat|Array.<geo.polygonFlat>|Array.<Array.<geo.polygonFlat>>|geo.polygonObject|Array.<geo.polygonObject>|Array.<geo.geoPositionFlat>|Array.<Array.<geo.geoPositionFlat>>|geo.polygonList|object} geo.polygonAny
|
|
39755
|
+
*/
|
|
39756
|
+
|
|
39757
|
+
/**
|
|
39758
|
+
* Object specification for polygon operation options.
|
|
39759
|
+
*
|
|
39760
|
+
* @typedef {object} geo.util.polyop.spec
|
|
39761
|
+
* @property {geo.polygonAny} [poly1] The first polygon set to operate on.
|
|
39762
|
+
* @property {geo.polygonAny} [poly2] The second polygon set to operate on.
|
|
39763
|
+
* @property {number} [epsilon1] A precision value to use when computing the
|
|
39764
|
+
* operation. If not specified, this is computed from the range of values in
|
|
39765
|
+
* ``poly1``. It is used for processing ``poly1`` and the general operation.
|
|
39766
|
+
* @property {number} [epsilon1] A precision value to use when processing
|
|
39767
|
+
* ``poly2``. If not specified, this is computed from the range of values in
|
|
39768
|
+
* ``poly2``.
|
|
39769
|
+
* @property {string|object} [style] If specified, the preferred output style.
|
|
39770
|
+
* This can be (flat|object)[-list[list[-outer[-list]]]]. If an object,
|
|
39771
|
+
* the object must have a method ``fromPolygonList``.
|
|
39772
|
+
* @property {string|geo.transform} [ingcs] The default coordinate
|
|
39773
|
+
* system of the source polygon coordinates. If not specified , this is
|
|
39774
|
+
* taken from the feature first or the map second if either is available.
|
|
39775
|
+
* @property {string|geo.transform} [gcs] The default coordinate system to use
|
|
39776
|
+
* for the actual operations. This is where the epsilon and rdp values are
|
|
39777
|
+
* applied. If not specified , this is taken from the map second if
|
|
39778
|
+
* available.
|
|
39779
|
+
* @property {geo.map} [map] Used for ``ingcs`` and ``gcs`` if needed.
|
|
39780
|
+
* @property {string} [innerOperation="union"] one of union, intersect, xor.
|
|
39781
|
+
* Used to combine individual polygons in each of ``poly1`` and ``poly2``
|
|
39782
|
+
* before the main operation is carried out.
|
|
39783
|
+
* @property {object} [correspond] If present, information about the
|
|
39784
|
+
* correspondence of the input and output polygons is added to this object.
|
|
39785
|
+
* This is of the form {poly1: [idx...], poly2: [idx...], exact1: [idx...],
|
|
39786
|
+
* exact2: [idx...]}, where the [idx...] array is the length of the input
|
|
39787
|
+
* polygon array and each entry is either undefined or contains a list of
|
|
39788
|
+
* indices of corresponding output polygons. Exact means that all of the
|
|
39789
|
+
* points in the input polygon are in the output polygon. Multiple inputs
|
|
39790
|
+
* can refer to the same output.
|
|
39791
|
+
* @property {number} [tolerance] A tolerance value to pass to features,
|
|
39792
|
+
* annotations, or other object-based polygon generators to specify how
|
|
39793
|
+
* closely non-polygons are converted to polygons. This is in the feature's
|
|
39794
|
+
* gcs coordinate system.
|
|
39795
|
+
* @property {number} [pixelTolerance] A tolerance value to pass to features,
|
|
39796
|
+
* annotations, or other object-based polygon generators to specify how
|
|
39797
|
+
* closely non-polygons are converted to polygons. This is interpreted in
|
|
39798
|
+
* the feature's map's display coordinates.
|
|
39799
|
+
*/
|
|
39800
|
+
|
|
39801
|
+
|
|
39802
|
+
var AlternateOpNames = {
|
|
39803
|
+
'+': 'union',
|
|
39804
|
+
'|': 'union',
|
|
39805
|
+
add: 'union',
|
|
39806
|
+
'-': 'difference',
|
|
39807
|
+
sub: 'difference',
|
|
39808
|
+
subtract: 'difference',
|
|
39809
|
+
minus: 'difference',
|
|
39810
|
+
'*': 'intersect',
|
|
39811
|
+
'&': 'intersect',
|
|
39812
|
+
mul: 'intersect',
|
|
39813
|
+
multiply: 'intersect',
|
|
39814
|
+
x: 'xor',
|
|
39815
|
+
'^': 'xor'
|
|
39816
|
+
};
|
|
39817
|
+
/**
|
|
39818
|
+
* Convert a segment list to a polygon list.
|
|
39819
|
+
*
|
|
39820
|
+
* @param {object[]} seglist A PolyBool segment list.
|
|
39821
|
+
* @returns {geo.polygonList} A polygon list.
|
|
39822
|
+
*/
|
|
39823
|
+
|
|
39824
|
+
function seglistToPolygonList(seglist) {
|
|
39825
|
+
// This single line doesn't arrange holes correctly
|
|
39826
|
+
// return seglist.map((s) => PolyBool.polygon(s).regions);
|
|
39827
|
+
var polys = [];
|
|
39828
|
+
seglist.forEach(function (s) {
|
|
39829
|
+
var geojson = PolyBool.polygonToGeoJSON(PolyBool.polygon(s));
|
|
39830
|
+
|
|
39831
|
+
if (geojson.type === 'MultiPolygon') {
|
|
39832
|
+
geojson.coordinates.forEach(function (p) {
|
|
39833
|
+
polys.push(p.map(function (h) {
|
|
39834
|
+
return h.slice(0, h.length - 1);
|
|
39835
|
+
}));
|
|
39836
|
+
});
|
|
39837
|
+
} else if (geojson.type === 'Polygon') {
|
|
39838
|
+
polys.push(geojson.coordinates.map(function (h) {
|
|
39839
|
+
return h.slice(0, h.length - 1);
|
|
39840
|
+
}));
|
|
39841
|
+
}
|
|
39842
|
+
});
|
|
39843
|
+
return polys;
|
|
39844
|
+
}
|
|
39845
|
+
/**
|
|
39846
|
+
* Perform an boolean operation on a seglist from polygons.
|
|
39847
|
+
*
|
|
39848
|
+
* @param {string} op One of 'union', 'intersect', or other value PolyBool
|
|
39849
|
+
* supports.
|
|
39850
|
+
* @param {number} epsilon Precision for calculations. In degrees, 1e-9 is
|
|
39851
|
+
* around 0.11 mm in ground distance.
|
|
39852
|
+
* @param {object} seglist A seglist array as used by the polybool library.
|
|
39853
|
+
* @returns {object} A seglist array.
|
|
39854
|
+
*/
|
|
39855
|
+
|
|
39856
|
+
|
|
39857
|
+
function polygonOperationSeglist(op, epsilon, seglist) {
|
|
39858
|
+
op = 'select' + op.charAt(0).toUpperCase() + op.slice(1);
|
|
39859
|
+
PolyBool.epsilon(epsilon);
|
|
39860
|
+
|
|
39861
|
+
while (seglist.length > 1) {
|
|
39862
|
+
var newlist = [];
|
|
39863
|
+
var half = Math.ceil(seglist.length / 2);
|
|
39864
|
+
|
|
39865
|
+
for (var i = 0; i < half; i += 1) {
|
|
39866
|
+
var segments = seglist[i];
|
|
39867
|
+
|
|
39868
|
+
if (i + half < seglist.length) {
|
|
39869
|
+
var nextseg = seglist[i + half];
|
|
39870
|
+
|
|
39871
|
+
try {
|
|
39872
|
+
segments = PolyBool.combine(segments, nextseg);
|
|
39873
|
+
} catch (err) {
|
|
39874
|
+
segments = PolyBool.segments(PolyBool.polygon(segments));
|
|
39875
|
+
nextseg = PolyBool.segments(PolyBool.polygon(nextseg));
|
|
39876
|
+
|
|
39877
|
+
for (var j = 20; j >= 6; j -= 1) {
|
|
39878
|
+
PolyBool.epsilon(Math.pow(0.1, j));
|
|
39879
|
+
|
|
39880
|
+
try {
|
|
39881
|
+
segments = PolyBool.combine(segments, nextseg);
|
|
39882
|
+
break;
|
|
39883
|
+
} catch (err) {}
|
|
39884
|
+
}
|
|
39885
|
+
|
|
39886
|
+
PolyBool.epsilon(epsilon);
|
|
39887
|
+
}
|
|
39888
|
+
|
|
39889
|
+
if (segments.combined) {
|
|
39890
|
+
segments.combined = segments.combined.filter(function (s) {
|
|
39891
|
+
return Math.abs(s.start[0] - s.end[0]) > epsilon || Math.abs(s.start[1] - s.end[1]) > epsilon;
|
|
39892
|
+
});
|
|
39893
|
+
segments = PolyBool[op](segments);
|
|
39894
|
+
} else {
|
|
39895
|
+
console.warn('Failed in polygon functions.');
|
|
39896
|
+
}
|
|
39897
|
+
|
|
39898
|
+
segments.segments = segments.segments.filter(function (s) {
|
|
39899
|
+
return Math.abs(s.start[0] - s.end[0]) > epsilon || Math.abs(s.start[1] - s.end[1]) > epsilon;
|
|
39900
|
+
});
|
|
39901
|
+
}
|
|
39902
|
+
|
|
39903
|
+
newlist.push(segments);
|
|
39904
|
+
}
|
|
39905
|
+
|
|
39906
|
+
seglist = newlist;
|
|
39907
|
+
}
|
|
39908
|
+
|
|
39909
|
+
return seglist;
|
|
39910
|
+
}
|
|
39911
|
+
/**
|
|
39912
|
+
* Convert a polygon in any of several formats to a polygon list. Each polygon
|
|
39913
|
+
* in the list is a list of polylines. Each polyline is a list of points.
|
|
39914
|
+
* Each point is a list of two coordinates. The input can be a variety of
|
|
39915
|
+
* formats:
|
|
39916
|
+
* - object, flat: a list of {x, y} or [x, y]
|
|
39917
|
+
* - object-list, flat-list: a list of lists of {x, y} or [x, y]
|
|
39918
|
+
* - object-listlist, flat-listlist: a list if lists of lists of {x, y} or
|
|
39919
|
+
* [x, y]
|
|
39920
|
+
* - object-listlist-outer, flat-listlist-outer: {outer: {x, y}, inner:
|
|
39921
|
+
* [{x, y}]} or {outer: [x, y], inner: [[x, y]]}
|
|
39922
|
+
* - object-listlist-outer-list, flat-listlist-outer-list: a list of objects
|
|
39923
|
+
* in outer/inner object or outer/inner list form
|
|
39924
|
+
* The actual format is stored in the mode object.
|
|
39925
|
+
*
|
|
39926
|
+
* @param {geo.polygonAny} poly A polygon in one of the above formats to
|
|
39927
|
+
* convert.
|
|
39928
|
+
* @param {object} mode An object that is modified with information about
|
|
39929
|
+
* the conversion. This includes style: the input polygon format; min: a
|
|
39930
|
+
* 2-item list with minimum values in x, y; max: a 2-item list with
|
|
39931
|
+
* maximum values in x, y; epsilon: a recommended value for epsilon in other
|
|
39932
|
+
* functions.
|
|
39933
|
+
* @param {geo.util.polyop.spec} [opts] Options for the operation. Only used
|
|
39934
|
+
* if poly is an object with a toPolygonList method.
|
|
39935
|
+
* @returns {geo.polygonList} A list of polygons.
|
|
39936
|
+
*/
|
|
39937
|
+
|
|
39938
|
+
|
|
39939
|
+
function toPolygonList(poly, mode, opts) {
|
|
39940
|
+
mode = mode || {};
|
|
39941
|
+
|
|
39942
|
+
if (poly.toPolygonList) {
|
|
39943
|
+
mode.style = poly;
|
|
39944
|
+
poly = poly.toPolygonList(opts);
|
|
39945
|
+
|
|
39946
|
+
if (!poly.length) {
|
|
39947
|
+
mode.min = mode.max = [0, 0];
|
|
39948
|
+
mode.epsilon = 1e-10;
|
|
39949
|
+
return poly;
|
|
39950
|
+
}
|
|
39951
|
+
} else {
|
|
39952
|
+
mode.style = '';
|
|
39953
|
+
|
|
39954
|
+
if (poly.outer) {
|
|
39955
|
+
mode.style = '-outer';
|
|
39956
|
+
poly = [[poly.outer].concat(_toConsumableArray(poly.inner || []))];
|
|
39957
|
+
} else if (poly.length && poly[0].outer) {
|
|
39958
|
+
mode.style = '-outer-list';
|
|
39959
|
+
poly = poly.map(function (p) {
|
|
39960
|
+
return [p.outer].concat(_toConsumableArray(p.inner || []));
|
|
39961
|
+
});
|
|
39962
|
+
}
|
|
39963
|
+
|
|
39964
|
+
if (!poly.length) {
|
|
39965
|
+
mode.style = 'flat-listlist' + mode.style;
|
|
39966
|
+
mode.min = mode.max = [0, 0];
|
|
39967
|
+
mode.epsilon = 1e-10;
|
|
39968
|
+
return poly;
|
|
39969
|
+
}
|
|
39970
|
+
|
|
39971
|
+
if (poly[0].x !== undefined) {
|
|
39972
|
+
mode.style = 'object';
|
|
39973
|
+
poly = [[poly.map(function (pt) {
|
|
39974
|
+
return [pt.x, pt.y];
|
|
39975
|
+
})]];
|
|
39976
|
+
} else if (poly[0][0].x !== undefined) {
|
|
39977
|
+
mode.style = 'object-list' + mode.style;
|
|
39978
|
+
poly = [poly.map(function (p) {
|
|
39979
|
+
return p.map(function (pt) {
|
|
39980
|
+
return [pt.x, pt.y];
|
|
39981
|
+
});
|
|
39982
|
+
})];
|
|
39983
|
+
} else if (poly[0][0][0] === undefined) {
|
|
39984
|
+
mode.style = 'flat';
|
|
39985
|
+
poly = [[poly]];
|
|
39986
|
+
} else if (poly[0][0][0].x !== undefined) {
|
|
39987
|
+
mode.style = 'object-listlist' + mode.style;
|
|
39988
|
+
poly = poly.map(function (p) {
|
|
39989
|
+
return p.map(function (l) {
|
|
39990
|
+
return l.map(function (pt) {
|
|
39991
|
+
return [pt.x, pt.y];
|
|
39992
|
+
});
|
|
39993
|
+
});
|
|
39994
|
+
});
|
|
39995
|
+
} else if (poly[0][0][0][0] === undefined) {
|
|
39996
|
+
mode.style = 'flat-list';
|
|
39997
|
+
poly = [poly];
|
|
39998
|
+
} else {
|
|
39999
|
+
mode.style = 'flat-listlist' + mode.style;
|
|
40000
|
+
}
|
|
40001
|
+
}
|
|
40002
|
+
|
|
40003
|
+
mode.min = [poly[0][0][0][0], poly[0][0][0][1]];
|
|
40004
|
+
mode.max = [poly[0][0][0][0], poly[0][0][0][1]];
|
|
40005
|
+
poly.forEach(function (p) {
|
|
40006
|
+
return p.forEach(function (l) {
|
|
40007
|
+
return l.forEach(function (pt) {
|
|
40008
|
+
if (pt[0] < mode.min[0]) {
|
|
40009
|
+
mode.min[0] = pt[0];
|
|
40010
|
+
}
|
|
40011
|
+
|
|
40012
|
+
if (pt[0] > mode.max[0]) {
|
|
40013
|
+
mode.max[0] = pt[0];
|
|
40014
|
+
}
|
|
40015
|
+
|
|
40016
|
+
if (pt[1] < mode.min[1]) {
|
|
40017
|
+
mode.min[1] = pt[1];
|
|
40018
|
+
}
|
|
40019
|
+
|
|
40020
|
+
if (pt[1] > mode.max[1]) {
|
|
40021
|
+
mode.max[1] = pt[1];
|
|
40022
|
+
}
|
|
40023
|
+
});
|
|
40024
|
+
});
|
|
40025
|
+
});
|
|
40026
|
+
mode.epsilon = Math.max(Math.max(mode.max[0], mode.max[1]), Math.max(Math.abs(mode.min[0]), Math.abs(mode.min[1]))) * 1e-10;
|
|
40027
|
+
return poly;
|
|
40028
|
+
}
|
|
40029
|
+
/**
|
|
40030
|
+
* Convert a polygon list to another format.
|
|
40031
|
+
*
|
|
40032
|
+
* @param {geo.polygonList} poly A list of polygons.
|
|
40033
|
+
* @param {object} mode An object that is modified with information about the
|
|
40034
|
+
* conversion. This includes style: the input polygon format; min: a 2-item
|
|
40035
|
+
* list with minimum values in x, y; max: a 2-item list with maximum values
|
|
40036
|
+
* in x, y; epsilon: a recommended value for epsilon in other functions.
|
|
40037
|
+
* @param {geo.util.polyop.spec} [opts] Options for the operation. Only used
|
|
40038
|
+
* if ``mode.style`` is an object with a fromPolygonList method.
|
|
40039
|
+
* @returns {geo.polygonAny} A polygon in one of several formats.
|
|
40040
|
+
*/
|
|
40041
|
+
|
|
40042
|
+
|
|
40043
|
+
function fromPolygonList(poly, mode, opts) {
|
|
40044
|
+
if (mode.style.fromPolygonList) {
|
|
40045
|
+
return mode.style.fromPolygonList(poly, opts);
|
|
40046
|
+
}
|
|
40047
|
+
|
|
40048
|
+
if (mode.style.includes('object')) {
|
|
40049
|
+
poly = poly.map(function (p) {
|
|
40050
|
+
return p.map(function (h) {
|
|
40051
|
+
return h.map(function (pt) {
|
|
40052
|
+
return {
|
|
40053
|
+
x: pt[0],
|
|
40054
|
+
y: pt[1]
|
|
40055
|
+
};
|
|
40056
|
+
});
|
|
40057
|
+
});
|
|
40058
|
+
});
|
|
40059
|
+
}
|
|
40060
|
+
|
|
40061
|
+
if (mode.style.includes('outer')) {
|
|
40062
|
+
poly = [poly.map(function (p) {
|
|
40063
|
+
return {
|
|
40064
|
+
outer: p[0],
|
|
40065
|
+
inner: p.slice(1)
|
|
40066
|
+
};
|
|
40067
|
+
})];
|
|
40068
|
+
}
|
|
40069
|
+
|
|
40070
|
+
if (!mode.style.endsWith('listlist')) {
|
|
40071
|
+
if (mode.style.endsWith('list')) {
|
|
40072
|
+
poly = poly[0];
|
|
40073
|
+
} else {
|
|
40074
|
+
poly = poly[0][0];
|
|
40075
|
+
}
|
|
40076
|
+
}
|
|
40077
|
+
|
|
40078
|
+
return poly;
|
|
40079
|
+
}
|
|
40080
|
+
/**
|
|
40081
|
+
* Use a minimum style for output to include all of the results.
|
|
40082
|
+
*
|
|
40083
|
+
* @param {geo.polygonList} polylist A list of polygons.
|
|
40084
|
+
* @param {string} style the proposed style.
|
|
40085
|
+
* @returns {string} The preferred style.
|
|
40086
|
+
*/
|
|
40087
|
+
|
|
40088
|
+
|
|
40089
|
+
function minimumPolygonStyle(polylist, style) {
|
|
40090
|
+
if (style.fromPolygonList) {
|
|
40091
|
+
return style;
|
|
40092
|
+
}
|
|
40093
|
+
|
|
40094
|
+
if (polylist.length > 1) {
|
|
40095
|
+
if (style.includes('outer')) {
|
|
40096
|
+
return style + (style.endsWith('list') ? '' : '-list');
|
|
40097
|
+
}
|
|
40098
|
+
|
|
40099
|
+
if (style.endsWith('listlist')) {
|
|
40100
|
+
return style;
|
|
40101
|
+
}
|
|
40102
|
+
|
|
40103
|
+
return style + (style.endsWith('list') ? 'list' : '-listlist');
|
|
40104
|
+
}
|
|
40105
|
+
|
|
40106
|
+
if (polylist.length === 1 && polylist[0].length > 1) {
|
|
40107
|
+
if (style.includes('outer') || style.endsWith('list')) {
|
|
40108
|
+
return style;
|
|
40109
|
+
}
|
|
40110
|
+
|
|
40111
|
+
return style + '-list';
|
|
40112
|
+
}
|
|
40113
|
+
|
|
40114
|
+
return style;
|
|
40115
|
+
}
|
|
40116
|
+
/**
|
|
40117
|
+
* Generate the correspondence between the source polygons and the output
|
|
40118
|
+
* polygons. A polygon corresponds if it has at least two points in common.
|
|
40119
|
+
*
|
|
40120
|
+
* @param {geo.polygonList} poly1 First set of source polygons.
|
|
40121
|
+
* @param {geo.polygonList} poly2 Second set of source polygons.
|
|
40122
|
+
* @param {geo.polygonList} newpoly Output polygons.
|
|
40123
|
+
* @param {object} results An object to add results to.
|
|
40124
|
+
*/
|
|
40125
|
+
|
|
40126
|
+
|
|
40127
|
+
function generateCorrespondence(poly1, poly2, newpoly, results) {
|
|
40128
|
+
var pts = {};
|
|
40129
|
+
var counts = [];
|
|
40130
|
+
newpoly.forEach(function (p, idx) {
|
|
40131
|
+
return p.forEach(function (h) {
|
|
40132
|
+
return h.forEach(function (pt) {
|
|
40133
|
+
var key = '_' + pt[0] + '_' + pt[1];
|
|
40134
|
+
|
|
40135
|
+
if (pts[key]) {
|
|
40136
|
+
if (pts[key].indexOf(idx) === -1) {
|
|
40137
|
+
pts[key].push(idx);
|
|
40138
|
+
}
|
|
40139
|
+
} else {
|
|
40140
|
+
pts[key] = [idx];
|
|
40141
|
+
}
|
|
40142
|
+
|
|
40143
|
+
if (counts.length <= idx) {
|
|
40144
|
+
counts.push(0);
|
|
40145
|
+
}
|
|
40146
|
+
|
|
40147
|
+
counts[idx] += 1;
|
|
40148
|
+
});
|
|
40149
|
+
});
|
|
40150
|
+
});
|
|
40151
|
+
['poly1', 'poly2'].forEach(function (pkey) {
|
|
40152
|
+
var poly = pkey === 'poly1' ? poly1 : poly2;
|
|
40153
|
+
var ekey = pkey === 'poly1' ? 'exact1' : 'exact2';
|
|
40154
|
+
results[pkey] = Array(poly.length);
|
|
40155
|
+
results[ekey] = Array(poly.length);
|
|
40156
|
+
poly.forEach(function (p, idx) {
|
|
40157
|
+
var found = {};
|
|
40158
|
+
p.forEach(function (h) {
|
|
40159
|
+
return h.forEach(function (pt) {
|
|
40160
|
+
var key = '_' + pt[0] + '_' + pt[1];
|
|
40161
|
+
|
|
40162
|
+
if (pts[key]) {
|
|
40163
|
+
pts[key].forEach(function (val) {
|
|
40164
|
+
found[val] = (found[val] || 0) + 1;
|
|
40165
|
+
});
|
|
40166
|
+
}
|
|
40167
|
+
});
|
|
40168
|
+
});
|
|
40169
|
+
Object.keys(found).forEach(function (nidx) {
|
|
40170
|
+
if (found[nidx] === counts[+nidx]) {
|
|
40171
|
+
if (!results[ekey][idx]) {
|
|
40172
|
+
results[ekey][idx] = [];
|
|
40173
|
+
}
|
|
40174
|
+
|
|
40175
|
+
results[ekey][idx].push(+nidx);
|
|
40176
|
+
}
|
|
40177
|
+
|
|
40178
|
+
if (found[nidx] >= 2) {
|
|
40179
|
+
if (!results[pkey][idx]) {
|
|
40180
|
+
results[pkey][idx] = [];
|
|
40181
|
+
}
|
|
40182
|
+
|
|
40183
|
+
results[pkey][idx].push(+nidx);
|
|
40184
|
+
}
|
|
40185
|
+
});
|
|
40186
|
+
});
|
|
40187
|
+
});
|
|
40188
|
+
}
|
|
40189
|
+
/**
|
|
40190
|
+
* Perform a general operation of a set of polygons.
|
|
40191
|
+
*
|
|
40192
|
+
* @param {string} op The operation to handle. One of union, intersect,
|
|
40193
|
+
* difference, or xor.
|
|
40194
|
+
* @param {geo.polygonAny|geo.util.polyop.spec} poly1 Either the first polygon
|
|
40195
|
+
* set or an object containing all parameters for the function.
|
|
40196
|
+
* @param {geo.polygonAny} [poly2] If the poly1 parameter is not a complete
|
|
40197
|
+
* options object, the second polygon set for the operation.
|
|
40198
|
+
* @param {geo.util.polyop.spec} [opts] If the poly1 parameter is not a
|
|
40199
|
+
* complete options object, the options for the operation.
|
|
40200
|
+
* @returns {geo.polygonAny} A polygon set in the same style as poly1.
|
|
40201
|
+
*/
|
|
40202
|
+
|
|
40203
|
+
|
|
40204
|
+
function generalOperationProcess(op, poly1, poly2, opts) {
|
|
40205
|
+
var transform = __webpack_require__(6853);
|
|
40206
|
+
|
|
40207
|
+
op = AlternateOpNames[op] || op;
|
|
40208
|
+
|
|
40209
|
+
if (poly1.poly1) {
|
|
40210
|
+
opts = poly1;
|
|
40211
|
+
poly1 = opts.poly1;
|
|
40212
|
+
poly2 = opts.poly2;
|
|
40213
|
+
}
|
|
40214
|
+
|
|
40215
|
+
opts = opts || {};
|
|
40216
|
+
var ingcs1 = opts.ingcs || (opts.map ? opts.map.ingcs() : poly1.gcs ? poly1.gcs() : poly1.layer && poly1.layer().gcs ? poly1.layer().gcs() : poly1.layer ? poly1.layer().map().ingcs() : poly1.map instanceof geo_map ? poly1.map().ingcs() : undefined);
|
|
40217
|
+
var ingcs2 = opts.ingcs || (opts.map ? opts.map.ingcs() : poly2.gcs ? poly2.gcs() : poly2.layer && poly2.layer().gcs ? poly2.layer().gcs() : poly2.layer ? poly2.layer().map().ingcs() : poly2.map instanceof geo_map ? poly2.map().ingcs() : ingcs1);
|
|
40218
|
+
var gcs = opts.gcs || (opts.map ? opts.map.gcs() : poly1.layer ? poly1.layer().map().gcs() : poly1.map instanceof geo_map ? poly1.map().gcs() : undefined);
|
|
40219
|
+
var mode1 = {};
|
|
40220
|
+
var mode2 = {};
|
|
40221
|
+
poly1 = toPolygonList(poly1, mode1, opts);
|
|
40222
|
+
poly2 = toPolygonList(poly2, mode2, opts);
|
|
40223
|
+
mode1.epsilon = opts.epsilon1 || mode1.epsilon;
|
|
40224
|
+
mode2.epsilon = opts.epsilon2 || mode1.epsilon;
|
|
40225
|
+
|
|
40226
|
+
if (ingcs1 && gcs && ingcs1 !== gcs) {
|
|
40227
|
+
poly1 = poly1.map(function (p) {
|
|
40228
|
+
return p.map(function (h) {
|
|
40229
|
+
return transform.transformCoordinates(ingcs1, gcs, h);
|
|
40230
|
+
});
|
|
40231
|
+
});
|
|
40232
|
+
}
|
|
40233
|
+
|
|
40234
|
+
if (ingcs2 && gcs && ingcs2 !== gcs) {
|
|
40235
|
+
poly2 = poly2.map(function (p) {
|
|
40236
|
+
return p.map(function (h) {
|
|
40237
|
+
return transform.transformCoordinates(ingcs2, gcs, h);
|
|
40238
|
+
});
|
|
40239
|
+
});
|
|
40240
|
+
}
|
|
40241
|
+
|
|
40242
|
+
var seglist1 = poly1.map(function (p) {
|
|
40243
|
+
return PolyBool.segments({
|
|
40244
|
+
regions: p
|
|
40245
|
+
});
|
|
40246
|
+
});
|
|
40247
|
+
var seglist2 = poly2.map(function (p) {
|
|
40248
|
+
return PolyBool.segments({
|
|
40249
|
+
regions: p
|
|
40250
|
+
});
|
|
40251
|
+
});
|
|
40252
|
+
seglist1 = polygonOperationSeglist(opts.innerOperation || 'union', mode1.epsilon, seglist1);
|
|
40253
|
+
seglist2 = polygonOperationSeglist(opts.innerOperation || 'union', mode2.epsilon, seglist2);
|
|
40254
|
+
var seglist = seglist1;
|
|
40255
|
+
|
|
40256
|
+
if (seglist1[0] && seglist2[0]) {
|
|
40257
|
+
/* We need to do the main operation with the same inversion flags */
|
|
40258
|
+
seglist1[0].inverted = false;
|
|
40259
|
+
seglist2[0].inverted = false;
|
|
40260
|
+
seglist = polygonOperationSeglist(op, Math.max(mode1.epsilon, mode2.epsilon), [seglist1[0], seglist2[0]]);
|
|
40261
|
+
} else if (seglist2[0]) {
|
|
40262
|
+
seglist = seglist2;
|
|
40263
|
+
}
|
|
40264
|
+
|
|
40265
|
+
var newpoly = seglistToPolygonList(seglist);
|
|
40266
|
+
|
|
40267
|
+
if (opts.correspond) {
|
|
40268
|
+
generateCorrespondence(poly1, poly2, newpoly, opts.correspond);
|
|
40269
|
+
}
|
|
40270
|
+
|
|
40271
|
+
if (ingcs1 && gcs && ingcs1 !== gcs) {
|
|
40272
|
+
newpoly = newpoly.map(function (p) {
|
|
40273
|
+
return p.map(function (h) {
|
|
40274
|
+
return transform.transformCoordinates(gcs, ingcs1, h);
|
|
40275
|
+
});
|
|
40276
|
+
});
|
|
40277
|
+
}
|
|
40278
|
+
|
|
40279
|
+
var mode = {
|
|
40280
|
+
style: opts.style || minimumPolygonStyle(newpoly, mode1.style)
|
|
40281
|
+
};
|
|
40282
|
+
return fromPolygonList(newpoly, mode, opts);
|
|
40283
|
+
}
|
|
40284
|
+
/**
|
|
40285
|
+
* Generate a polygon function for a specific operation.
|
|
40286
|
+
*
|
|
40287
|
+
* @param {string} op The operation to handle. One of union, intersect,
|
|
40288
|
+
* difference, or xor.
|
|
40289
|
+
* @returns {function} a function for the polygons.
|
|
40290
|
+
*/
|
|
40291
|
+
|
|
40292
|
+
|
|
40293
|
+
function generalOperation(op) {
|
|
40294
|
+
return function (poly1, poly2, opts) {
|
|
40295
|
+
return generalOperationProcess(op, poly1, poly2, opts);
|
|
40296
|
+
};
|
|
40297
|
+
}
|
|
40298
|
+
|
|
40299
|
+
module.exports = {
|
|
40300
|
+
union: generalOperation('union'),
|
|
40301
|
+
intersect: generalOperation('intersect'),
|
|
40302
|
+
difference: generalOperation('difference'),
|
|
40303
|
+
xor: generalOperation('xor'),
|
|
40304
|
+
toPolygonList: toPolygonList,
|
|
40305
|
+
fromPolygonList: fromPolygonList
|
|
40306
|
+
};
|
|
40307
|
+
|
|
40308
|
+
/***/ }),
|
|
40309
|
+
|
|
39208
40310
|
/***/ 9215:
|
|
39209
40311
|
/***/ (function(module) {
|
|
39210
40312
|
|
|
@@ -39581,7 +40683,7 @@ module.exports = vectorFeature;
|
|
|
39581
40683
|
* @constant
|
|
39582
40684
|
* @type {string}
|
|
39583
40685
|
*/
|
|
39584
|
-
module.exports = "1.
|
|
40686
|
+
module.exports = "1.9.2";
|
|
39585
40687
|
|
|
39586
40688
|
/***/ }),
|
|
39587
40689
|
|
|
@@ -45314,12 +46416,23 @@ module.exports = {
|
|
|
45314
46416
|
/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__);
|
|
45315
46417
|
/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(3476);
|
|
45316
46418
|
/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__);
|
|
46419
|
+
/* harmony import */ var _node_modules_css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(1678);
|
|
46420
|
+
/* harmony import */ var _node_modules_css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2__);
|
|
45317
46421
|
// Imports
|
|
45318
46422
|
|
|
45319
46423
|
|
|
46424
|
+
|
|
46425
|
+
var ___CSS_LOADER_URL_IMPORT_0___ = new URL(/* asset import */ __webpack_require__(3554), __webpack_require__.b);
|
|
46426
|
+
var ___CSS_LOADER_URL_IMPORT_1___ = new URL(/* asset import */ __webpack_require__(4144), __webpack_require__.b);
|
|
46427
|
+
var ___CSS_LOADER_URL_IMPORT_2___ = new URL(/* asset import */ __webpack_require__(237), __webpack_require__.b);
|
|
46428
|
+
var ___CSS_LOADER_URL_IMPORT_3___ = new URL(/* asset import */ __webpack_require__(9490), __webpack_require__.b);
|
|
45320
46429
|
var ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default()));
|
|
46430
|
+
var ___CSS_LOADER_URL_REPLACEMENT_0___ = _node_modules_css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2___default()(___CSS_LOADER_URL_IMPORT_0___);
|
|
46431
|
+
var ___CSS_LOADER_URL_REPLACEMENT_1___ = _node_modules_css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2___default()(___CSS_LOADER_URL_IMPORT_1___);
|
|
46432
|
+
var ___CSS_LOADER_URL_REPLACEMENT_2___ = _node_modules_css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2___default()(___CSS_LOADER_URL_IMPORT_2___);
|
|
46433
|
+
var ___CSS_LOADER_URL_REPLACEMENT_3___ = _node_modules_css_loader_dist_runtime_getUrl_js__WEBPACK_IMPORTED_MODULE_2___default()(___CSS_LOADER_URL_IMPORT_3___);
|
|
45321
46434
|
// Module
|
|
45322
|
-
___CSS_LOADER_EXPORT___.push([module.id, ".geojs-map{position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;overflow:hidden}.geojs-map .geo-attribution{position:absolute;right:0;bottom:0;padding-right:5px;cursor:auto;font:11px/1.5 \"Helvetica Neue\",Arial,Helvetica,sans-serif;z-index:1001;background:rgba(255,255,255,0.7);clear:both;display:block;pointer-events:auto}.geojs-map .geo-attribution .geo-attribution-layer{padding-left:5px}.geojs-map .canvas-canvas{display:block;-webkit-transform-origin:0 0;-moz-transform-origin:0 0;-o-transform-origin:0 0;-ms-transform-origin:0 0;transform-origin:0 0}.geojs-map .webgl-canvas{display:block}.geojs-map .geojs-layer{position:absolute;width:100%;height:100%;left:0;top:0;pointer-events:none}.geojs-map .geojs-layer.active:not(.hidden) > *{pointer-events:auto}.geojs-map .geojs-layer.hidden{display:none}.geojs-map .geojs-layer.hidden[renderer=\"webgl\"]{display:inherit}.geojs-map .geo-tile-layer{-webkit-transform-origin:0 0;-moz-transform-origin:0 0;-o-transform-origin:0 0;-ms-transform-origin:0 0;transform-origin:0 0;line-height:0;font-size:0}.geojs-map.annotation-input{cursor:crosshair}.geojs-map.highlight-focus:after{content:\"\";display:block;position:absolute;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;left:0;top:0;right:0;bottom:0;border:3px solid Highlight;opacity:1;-ms-filter:none;filter:none;-webkit-transition:opacity 0s;-moz-transition:opacity 0s;-o-transition:opacity 0s;-ms-transition:opacity 0s;transition:opacity 0s;visibility:hidden}.geojs-map.highlight-focus:focus:after{visibility:visible;-webkit-transition:opacity 2.5s ease-in;-moz-transition:opacity 2.5s ease-in;-o-transition:opacity 2.5s ease-in;-ms-transition:opacity 2.5s ease-in;transition:opacity 2.5s ease-in;opacity:0;-ms-filter:\"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)\";filter:alpha(opacity=0)}.geo-tile-container{position:absolute}.geo-tile-container.crop{overflow:hidden}", "",{"version":3,"sources":["webpack://./main.styl","webpack://./../node_modules/nib/lib/nib/vendor.styl","webpack://./../node_modules/nib/lib/nib/overflow.styl","webpack://./../node_modules/nib/lib/nib/flex.styl","webpack://./../node_modules/nib/lib/nib/border.styl"],"names":[],"mappings":"AAEA,WACE,iBAAS,CCwCO,wBAAG,CAAH,qBAAG,CAAH,oBAAG,CARN,gBAAG,CChBd,eAAU,CFZZ,4BACE,iBAAS,CACT,OAAM,CACN,QAAO,CACP,iBAAc,CCmfd,WAAO,CDjfP,yDAA8B,CAC9B,YAAQ,CCoeR,gCAAW,CDleX,UAAM,CGMN,aAAS,CHJT,mBAAe,CAEf,mDACE,gBAAa,CAEjB,0BGDE,aAAS,CFqBK,4BAAG,CAAH,yBAAG,CAAH,uBAAG,CAAH,wBAAG,CARN,oBAAG,CDThB,yBGJE,aAAS,CHOX,wBACE,iBAAS,CACT,UAAM,CACN,WAAO,CACP,MAAK,CACL,KAAI,CACJ,mBAAe,CAEb,gDACE,mBAAe,CACnB,+BGjBA,YAAS,CHmBT,iDGnBA,eAAS,CHsBX,2BCDgB,4BAAG,CAAH,yBAAG,CAAH,uBAAG,CAAH,wBAAG,CARN,oBAAG,CDWd,aAAY,CACZ,WAAU,CAEZ,4BC6cE,gBAAO,CDzcP,iCACE,UAAQ,CGhCV,aAAS,CHkCP,iBAAS,CCbG,6BAAG,CAAH,0BAAG,CARN,qBAAG,CDuBZ,MAAK,CACL,KAAI,CACJ,OAAM,CACN,QAAO,CIpDT,0BAAQ,CHmQV,SAAS,CAQH,eAAY,CACZ,WAAQ,CA5OE,6BAAG,CAAH,0BAAG,CAAH,wBAAG,CAAH,yBAAG,CARN,qBAAG,CDkCZ,iBAAW,CACb,uCACE,kBAAW,CC5BC,uCAAG,CAAH,oCAAG,CAAH,kCAAG,CAAH,mCAAG,CARN,+BAAG,CA2OhB,SAAS,CAWH,+DAAyE,CACzE,uBAAiC,CD/MzC,oBACE,iBAAS,CACT,yBExDE,eAAU","sourcesContent":["@import '~nib/index.styl'\n\n.geojs-map\n position relative\n user-select none\n overflow hidden\n\n .geo-attribution\n position absolute\n right 0\n bottom 0\n padding-right 5px\n cursor auto\n font 11px/1.5 \"Helvetica Neue\", Arial, Helvetica, sans-serif\n z-index 1001\n background rgba(255,255,255,0.7)\n clear both\n display block\n pointer-events auto\n\n .geo-attribution-layer\n padding-left 5px\n\n .canvas-canvas\n display block\n transform-origin 0px 0px\n .webgl-canvas\n display block\n\n .geojs-layer\n position absolute\n width 100%\n height 100%\n left 0\n top 0\n pointer-events none\n &.active:not(.hidden)\n > *\n pointer-events auto\n &.hidden\n display none\n &.hidden[renderer=\"webgl\"]\n display inherit\n\n .geo-tile-layer\n transform-origin 0px 0px\n line-height 0\n font-size 0\n\n &.annotation-input\n cursor crosshair\n\n &.highlight-focus\n &:after\n content \"\"\n display block\n position absolute\n box-sizing border-box\n left 0px\n top 0px\n right 0px\n bottom 0px\n // Highlight is technically a css2 color. We may need to specify it\n // explicitly. #3B66A6 seems close\n border 3px solid Highlight\n opacity 1\n transition opacity 0s\n visibility hidden\n &:focus:after\n visibility visible\n transition opacity 2.5s ease-in\n opacity 0\n\n.geo-tile-container\n position absolute\n &.crop\n overflow hidden\n","use('../nodes/vendor-helpers.js')\n@import 'config'\n\n/*\n * Alias \"nowrap\" as \"no-wrap\".\n */\n\nno-wrap = unquote('nowrap')\n\n/*\n * Helper to find out if a given value is a width\n */\n\nis-width(val)\n if auto == val\n return true\n else if val && 'unit' == type(val)\n // Stylus does not short circuit so we need to perform this as a distinct\n // operation to prevent errors\n return '' != unit(val)\n return false\n\n/*\n * Vendor support for the given prop / arguments, optionally specifying the\n * only prefixes to utilize, or those which should be ignored.\n */\n\nvendor(prop, args, only = null, ignore = null, vendor-property = true)\n need_normalize = !vendor-property or prop in ('transition' 'transition-property' 'border-image' 'border-image-slice')\n for prefix in vendor-prefixes\n unless (only and !(prefix in only)) or (ignore and prefix in ignore)\n if official == prefix\n if need_normalize\n {prop}: normalize(prop,('%s' % args))\n else\n {prop}: args\n else\n newprop = prop\n newprop = '-' + prefix + '-' + prop if vendor-property\n\n if need_normalize\n {newprop}: normalize(prop,('%s' % args),prefix)\n else\n {newprop}: args\n/*\n * Vendorize the given value.\n */\n\nvendor-value(arg, only = null, ignore = null)\n prop = current-property[0]\n for prefix in vendor-prefixes\n unless (only and !(prefix in only)) or (ignore and prefix in ignore) or official == prefix\n add-property(prop, '-%s-%s' % (prefix arg))\n arg\n\n/*\n * Vendor \"box-shadow\" support.\n */\n\nbox-shadow()\n vendor('box-shadow', arguments, only: webkit official)\n\n/*\n * Vendor \"user-select\" support.\n */\n\nuser-select()\n vendor('user-select', arguments, only: webkit moz ms official)\n\n/*\n * Vendor \"column-count\" support.\n */\n\ncolumn-count()\n vendor('column-count', arguments, only: webkit moz official)\n\n/*\n * Vendor \"column-gap\" support.\n */\n\ncolumn-gap()\n vendor('column-gap', arguments, only: webkit moz official)\n\n/*\n * Vendor \"column-rule\" support.\n */\n\ncolumn-rule()\n vendor('column-rule', arguments, only: webkit moz official)\n\n/*\n * Vendor \"column-rule-color\" support.\n */\n\ncolumn-rule-color()\n vendor('column-rule-color', arguments, only: webkit moz official)\n\n/*\n * Vendor \"column-rule-width\" support.\n */\n\ncolumn-rule-width()\n vendor('column-rule-width', arguments, only: webkit moz official)\n\n/*\n * Vendor \"column-rule-style\" support.\n */\n\ncolumn-rule-style()\n vendor('column-rule-style', arguments, only: webkit moz official)\n\n/*\n * Vendor \"column-width\" support.\n */\n\ncolumn-width()\n vendor('column-width', arguments, only: webkit moz official)\n\n/*\n * Vendor \"column-span\" support.\n */\n\ncolumn-span()\n vendor('column-span', arguments, only: webkit official)\n\n/*\n * Vendor \"column-fill\" support.\n */\n\ncolumn-fill()\n vendor('column-fill', arguments, only: moz)\n\n/*\n * Legacy syntax support for background-clip and background-origin\n */\n\nlegacy-bg-values(property, args)\n legacy_args = ()\n importance = unquote('')\n for subargs in args\n for arg in subargs\n if arg in (border-box padding-box content-box)\n arg = unquote('border') if arg == border-box\n arg = unquote('padding') if arg == padding-box\n arg = unquote('content') if arg == content-box\n if arg != '!important'\n push(legacy_args,arg)\n else\n importance = !important\n vendor(property, unquote(join(', ',legacy_args)) importance, only: moz webkit)\n\n/*\n * Vendor \"background-clip\" support.\n */\n\nbackground-clip()\n if arguments[0] == text\n vendor('background-clip', arguments, only: webkit)\n else\n legacy-bg-values('background-clip', arguments)\n background-clip: arguments\n\n/*\n * Vendor \"background-origin\" support.\n */\n\nbackground-origin()\n legacy-bg-values('background-origin', arguments)\n background-origin: arguments\n\n/*\n * Vendor \"background-size\" support.\n */\n\nbackground-size()\n vendor('background-size', arguments, only: webkit moz official)\n\n/*\n * Vendor \"transform\" support.\n */\n\ntransform()\n vendor('transform', arguments)\n\n/*\n * Vendor \"transform-origin\" support.\n */\ntransform-origin()\n vendor('transform-origin', arguments)\n\n/*\n * Vendor \"transform-style\" support.\n */\n\ntransform-style()\n vendor('transform-style', arguments)\n\n/*\n * Vendor \"border-image\" support.\n */\n\nborder-image()\n vendor('border-image', arguments, only: webkit moz o official)\n\n/*\n * Vendor \"transition\" support.\n */\n\ntransition()\n vendor('transition', arguments)\n\n/*\n * Vendor \"transition-property\" support.\n */\n\ntransition-property()\n vendor('transition-property', arguments)\n\n/*\n * Vendor \"transition-duration\" support.\n */\n\ntransition-duration()\n vendor('transition-duration', arguments)\n\n/*\n * Vendor \"transition-timing-function\" support.\n */\n\ntransition-timing-function()\n vendor('transition-timing-function', arguments)\n\n/*\n * Vendor \"transition-delay\" support.\n */\n\ntransition-delay()\n vendor('transition-delay', arguments)\n\n/*\n * Vendor \"backface-visibility\" support.\n */\n\nbackface-visibility()\n vendor('backface-visibility', arguments, only: webkit moz ms official)\n\n/*\n * Vendor \"perspective\" support.\n */\n\nperspective()\n if mixin\n vendor('perspective', arguments, only: webkit moz ms official)\n else\n 'perspective(%s)' % arguments\n\n/*\n * Vendor \"perspective-origin\" support.\n */\n\nperspective-origin()\n vendor('perspective-origin', arguments, only: webkit moz ms official)\n\n/*\n * Opacity with conditional IE support.\n */\n\nopacity(n, args...)\n opacity: n args\n if support-for-ie\n if n == inherit or n == initial\n -ms-filter: n args\n filter: n args\n else\n val = round(n * 100)\n if val == 100\n -ms-filter: none args\n filter: none args\n else\n -ms-filter: '\"progid:DXImageTransform.Microsoft.Alpha(Opacity=%s)\"' % val args\n filter: 'alpha(opacity=%s)' % val args\n\n/*\n * Vendor \"text-size-adjust\"\n */\n\ntext-size-adjust()\n vendor('text-size-adjust', arguments)\n\n/*\n * Alias the \"white-space\" property.\n */\n\nwhitespace()\n white-space: arguments\n\n/*\n * Vendor \"box-sizing\" support.\n */\n\nbox-sizing()\n vendor('box-sizing', arguments, only: webkit moz official)\n\n/*\n * Vendor \"box-orient\" support.\n */\n\nbox-orient()\n vendor('box-orient', arguments, only: webkit moz official)\n\n/*\n * Vendor \"box-flex-group\" support.\n */\n\nbox-flex-group()\n vendor('box-flex-group', arguments, only: webkit moz official)\n\n/*\n * Vendor \"box-ordinal-group\" support.\n */\n\nbox-ordinal-group()\n vendor('box-ordinal-group', arguments, only: webkit moz ms official)\n\n\n/*\n * Vendor \"box-align\" support.\n */\n\nbox-align()\n vendor('box-align', arguments, only: webkit moz ms official)\n\n/*\n * Vendor \"box-pack\" support.\n */\n\nbox-pack()\n vendor('box-pack', arguments, only: webkit moz ms official)\n\n/*\n * Vendor \"box-direction\" support.\n */\n\nbox-direction()\n vendor('box-direction', arguments, only: webkit moz ms official)\n\n/*\n * Vendor \"animation\" support.\n */\n\nanimation()\n vendor('animation', arguments)\n\n\n/*\n * Vendor \"animation-name\" support.\n */\n\nanimation-name()\n vendor('animation-name', arguments)\n\n/*\n * Vendor \"animation-duration\" support.\n */\n\nanimation-duration()\n vendor('animation-duration', arguments)\n\n/*\n * Vendor \"animation-delay\" support.\n */\n\nanimation-delay()\n vendor('animation-delay', arguments)\n\n/*\n * Vendor \"animation-direction\" support.\n */\n\nanimation-direction()\n vendor('animation-direction', arguments)\n\n/*\n * Vendor \"animation-iteration-count\" support.\n */\n\nanimation-iteration-count()\n vendor('animation-iteration-count', arguments)\n\n/*\n * Vendor \"animation-timing-function\" support.\n */\n\nanimation-timing-function()\n vendor('animation-timing-function', arguments)\n\n/*\n * Vendor \"animation-play-state\" support.\n */\n\nanimation-play-state()\n vendor('animation-play-state', arguments)\n\n/*\n * Vendor \"animation-fill-mode\" support.\n */\n\nanimation-fill-mode()\n vendor('animation-fill-mode', arguments)\n\n/*\n * Vendor \"hyphens\" support.\n */\n\nhyphens()\n vendor('hyphens', arguments, only: webkit moz ms official)\n\n/*\n * Vendor \"appearance\" support.\n */\n\nappearance()\n vendor('appearance', arguments, only: webkit moz official)\n\n/*\n * Vendor \"tab-size\" support.\n */\n\ntab-size()\n vendor('tab-size', arguments, only: moz o official)\n\n/*\n * Vendor \"overflow-scrolling\" support.\n */\n\noverflow-scrolling()\n vendor('overflow-scrolling', arguments, only: webkit official)\n\n/*\n * Vendor \"text-overflow\" support, , -o- for opera 9.* - 10.*\n */\n\ntext-overflow()\n vendor('text-overflow', arguments, only: official o)\n\n/*\n * Vendor \"text-size-adjust\" support.\n */\ntext-size-adjust()\n vendor('text-size-adjust', arguments, only: official webkit ms)\n\n/*\n * Vendor \"font-smoothing\" support, webkit only.\n */\nfont-smoothing()\n vendor('font-smoothing', arguments, only: webkit)\n\n\n/**\n * Vendor input-placeholder/placeholder support.\n *\n * Examples:\n * // Default syntax\n * body\n * placeholder(color #333, font-weight normal)\n *\n * // The comma is important\n * .placeholder-red\n * placeholder(color red,)\n *\n * // We can pass a function\n * green-placeholder()\n * color green\n * .placeholder-green\n * placeholder(green-placeholder)\n *\n * // We can pass a hash\n * textarea\n * placeholder((font-style italic) (font-weight bold) (padding '4px 10px'))\n */\nplaceholder()\n for v in ':-webkit-input' '-moz' ':-moz' '-ms-input'\n &:{v}-placeholder\n for pair in arguments\n if typeof(pair) == 'function'\n pair()\n else if pair is not null && pair[0] is not null\n {pair[0]}: type(pair[1]) == 'string' ? s(pair[1]) : pair[1]\ninput-placeholder = placeholder\n\n/*\n * Vendor background support (gradients).\n */\n\nbackground()\n if match('-gradient\\(', ''+arguments)\n vendor('background', arguments, vendor-property: false)\n else\n background arguments\n\nbackground-image()\n if match('-gradient\\(', ''+arguments)\n vendor('background-image', arguments, vendor-property: false)\n else\n background-image arguments\n\ncursor()\n if match('-gradient\\(', ''+arguments)\n vendor('cursor', arguments, vendor-property: false)\n else\n cursor arguments\n\nlist-style()\n if match('-gradient\\(', ''+arguments)\n vendor('list-style', arguments, vendor-property: false)\n else\n list-style arguments\n\nlist-style-image()\n if match('-gradient\\(', ''+arguments)\n vendor('list-style-image', arguments, vendor-property: false)\n else\n list-style-image arguments\n","/*\n * Overflow utility. Maps to regular overflow, and adds an ellipsis value.\n *\n * Synopsis:\n *\n * overflow: <type>\n *\n * Examples:\n *\n * overflow: auto\n * overflow: hidden\n * overflow: ellipsis\n *\n */\n\noverflow()\n if arguments[0] == ellipsis\n ellipsis()\n else\n overflow: arguments\n","/*\n * Vendor \"display: flex\" support with fallback to obsolete versions.\n */\n\nflex-version ?= box flex\n\n//\n// 1. Display values\n// - http://www.w3.org/TR/css3-flexbox/#flex-containers\n//\ndisplay(type, args...)\n if flex == type || inline-flex == type\n if box in flex-version\n if flex == type\n display: -ms-flexbox args\n display: vendor-value(box args, only: moz webkit)\n else\n display: -ms-inline-flexbox args\n display: vendor-value(inline-box args, only: moz webkit)\n if flex in flex-version\n display: vendor-value(arguments, only: webkit official) // overwrites old webkit\n else\n display: arguments\n\n/*\n * New syntax for browsers like Google Chrome.\n * Plus a translation to the old syntax, if possible.\n */\n\n\n//\n// 5. Ordering and Orientation\n// - http://www.w3.org/TR/css3-flexbox/#ordering-and-orientation\n//\n-flex-obsolete-direction(direction)\n if box in flex-version\n if row-reverse == direction || column-reverse == direction\n vendor('box-direction', reverse, ignore: ms official)\n\n if row == direction || row-reverse == direction\n vendor('box-orient', horizontal, ignore: ms official)\n else if column == direction || column-reverse == direction\n vendor('box-orient', vertical, ignore: ms official)\n\n-flex-obsolete-wrap(value)\n if box in flex-version\n // WARN: wrap-reverse does not have a box equivalent. This will render in different manners\n // on box vs. flex values.\n if 'wrap' == value || wrap-reverse == value\n vendor('box-lines', multiple, ignore: ms official)\n else if nowrap == value\n vendor('box-lines', single, ignore: ms official)\n\nflex-direction(direction)\n // obsolete\n -flex-obsolete-direction(direction)\n\n // new\n if flex in flex-version\n vendor('flex-direction', arguments, only: webkit ms official)\n\nflex-wrap(value)\n // obsolete\n -flex-obsolete-wrap(value)\n\n if flex in flex-version\n vendor('flex-wrap', arguments, only: webkit ms official)\n\nflex-flow()\n // obsolete\n -flex-obsolete-direction(arguments[0])\n -flex-obsolete-direction(arguments[1])\n -flex-obsolete-wrap(arguments[0])\n -flex-obsolete-wrap(arguments[1])\n\n // new\n if flex in flex-version\n vendor('flex-flow', arguments, only: webkit ms official)\n\n\norder()\n // obsolete\n if box in flex-version\n vendor('box-ordinal-group', arguments, ignore: ms official)\n\n // new\n if flex in flex-version\n vendor('flex-order', arguments, only: ms)\n vendor('order', arguments, only: webkit official)\n\n\n//\n// 7. Flexibility\n// - http://www.w3.org/TR/css3-flexbox/#flexibility\n//\nflex-grow(growth)\n // obsolete\n if box in flex-version\n vendor('box-flex', growth)\n\n // new\n if flex in flex-version\n vendor('flex-grow', arguments, only: webkit official)\n\nflex-basis()\n if flex in flex-version\n vendor('flex-basis', arguments, only: webkit official)\n\nflex-shrink()\n if flex in flex-version\n vendor('flex-shrink', arguments, only: webkit official)\n\nflex(growth)\n\n // obsolete\n if box in flex-version\n shrink = 1\n\n if none == growth || initial == growth\n // Well known values\n shrink = 0 if none == growth\n growth = 0\n else if is-width(growth) == true\n // Basis is defined as the first parameter\n growth = arguments[1] || 0\n shrink = arguments[2] if 3 <= length(arguments)\n else if arguments[1] && is-width(arguments[1]) == false\n // Growth is first and shrink is second\n shrink = arguments[1]\n\n // Since we can't make the distinction between growing and shrinking in the box model, take\n // the one that provides the most flexibility.\n vendor('box-flex', max(growth, shrink), ignore: ms)\n\n // new\n if flex in flex-version\n vendor('flex', arguments, only: webkit ms official)\n\n\n// converts the justification alignment\n-convert-justify(align)\n if flex-start == align\n return start\n else if flex-end == align\n return end\n else if space-around == align\n return distribute\n else if space-between == align\n return justify\n else\n return align\n\n//\n// 8. Alignment\n// - http://www.w3.org/TR/css3-flexbox/#alignment\n//\njustify-content(align)\n // obsolete\n if box in flex-version\n vendor('box-pack', -convert-justify(align), ignore: ms official)\n\n // new\n if flex in flex-version\n vendor('flex-pack', -convert-justify(align), only: ms)\n vendor('justify-content', align, only: webkit official)\n\nalign-content(align)\n // WARN: Obsolete spec does not allow for adjustment here\n if flex in flex-version\n vendor('flex-line-pack', -convert-justify(align), only: ms)\n vendor('align-content', align, only: webkit official)\n\n// converts alignment from 'flex' to normal value\n-convert-alignment(align)\n if flex-start == align\n return start\n else if flex-end == align\n return end\n else\n return align\n\nalign-items(align)\n // obsolete\n if box in flex-version\n vendor('box-align', -convert-alignment(align), ignore: ms official)\n\n // new\n if flex in flex-version\n vendor('flex-align', -convert-alignment(align), only: ms)\n vendor('align-items', arguments, only: webkit official)\n\nalign-self(align)\n // WARN: Obsolete spec does not allow for overriding alignment on individual items.\n if flex in flex-version\n vendor('align-self', align, only: webkit official)\n vendor('flex-item-align', -convert-alignment(align), only: ms)\n","/*\n * border: <color>\n * border: ...\n */\n\nborder(color, args...)\n if color is a 'color'\n border: 1px solid color args\n else\n border: arguments\n"],"sourceRoot":""}]);
|
|
46435
|
+
___CSS_LOADER_EXPORT___.push([module.id, ".geojs-map{position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;overflow:hidden}.geojs-map .geo-attribution{position:absolute;right:0;bottom:0;padding-right:5px;cursor:auto;font:11px/1.5 \"Helvetica Neue\",Arial,Helvetica,sans-serif;z-index:1001;background:rgba(255,255,255,0.7);clear:both;display:block;pointer-events:auto}.geojs-map .geo-attribution .geo-attribution-layer{padding-left:5px}.geojs-map .canvas-canvas{display:block;-webkit-transform-origin:0 0;-moz-transform-origin:0 0;-o-transform-origin:0 0;-ms-transform-origin:0 0;transform-origin:0 0}.geojs-map .webgl-canvas{display:block}.geojs-map .geojs-layer{position:absolute;width:100%;height:100%;left:0;top:0;pointer-events:none}.geojs-map .geojs-layer.active:not(.hidden) > *{pointer-events:auto}.geojs-map .geojs-layer.hidden{display:none}.geojs-map .geojs-layer.hidden[renderer=\"webgl\"]{display:inherit}.geojs-map .geo-tile-layer{-webkit-transform-origin:0 0;-moz-transform-origin:0 0;-o-transform-origin:0 0;-ms-transform-origin:0 0;transform-origin:0 0;line-height:0;font-size:0}.geojs-map.annotation-input{cursor:crosshair}.geojs-map.annotation-input.annotation-intersect{cursor:url(" + ___CSS_LOADER_URL_REPLACEMENT_0___ + ") 12 12,crosshair}.geojs-map.annotation-input.annotation-difference{cursor:url(" + ___CSS_LOADER_URL_REPLACEMENT_1___ + ") 12 12,crosshair}.geojs-map.annotation-input.annotation-union{cursor:url(" + ___CSS_LOADER_URL_REPLACEMENT_2___ + ") 12 12,crosshair}.geojs-map.annotation-input.annotation-xor{cursor:url(" + ___CSS_LOADER_URL_REPLACEMENT_3___ + ") 12 12,crosshair}.geojs-map.highlight-focus:after{content:\"\";display:block;position:absolute;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;left:0;top:0;right:0;bottom:0;border:3px solid Highlight;opacity:1;-ms-filter:none;filter:none;-webkit-transition:opacity 0s;-moz-transition:opacity 0s;-o-transition:opacity 0s;-ms-transition:opacity 0s;transition:opacity 0s;visibility:hidden}.geojs-map.highlight-focus:focus:after{visibility:visible;-webkit-transition:opacity 2.5s ease-in;-moz-transition:opacity 2.5s ease-in;-o-transition:opacity 2.5s ease-in;-ms-transition:opacity 2.5s ease-in;transition:opacity 2.5s ease-in;opacity:0;-ms-filter:\"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)\";filter:alpha(opacity=0)}.geo-tile-container{position:absolute}.geo-tile-container.crop{overflow:hidden}", "",{"version":3,"sources":["webpack://./main.styl","webpack://./../node_modules/nib/lib/nib/vendor.styl","webpack://./../node_modules/nib/lib/nib/overflow.styl","webpack://./../node_modules/nib/lib/nib/flex.styl","webpack://./../node_modules/nib/lib/nib/border.styl"],"names":[],"mappings":"AAEA,WACE,iBAAS,CCwCO,wBAAG,CAAH,qBAAG,CAAH,oBAAG,CARN,gBAAG,CChBd,eAAU,CFZZ,4BACE,iBAAS,CACT,OAAM,CACN,QAAO,CACP,iBAAc,CC4ed,WAAO,CD1eP,yDAA8B,CAC9B,YAAQ,CC6dR,gCAAW,CD3dX,UAAM,CGMN,aAAS,CHJT,mBAAe,CAEf,mDACE,gBAAa,CAEjB,0BGDE,aAAS,CFqBK,4BAAG,CAAH,yBAAG,CAAH,uBAAG,CAAH,wBAAG,CARN,oBAAG,CDThB,yBGJE,aAAS,CHOX,wBACE,iBAAS,CACT,UAAM,CACN,WAAO,CACP,MAAK,CACL,KAAI,CACJ,mBAAe,CAEb,gDACE,mBAAe,CACnB,+BGjBA,YAAS,CHmBT,iDGnBA,eAAS,CHsBX,2BCDgB,4BAAG,CAAH,yBAAG,CAAH,uBAAG,CAAH,wBAAG,CARN,oBAAG,CDWd,aAAY,CACZ,WAAU,CAEZ,4BCscE,gBAAO,CDpcP,iDCocA,8DAAO,CDlcP,kDCkcA,8DAAO,CDhcP,6CCgcA,8DAAO,CD9bP,2CC8bA,8DAAO,CD1bP,iCACE,UAAQ,CGxCV,aAAS,CH0CP,iBAAS,CCrBG,6BAAG,CAAH,0BAAG,CARN,qBAAG,CD+BZ,MAAK,CACL,KAAI,CACJ,OAAM,CACN,QAAO,CI5DT,0BAAQ,CH4PV,SAAS,CAQH,eAAY,CACZ,WAAQ,CArOE,6BAAG,CAAH,0BAAG,CAAH,wBAAG,CAAH,yBAAG,CARN,qBAAG,CD0CZ,iBAAW,CACb,uCACE,kBAAW,CCpCC,uCAAG,CAAH,oCAAG,CAAH,kCAAG,CAAH,mCAAG,CARN,+BAAG,CAoOhB,SAAS,CAWH,+DAAyE,CACzE,uBAAiC,CDhMzC,oBACE,iBAAS,CACT,yBEhEE,eAAU","sourcesContent":["@import '~nib/index.styl'\n\n.geojs-map\n position relative\n user-select none\n overflow hidden\n\n .geo-attribution\n position absolute\n right 0\n bottom 0\n padding-right 5px\n cursor auto\n font 11px/1.5 \"Helvetica Neue\", Arial, Helvetica, sans-serif\n z-index 1001\n background rgba(255,255,255,0.7)\n clear both\n display block\n pointer-events auto\n\n .geo-attribution-layer\n padding-left 5px\n\n .canvas-canvas\n display block\n transform-origin 0px 0px\n .webgl-canvas\n display block\n\n .geojs-layer\n position absolute\n width 100%\n height 100%\n left 0\n top 0\n pointer-events none\n &.active:not(.hidden)\n > *\n pointer-events auto\n &.hidden\n display none\n &.hidden[renderer=\"webgl\"]\n display inherit\n\n .geo-tile-layer\n transform-origin 0px 0px\n line-height 0\n font-size 0\n\n &.annotation-input\n cursor crosshair\n &.annotation-intersect\n cursor embedurl(\"./css/cursor-crosshair-intersect.svg\") 12 12,crosshair\n &.annotation-difference\n cursor embedurl(\"./css/cursor-crosshair-difference.svg\") 12 12,crosshair\n &.annotation-union\n cursor embedurl(\"./css/cursor-crosshair-union.svg\") 12 12,crosshair\n &.annotation-xor\n cursor embedurl(\"./css/cursor-crosshair-xor.svg\") 12 12,crosshair\n\n &.highlight-focus\n &:after\n content \"\"\n display block\n position absolute\n box-sizing border-box\n left 0px\n top 0px\n right 0px\n bottom 0px\n // Highlight is technically a css2 color. We may need to specify it\n // explicitly. #3B66A6 seems close\n border 3px solid Highlight\n opacity 1\n transition opacity 0s\n visibility hidden\n &:focus:after\n visibility visible\n transition opacity 2.5s ease-in\n opacity 0\n\n.geo-tile-container\n position absolute\n &.crop\n overflow hidden\n","use('../nodes/vendor-helpers.js')\n@import 'config'\n\n/*\n * Alias \"nowrap\" as \"no-wrap\".\n */\n\nno-wrap = unquote('nowrap')\n\n/*\n * Helper to find out if a given value is a width\n */\n\nis-width(val)\n if auto == val\n return true\n else if val && 'unit' == type(val)\n // Stylus does not short circuit so we need to perform this as a distinct\n // operation to prevent errors\n return '' != unit(val)\n return false\n\n/*\n * Vendor support for the given prop / arguments, optionally specifying the\n * only prefixes to utilize, or those which should be ignored.\n */\n\nvendor(prop, args, only = null, ignore = null, vendor-property = true)\n need_normalize = !vendor-property or prop in ('transition' 'transition-property' 'border-image' 'border-image-slice')\n for prefix in vendor-prefixes\n unless (only and !(prefix in only)) or (ignore and prefix in ignore)\n if official == prefix\n if need_normalize\n {prop}: normalize(prop,('%s' % args))\n else\n {prop}: args\n else\n newprop = prop\n newprop = '-' + prefix + '-' + prop if vendor-property\n\n if need_normalize\n {newprop}: normalize(prop,('%s' % args),prefix)\n else\n {newprop}: args\n/*\n * Vendorize the given value.\n */\n\nvendor-value(arg, only = null, ignore = null)\n prop = current-property[0]\n for prefix in vendor-prefixes\n unless (only and !(prefix in only)) or (ignore and prefix in ignore) or official == prefix\n add-property(prop, '-%s-%s' % (prefix arg))\n arg\n\n/*\n * Vendor \"box-shadow\" support.\n */\n\nbox-shadow()\n vendor('box-shadow', arguments, only: webkit official)\n\n/*\n * Vendor \"user-select\" support.\n */\n\nuser-select()\n vendor('user-select', arguments, only: webkit moz ms official)\n\n/*\n * Vendor \"column-count\" support.\n */\n\ncolumn-count()\n vendor('column-count', arguments, only: webkit moz official)\n\n/*\n * Vendor \"column-gap\" support.\n */\n\ncolumn-gap()\n vendor('column-gap', arguments, only: webkit moz official)\n\n/*\n * Vendor \"column-rule\" support.\n */\n\ncolumn-rule()\n vendor('column-rule', arguments, only: webkit moz official)\n\n/*\n * Vendor \"column-rule-color\" support.\n */\n\ncolumn-rule-color()\n vendor('column-rule-color', arguments, only: webkit moz official)\n\n/*\n * Vendor \"column-rule-width\" support.\n */\n\ncolumn-rule-width()\n vendor('column-rule-width', arguments, only: webkit moz official)\n\n/*\n * Vendor \"column-rule-style\" support.\n */\n\ncolumn-rule-style()\n vendor('column-rule-style', arguments, only: webkit moz official)\n\n/*\n * Vendor \"column-width\" support.\n */\n\ncolumn-width()\n vendor('column-width', arguments, only: webkit moz official)\n\n/*\n * Vendor \"column-span\" support.\n */\n\ncolumn-span()\n vendor('column-span', arguments, only: webkit official)\n\n/*\n * Vendor \"column-fill\" support.\n */\n\ncolumn-fill()\n vendor('column-fill', arguments, only: moz official)\n\n/*\n * Legacy syntax support for background-clip and background-origin\n */\n\nlegacy-bg-values(property, args)\n legacy_args = ()\n importance = unquote('')\n for subargs in args\n for arg in subargs\n if arg in (border-box padding-box content-box)\n arg = unquote('border') if arg == border-box\n arg = unquote('padding') if arg == padding-box\n arg = unquote('content') if arg == content-box\n if arg != '!important'\n push(legacy_args,arg)\n else\n importance = !important\n vendor(property, unquote(join(', ',legacy_args)) importance, only: moz webkit)\n\n/*\n * Vendor \"background-clip\" support.\n */\n\nbackground-clip()\n if arguments[0] == text\n vendor('background-clip', arguments, only: webkit)\n else\n legacy-bg-values('background-clip', arguments)\n background-clip: arguments\n\n/*\n * Vendor \"background-origin\" support.\n */\n\nbackground-origin()\n legacy-bg-values('background-origin', arguments)\n background-origin: arguments\n\n/*\n * Vendor \"transform\" support.\n */\n\ntransform()\n vendor('transform', arguments)\n\n/*\n * Vendor \"transform-origin\" support.\n */\ntransform-origin()\n vendor('transform-origin', arguments)\n\n/*\n * Vendor \"transform-style\" support.\n */\n\ntransform-style()\n vendor('transform-style', arguments)\n\n/*\n * Vendor \"border-image\" support.\n */\n\nborder-image()\n vendor('border-image', arguments, only: webkit moz o official)\n\n/*\n * Vendor \"transition\" support.\n */\n\ntransition()\n vendor('transition', arguments)\n\n/*\n * Vendor \"transition-property\" support.\n */\n\ntransition-property()\n vendor('transition-property', arguments)\n\n/*\n * Vendor \"transition-duration\" support.\n */\n\ntransition-duration()\n vendor('transition-duration', arguments)\n\n/*\n * Vendor \"transition-timing-function\" support.\n */\n\ntransition-timing-function()\n vendor('transition-timing-function', arguments)\n\n/*\n * Vendor \"transition-delay\" support.\n */\n\ntransition-delay()\n vendor('transition-delay', arguments)\n\n/*\n * Vendor \"backface-visibility\" support.\n */\n\nbackface-visibility()\n vendor('backface-visibility', arguments, only: webkit moz ms official)\n\n/*\n * Vendor \"perspective\" support.\n */\n\nperspective()\n if mixin\n vendor('perspective', arguments, only: webkit moz ms official)\n else\n 'perspective(%s)' % arguments\n\n/*\n * Vendor \"perspective-origin\" support.\n */\n\nperspective-origin()\n vendor('perspective-origin', arguments, only: webkit moz ms official)\n\n/*\n * Opacity with conditional IE support.\n */\n\nopacity(n, args...)\n opacity: n args\n if support-for-ie\n if n == inherit or n == initial\n -ms-filter: n args\n filter: n args\n else\n val = round(n * 100)\n if val == 100\n -ms-filter: none args\n filter: none args\n else\n -ms-filter: '\"progid:DXImageTransform.Microsoft.Alpha(Opacity=%s)\"' % val args\n filter: 'alpha(opacity=%s)' % val args\n\n/*\n * Vendor \"text-size-adjust\"\n */\n\ntext-size-adjust()\n vendor('text-size-adjust', arguments)\n\n/*\n * Alias the \"white-space\" property.\n */\n\nwhitespace()\n white-space: arguments\n\n/*\n * Vendor \"box-sizing\" support.\n */\n\nbox-sizing()\n vendor('box-sizing', arguments, only: webkit moz official)\n\n/*\n * Vendor \"box-orient\" support.\n */\n\nbox-orient()\n vendor('box-orient', arguments, only: webkit moz official)\n\n/*\n * Vendor \"box-flex-group\" support.\n */\n\nbox-flex-group()\n vendor('box-flex-group', arguments, only: webkit moz official)\n\n/*\n * Vendor \"box-ordinal-group\" support.\n */\n\nbox-ordinal-group()\n vendor('box-ordinal-group', arguments, only: webkit moz ms official)\n\n\n/*\n * Vendor \"box-align\" support.\n */\n\nbox-align()\n vendor('box-align', arguments, only: webkit moz ms official)\n\n/*\n * Vendor \"box-pack\" support.\n */\n\nbox-pack()\n vendor('box-pack', arguments, only: webkit moz ms official)\n\n/*\n * Vendor \"box-direction\" support.\n */\n\nbox-direction()\n vendor('box-direction', arguments, only: webkit moz ms official)\n\n/*\n * Vendor \"animation\" support.\n */\n\nanimation()\n vendor('animation', arguments)\n\n\n/*\n * Vendor \"animation-name\" support.\n */\n\nanimation-name()\n vendor('animation-name', arguments)\n\n/*\n * Vendor \"animation-duration\" support.\n */\n\nanimation-duration()\n vendor('animation-duration', arguments)\n\n/*\n * Vendor \"animation-delay\" support.\n */\n\nanimation-delay()\n vendor('animation-delay', arguments)\n\n/*\n * Vendor \"animation-direction\" support.\n */\n\nanimation-direction()\n vendor('animation-direction', arguments)\n\n/*\n * Vendor \"animation-iteration-count\" support.\n */\n\nanimation-iteration-count()\n vendor('animation-iteration-count', arguments)\n\n/*\n * Vendor \"animation-timing-function\" support.\n */\n\nanimation-timing-function()\n vendor('animation-timing-function', arguments)\n\n/*\n * Vendor \"animation-play-state\" support.\n */\n\nanimation-play-state()\n vendor('animation-play-state', arguments)\n\n/*\n * Vendor \"animation-fill-mode\" support.\n */\n\nanimation-fill-mode()\n vendor('animation-fill-mode', arguments)\n\n/*\n * Vendor \"hyphens\" support.\n */\n\nhyphens()\n vendor('hyphens', arguments, only: webkit moz ms official)\n\n/*\n * Vendor \"appearance\" support.\n */\n\nappearance()\n vendor('appearance', arguments, only: webkit moz official)\n\n/*\n * Vendor \"tab-size\" support.\n */\n\ntab-size()\n vendor('tab-size', arguments, only: moz o official)\n\n/*\n * Vendor \"overflow-scrolling\" support.\n */\n\noverflow-scrolling()\n vendor('overflow-scrolling', arguments, only: webkit official)\n\n/*\n * Vendor \"text-overflow\" support, , -o- for opera 9.* - 10.*\n */\n\ntext-overflow()\n vendor('text-overflow', arguments, only: official o)\n\n/*\n * Vendor \"text-size-adjust\" support.\n */\ntext-size-adjust()\n vendor('text-size-adjust', arguments, only: official webkit ms)\n\n/*\n * Vendor \"font-smoothing\" support, webkit only.\n */\nfont-smoothing()\n vendor('font-smoothing', arguments, only: webkit)\n\n\n/**\n * Vendor input-placeholder/placeholder support.\n *\n * Examples:\n * // Default syntax\n * body\n * placeholder(color #333, font-weight normal)\n *\n * // The comma is important\n * .placeholder-red\n * placeholder(color red,)\n *\n * // We can pass a function\n * green-placeholder()\n * color green\n * .placeholder-green\n * placeholder(green-placeholder)\n *\n * // We can pass a hash\n * textarea\n * placeholder((font-style italic) (font-weight bold) (padding '4px 10px'))\n */\nplaceholder()\n for v in ':-webkit-input' '-moz' ':-moz' '-ms-input'\n &:{v}-placeholder\n for pair in arguments\n if typeof(pair) == 'function'\n pair()\n else if pair is not null && pair[0] is not null\n {pair[0]}: type(pair[1]) == 'string' ? s(pair[1]) : pair[1]\ninput-placeholder = placeholder\n\n/*\n * Vendor background support (gradients).\n */\n\nbackground()\n if match('-gradient\\(', ''+arguments)\n vendor('background', arguments, vendor-property: false)\n else\n background arguments\n\nbackground-image()\n if match('-gradient\\(', ''+arguments)\n vendor('background-image', arguments, vendor-property: false)\n else\n background-image arguments\n\ncursor()\n if match('-gradient\\(', ''+arguments)\n vendor('cursor', arguments, vendor-property: false)\n else\n cursor arguments\n\nlist-style()\n if match('-gradient\\(', ''+arguments)\n vendor('list-style', arguments, vendor-property: false)\n else\n list-style arguments\n\nlist-style-image()\n if match('-gradient\\(', ''+arguments)\n vendor('list-style-image', arguments, vendor-property: false)\n else\n list-style-image arguments\n","/*\n * Overflow utility. Maps to regular overflow, and adds an ellipsis value.\n *\n * Synopsis:\n *\n * overflow: <type>\n *\n * Examples:\n *\n * overflow: auto\n * overflow: hidden\n * overflow: ellipsis\n *\n */\n\noverflow()\n if arguments[0] == ellipsis\n ellipsis()\n else\n overflow: arguments\n","/*\n * Vendor \"display: flex\" support with fallback to obsolete versions.\n */\n\nflex-version ?= box flex\n\n//\n// 1. Display values\n// - http://www.w3.org/TR/css3-flexbox/#flex-containers\n//\ndisplay(type, args...)\n if flex == type || inline-flex == type\n if box in flex-version\n if flex == type\n display: -ms-flexbox args\n display: vendor-value(box args, only: moz webkit)\n else\n display: -ms-inline-flexbox args\n display: vendor-value(inline-box args, only: moz webkit)\n if flex in flex-version\n display: vendor-value(arguments, only: webkit official) // overwrites old webkit\n else\n display: arguments\n\n/*\n * New syntax for browsers like Google Chrome.\n * Plus a translation to the old syntax, if possible.\n */\n\n\n//\n// 5. Ordering and Orientation\n// - http://www.w3.org/TR/css3-flexbox/#ordering-and-orientation\n//\n-flex-obsolete-direction(direction)\n if box in flex-version\n if row-reverse == direction || column-reverse == direction\n vendor('box-direction', reverse, ignore: ms official)\n\n if row == direction || row-reverse == direction\n vendor('box-orient', horizontal, ignore: ms official)\n else if column == direction || column-reverse == direction\n vendor('box-orient', vertical, ignore: ms official)\n\n-flex-obsolete-wrap(value)\n if box in flex-version\n // WARN: wrap-reverse does not have a box equivalent. This will render in different manners\n // on box vs. flex values.\n if 'wrap' == value || wrap-reverse == value\n vendor('box-lines', multiple, ignore: ms official)\n else if nowrap == value\n vendor('box-lines', single, ignore: ms official)\n\nflex-direction(direction)\n // obsolete\n -flex-obsolete-direction(direction)\n\n // new\n if flex in flex-version\n vendor('flex-direction', arguments, only: webkit ms official)\n\nflex-wrap(value)\n // obsolete\n -flex-obsolete-wrap(value)\n\n if flex in flex-version\n vendor('flex-wrap', arguments, only: webkit ms official)\n\nflex-flow()\n // obsolete\n -flex-obsolete-direction(arguments[0])\n -flex-obsolete-direction(arguments[1])\n -flex-obsolete-wrap(arguments[0])\n -flex-obsolete-wrap(arguments[1])\n\n // new\n if flex in flex-version\n vendor('flex-flow', arguments, only: webkit ms official)\n\n\norder()\n // obsolete\n if box in flex-version\n vendor('box-ordinal-group', arguments, ignore: ms official)\n\n // new\n if flex in flex-version\n vendor('flex-order', arguments, only: ms)\n vendor('order', arguments, only: webkit official)\n\n\n//\n// 7. Flexibility\n// - http://www.w3.org/TR/css3-flexbox/#flexibility\n//\nflex-grow(growth)\n // obsolete\n if box in flex-version\n vendor('box-flex', growth)\n\n // new\n if flex in flex-version\n vendor('flex-grow', arguments, only: webkit official)\n\nflex-basis()\n if flex in flex-version\n vendor('flex-basis', arguments, only: webkit official)\n\nflex-shrink()\n if flex in flex-version\n vendor('flex-shrink', arguments, only: webkit official)\n\nflex(growth)\n\n // obsolete\n if box in flex-version\n shrink = 1\n\n if none == growth || initial == growth\n // Well known values\n shrink = 0 if none == growth\n growth = 0\n else if is-width(growth) == true\n // Basis is defined as the first parameter\n growth = arguments[1] || 0\n shrink = arguments[2] if 3 <= length(arguments)\n else if arguments[1] && is-width(arguments[1]) == false\n // Growth is first and shrink is second\n shrink = arguments[1]\n\n // Since we can't make the distinction between growing and shrinking in the box model, take\n // the one that provides the most flexibility.\n vendor('box-flex', max(growth, shrink), ignore: ms)\n\n // new\n if flex in flex-version\n vendor('flex', arguments, only: webkit ms official)\n\n\n// converts the justification alignment\n-convert-justify(align)\n if flex-start == align\n return start\n else if flex-end == align\n return end\n else if space-around == align\n return distribute\n else if space-between == align\n return justify\n else\n return align\n\n//\n// 8. Alignment\n// - http://www.w3.org/TR/css3-flexbox/#alignment\n//\njustify-content(align)\n // obsolete\n if box in flex-version\n vendor('box-pack', -convert-justify(align), ignore: ms official)\n\n // new\n if flex in flex-version\n vendor('flex-pack', -convert-justify(align), only: ms)\n vendor('justify-content', align, only: webkit official)\n\nalign-content(align)\n // WARN: Obsolete spec does not allow for adjustment here\n if flex in flex-version\n vendor('flex-line-pack', -convert-justify(align), only: ms)\n vendor('align-content', align, only: webkit official)\n\n// converts alignment from 'flex' to normal value\n-convert-alignment(align)\n if flex-start == align\n return start\n else if flex-end == align\n return end\n else\n return align\n\nalign-items(align)\n // obsolete\n if box in flex-version\n vendor('box-align', -convert-alignment(align), ignore: ms official)\n\n // new\n if flex in flex-version\n vendor('flex-align', -convert-alignment(align), only: ms)\n vendor('align-items', arguments, only: webkit official)\n\nalign-self(align)\n // WARN: Obsolete spec does not allow for overriding alignment on individual items.\n if flex in flex-version\n vendor('align-self', align, only: webkit official)\n vendor('flex-item-align', -convert-alignment(align), only: ms)\n","/*\n * border: <color>\n * border: ...\n */\n\nborder(color, args...)\n if color is a 'color'\n border: 1px solid color args\n else\n border: arguments\n"],"sourceRoot":""}]);
|
|
45323
46436
|
// Exports
|
|
45324
46437
|
/* harmony default export */ __webpack_exports__["Z"] = (___CSS_LOADER_EXPORT___);
|
|
45325
46438
|
|
|
@@ -45475,6 +46588,42 @@ module.exports = function (cssWithMappingToString) {
|
|
|
45475
46588
|
|
|
45476
46589
|
/***/ }),
|
|
45477
46590
|
|
|
46591
|
+
/***/ 1678:
|
|
46592
|
+
/***/ (function(module) {
|
|
46593
|
+
|
|
46594
|
+
"use strict";
|
|
46595
|
+
|
|
46596
|
+
|
|
46597
|
+
module.exports = function (url, options) {
|
|
46598
|
+
if (!options) {
|
|
46599
|
+
options = {};
|
|
46600
|
+
}
|
|
46601
|
+
|
|
46602
|
+
if (!url) {
|
|
46603
|
+
return url;
|
|
46604
|
+
}
|
|
46605
|
+
|
|
46606
|
+
url = String(url.__esModule ? url.default : url); // If url is already wrapped in quotes, remove them
|
|
46607
|
+
|
|
46608
|
+
if (/^['"].*['"]$/.test(url)) {
|
|
46609
|
+
url = url.slice(1, -1);
|
|
46610
|
+
}
|
|
46611
|
+
|
|
46612
|
+
if (options.hash) {
|
|
46613
|
+
url += options.hash;
|
|
46614
|
+
} // Should url be wrapped?
|
|
46615
|
+
// See https://drafts.csswg.org/css-values-3/#urls
|
|
46616
|
+
|
|
46617
|
+
|
|
46618
|
+
if (/["'() \t\n]|(%20)/.test(url) || options.needQuotes) {
|
|
46619
|
+
return "\"".concat(url.replace(/"/g, '\\"').replace(/\n/g, "\\n"), "\"");
|
|
46620
|
+
}
|
|
46621
|
+
|
|
46622
|
+
return url;
|
|
46623
|
+
};
|
|
46624
|
+
|
|
46625
|
+
/***/ }),
|
|
46626
|
+
|
|
45478
46627
|
/***/ 559:
|
|
45479
46628
|
/***/ (function(module) {
|
|
45480
46629
|
|
|
@@ -74518,6 +75667,1671 @@ var __WEBPACK_AMD_DEFINE_RESULT__;/*global define:false */
|
|
|
74518
75667
|
}) (typeof window !== 'undefined' ? window : null, typeof window !== 'undefined' ? document : null);
|
|
74519
75668
|
|
|
74520
75669
|
|
|
75670
|
+
/***/ }),
|
|
75671
|
+
|
|
75672
|
+
/***/ 3291:
|
|
75673
|
+
/***/ (function(module, __unused_webpack_exports, __webpack_require__) {
|
|
75674
|
+
|
|
75675
|
+
/*
|
|
75676
|
+
* @copyright 2016 Sean Connelly (@voidqk), http://syntheti.cc
|
|
75677
|
+
* @license MIT
|
|
75678
|
+
* @preserve Project Home: https://github.com/voidqk/polybooljs
|
|
75679
|
+
*/
|
|
75680
|
+
|
|
75681
|
+
var BuildLog = __webpack_require__(1009);
|
|
75682
|
+
var Epsilon = __webpack_require__(1835);
|
|
75683
|
+
var Intersecter = __webpack_require__(7671);
|
|
75684
|
+
var SegmentChainer = __webpack_require__(9048);
|
|
75685
|
+
var SegmentSelector = __webpack_require__(571);
|
|
75686
|
+
var GeoJSON = __webpack_require__(3928);
|
|
75687
|
+
|
|
75688
|
+
var buildLog = false;
|
|
75689
|
+
var epsilon = Epsilon();
|
|
75690
|
+
|
|
75691
|
+
var PolyBool;
|
|
75692
|
+
PolyBool = {
|
|
75693
|
+
// getter/setter for buildLog
|
|
75694
|
+
buildLog: function(bl){
|
|
75695
|
+
if (bl === true)
|
|
75696
|
+
buildLog = BuildLog();
|
|
75697
|
+
else if (bl === false)
|
|
75698
|
+
buildLog = false;
|
|
75699
|
+
return buildLog === false ? false : buildLog.list;
|
|
75700
|
+
},
|
|
75701
|
+
// getter/setter for epsilon
|
|
75702
|
+
epsilon: function(v){
|
|
75703
|
+
return epsilon.epsilon(v);
|
|
75704
|
+
},
|
|
75705
|
+
|
|
75706
|
+
// core API
|
|
75707
|
+
segments: function(poly){
|
|
75708
|
+
var i = Intersecter(true, epsilon, buildLog);
|
|
75709
|
+
poly.regions.forEach(i.addRegion);
|
|
75710
|
+
return {
|
|
75711
|
+
segments: i.calculate(poly.inverted),
|
|
75712
|
+
inverted: poly.inverted
|
|
75713
|
+
};
|
|
75714
|
+
},
|
|
75715
|
+
combine: function(segments1, segments2){
|
|
75716
|
+
var i3 = Intersecter(false, epsilon, buildLog);
|
|
75717
|
+
return {
|
|
75718
|
+
combined: i3.calculate(
|
|
75719
|
+
segments1.segments, segments1.inverted,
|
|
75720
|
+
segments2.segments, segments2.inverted
|
|
75721
|
+
),
|
|
75722
|
+
inverted1: segments1.inverted,
|
|
75723
|
+
inverted2: segments2.inverted
|
|
75724
|
+
};
|
|
75725
|
+
},
|
|
75726
|
+
selectUnion: function(combined){
|
|
75727
|
+
return {
|
|
75728
|
+
segments: SegmentSelector.union(combined.combined, buildLog),
|
|
75729
|
+
inverted: combined.inverted1 || combined.inverted2
|
|
75730
|
+
}
|
|
75731
|
+
},
|
|
75732
|
+
selectIntersect: function(combined){
|
|
75733
|
+
return {
|
|
75734
|
+
segments: SegmentSelector.intersect(combined.combined, buildLog),
|
|
75735
|
+
inverted: combined.inverted1 && combined.inverted2
|
|
75736
|
+
}
|
|
75737
|
+
},
|
|
75738
|
+
selectDifference: function(combined){
|
|
75739
|
+
return {
|
|
75740
|
+
segments: SegmentSelector.difference(combined.combined, buildLog),
|
|
75741
|
+
inverted: combined.inverted1 && !combined.inverted2
|
|
75742
|
+
}
|
|
75743
|
+
},
|
|
75744
|
+
selectDifferenceRev: function(combined){
|
|
75745
|
+
return {
|
|
75746
|
+
segments: SegmentSelector.differenceRev(combined.combined, buildLog),
|
|
75747
|
+
inverted: !combined.inverted1 && combined.inverted2
|
|
75748
|
+
}
|
|
75749
|
+
},
|
|
75750
|
+
selectXor: function(combined){
|
|
75751
|
+
return {
|
|
75752
|
+
segments: SegmentSelector.xor(combined.combined, buildLog),
|
|
75753
|
+
inverted: combined.inverted1 !== combined.inverted2
|
|
75754
|
+
}
|
|
75755
|
+
},
|
|
75756
|
+
polygon: function(segments){
|
|
75757
|
+
return {
|
|
75758
|
+
regions: SegmentChainer(segments.segments, epsilon, buildLog),
|
|
75759
|
+
inverted: segments.inverted
|
|
75760
|
+
};
|
|
75761
|
+
},
|
|
75762
|
+
|
|
75763
|
+
// GeoJSON converters
|
|
75764
|
+
polygonFromGeoJSON: function(geojson){
|
|
75765
|
+
return GeoJSON.toPolygon(PolyBool, geojson);
|
|
75766
|
+
},
|
|
75767
|
+
polygonToGeoJSON: function(poly){
|
|
75768
|
+
return GeoJSON.fromPolygon(PolyBool, epsilon, poly);
|
|
75769
|
+
},
|
|
75770
|
+
|
|
75771
|
+
// helper functions for common operations
|
|
75772
|
+
union: function(poly1, poly2){
|
|
75773
|
+
return operate(poly1, poly2, PolyBool.selectUnion);
|
|
75774
|
+
},
|
|
75775
|
+
intersect: function(poly1, poly2){
|
|
75776
|
+
return operate(poly1, poly2, PolyBool.selectIntersect);
|
|
75777
|
+
},
|
|
75778
|
+
difference: function(poly1, poly2){
|
|
75779
|
+
return operate(poly1, poly2, PolyBool.selectDifference);
|
|
75780
|
+
},
|
|
75781
|
+
differenceRev: function(poly1, poly2){
|
|
75782
|
+
return operate(poly1, poly2, PolyBool.selectDifferenceRev);
|
|
75783
|
+
},
|
|
75784
|
+
xor: function(poly1, poly2){
|
|
75785
|
+
return operate(poly1, poly2, PolyBool.selectXor);
|
|
75786
|
+
}
|
|
75787
|
+
};
|
|
75788
|
+
|
|
75789
|
+
function operate(poly1, poly2, selector){
|
|
75790
|
+
var seg1 = PolyBool.segments(poly1);
|
|
75791
|
+
var seg2 = PolyBool.segments(poly2);
|
|
75792
|
+
var comb = PolyBool.combine(seg1, seg2);
|
|
75793
|
+
var seg3 = selector(comb);
|
|
75794
|
+
return PolyBool.polygon(seg3);
|
|
75795
|
+
}
|
|
75796
|
+
|
|
75797
|
+
if (typeof window === 'object')
|
|
75798
|
+
window.PolyBool = PolyBool;
|
|
75799
|
+
|
|
75800
|
+
module.exports = PolyBool;
|
|
75801
|
+
|
|
75802
|
+
|
|
75803
|
+
/***/ }),
|
|
75804
|
+
|
|
75805
|
+
/***/ 1009:
|
|
75806
|
+
/***/ (function(module) {
|
|
75807
|
+
|
|
75808
|
+
// (c) Copyright 2016, Sean Connelly (@voidqk), http://syntheti.cc
|
|
75809
|
+
// MIT License
|
|
75810
|
+
// Project Home: https://github.com/voidqk/polybooljs
|
|
75811
|
+
|
|
75812
|
+
//
|
|
75813
|
+
// used strictly for logging the processing of the algorithm... only useful if you intend on
|
|
75814
|
+
// looking under the covers (for pretty UI's or debugging)
|
|
75815
|
+
//
|
|
75816
|
+
|
|
75817
|
+
function BuildLog(){
|
|
75818
|
+
var my;
|
|
75819
|
+
var nextSegmentId = 0;
|
|
75820
|
+
var curVert = false;
|
|
75821
|
+
|
|
75822
|
+
function push(type, data){
|
|
75823
|
+
my.list.push({
|
|
75824
|
+
type: type,
|
|
75825
|
+
data: data ? JSON.parse(JSON.stringify(data)) : void 0
|
|
75826
|
+
});
|
|
75827
|
+
return my;
|
|
75828
|
+
}
|
|
75829
|
+
|
|
75830
|
+
my = {
|
|
75831
|
+
list: [],
|
|
75832
|
+
segmentId: function(){
|
|
75833
|
+
return nextSegmentId++;
|
|
75834
|
+
},
|
|
75835
|
+
checkIntersection: function(seg1, seg2){
|
|
75836
|
+
return push('check', { seg1: seg1, seg2: seg2 });
|
|
75837
|
+
},
|
|
75838
|
+
segmentChop: function(seg, end){
|
|
75839
|
+
push('div_seg', { seg: seg, pt: end });
|
|
75840
|
+
return push('chop', { seg: seg, pt: end });
|
|
75841
|
+
},
|
|
75842
|
+
statusRemove: function(seg){
|
|
75843
|
+
return push('pop_seg', { seg: seg });
|
|
75844
|
+
},
|
|
75845
|
+
segmentUpdate: function(seg){
|
|
75846
|
+
return push('seg_update', { seg: seg });
|
|
75847
|
+
},
|
|
75848
|
+
segmentNew: function(seg, primary){
|
|
75849
|
+
return push('new_seg', { seg: seg, primary: primary });
|
|
75850
|
+
},
|
|
75851
|
+
segmentRemove: function(seg){
|
|
75852
|
+
return push('rem_seg', { seg: seg });
|
|
75853
|
+
},
|
|
75854
|
+
tempStatus: function(seg, above, below){
|
|
75855
|
+
return push('temp_status', { seg: seg, above: above, below: below });
|
|
75856
|
+
},
|
|
75857
|
+
rewind: function(seg){
|
|
75858
|
+
return push('rewind', { seg: seg });
|
|
75859
|
+
},
|
|
75860
|
+
status: function(seg, above, below){
|
|
75861
|
+
return push('status', { seg: seg, above: above, below: below });
|
|
75862
|
+
},
|
|
75863
|
+
vert: function(x){
|
|
75864
|
+
if (x === curVert)
|
|
75865
|
+
return my;
|
|
75866
|
+
curVert = x;
|
|
75867
|
+
return push('vert', { x: x });
|
|
75868
|
+
},
|
|
75869
|
+
log: function(data){
|
|
75870
|
+
if (typeof data !== 'string')
|
|
75871
|
+
data = JSON.stringify(data, false, ' ');
|
|
75872
|
+
return push('log', { txt: data });
|
|
75873
|
+
},
|
|
75874
|
+
reset: function(){
|
|
75875
|
+
return push('reset');
|
|
75876
|
+
},
|
|
75877
|
+
selected: function(segs){
|
|
75878
|
+
return push('selected', { segs: segs });
|
|
75879
|
+
},
|
|
75880
|
+
chainStart: function(seg){
|
|
75881
|
+
return push('chain_start', { seg: seg });
|
|
75882
|
+
},
|
|
75883
|
+
chainRemoveHead: function(index, pt){
|
|
75884
|
+
return push('chain_rem_head', { index: index, pt: pt });
|
|
75885
|
+
},
|
|
75886
|
+
chainRemoveTail: function(index, pt){
|
|
75887
|
+
return push('chain_rem_tail', { index: index, pt: pt });
|
|
75888
|
+
},
|
|
75889
|
+
chainNew: function(pt1, pt2){
|
|
75890
|
+
return push('chain_new', { pt1: pt1, pt2: pt2 });
|
|
75891
|
+
},
|
|
75892
|
+
chainMatch: function(index){
|
|
75893
|
+
return push('chain_match', { index: index });
|
|
75894
|
+
},
|
|
75895
|
+
chainClose: function(index){
|
|
75896
|
+
return push('chain_close', { index: index });
|
|
75897
|
+
},
|
|
75898
|
+
chainAddHead: function(index, pt){
|
|
75899
|
+
return push('chain_add_head', { index: index, pt: pt });
|
|
75900
|
+
},
|
|
75901
|
+
chainAddTail: function(index, pt){
|
|
75902
|
+
return push('chain_add_tail', { index: index, pt: pt, });
|
|
75903
|
+
},
|
|
75904
|
+
chainConnect: function(index1, index2){
|
|
75905
|
+
return push('chain_con', { index1: index1, index2: index2 });
|
|
75906
|
+
},
|
|
75907
|
+
chainReverse: function(index){
|
|
75908
|
+
return push('chain_rev', { index: index });
|
|
75909
|
+
},
|
|
75910
|
+
chainJoin: function(index1, index2){
|
|
75911
|
+
return push('chain_join', { index1: index1, index2: index2 });
|
|
75912
|
+
},
|
|
75913
|
+
done: function(){
|
|
75914
|
+
return push('done');
|
|
75915
|
+
}
|
|
75916
|
+
};
|
|
75917
|
+
return my;
|
|
75918
|
+
}
|
|
75919
|
+
|
|
75920
|
+
module.exports = BuildLog;
|
|
75921
|
+
|
|
75922
|
+
|
|
75923
|
+
/***/ }),
|
|
75924
|
+
|
|
75925
|
+
/***/ 1835:
|
|
75926
|
+
/***/ (function(module) {
|
|
75927
|
+
|
|
75928
|
+
// (c) Copyright 2016, Sean Connelly (@voidqk), http://syntheti.cc
|
|
75929
|
+
// MIT License
|
|
75930
|
+
// Project Home: https://github.com/voidqk/polybooljs
|
|
75931
|
+
|
|
75932
|
+
//
|
|
75933
|
+
// provides the raw computation functions that takes epsilon into account
|
|
75934
|
+
//
|
|
75935
|
+
// zero is defined to be between (-epsilon, epsilon) exclusive
|
|
75936
|
+
//
|
|
75937
|
+
|
|
75938
|
+
function Epsilon(eps){
|
|
75939
|
+
if (typeof eps !== 'number')
|
|
75940
|
+
eps = 0.0000000001; // sane default? sure why not
|
|
75941
|
+
var my = {
|
|
75942
|
+
epsilon: function(v){
|
|
75943
|
+
if (typeof v === 'number')
|
|
75944
|
+
eps = v;
|
|
75945
|
+
return eps;
|
|
75946
|
+
},
|
|
75947
|
+
pointAboveOrOnLine: function(pt, left, right){
|
|
75948
|
+
var Ax = left[0];
|
|
75949
|
+
var Ay = left[1];
|
|
75950
|
+
var Bx = right[0];
|
|
75951
|
+
var By = right[1];
|
|
75952
|
+
var Cx = pt[0];
|
|
75953
|
+
var Cy = pt[1];
|
|
75954
|
+
var ABx = Bx - Ax;
|
|
75955
|
+
var ABy = By - Ay;
|
|
75956
|
+
var AB = Math.sqrt(ABx * ABx + ABy * ABy);
|
|
75957
|
+
// algebraic distance of 'pt' to ('left', 'right') line is:
|
|
75958
|
+
// [ABx * (Cy - Ay) - ABy * (Cx - Ax)] / AB
|
|
75959
|
+
return ABx * (Cy - Ay) - ABy * (Cx - Ax) >= -eps * AB;
|
|
75960
|
+
},
|
|
75961
|
+
pointBetween: function(p, left, right){
|
|
75962
|
+
// p must be collinear with left->right
|
|
75963
|
+
// returns false if p == left, p == right, or left == right
|
|
75964
|
+
if (my.pointsSame(p, left) || my.pointsSame(p, right)) return false;
|
|
75965
|
+
var d_py_ly = p[1] - left[1];
|
|
75966
|
+
var d_rx_lx = right[0] - left[0];
|
|
75967
|
+
var d_px_lx = p[0] - left[0];
|
|
75968
|
+
var d_ry_ly = right[1] - left[1];
|
|
75969
|
+
|
|
75970
|
+
var dot = d_px_lx * d_rx_lx + d_py_ly * d_ry_ly;
|
|
75971
|
+
// dot < 0 is p is to the left of 'left'
|
|
75972
|
+
if (dot < 0) return false;
|
|
75973
|
+
var sqlen = d_rx_lx * d_rx_lx + d_ry_ly * d_ry_ly;
|
|
75974
|
+
// dot <= sqlen is p is to the left of 'right'
|
|
75975
|
+
return dot <= sqlen;
|
|
75976
|
+
},
|
|
75977
|
+
pointsSameX: function(p1, p2){
|
|
75978
|
+
return Math.abs(p1[0] - p2[0]) < eps;
|
|
75979
|
+
},
|
|
75980
|
+
pointsSameY: function(p1, p2){
|
|
75981
|
+
return Math.abs(p1[1] - p2[1]) < eps;
|
|
75982
|
+
},
|
|
75983
|
+
pointsSame: function(p1, p2){
|
|
75984
|
+
return my.pointsSameX(p1, p2) && my.pointsSameY(p1, p2);
|
|
75985
|
+
},
|
|
75986
|
+
pointsCompare: function(p1, p2){
|
|
75987
|
+
// returns -1 if p1 is smaller, 1 if p2 is smaller, 0 if equal
|
|
75988
|
+
if (my.pointsSameX(p1, p2))
|
|
75989
|
+
return my.pointsSameY(p1, p2) ? 0 : (p1[1] < p2[1] ? -1 : 1);
|
|
75990
|
+
return p1[0] < p2[0] ? -1 : 1;
|
|
75991
|
+
},
|
|
75992
|
+
pointsCollinear: function(pt1, pt2, pt3){
|
|
75993
|
+
// does pt1->pt2->pt3 make a straight line?
|
|
75994
|
+
// essentially this is just checking to see if the slope(pt1->pt2) === slope(pt2->pt3)
|
|
75995
|
+
// if slopes are equal, then they must be collinear, because they share pt2
|
|
75996
|
+
var dx1 = pt1[0] - pt2[0];
|
|
75997
|
+
var dy1 = pt1[1] - pt2[1];
|
|
75998
|
+
var dx2 = pt2[0] - pt3[0];
|
|
75999
|
+
var dy2 = pt2[1] - pt3[1];
|
|
76000
|
+
var n1 = Math.sqrt(dx1 * dx1 + dy1 * dy1);
|
|
76001
|
+
var n2 = Math.sqrt(dx2 * dx2 + dy2 * dy2);
|
|
76002
|
+
// Assuming det(u, v) = 0, we have:
|
|
76003
|
+
// |det(u + u_err, v + v_err)| = |det(u + u_err, v + v_err) - det(u,v)|
|
|
76004
|
+
// =|det(u, v_err) + det(u_err. v) + det(u_err, v_err)|
|
|
76005
|
+
// <= |det(u, v_err)| + |det(u_err, v)| + |det(u_err, v_err)|
|
|
76006
|
+
// <= N(u)N(v_err) + N(u_err)N(v) + N(u_err)N(v_err)
|
|
76007
|
+
// <= eps * (N(u) + N(v) + eps)
|
|
76008
|
+
// We have N(u) ~ N(u + u_err) and N(v) ~ N(v + v_err).
|
|
76009
|
+
// Assuming eps << N(u) and eps << N(v), we end with:
|
|
76010
|
+
// |det(u + u_err, v + v_err)| <= eps * (N(u + u_err) + N(v + v_err))
|
|
76011
|
+
return Math.abs(dx1 * dy2 - dx2 * dy1) <= eps * (n1 + n2);
|
|
76012
|
+
},
|
|
76013
|
+
linesIntersect: function(a0, a1, b0, b1){
|
|
76014
|
+
// returns false if the lines are coincident (e.g., parallel or on top of each other)
|
|
76015
|
+
//
|
|
76016
|
+
// returns an object if the lines intersect:
|
|
76017
|
+
// {
|
|
76018
|
+
// pt: [x, y], where the intersection point is at
|
|
76019
|
+
// alongA: where intersection point is along A,
|
|
76020
|
+
// alongB: where intersection point is along B
|
|
76021
|
+
// }
|
|
76022
|
+
//
|
|
76023
|
+
// alongA and alongB will each be one of: -2, -1, 0, 1, 2
|
|
76024
|
+
//
|
|
76025
|
+
// with the following meaning:
|
|
76026
|
+
//
|
|
76027
|
+
// -2 intersection point is before segment's first point
|
|
76028
|
+
// -1 intersection point is directly on segment's first point
|
|
76029
|
+
// 0 intersection point is between segment's first and second points (exclusive)
|
|
76030
|
+
// 1 intersection point is directly on segment's second point
|
|
76031
|
+
// 2 intersection point is after segment's second point
|
|
76032
|
+
var adx = a1[0] - a0[0];
|
|
76033
|
+
var ady = a1[1] - a0[1];
|
|
76034
|
+
var bdx = b1[0] - b0[0];
|
|
76035
|
+
var bdy = b1[1] - b0[1];
|
|
76036
|
+
|
|
76037
|
+
var axb = adx * bdy - ady * bdx;
|
|
76038
|
+
var n1 = Math.sqrt(adx * adx + ady * ady);
|
|
76039
|
+
var n2 = Math.sqrt(bdx * bdx + bdy * bdy);
|
|
76040
|
+
if (Math.abs(axb) <= eps * (n1 + n2))
|
|
76041
|
+
return false; // lines are coincident
|
|
76042
|
+
|
|
76043
|
+
var dx = a0[0] - b0[0];
|
|
76044
|
+
var dy = a0[1] - b0[1];
|
|
76045
|
+
|
|
76046
|
+
var A = (bdx * dy - bdy * dx) / axb;
|
|
76047
|
+
var B = (adx * dy - ady * dx) / axb;
|
|
76048
|
+
var pt = [
|
|
76049
|
+
a0[0] + A * adx,
|
|
76050
|
+
a0[1] + A * ady
|
|
76051
|
+
];
|
|
76052
|
+
|
|
76053
|
+
var ret = {
|
|
76054
|
+
alongA: 0,
|
|
76055
|
+
alongB: 0,
|
|
76056
|
+
pt: pt
|
|
76057
|
+
};
|
|
76058
|
+
|
|
76059
|
+
// categorize where intersection point is along A and B
|
|
76060
|
+
if (my.pointsSame(pt, a0))
|
|
76061
|
+
ret.alongA = -1;
|
|
76062
|
+
else if (my.pointsSame(pt, a1))
|
|
76063
|
+
ret.alongA = 1;
|
|
76064
|
+
else if (A < 0)
|
|
76065
|
+
ret.alongA = -2;
|
|
76066
|
+
else if (A > 1)
|
|
76067
|
+
ret.alongA = 2;
|
|
76068
|
+
|
|
76069
|
+
if (my.pointsSame(pt, b0))
|
|
76070
|
+
ret.alongB = -1;
|
|
76071
|
+
else if (my.pointsSame(pt, b1))
|
|
76072
|
+
ret.alongB = 1;
|
|
76073
|
+
else if (B < 0)
|
|
76074
|
+
ret.alongB = -2;
|
|
76075
|
+
else if (B > 1)
|
|
76076
|
+
ret.alongB = 2;
|
|
76077
|
+
|
|
76078
|
+
return ret;
|
|
76079
|
+
},
|
|
76080
|
+
pointInsideRegion: function(pt, region){
|
|
76081
|
+
var x = pt[0];
|
|
76082
|
+
var y = pt[1];
|
|
76083
|
+
var last_x = region[region.length - 1][0];
|
|
76084
|
+
var last_y = region[region.length - 1][1];
|
|
76085
|
+
var inside = false;
|
|
76086
|
+
for (var i = 0; i < region.length; i++){
|
|
76087
|
+
var curr_x = region[i][0];
|
|
76088
|
+
var curr_y = region[i][1];
|
|
76089
|
+
|
|
76090
|
+
// if y is between curr_y and last_y, and
|
|
76091
|
+
// x is to the right of the boundary created by the line
|
|
76092
|
+
if ((curr_y - y > eps) != (last_y - y > eps) &&
|
|
76093
|
+
(last_x - curr_x) * (y - curr_y) / (last_y - curr_y) + curr_x - x > eps)
|
|
76094
|
+
inside = !inside
|
|
76095
|
+
|
|
76096
|
+
last_x = curr_x;
|
|
76097
|
+
last_y = curr_y;
|
|
76098
|
+
}
|
|
76099
|
+
return inside;
|
|
76100
|
+
}
|
|
76101
|
+
};
|
|
76102
|
+
return my;
|
|
76103
|
+
}
|
|
76104
|
+
|
|
76105
|
+
module.exports = Epsilon;
|
|
76106
|
+
|
|
76107
|
+
|
|
76108
|
+
/***/ }),
|
|
76109
|
+
|
|
76110
|
+
/***/ 3928:
|
|
76111
|
+
/***/ (function(module) {
|
|
76112
|
+
|
|
76113
|
+
// (c) Copyright 2017, Sean Connelly (@voidqk), http://syntheti.cc
|
|
76114
|
+
// MIT License
|
|
76115
|
+
// Project Home: https://github.com/voidqk/polybooljs
|
|
76116
|
+
|
|
76117
|
+
//
|
|
76118
|
+
// convert between PolyBool polygon format and GeoJSON formats (Polygon and MultiPolygon)
|
|
76119
|
+
//
|
|
76120
|
+
|
|
76121
|
+
var GeoJSON = {
|
|
76122
|
+
// convert a GeoJSON object to a PolyBool polygon
|
|
76123
|
+
toPolygon: function(PolyBool, geojson){
|
|
76124
|
+
|
|
76125
|
+
// converts list of LineString's to segments
|
|
76126
|
+
function GeoPoly(coords){
|
|
76127
|
+
// check for empty coords
|
|
76128
|
+
if (coords.length <= 0)
|
|
76129
|
+
return PolyBool.segments({ inverted: false, regions: [] });
|
|
76130
|
+
|
|
76131
|
+
// convert LineString to segments
|
|
76132
|
+
function LineString(ls){
|
|
76133
|
+
// remove tail which should be the same as head
|
|
76134
|
+
var reg = ls.slice(0, ls.length - 1);
|
|
76135
|
+
return PolyBool.segments({ inverted: false, regions: [reg] });
|
|
76136
|
+
}
|
|
76137
|
+
|
|
76138
|
+
// the first LineString is considered the outside
|
|
76139
|
+
var out = LineString(coords[0]);
|
|
76140
|
+
|
|
76141
|
+
// the rest of the LineStrings are considered interior holes, so subtract them from the
|
|
76142
|
+
// current result
|
|
76143
|
+
for (var i = 1; i < coords.length; i++)
|
|
76144
|
+
out = PolyBool.selectDifference(PolyBool.combine(out, LineString(coords[i])));
|
|
76145
|
+
|
|
76146
|
+
return out;
|
|
76147
|
+
}
|
|
76148
|
+
|
|
76149
|
+
if (geojson.type === 'Polygon'){
|
|
76150
|
+
// single polygon, so just convert it and we're done
|
|
76151
|
+
return PolyBool.polygon(GeoPoly(geojson.coordinates));
|
|
76152
|
+
}
|
|
76153
|
+
else if (geojson.type === 'MultiPolygon'){
|
|
76154
|
+
// multiple polygons, so union all the polygons together
|
|
76155
|
+
var out = PolyBool.segments({ inverted: false, regions: [] });
|
|
76156
|
+
for (var i = 0; i < geojson.coordinates.length; i++)
|
|
76157
|
+
out = PolyBool.selectUnion(PolyBool.combine(out, GeoPoly(geojson.coordinates[i])));
|
|
76158
|
+
return PolyBool.polygon(out);
|
|
76159
|
+
}
|
|
76160
|
+
throw new Error('PolyBool: Cannot convert GeoJSON object to PolyBool polygon');
|
|
76161
|
+
},
|
|
76162
|
+
|
|
76163
|
+
// convert a PolyBool polygon to a GeoJSON object
|
|
76164
|
+
fromPolygon: function(PolyBool, eps, poly){
|
|
76165
|
+
// make sure out polygon is clean
|
|
76166
|
+
poly = PolyBool.polygon(PolyBool.segments(poly));
|
|
76167
|
+
|
|
76168
|
+
// test if r1 is inside r2
|
|
76169
|
+
function regionInsideRegion(r1, r2){
|
|
76170
|
+
// we're guaranteed no lines intersect (because the polygon is clean), but a vertex
|
|
76171
|
+
// could be on the edge -- so we just average pt[0] and pt[1] to produce a point on the
|
|
76172
|
+
// edge of the first line, which cannot be on an edge
|
|
76173
|
+
return eps.pointInsideRegion([
|
|
76174
|
+
(r1[0][0] + r1[1][0]) * 0.5,
|
|
76175
|
+
(r1[0][1] + r1[1][1]) * 0.5
|
|
76176
|
+
], r2);
|
|
76177
|
+
}
|
|
76178
|
+
|
|
76179
|
+
// calculate inside heirarchy
|
|
76180
|
+
//
|
|
76181
|
+
// _____________________ _______ roots -> A -> F
|
|
76182
|
+
// | A | | F | | |
|
|
76183
|
+
// | _______ _______ | | ___ | +-- B +-- G
|
|
76184
|
+
// | | B | | C | | | | | | | |
|
|
76185
|
+
// | | ___ | | ___ | | | | | | | +-- D
|
|
76186
|
+
// | | | D | | | | E | | | | | G | | |
|
|
76187
|
+
// | | |___| | | |___| | | | | | | +-- C
|
|
76188
|
+
// | |_______| |_______| | | |___| | |
|
|
76189
|
+
// |_____________________| |_______| +-- E
|
|
76190
|
+
|
|
76191
|
+
function newNode(region){
|
|
76192
|
+
return {
|
|
76193
|
+
region: region,
|
|
76194
|
+
children: []
|
|
76195
|
+
};
|
|
76196
|
+
}
|
|
76197
|
+
|
|
76198
|
+
var roots = newNode(null);
|
|
76199
|
+
|
|
76200
|
+
function addChild(root, region){
|
|
76201
|
+
// first check if we're inside any children
|
|
76202
|
+
for (var i = 0; i < root.children.length; i++){
|
|
76203
|
+
var child = root.children[i];
|
|
76204
|
+
if (regionInsideRegion(region, child.region)){
|
|
76205
|
+
// we are, so insert inside them instead
|
|
76206
|
+
addChild(child, region);
|
|
76207
|
+
return;
|
|
76208
|
+
}
|
|
76209
|
+
}
|
|
76210
|
+
|
|
76211
|
+
// not inside any children, so check to see if any children are inside us
|
|
76212
|
+
var node = newNode(region);
|
|
76213
|
+
for (var i = 0; i < root.children.length; i++){
|
|
76214
|
+
var child = root.children[i];
|
|
76215
|
+
if (regionInsideRegion(child.region, region)){
|
|
76216
|
+
// oops... move the child beneath us, and remove them from root
|
|
76217
|
+
node.children.push(child);
|
|
76218
|
+
root.children.splice(i, 1);
|
|
76219
|
+
i--;
|
|
76220
|
+
}
|
|
76221
|
+
}
|
|
76222
|
+
|
|
76223
|
+
// now we can add ourselves
|
|
76224
|
+
root.children.push(node);
|
|
76225
|
+
}
|
|
76226
|
+
|
|
76227
|
+
// add all regions to the root
|
|
76228
|
+
for (var i = 0; i < poly.regions.length; i++){
|
|
76229
|
+
var region = poly.regions[i];
|
|
76230
|
+
if (region.length < 3) // regions must have at least 3 points (sanity check)
|
|
76231
|
+
continue;
|
|
76232
|
+
addChild(roots, region);
|
|
76233
|
+
}
|
|
76234
|
+
|
|
76235
|
+
// with our heirarchy, we can distinguish between exterior borders, and interior holes
|
|
76236
|
+
// the root nodes are exterior, children are interior, children's children are exterior,
|
|
76237
|
+
// children's children's children are interior, etc
|
|
76238
|
+
|
|
76239
|
+
// while we're at it, exteriors are counter-clockwise, and interiors are clockwise
|
|
76240
|
+
|
|
76241
|
+
function forceWinding(region, clockwise){
|
|
76242
|
+
// first, see if we're clockwise or counter-clockwise
|
|
76243
|
+
// https://en.wikipedia.org/wiki/Shoelace_formula
|
|
76244
|
+
var winding = 0;
|
|
76245
|
+
var last_x = region[region.length - 1][0];
|
|
76246
|
+
var last_y = region[region.length - 1][1];
|
|
76247
|
+
var copy = [];
|
|
76248
|
+
for (var i = 0; i < region.length; i++){
|
|
76249
|
+
var curr_x = region[i][0];
|
|
76250
|
+
var curr_y = region[i][1];
|
|
76251
|
+
copy.push([curr_x, curr_y]); // create a copy while we're at it
|
|
76252
|
+
winding += curr_y * last_x - curr_x * last_y;
|
|
76253
|
+
last_x = curr_x;
|
|
76254
|
+
last_y = curr_y;
|
|
76255
|
+
}
|
|
76256
|
+
// this assumes Cartesian coordinates (Y is positive going up)
|
|
76257
|
+
var isclockwise = winding < 0;
|
|
76258
|
+
if (isclockwise !== clockwise)
|
|
76259
|
+
copy.reverse();
|
|
76260
|
+
// while we're here, the last point must be the first point...
|
|
76261
|
+
copy.push([copy[0][0], copy[0][1]]);
|
|
76262
|
+
return copy;
|
|
76263
|
+
}
|
|
76264
|
+
|
|
76265
|
+
var geopolys = [];
|
|
76266
|
+
|
|
76267
|
+
function addExterior(node){
|
|
76268
|
+
var poly = [forceWinding(node.region, false)];
|
|
76269
|
+
geopolys.push(poly);
|
|
76270
|
+
// children of exteriors are interior
|
|
76271
|
+
for (var i = 0; i < node.children.length; i++)
|
|
76272
|
+
poly.push(getInterior(node.children[i]));
|
|
76273
|
+
}
|
|
76274
|
+
|
|
76275
|
+
function getInterior(node){
|
|
76276
|
+
// children of interiors are exterior
|
|
76277
|
+
for (var i = 0; i < node.children.length; i++)
|
|
76278
|
+
addExterior(node.children[i]);
|
|
76279
|
+
// return the clockwise interior
|
|
76280
|
+
return forceWinding(node.region, true);
|
|
76281
|
+
}
|
|
76282
|
+
|
|
76283
|
+
// root nodes are exterior
|
|
76284
|
+
for (var i = 0; i < roots.children.length; i++)
|
|
76285
|
+
addExterior(roots.children[i]);
|
|
76286
|
+
|
|
76287
|
+
// lastly, construct the approrpriate GeoJSON object
|
|
76288
|
+
|
|
76289
|
+
if (geopolys.length <= 0) // empty GeoJSON Polygon
|
|
76290
|
+
return { type: 'Polygon', coordinates: [] };
|
|
76291
|
+
if (geopolys.length == 1) // use a GeoJSON Polygon
|
|
76292
|
+
return { type: 'Polygon', coordinates: geopolys[0] };
|
|
76293
|
+
return { // otherwise, use a GeoJSON MultiPolygon
|
|
76294
|
+
type: 'MultiPolygon',
|
|
76295
|
+
coordinates: geopolys
|
|
76296
|
+
};
|
|
76297
|
+
}
|
|
76298
|
+
};
|
|
76299
|
+
|
|
76300
|
+
module.exports = GeoJSON;
|
|
76301
|
+
|
|
76302
|
+
|
|
76303
|
+
/***/ }),
|
|
76304
|
+
|
|
76305
|
+
/***/ 7671:
|
|
76306
|
+
/***/ (function(module, __unused_webpack_exports, __webpack_require__) {
|
|
76307
|
+
|
|
76308
|
+
// (c) Copyright 2016, Sean Connelly (@voidqk), http://syntheti.cc
|
|
76309
|
+
// MIT License
|
|
76310
|
+
// Project Home: https://github.com/voidqk/polybooljs
|
|
76311
|
+
|
|
76312
|
+
//
|
|
76313
|
+
// this is the core work-horse
|
|
76314
|
+
//
|
|
76315
|
+
|
|
76316
|
+
var LinkedList = __webpack_require__(9186);
|
|
76317
|
+
|
|
76318
|
+
function Intersecter(selfIntersection, eps, buildLog){
|
|
76319
|
+
// selfIntersection is true/false depending on the phase of the overall algorithm
|
|
76320
|
+
|
|
76321
|
+
//
|
|
76322
|
+
// segment creation
|
|
76323
|
+
//
|
|
76324
|
+
|
|
76325
|
+
function segmentNew(start, end){
|
|
76326
|
+
return {
|
|
76327
|
+
id: buildLog ? buildLog.segmentId() : -1,
|
|
76328
|
+
start: start,
|
|
76329
|
+
end: end,
|
|
76330
|
+
myFill: {
|
|
76331
|
+
above: null, // is there fill above us?
|
|
76332
|
+
below: null // is there fill below us?
|
|
76333
|
+
},
|
|
76334
|
+
otherFill: null
|
|
76335
|
+
};
|
|
76336
|
+
}
|
|
76337
|
+
|
|
76338
|
+
function segmentCopy(start, end, seg){
|
|
76339
|
+
return {
|
|
76340
|
+
id: buildLog ? buildLog.segmentId() : -1,
|
|
76341
|
+
start: start,
|
|
76342
|
+
end: end,
|
|
76343
|
+
myFill: {
|
|
76344
|
+
above: seg.myFill.above,
|
|
76345
|
+
below: seg.myFill.below
|
|
76346
|
+
},
|
|
76347
|
+
otherFill: null
|
|
76348
|
+
};
|
|
76349
|
+
}
|
|
76350
|
+
|
|
76351
|
+
//
|
|
76352
|
+
// event logic
|
|
76353
|
+
//
|
|
76354
|
+
|
|
76355
|
+
var event_root = LinkedList.create();
|
|
76356
|
+
|
|
76357
|
+
function eventCompare(p1_isStart, p1_1, p1_2, p2_isStart, p2_1, p2_2){
|
|
76358
|
+
// compare the selected points first
|
|
76359
|
+
var comp = eps.pointsCompare(p1_1, p2_1);
|
|
76360
|
+
if (comp !== 0)
|
|
76361
|
+
return comp;
|
|
76362
|
+
// the selected points are the same
|
|
76363
|
+
|
|
76364
|
+
if (eps.pointsSame(p1_2, p2_2)) // if the non-selected points are the same too...
|
|
76365
|
+
return 0; // then the segments are equal
|
|
76366
|
+
|
|
76367
|
+
if (p1_isStart !== p2_isStart) // if one is a start and the other isn't...
|
|
76368
|
+
return p1_isStart ? 1 : -1; // favor the one that isn't the start
|
|
76369
|
+
|
|
76370
|
+
// otherwise, we'll have to calculate which one is below the other manually
|
|
76371
|
+
return eps.pointAboveOrOnLine(p1_2,
|
|
76372
|
+
p2_isStart ? p2_1 : p2_2, // order matters
|
|
76373
|
+
p2_isStart ? p2_2 : p2_1
|
|
76374
|
+
) ? 1 : -1;
|
|
76375
|
+
}
|
|
76376
|
+
|
|
76377
|
+
function eventAdd(ev, other_pt){
|
|
76378
|
+
event_root.insertBefore(ev, function(here){
|
|
76379
|
+
// should ev be inserted before here?
|
|
76380
|
+
var comp = eventCompare(
|
|
76381
|
+
ev .isStart, ev .pt, other_pt,
|
|
76382
|
+
here.isStart, here.pt, here.other.pt
|
|
76383
|
+
);
|
|
76384
|
+
return comp < 0;
|
|
76385
|
+
});
|
|
76386
|
+
}
|
|
76387
|
+
|
|
76388
|
+
function eventAddSegmentStart(seg, primary){
|
|
76389
|
+
var ev_start = LinkedList.node({
|
|
76390
|
+
isStart: true,
|
|
76391
|
+
pt: seg.start,
|
|
76392
|
+
seg: seg,
|
|
76393
|
+
primary: primary,
|
|
76394
|
+
other: null,
|
|
76395
|
+
status: null
|
|
76396
|
+
});
|
|
76397
|
+
eventAdd(ev_start, seg.end);
|
|
76398
|
+
return ev_start;
|
|
76399
|
+
}
|
|
76400
|
+
|
|
76401
|
+
function eventAddSegmentEnd(ev_start, seg, primary){
|
|
76402
|
+
var ev_end = LinkedList.node({
|
|
76403
|
+
isStart: false,
|
|
76404
|
+
pt: seg.end,
|
|
76405
|
+
seg: seg,
|
|
76406
|
+
primary: primary,
|
|
76407
|
+
other: ev_start,
|
|
76408
|
+
status: null
|
|
76409
|
+
});
|
|
76410
|
+
ev_start.other = ev_end;
|
|
76411
|
+
eventAdd(ev_end, ev_start.pt);
|
|
76412
|
+
}
|
|
76413
|
+
|
|
76414
|
+
function eventAddSegment(seg, primary){
|
|
76415
|
+
var ev_start = eventAddSegmentStart(seg, primary);
|
|
76416
|
+
eventAddSegmentEnd(ev_start, seg, primary);
|
|
76417
|
+
return ev_start;
|
|
76418
|
+
}
|
|
76419
|
+
|
|
76420
|
+
function eventUpdateEnd(ev, end){
|
|
76421
|
+
// slides an end backwards
|
|
76422
|
+
// (start)------------(end) to:
|
|
76423
|
+
// (start)---(end)
|
|
76424
|
+
|
|
76425
|
+
if (buildLog)
|
|
76426
|
+
buildLog.segmentChop(ev.seg, end);
|
|
76427
|
+
|
|
76428
|
+
ev.other.remove();
|
|
76429
|
+
ev.seg.end = end;
|
|
76430
|
+
ev.other.pt = end;
|
|
76431
|
+
eventAdd(ev.other, ev.pt);
|
|
76432
|
+
}
|
|
76433
|
+
|
|
76434
|
+
function eventDivide(ev, pt){
|
|
76435
|
+
var ns = segmentCopy(pt, ev.seg.end, ev.seg);
|
|
76436
|
+
eventUpdateEnd(ev, pt);
|
|
76437
|
+
return eventAddSegment(ns, ev.primary);
|
|
76438
|
+
}
|
|
76439
|
+
|
|
76440
|
+
function calculate(primaryPolyInverted, secondaryPolyInverted){
|
|
76441
|
+
// if selfIntersection is true then there is no secondary polygon, so that isn't used
|
|
76442
|
+
|
|
76443
|
+
//
|
|
76444
|
+
// status logic
|
|
76445
|
+
//
|
|
76446
|
+
|
|
76447
|
+
var status_root = LinkedList.create();
|
|
76448
|
+
|
|
76449
|
+
function statusCompare(ev1, ev2){
|
|
76450
|
+
var a1 = ev1.seg.start;
|
|
76451
|
+
var a2 = ev1.seg.end;
|
|
76452
|
+
var b1 = ev2.seg.start;
|
|
76453
|
+
var b2 = ev2.seg.end;
|
|
76454
|
+
|
|
76455
|
+
if (eps.pointsCollinear(a1, b1, b2)){
|
|
76456
|
+
if (eps.pointsCollinear(a2, b1, b2))
|
|
76457
|
+
return 1;//eventCompare(true, a1, a2, true, b1, b2);
|
|
76458
|
+
return eps.pointAboveOrOnLine(a2, b1, b2) ? 1 : -1;
|
|
76459
|
+
}
|
|
76460
|
+
return eps.pointAboveOrOnLine(a1, b1, b2) ? 1 : -1;
|
|
76461
|
+
}
|
|
76462
|
+
|
|
76463
|
+
function statusFindSurrounding(ev){
|
|
76464
|
+
return status_root.findTransition(function(here){
|
|
76465
|
+
var comp = statusCompare(ev, here.ev);
|
|
76466
|
+
return comp > 0;
|
|
76467
|
+
});
|
|
76468
|
+
}
|
|
76469
|
+
|
|
76470
|
+
function checkIntersection(ev1, ev2){
|
|
76471
|
+
// returns the segment equal to ev1, or false if nothing equal
|
|
76472
|
+
|
|
76473
|
+
var seg1 = ev1.seg;
|
|
76474
|
+
var seg2 = ev2.seg;
|
|
76475
|
+
var a1 = seg1.start;
|
|
76476
|
+
var a2 = seg1.end;
|
|
76477
|
+
var b1 = seg2.start;
|
|
76478
|
+
var b2 = seg2.end;
|
|
76479
|
+
|
|
76480
|
+
if (buildLog)
|
|
76481
|
+
buildLog.checkIntersection(seg1, seg2);
|
|
76482
|
+
|
|
76483
|
+
var i = eps.linesIntersect(a1, a2, b1, b2);
|
|
76484
|
+
|
|
76485
|
+
if (i === false){
|
|
76486
|
+
// segments are parallel or coincident
|
|
76487
|
+
|
|
76488
|
+
// if points aren't collinear, then the segments are parallel, so no intersections
|
|
76489
|
+
if (!eps.pointsCollinear(a1, a2, b1))
|
|
76490
|
+
return false;
|
|
76491
|
+
// otherwise, segments are on top of each other somehow (aka coincident)
|
|
76492
|
+
|
|
76493
|
+
if (eps.pointsSame(a1, b2) || eps.pointsSame(a2, b1))
|
|
76494
|
+
return false; // segments touch at endpoints... no intersection
|
|
76495
|
+
|
|
76496
|
+
var a1_equ_b1 = eps.pointsSame(a1, b1);
|
|
76497
|
+
var a2_equ_b2 = eps.pointsSame(a2, b2);
|
|
76498
|
+
|
|
76499
|
+
if (a1_equ_b1 && a2_equ_b2)
|
|
76500
|
+
return ev2; // segments are exactly equal
|
|
76501
|
+
|
|
76502
|
+
var a1_between = !a1_equ_b1 && eps.pointBetween(a1, b1, b2);
|
|
76503
|
+
var a2_between = !a2_equ_b2 && eps.pointBetween(a2, b1, b2);
|
|
76504
|
+
|
|
76505
|
+
// handy for debugging:
|
|
76506
|
+
// buildLog.log({
|
|
76507
|
+
// a1_equ_b1: a1_equ_b1,
|
|
76508
|
+
// a2_equ_b2: a2_equ_b2,
|
|
76509
|
+
// a1_between: a1_between,
|
|
76510
|
+
// a2_between: a2_between
|
|
76511
|
+
// });
|
|
76512
|
+
|
|
76513
|
+
if (a1_equ_b1){
|
|
76514
|
+
if (a2_between){
|
|
76515
|
+
// (a1)---(a2)
|
|
76516
|
+
// (b1)----------(b2)
|
|
76517
|
+
eventDivide(ev2, a2);
|
|
76518
|
+
}
|
|
76519
|
+
else{
|
|
76520
|
+
// (a1)----------(a2)
|
|
76521
|
+
// (b1)---(b2)
|
|
76522
|
+
eventDivide(ev1, b2);
|
|
76523
|
+
}
|
|
76524
|
+
return ev2;
|
|
76525
|
+
}
|
|
76526
|
+
else if (a1_between){
|
|
76527
|
+
if (!a2_equ_b2){
|
|
76528
|
+
// make a2 equal to b2
|
|
76529
|
+
if (a2_between){
|
|
76530
|
+
// (a1)---(a2)
|
|
76531
|
+
// (b1)-----------------(b2)
|
|
76532
|
+
eventDivide(ev2, a2);
|
|
76533
|
+
}
|
|
76534
|
+
else{
|
|
76535
|
+
// (a1)----------(a2)
|
|
76536
|
+
// (b1)----------(b2)
|
|
76537
|
+
eventDivide(ev1, b2);
|
|
76538
|
+
}
|
|
76539
|
+
}
|
|
76540
|
+
|
|
76541
|
+
// (a1)---(a2)
|
|
76542
|
+
// (b1)----------(b2)
|
|
76543
|
+
eventDivide(ev2, a1);
|
|
76544
|
+
}
|
|
76545
|
+
}
|
|
76546
|
+
else{
|
|
76547
|
+
// otherwise, lines intersect at i.pt, which may or may not be between the endpoints
|
|
76548
|
+
|
|
76549
|
+
// is A divided between its endpoints? (exclusive)
|
|
76550
|
+
if (i.alongA === 0){
|
|
76551
|
+
if (i.alongB === -1) // yes, at exactly b1
|
|
76552
|
+
eventDivide(ev1, b1);
|
|
76553
|
+
else if (i.alongB === 0) // yes, somewhere between B's endpoints
|
|
76554
|
+
eventDivide(ev1, i.pt);
|
|
76555
|
+
else if (i.alongB === 1) // yes, at exactly b2
|
|
76556
|
+
eventDivide(ev1, b2);
|
|
76557
|
+
}
|
|
76558
|
+
|
|
76559
|
+
// is B divided between its endpoints? (exclusive)
|
|
76560
|
+
if (i.alongB === 0){
|
|
76561
|
+
if (i.alongA === -1) // yes, at exactly a1
|
|
76562
|
+
eventDivide(ev2, a1);
|
|
76563
|
+
else if (i.alongA === 0) // yes, somewhere between A's endpoints (exclusive)
|
|
76564
|
+
eventDivide(ev2, i.pt);
|
|
76565
|
+
else if (i.alongA === 1) // yes, at exactly a2
|
|
76566
|
+
eventDivide(ev2, a2);
|
|
76567
|
+
}
|
|
76568
|
+
}
|
|
76569
|
+
return false;
|
|
76570
|
+
}
|
|
76571
|
+
|
|
76572
|
+
//
|
|
76573
|
+
// main event loop
|
|
76574
|
+
//
|
|
76575
|
+
var segments = [];
|
|
76576
|
+
while (!event_root.isEmpty()){
|
|
76577
|
+
var ev = event_root.getHead();
|
|
76578
|
+
|
|
76579
|
+
if (buildLog)
|
|
76580
|
+
buildLog.vert(ev.pt[0]);
|
|
76581
|
+
|
|
76582
|
+
if (ev.isStart){
|
|
76583
|
+
|
|
76584
|
+
if (buildLog)
|
|
76585
|
+
buildLog.segmentNew(ev.seg, ev.primary);
|
|
76586
|
+
|
|
76587
|
+
var surrounding = statusFindSurrounding(ev);
|
|
76588
|
+
var above = surrounding.before ? surrounding.before.ev : null;
|
|
76589
|
+
var below = surrounding.after ? surrounding.after.ev : null;
|
|
76590
|
+
|
|
76591
|
+
if (buildLog){
|
|
76592
|
+
buildLog.tempStatus(
|
|
76593
|
+
ev.seg,
|
|
76594
|
+
above ? above.seg : false,
|
|
76595
|
+
below ? below.seg : false
|
|
76596
|
+
);
|
|
76597
|
+
}
|
|
76598
|
+
|
|
76599
|
+
function checkBothIntersections(){
|
|
76600
|
+
if (above){
|
|
76601
|
+
var eve = checkIntersection(ev, above);
|
|
76602
|
+
if (eve)
|
|
76603
|
+
return eve;
|
|
76604
|
+
}
|
|
76605
|
+
if (below)
|
|
76606
|
+
return checkIntersection(ev, below);
|
|
76607
|
+
return false;
|
|
76608
|
+
}
|
|
76609
|
+
|
|
76610
|
+
var eve = checkBothIntersections();
|
|
76611
|
+
if (eve){
|
|
76612
|
+
// ev and eve are equal
|
|
76613
|
+
// we'll keep eve and throw away ev
|
|
76614
|
+
|
|
76615
|
+
// merge ev.seg's fill information into eve.seg
|
|
76616
|
+
|
|
76617
|
+
if (selfIntersection){
|
|
76618
|
+
var toggle; // are we a toggling edge?
|
|
76619
|
+
if (ev.seg.myFill.below === null)
|
|
76620
|
+
toggle = true;
|
|
76621
|
+
else
|
|
76622
|
+
toggle = ev.seg.myFill.above !== ev.seg.myFill.below;
|
|
76623
|
+
|
|
76624
|
+
// merge two segments that belong to the same polygon
|
|
76625
|
+
// think of this as sandwiching two segments together, where `eve.seg` is
|
|
76626
|
+
// the bottom -- this will cause the above fill flag to toggle
|
|
76627
|
+
if (toggle)
|
|
76628
|
+
eve.seg.myFill.above = !eve.seg.myFill.above;
|
|
76629
|
+
}
|
|
76630
|
+
else{
|
|
76631
|
+
// merge two segments that belong to different polygons
|
|
76632
|
+
// each segment has distinct knowledge, so no special logic is needed
|
|
76633
|
+
// note that this can only happen once per segment in this phase, because we
|
|
76634
|
+
// are guaranteed that all self-intersections are gone
|
|
76635
|
+
eve.seg.otherFill = ev.seg.myFill;
|
|
76636
|
+
}
|
|
76637
|
+
|
|
76638
|
+
if (buildLog)
|
|
76639
|
+
buildLog.segmentUpdate(eve.seg);
|
|
76640
|
+
|
|
76641
|
+
ev.other.remove();
|
|
76642
|
+
ev.remove();
|
|
76643
|
+
}
|
|
76644
|
+
|
|
76645
|
+
if (event_root.getHead() !== ev){
|
|
76646
|
+
// something was inserted before us in the event queue, so loop back around and
|
|
76647
|
+
// process it before continuing
|
|
76648
|
+
if (buildLog)
|
|
76649
|
+
buildLog.rewind(ev.seg);
|
|
76650
|
+
continue;
|
|
76651
|
+
}
|
|
76652
|
+
|
|
76653
|
+
//
|
|
76654
|
+
// calculate fill flags
|
|
76655
|
+
//
|
|
76656
|
+
if (selfIntersection){
|
|
76657
|
+
var toggle; // are we a toggling edge?
|
|
76658
|
+
if (ev.seg.myFill.below === null) // if we are a new segment...
|
|
76659
|
+
toggle = true; // then we toggle
|
|
76660
|
+
else // we are a segment that has previous knowledge from a division
|
|
76661
|
+
toggle = ev.seg.myFill.above !== ev.seg.myFill.below; // calculate toggle
|
|
76662
|
+
|
|
76663
|
+
// next, calculate whether we are filled below us
|
|
76664
|
+
if (!below){ // if nothing is below us...
|
|
76665
|
+
// we are filled below us if the polygon is inverted
|
|
76666
|
+
ev.seg.myFill.below = primaryPolyInverted;
|
|
76667
|
+
}
|
|
76668
|
+
else{
|
|
76669
|
+
// otherwise, we know the answer -- it's the same if whatever is below
|
|
76670
|
+
// us is filled above it
|
|
76671
|
+
ev.seg.myFill.below = below.seg.myFill.above;
|
|
76672
|
+
}
|
|
76673
|
+
|
|
76674
|
+
// since now we know if we're filled below us, we can calculate whether
|
|
76675
|
+
// we're filled above us by applying toggle to whatever is below us
|
|
76676
|
+
if (toggle)
|
|
76677
|
+
ev.seg.myFill.above = !ev.seg.myFill.below;
|
|
76678
|
+
else
|
|
76679
|
+
ev.seg.myFill.above = ev.seg.myFill.below;
|
|
76680
|
+
}
|
|
76681
|
+
else{
|
|
76682
|
+
// now we fill in any missing transition information, since we are all-knowing
|
|
76683
|
+
// at this point
|
|
76684
|
+
|
|
76685
|
+
if (ev.seg.otherFill === null){
|
|
76686
|
+
// if we don't have other information, then we need to figure out if we're
|
|
76687
|
+
// inside the other polygon
|
|
76688
|
+
var inside;
|
|
76689
|
+
if (!below){
|
|
76690
|
+
// if nothing is below us, then we're inside if the other polygon is
|
|
76691
|
+
// inverted
|
|
76692
|
+
inside =
|
|
76693
|
+
ev.primary ? secondaryPolyInverted : primaryPolyInverted;
|
|
76694
|
+
}
|
|
76695
|
+
else{ // otherwise, something is below us
|
|
76696
|
+
// so copy the below segment's other polygon's above
|
|
76697
|
+
if (ev.primary === below.primary)
|
|
76698
|
+
inside = below.seg.otherFill.above;
|
|
76699
|
+
else
|
|
76700
|
+
inside = below.seg.myFill.above;
|
|
76701
|
+
}
|
|
76702
|
+
ev.seg.otherFill = {
|
|
76703
|
+
above: inside,
|
|
76704
|
+
below: inside
|
|
76705
|
+
};
|
|
76706
|
+
}
|
|
76707
|
+
}
|
|
76708
|
+
|
|
76709
|
+
if (buildLog){
|
|
76710
|
+
buildLog.status(
|
|
76711
|
+
ev.seg,
|
|
76712
|
+
above ? above.seg : false,
|
|
76713
|
+
below ? below.seg : false
|
|
76714
|
+
);
|
|
76715
|
+
}
|
|
76716
|
+
|
|
76717
|
+
// insert the status and remember it for later removal
|
|
76718
|
+
ev.other.status = surrounding.insert(LinkedList.node({ ev: ev }));
|
|
76719
|
+
}
|
|
76720
|
+
else{
|
|
76721
|
+
var st = ev.status;
|
|
76722
|
+
|
|
76723
|
+
if (st === null){
|
|
76724
|
+
throw new Error('PolyBool: Zero-length segment detected; your epsilon is ' +
|
|
76725
|
+
'probably too small or too large');
|
|
76726
|
+
}
|
|
76727
|
+
|
|
76728
|
+
// removing the status will create two new adjacent edges, so we'll need to check
|
|
76729
|
+
// for those
|
|
76730
|
+
if (status_root.exists(st.prev) && status_root.exists(st.next))
|
|
76731
|
+
checkIntersection(st.prev.ev, st.next.ev);
|
|
76732
|
+
|
|
76733
|
+
if (buildLog)
|
|
76734
|
+
buildLog.statusRemove(st.ev.seg);
|
|
76735
|
+
|
|
76736
|
+
// remove the status
|
|
76737
|
+
st.remove();
|
|
76738
|
+
|
|
76739
|
+
// if we've reached this point, we've calculated everything there is to know, so
|
|
76740
|
+
// save the segment for reporting
|
|
76741
|
+
if (!ev.primary){
|
|
76742
|
+
// make sure `seg.myFill` actually points to the primary polygon though
|
|
76743
|
+
var s = ev.seg.myFill;
|
|
76744
|
+
ev.seg.myFill = ev.seg.otherFill;
|
|
76745
|
+
ev.seg.otherFill = s;
|
|
76746
|
+
}
|
|
76747
|
+
segments.push(ev.seg);
|
|
76748
|
+
}
|
|
76749
|
+
|
|
76750
|
+
// remove the event and continue
|
|
76751
|
+
event_root.getHead().remove();
|
|
76752
|
+
}
|
|
76753
|
+
|
|
76754
|
+
if (buildLog)
|
|
76755
|
+
buildLog.done();
|
|
76756
|
+
|
|
76757
|
+
return segments;
|
|
76758
|
+
}
|
|
76759
|
+
|
|
76760
|
+
// return the appropriate API depending on what we're doing
|
|
76761
|
+
if (!selfIntersection){
|
|
76762
|
+
// performing combination of polygons, so only deal with already-processed segments
|
|
76763
|
+
return {
|
|
76764
|
+
calculate: function(segments1, inverted1, segments2, inverted2){
|
|
76765
|
+
// segmentsX come from the self-intersection API, or this API
|
|
76766
|
+
// invertedX is whether we treat that list of segments as an inverted polygon or not
|
|
76767
|
+
// returns segments that can be used for further operations
|
|
76768
|
+
segments1.forEach(function(seg){
|
|
76769
|
+
eventAddSegment(segmentCopy(seg.start, seg.end, seg), true);
|
|
76770
|
+
});
|
|
76771
|
+
segments2.forEach(function(seg){
|
|
76772
|
+
eventAddSegment(segmentCopy(seg.start, seg.end, seg), false);
|
|
76773
|
+
});
|
|
76774
|
+
return calculate(inverted1, inverted2);
|
|
76775
|
+
}
|
|
76776
|
+
};
|
|
76777
|
+
}
|
|
76778
|
+
|
|
76779
|
+
// otherwise, performing self-intersection, so deal with regions
|
|
76780
|
+
return {
|
|
76781
|
+
addRegion: function(region){
|
|
76782
|
+
// regions are a list of points:
|
|
76783
|
+
// [ [0, 0], [100, 0], [50, 100] ]
|
|
76784
|
+
// you can add multiple regions before running calculate
|
|
76785
|
+
var pt1;
|
|
76786
|
+
var pt2 = region[region.length - 1];
|
|
76787
|
+
for (var i = 0; i < region.length; i++){
|
|
76788
|
+
pt1 = pt2;
|
|
76789
|
+
pt2 = region[i];
|
|
76790
|
+
|
|
76791
|
+
var forward = eps.pointsCompare(pt1, pt2);
|
|
76792
|
+
if (forward === 0) // points are equal, so we have a zero-length segment
|
|
76793
|
+
continue; // just skip it
|
|
76794
|
+
|
|
76795
|
+
eventAddSegment(
|
|
76796
|
+
segmentNew(
|
|
76797
|
+
forward < 0 ? pt1 : pt2,
|
|
76798
|
+
forward < 0 ? pt2 : pt1
|
|
76799
|
+
),
|
|
76800
|
+
true
|
|
76801
|
+
);
|
|
76802
|
+
}
|
|
76803
|
+
},
|
|
76804
|
+
calculate: function(inverted){
|
|
76805
|
+
// is the polygon inverted?
|
|
76806
|
+
// returns segments
|
|
76807
|
+
return calculate(inverted, false);
|
|
76808
|
+
}
|
|
76809
|
+
};
|
|
76810
|
+
}
|
|
76811
|
+
|
|
76812
|
+
module.exports = Intersecter;
|
|
76813
|
+
|
|
76814
|
+
|
|
76815
|
+
/***/ }),
|
|
76816
|
+
|
|
76817
|
+
/***/ 9186:
|
|
76818
|
+
/***/ (function(module) {
|
|
76819
|
+
|
|
76820
|
+
// (c) Copyright 2016, Sean Connelly (@voidqk), http://syntheti.cc
|
|
76821
|
+
// MIT License
|
|
76822
|
+
// Project Home: https://github.com/voidqk/polybooljs
|
|
76823
|
+
|
|
76824
|
+
//
|
|
76825
|
+
// simple linked list implementation that allows you to traverse down nodes and save positions
|
|
76826
|
+
//
|
|
76827
|
+
|
|
76828
|
+
var LinkedList = {
|
|
76829
|
+
create: function(){
|
|
76830
|
+
var my = {
|
|
76831
|
+
root: { root: true, next: null },
|
|
76832
|
+
exists: function(node){
|
|
76833
|
+
if (node === null || node === my.root)
|
|
76834
|
+
return false;
|
|
76835
|
+
return true;
|
|
76836
|
+
},
|
|
76837
|
+
isEmpty: function(){
|
|
76838
|
+
return my.root.next === null;
|
|
76839
|
+
},
|
|
76840
|
+
getHead: function(){
|
|
76841
|
+
return my.root.next;
|
|
76842
|
+
},
|
|
76843
|
+
insertBefore: function(node, check){
|
|
76844
|
+
var last = my.root;
|
|
76845
|
+
var here = my.root.next;
|
|
76846
|
+
while (here !== null){
|
|
76847
|
+
if (check(here)){
|
|
76848
|
+
node.prev = here.prev;
|
|
76849
|
+
node.next = here;
|
|
76850
|
+
here.prev.next = node;
|
|
76851
|
+
here.prev = node;
|
|
76852
|
+
return;
|
|
76853
|
+
}
|
|
76854
|
+
last = here;
|
|
76855
|
+
here = here.next;
|
|
76856
|
+
}
|
|
76857
|
+
last.next = node;
|
|
76858
|
+
node.prev = last;
|
|
76859
|
+
node.next = null;
|
|
76860
|
+
},
|
|
76861
|
+
findTransition: function(check){
|
|
76862
|
+
var prev = my.root;
|
|
76863
|
+
var here = my.root.next;
|
|
76864
|
+
while (here !== null){
|
|
76865
|
+
if (check(here))
|
|
76866
|
+
break;
|
|
76867
|
+
prev = here;
|
|
76868
|
+
here = here.next;
|
|
76869
|
+
}
|
|
76870
|
+
return {
|
|
76871
|
+
before: prev === my.root ? null : prev,
|
|
76872
|
+
after: here,
|
|
76873
|
+
insert: function(node){
|
|
76874
|
+
node.prev = prev;
|
|
76875
|
+
node.next = here;
|
|
76876
|
+
prev.next = node;
|
|
76877
|
+
if (here !== null)
|
|
76878
|
+
here.prev = node;
|
|
76879
|
+
return node;
|
|
76880
|
+
}
|
|
76881
|
+
};
|
|
76882
|
+
}
|
|
76883
|
+
};
|
|
76884
|
+
return my;
|
|
76885
|
+
},
|
|
76886
|
+
node: function(data){
|
|
76887
|
+
data.prev = null;
|
|
76888
|
+
data.next = null;
|
|
76889
|
+
data.remove = function(){
|
|
76890
|
+
data.prev.next = data.next;
|
|
76891
|
+
if (data.next)
|
|
76892
|
+
data.next.prev = data.prev;
|
|
76893
|
+
data.prev = null;
|
|
76894
|
+
data.next = null;
|
|
76895
|
+
};
|
|
76896
|
+
return data;
|
|
76897
|
+
}
|
|
76898
|
+
};
|
|
76899
|
+
|
|
76900
|
+
module.exports = LinkedList;
|
|
76901
|
+
|
|
76902
|
+
|
|
76903
|
+
/***/ }),
|
|
76904
|
+
|
|
76905
|
+
/***/ 9048:
|
|
76906
|
+
/***/ (function(module) {
|
|
76907
|
+
|
|
76908
|
+
// (c) Copyright 2016, Sean Connelly (@voidqk), http://syntheti.cc
|
|
76909
|
+
// MIT License
|
|
76910
|
+
// Project Home: https://github.com/voidqk/polybooljs
|
|
76911
|
+
|
|
76912
|
+
//
|
|
76913
|
+
// converts a list of segments into a list of regions, while also removing unnecessary verticies
|
|
76914
|
+
//
|
|
76915
|
+
|
|
76916
|
+
function SegmentChainer(segments, eps, buildLog){
|
|
76917
|
+
var chains = [];
|
|
76918
|
+
var regions = [];
|
|
76919
|
+
|
|
76920
|
+
segments.forEach(function(seg){
|
|
76921
|
+
var pt1 = seg.start;
|
|
76922
|
+
var pt2 = seg.end;
|
|
76923
|
+
if (eps.pointsSame(pt1, pt2)){
|
|
76924
|
+
console.warn('PolyBool: Warning: Zero-length segment detected; your epsilon is ' +
|
|
76925
|
+
'probably too small or too large');
|
|
76926
|
+
return;
|
|
76927
|
+
}
|
|
76928
|
+
|
|
76929
|
+
if (buildLog)
|
|
76930
|
+
buildLog.chainStart(seg);
|
|
76931
|
+
|
|
76932
|
+
// search for two chains that this segment matches
|
|
76933
|
+
var first_match = {
|
|
76934
|
+
index: 0,
|
|
76935
|
+
matches_head: false,
|
|
76936
|
+
matches_pt1: false
|
|
76937
|
+
};
|
|
76938
|
+
var second_match = {
|
|
76939
|
+
index: 0,
|
|
76940
|
+
matches_head: false,
|
|
76941
|
+
matches_pt1: false
|
|
76942
|
+
};
|
|
76943
|
+
var next_match = first_match;
|
|
76944
|
+
function setMatch(index, matches_head, matches_pt1){
|
|
76945
|
+
// return true if we've matched twice
|
|
76946
|
+
next_match.index = index;
|
|
76947
|
+
next_match.matches_head = matches_head;
|
|
76948
|
+
next_match.matches_pt1 = matches_pt1;
|
|
76949
|
+
if (next_match === first_match){
|
|
76950
|
+
next_match = second_match;
|
|
76951
|
+
return false;
|
|
76952
|
+
}
|
|
76953
|
+
next_match = null;
|
|
76954
|
+
return true; // we've matched twice, we're done here
|
|
76955
|
+
}
|
|
76956
|
+
for (var i = 0; i < chains.length; i++){
|
|
76957
|
+
var chain = chains[i];
|
|
76958
|
+
var head = chain[0];
|
|
76959
|
+
var head2 = chain[1];
|
|
76960
|
+
var tail = chain[chain.length - 1];
|
|
76961
|
+
var tail2 = chain[chain.length - 2];
|
|
76962
|
+
if (eps.pointsSame(head, pt1)){
|
|
76963
|
+
if (setMatch(i, true, true))
|
|
76964
|
+
break;
|
|
76965
|
+
}
|
|
76966
|
+
else if (eps.pointsSame(head, pt2)){
|
|
76967
|
+
if (setMatch(i, true, false))
|
|
76968
|
+
break;
|
|
76969
|
+
}
|
|
76970
|
+
else if (eps.pointsSame(tail, pt1)){
|
|
76971
|
+
if (setMatch(i, false, true))
|
|
76972
|
+
break;
|
|
76973
|
+
}
|
|
76974
|
+
else if (eps.pointsSame(tail, pt2)){
|
|
76975
|
+
if (setMatch(i, false, false))
|
|
76976
|
+
break;
|
|
76977
|
+
}
|
|
76978
|
+
}
|
|
76979
|
+
|
|
76980
|
+
if (next_match === first_match){
|
|
76981
|
+
// we didn't match anything, so create a new chain
|
|
76982
|
+
chains.push([ pt1, pt2 ]);
|
|
76983
|
+
if (buildLog)
|
|
76984
|
+
buildLog.chainNew(pt1, pt2);
|
|
76985
|
+
return;
|
|
76986
|
+
}
|
|
76987
|
+
|
|
76988
|
+
if (next_match === second_match){
|
|
76989
|
+
// we matched a single chain
|
|
76990
|
+
|
|
76991
|
+
if (buildLog)
|
|
76992
|
+
buildLog.chainMatch(first_match.index);
|
|
76993
|
+
|
|
76994
|
+
// add the other point to the apporpriate end, and check to see if we've closed the
|
|
76995
|
+
// chain into a loop
|
|
76996
|
+
|
|
76997
|
+
var index = first_match.index;
|
|
76998
|
+
var pt = first_match.matches_pt1 ? pt2 : pt1; // if we matched pt1, then we add pt2, etc
|
|
76999
|
+
var addToHead = first_match.matches_head; // if we matched at head, then add to the head
|
|
77000
|
+
|
|
77001
|
+
var chain = chains[index];
|
|
77002
|
+
var grow = addToHead ? chain[0] : chain[chain.length - 1];
|
|
77003
|
+
var grow2 = addToHead ? chain[1] : chain[chain.length - 2];
|
|
77004
|
+
var oppo = addToHead ? chain[chain.length - 1] : chain[0];
|
|
77005
|
+
var oppo2 = addToHead ? chain[chain.length - 2] : chain[1];
|
|
77006
|
+
|
|
77007
|
+
if (eps.pointsCollinear(grow2, grow, pt)){
|
|
77008
|
+
// grow isn't needed because it's directly between grow2 and pt:
|
|
77009
|
+
// grow2 ---grow---> pt
|
|
77010
|
+
if (addToHead){
|
|
77011
|
+
if (buildLog)
|
|
77012
|
+
buildLog.chainRemoveHead(first_match.index, pt);
|
|
77013
|
+
chain.shift();
|
|
77014
|
+
}
|
|
77015
|
+
else{
|
|
77016
|
+
if (buildLog)
|
|
77017
|
+
buildLog.chainRemoveTail(first_match.index, pt);
|
|
77018
|
+
chain.pop();
|
|
77019
|
+
}
|
|
77020
|
+
grow = grow2; // old grow is gone... new grow is what grow2 was
|
|
77021
|
+
}
|
|
77022
|
+
|
|
77023
|
+
if (eps.pointsSame(oppo, pt)){
|
|
77024
|
+
// we're closing the loop, so remove chain from chains
|
|
77025
|
+
chains.splice(index, 1);
|
|
77026
|
+
|
|
77027
|
+
if (eps.pointsCollinear(oppo2, oppo, grow)){
|
|
77028
|
+
// oppo isn't needed because it's directly between oppo2 and grow:
|
|
77029
|
+
// oppo2 ---oppo--->grow
|
|
77030
|
+
if (addToHead){
|
|
77031
|
+
if (buildLog)
|
|
77032
|
+
buildLog.chainRemoveTail(first_match.index, grow);
|
|
77033
|
+
chain.pop();
|
|
77034
|
+
}
|
|
77035
|
+
else{
|
|
77036
|
+
if (buildLog)
|
|
77037
|
+
buildLog.chainRemoveHead(first_match.index, grow);
|
|
77038
|
+
chain.shift();
|
|
77039
|
+
}
|
|
77040
|
+
}
|
|
77041
|
+
|
|
77042
|
+
if (buildLog)
|
|
77043
|
+
buildLog.chainClose(first_match.index);
|
|
77044
|
+
|
|
77045
|
+
// we have a closed chain!
|
|
77046
|
+
regions.push(chain);
|
|
77047
|
+
return;
|
|
77048
|
+
}
|
|
77049
|
+
|
|
77050
|
+
// not closing a loop, so just add it to the apporpriate side
|
|
77051
|
+
if (addToHead){
|
|
77052
|
+
if (buildLog)
|
|
77053
|
+
buildLog.chainAddHead(first_match.index, pt);
|
|
77054
|
+
chain.unshift(pt);
|
|
77055
|
+
}
|
|
77056
|
+
else{
|
|
77057
|
+
if (buildLog)
|
|
77058
|
+
buildLog.chainAddTail(first_match.index, pt);
|
|
77059
|
+
chain.push(pt);
|
|
77060
|
+
}
|
|
77061
|
+
return;
|
|
77062
|
+
}
|
|
77063
|
+
|
|
77064
|
+
// otherwise, we matched two chains, so we need to combine those chains together
|
|
77065
|
+
|
|
77066
|
+
function reverseChain(index){
|
|
77067
|
+
if (buildLog)
|
|
77068
|
+
buildLog.chainReverse(index);
|
|
77069
|
+
chains[index].reverse(); // gee, that's easy
|
|
77070
|
+
}
|
|
77071
|
+
|
|
77072
|
+
function appendChain(index1, index2){
|
|
77073
|
+
// index1 gets index2 appended to it, and index2 is removed
|
|
77074
|
+
var chain1 = chains[index1];
|
|
77075
|
+
var chain2 = chains[index2];
|
|
77076
|
+
var tail = chain1[chain1.length - 1];
|
|
77077
|
+
var tail2 = chain1[chain1.length - 2];
|
|
77078
|
+
var head = chain2[0];
|
|
77079
|
+
var head2 = chain2[1];
|
|
77080
|
+
|
|
77081
|
+
if (eps.pointsCollinear(tail2, tail, head)){
|
|
77082
|
+
// tail isn't needed because it's directly between tail2 and head
|
|
77083
|
+
// tail2 ---tail---> head
|
|
77084
|
+
if (buildLog)
|
|
77085
|
+
buildLog.chainRemoveTail(index1, tail);
|
|
77086
|
+
chain1.pop();
|
|
77087
|
+
tail = tail2; // old tail is gone... new tail is what tail2 was
|
|
77088
|
+
}
|
|
77089
|
+
|
|
77090
|
+
if (eps.pointsCollinear(tail, head, head2)){
|
|
77091
|
+
// head isn't needed because it's directly between tail and head2
|
|
77092
|
+
// tail ---head---> head2
|
|
77093
|
+
if (buildLog)
|
|
77094
|
+
buildLog.chainRemoveHead(index2, head);
|
|
77095
|
+
chain2.shift();
|
|
77096
|
+
}
|
|
77097
|
+
|
|
77098
|
+
if (buildLog)
|
|
77099
|
+
buildLog.chainJoin(index1, index2);
|
|
77100
|
+
chains[index1] = chain1.concat(chain2);
|
|
77101
|
+
chains.splice(index2, 1);
|
|
77102
|
+
}
|
|
77103
|
+
|
|
77104
|
+
var F = first_match.index;
|
|
77105
|
+
var S = second_match.index;
|
|
77106
|
+
|
|
77107
|
+
if (buildLog)
|
|
77108
|
+
buildLog.chainConnect(F, S);
|
|
77109
|
+
|
|
77110
|
+
var reverseF = chains[F].length < chains[S].length; // reverse the shorter chain, if needed
|
|
77111
|
+
if (first_match.matches_head){
|
|
77112
|
+
if (second_match.matches_head){
|
|
77113
|
+
if (reverseF){
|
|
77114
|
+
// <<<< F <<<< --- >>>> S >>>>
|
|
77115
|
+
reverseChain(F);
|
|
77116
|
+
// >>>> F >>>> --- >>>> S >>>>
|
|
77117
|
+
appendChain(F, S);
|
|
77118
|
+
}
|
|
77119
|
+
else{
|
|
77120
|
+
// <<<< F <<<< --- >>>> S >>>>
|
|
77121
|
+
reverseChain(S);
|
|
77122
|
+
// <<<< F <<<< --- <<<< S <<<< logically same as:
|
|
77123
|
+
// >>>> S >>>> --- >>>> F >>>>
|
|
77124
|
+
appendChain(S, F);
|
|
77125
|
+
}
|
|
77126
|
+
}
|
|
77127
|
+
else{
|
|
77128
|
+
// <<<< F <<<< --- <<<< S <<<< logically same as:
|
|
77129
|
+
// >>>> S >>>> --- >>>> F >>>>
|
|
77130
|
+
appendChain(S, F);
|
|
77131
|
+
}
|
|
77132
|
+
}
|
|
77133
|
+
else{
|
|
77134
|
+
if (second_match.matches_head){
|
|
77135
|
+
// >>>> F >>>> --- >>>> S >>>>
|
|
77136
|
+
appendChain(F, S);
|
|
77137
|
+
}
|
|
77138
|
+
else{
|
|
77139
|
+
if (reverseF){
|
|
77140
|
+
// >>>> F >>>> --- <<<< S <<<<
|
|
77141
|
+
reverseChain(F);
|
|
77142
|
+
// <<<< F <<<< --- <<<< S <<<< logically same as:
|
|
77143
|
+
// >>>> S >>>> --- >>>> F >>>>
|
|
77144
|
+
appendChain(S, F);
|
|
77145
|
+
}
|
|
77146
|
+
else{
|
|
77147
|
+
// >>>> F >>>> --- <<<< S <<<<
|
|
77148
|
+
reverseChain(S);
|
|
77149
|
+
// >>>> F >>>> --- >>>> S >>>>
|
|
77150
|
+
appendChain(F, S);
|
|
77151
|
+
}
|
|
77152
|
+
}
|
|
77153
|
+
}
|
|
77154
|
+
});
|
|
77155
|
+
|
|
77156
|
+
return regions;
|
|
77157
|
+
}
|
|
77158
|
+
|
|
77159
|
+
module.exports = SegmentChainer;
|
|
77160
|
+
|
|
77161
|
+
|
|
77162
|
+
/***/ }),
|
|
77163
|
+
|
|
77164
|
+
/***/ 571:
|
|
77165
|
+
/***/ (function(module) {
|
|
77166
|
+
|
|
77167
|
+
// (c) Copyright 2016, Sean Connelly (@voidqk), http://syntheti.cc
|
|
77168
|
+
// MIT License
|
|
77169
|
+
// Project Home: https://github.com/voidqk/polybooljs
|
|
77170
|
+
|
|
77171
|
+
//
|
|
77172
|
+
// filter a list of segments based on boolean operations
|
|
77173
|
+
//
|
|
77174
|
+
|
|
77175
|
+
function select(segments, selection, buildLog){
|
|
77176
|
+
var result = [];
|
|
77177
|
+
segments.forEach(function(seg){
|
|
77178
|
+
var index =
|
|
77179
|
+
(seg.myFill.above ? 8 : 0) +
|
|
77180
|
+
(seg.myFill.below ? 4 : 0) +
|
|
77181
|
+
((seg.otherFill && seg.otherFill.above) ? 2 : 0) +
|
|
77182
|
+
((seg.otherFill && seg.otherFill.below) ? 1 : 0);
|
|
77183
|
+
if (selection[index] !== 0){
|
|
77184
|
+
// copy the segment to the results, while also calculating the fill status
|
|
77185
|
+
result.push({
|
|
77186
|
+
id: buildLog ? buildLog.segmentId() : -1,
|
|
77187
|
+
start: seg.start,
|
|
77188
|
+
end: seg.end,
|
|
77189
|
+
myFill: {
|
|
77190
|
+
above: selection[index] === 1, // 1 if filled above
|
|
77191
|
+
below: selection[index] === 2 // 2 if filled below
|
|
77192
|
+
},
|
|
77193
|
+
otherFill: null
|
|
77194
|
+
});
|
|
77195
|
+
}
|
|
77196
|
+
});
|
|
77197
|
+
|
|
77198
|
+
if (buildLog)
|
|
77199
|
+
buildLog.selected(result);
|
|
77200
|
+
|
|
77201
|
+
return result;
|
|
77202
|
+
}
|
|
77203
|
+
|
|
77204
|
+
var SegmentSelector = {
|
|
77205
|
+
union: function(segments, buildLog){ // primary | secondary
|
|
77206
|
+
// above1 below1 above2 below2 Keep? Value
|
|
77207
|
+
// 0 0 0 0 => no 0
|
|
77208
|
+
// 0 0 0 1 => yes filled below 2
|
|
77209
|
+
// 0 0 1 0 => yes filled above 1
|
|
77210
|
+
// 0 0 1 1 => no 0
|
|
77211
|
+
// 0 1 0 0 => yes filled below 2
|
|
77212
|
+
// 0 1 0 1 => yes filled below 2
|
|
77213
|
+
// 0 1 1 0 => no 0
|
|
77214
|
+
// 0 1 1 1 => no 0
|
|
77215
|
+
// 1 0 0 0 => yes filled above 1
|
|
77216
|
+
// 1 0 0 1 => no 0
|
|
77217
|
+
// 1 0 1 0 => yes filled above 1
|
|
77218
|
+
// 1 0 1 1 => no 0
|
|
77219
|
+
// 1 1 0 0 => no 0
|
|
77220
|
+
// 1 1 0 1 => no 0
|
|
77221
|
+
// 1 1 1 0 => no 0
|
|
77222
|
+
// 1 1 1 1 => no 0
|
|
77223
|
+
return select(segments, [
|
|
77224
|
+
0, 2, 1, 0,
|
|
77225
|
+
2, 2, 0, 0,
|
|
77226
|
+
1, 0, 1, 0,
|
|
77227
|
+
0, 0, 0, 0
|
|
77228
|
+
], buildLog);
|
|
77229
|
+
},
|
|
77230
|
+
intersect: function(segments, buildLog){ // primary & secondary
|
|
77231
|
+
// above1 below1 above2 below2 Keep? Value
|
|
77232
|
+
// 0 0 0 0 => no 0
|
|
77233
|
+
// 0 0 0 1 => no 0
|
|
77234
|
+
// 0 0 1 0 => no 0
|
|
77235
|
+
// 0 0 1 1 => no 0
|
|
77236
|
+
// 0 1 0 0 => no 0
|
|
77237
|
+
// 0 1 0 1 => yes filled below 2
|
|
77238
|
+
// 0 1 1 0 => no 0
|
|
77239
|
+
// 0 1 1 1 => yes filled below 2
|
|
77240
|
+
// 1 0 0 0 => no 0
|
|
77241
|
+
// 1 0 0 1 => no 0
|
|
77242
|
+
// 1 0 1 0 => yes filled above 1
|
|
77243
|
+
// 1 0 1 1 => yes filled above 1
|
|
77244
|
+
// 1 1 0 0 => no 0
|
|
77245
|
+
// 1 1 0 1 => yes filled below 2
|
|
77246
|
+
// 1 1 1 0 => yes filled above 1
|
|
77247
|
+
// 1 1 1 1 => no 0
|
|
77248
|
+
return select(segments, [
|
|
77249
|
+
0, 0, 0, 0,
|
|
77250
|
+
0, 2, 0, 2,
|
|
77251
|
+
0, 0, 1, 1,
|
|
77252
|
+
0, 2, 1, 0
|
|
77253
|
+
], buildLog);
|
|
77254
|
+
},
|
|
77255
|
+
difference: function(segments, buildLog){ // primary - secondary
|
|
77256
|
+
// above1 below1 above2 below2 Keep? Value
|
|
77257
|
+
// 0 0 0 0 => no 0
|
|
77258
|
+
// 0 0 0 1 => no 0
|
|
77259
|
+
// 0 0 1 0 => no 0
|
|
77260
|
+
// 0 0 1 1 => no 0
|
|
77261
|
+
// 0 1 0 0 => yes filled below 2
|
|
77262
|
+
// 0 1 0 1 => no 0
|
|
77263
|
+
// 0 1 1 0 => yes filled below 2
|
|
77264
|
+
// 0 1 1 1 => no 0
|
|
77265
|
+
// 1 0 0 0 => yes filled above 1
|
|
77266
|
+
// 1 0 0 1 => yes filled above 1
|
|
77267
|
+
// 1 0 1 0 => no 0
|
|
77268
|
+
// 1 0 1 1 => no 0
|
|
77269
|
+
// 1 1 0 0 => no 0
|
|
77270
|
+
// 1 1 0 1 => yes filled above 1
|
|
77271
|
+
// 1 1 1 0 => yes filled below 2
|
|
77272
|
+
// 1 1 1 1 => no 0
|
|
77273
|
+
return select(segments, [
|
|
77274
|
+
0, 0, 0, 0,
|
|
77275
|
+
2, 0, 2, 0,
|
|
77276
|
+
1, 1, 0, 0,
|
|
77277
|
+
0, 1, 2, 0
|
|
77278
|
+
], buildLog);
|
|
77279
|
+
},
|
|
77280
|
+
differenceRev: function(segments, buildLog){ // secondary - primary
|
|
77281
|
+
// above1 below1 above2 below2 Keep? Value
|
|
77282
|
+
// 0 0 0 0 => no 0
|
|
77283
|
+
// 0 0 0 1 => yes filled below 2
|
|
77284
|
+
// 0 0 1 0 => yes filled above 1
|
|
77285
|
+
// 0 0 1 1 => no 0
|
|
77286
|
+
// 0 1 0 0 => no 0
|
|
77287
|
+
// 0 1 0 1 => no 0
|
|
77288
|
+
// 0 1 1 0 => yes filled above 1
|
|
77289
|
+
// 0 1 1 1 => yes filled above 1
|
|
77290
|
+
// 1 0 0 0 => no 0
|
|
77291
|
+
// 1 0 0 1 => yes filled below 2
|
|
77292
|
+
// 1 0 1 0 => no 0
|
|
77293
|
+
// 1 0 1 1 => yes filled below 2
|
|
77294
|
+
// 1 1 0 0 => no 0
|
|
77295
|
+
// 1 1 0 1 => no 0
|
|
77296
|
+
// 1 1 1 0 => no 0
|
|
77297
|
+
// 1 1 1 1 => no 0
|
|
77298
|
+
return select(segments, [
|
|
77299
|
+
0, 2, 1, 0,
|
|
77300
|
+
0, 0, 1, 1,
|
|
77301
|
+
0, 2, 0, 2,
|
|
77302
|
+
0, 0, 0, 0
|
|
77303
|
+
], buildLog);
|
|
77304
|
+
},
|
|
77305
|
+
xor: function(segments, buildLog){ // primary ^ secondary
|
|
77306
|
+
// above1 below1 above2 below2 Keep? Value
|
|
77307
|
+
// 0 0 0 0 => no 0
|
|
77308
|
+
// 0 0 0 1 => yes filled below 2
|
|
77309
|
+
// 0 0 1 0 => yes filled above 1
|
|
77310
|
+
// 0 0 1 1 => no 0
|
|
77311
|
+
// 0 1 0 0 => yes filled below 2
|
|
77312
|
+
// 0 1 0 1 => no 0
|
|
77313
|
+
// 0 1 1 0 => no 0
|
|
77314
|
+
// 0 1 1 1 => yes filled above 1
|
|
77315
|
+
// 1 0 0 0 => yes filled above 1
|
|
77316
|
+
// 1 0 0 1 => no 0
|
|
77317
|
+
// 1 0 1 0 => no 0
|
|
77318
|
+
// 1 0 1 1 => yes filled below 2
|
|
77319
|
+
// 1 1 0 0 => no 0
|
|
77320
|
+
// 1 1 0 1 => yes filled above 1
|
|
77321
|
+
// 1 1 1 0 => yes filled below 2
|
|
77322
|
+
// 1 1 1 1 => no 0
|
|
77323
|
+
return select(segments, [
|
|
77324
|
+
0, 2, 1, 0,
|
|
77325
|
+
2, 0, 0, 1,
|
|
77326
|
+
1, 0, 0, 2,
|
|
77327
|
+
0, 1, 2, 0
|
|
77328
|
+
], buildLog);
|
|
77329
|
+
}
|
|
77330
|
+
};
|
|
77331
|
+
|
|
77332
|
+
module.exports = SegmentSelector;
|
|
77333
|
+
|
|
77334
|
+
|
|
74521
77335
|
/***/ }),
|
|
74522
77336
|
|
|
74523
77337
|
/***/ 6886:
|
|
@@ -83957,6 +86771,38 @@ module.exports = styleTagTransform;
|
|
|
83957
86771
|
|
|
83958
86772
|
/***/ }),
|
|
83959
86773
|
|
|
86774
|
+
/***/ 4144:
|
|
86775
|
+
/***/ (function(module) {
|
|
86776
|
+
|
|
86777
|
+
"use strict";
|
|
86778
|
+
module.exports = "data:image/svg+xml;base64,PHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjMyIiBoZWlnaHQ9IjMyIj4KPHBhdGggZD0iTTAsMTFsMTEsMGwwLC0xMWwyLDBsMCwxMWwxMSwwbDAsMmwtMTEsMGwwLDExbC0yLDBsMCwtMTFsLTExLDB6IiBmaWxsPSJibGFjayIgc3Ryb2tlLXdpZHRoPSIwIi8+CjxwYXRoIGQ9Ik0yNCwyN2w4LDBsMCwybC04LDB6IiBmaWxsPSJibGFjayIgc3Ryb2tlLXdpZHRoPSIwIi8+Cjwvc3ZnPgo=";
|
|
86779
|
+
|
|
86780
|
+
/***/ }),
|
|
86781
|
+
|
|
86782
|
+
/***/ 237:
|
|
86783
|
+
/***/ (function(module) {
|
|
86784
|
+
|
|
86785
|
+
"use strict";
|
|
86786
|
+
module.exports = "data:image/svg+xml;base64,PHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjMyIiBoZWlnaHQ9IjMyIj4KPHBhdGggZD0iTTAsMTFsMTEsMGwwLC0xMWwyLDBsMCwxMWwxMSwwbDAsMmwtMTEsMGwwLDExbC0yLDBsMCwtMTFsLTExLDB6IiBmaWxsPSJibGFjayIgc3Ryb2tlLXdpZHRoPSIwIi8+CjxwYXRoIGQ9Ik0yNCwyN2wzLDBsMCwtM2wyLDBsMCwzbDMsMGwwLDJsLTMsMGwwLDNsLTIsMGwwLC0zbC0zLDB6IiBmaWxsPSJibGFjayIgc3Ryb2tlLXdpZHRoPSIwIi8+Cjwvc3ZnPgo=";
|
|
86787
|
+
|
|
86788
|
+
/***/ }),
|
|
86789
|
+
|
|
86790
|
+
/***/ 3554:
|
|
86791
|
+
/***/ (function(module) {
|
|
86792
|
+
|
|
86793
|
+
"use strict";
|
|
86794
|
+
module.exports = "data:image/svg+xml;base64,PHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjMyIiBoZWlnaHQ9IjMyIj4KPHBhdGggZD0iTTAsMTFsMTEsMGwwLC0xMWwyLDBsMCwxMWwxMSwwbDAsMmwtMTEsMGwwLDExbC0yLDBsMCwtMTFsLTExLDB6IiBmaWxsPSJibGFjayIgc3Ryb2tlLXdpZHRoPSIwIi8+CjxwYXRoIGQ9Ik0yNCwzMmwwLC00YTQsNCwwLDAsMSw4LDBsMCw0bC0yLDBsMCwtNGEyLDIsMCwwLDAsLTQsMGwwLDR6IiBmaWxsPSJibGFjayIgc3Ryb2tlLXdpZHRoPSIwIi8+Cjwvc3ZnPgo=";
|
|
86795
|
+
|
|
86796
|
+
/***/ }),
|
|
86797
|
+
|
|
86798
|
+
/***/ 9490:
|
|
86799
|
+
/***/ (function(module) {
|
|
86800
|
+
|
|
86801
|
+
"use strict";
|
|
86802
|
+
module.exports = "data:image/svg+xml;base64,PHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjMyIiBoZWlnaHQ9IjMyIj4KPHBhdGggZD0iTTAsMTFsMTEsMGwwLC0xMWwyLDBsMCwxMWwxMSwwbDAsMmwtMTEsMGwwLDExbC0yLDBsMCwtMTFsLTExLDB6IiBmaWxsPSJibGFjayIgc3Ryb2tlLXdpZHRoPSIwIi8+CjxwYXRoIGQ9Ik0zMiwzMC41OWwtMS40MSwxLjQxbC0yLjEyLC0yLjEybC0yLjEyLDIuMTJsLTEuNDEsLTEuNDFsMi4xMiwtMi4xMmwtMi4xMiwtMi4xMmwxLjQxLC0xLjQxbDIuMTIsMi4xMmwyLjEyLC0yLjEybDEuNDEsMS40MWwtMi4xMiwyLjEyeiIgZmlsbD0iYmxhY2siIHN0cm9rZS13aWR0aD0iMCIvPgo8L3N2Zz4K";
|
|
86803
|
+
|
|
86804
|
+
/***/ }),
|
|
86805
|
+
|
|
83960
86806
|
/***/ 9990:
|
|
83961
86807
|
/***/ (function(module) {
|
|
83962
86808
|
|
|
@@ -84013,6 +86859,9 @@ module.exports = __WEBPACK_EXTERNAL_MODULE__3877__;
|
|
|
84013
86859
|
/******/ return module.exports;
|
|
84014
86860
|
/******/ }
|
|
84015
86861
|
/******/
|
|
86862
|
+
/******/ // expose the modules object (__webpack_modules__)
|
|
86863
|
+
/******/ __webpack_require__.m = __webpack_modules__;
|
|
86864
|
+
/******/
|
|
84016
86865
|
/************************************************************************/
|
|
84017
86866
|
/******/ /* webpack/runtime/compat get default export */
|
|
84018
86867
|
/******/ !function() {
|
|
@@ -84066,6 +86915,38 @@ module.exports = __WEBPACK_EXTERNAL_MODULE__3877__;
|
|
|
84066
86915
|
/******/ };
|
|
84067
86916
|
/******/ }();
|
|
84068
86917
|
/******/
|
|
86918
|
+
/******/ /* webpack/runtime/jsonp chunk loading */
|
|
86919
|
+
/******/ !function() {
|
|
86920
|
+
/******/ __webpack_require__.b = document.baseURI || self.location.href;
|
|
86921
|
+
/******/
|
|
86922
|
+
/******/ // object to store loaded and loading chunks
|
|
86923
|
+
/******/ // undefined = chunk not loaded, null = chunk preloaded/prefetched
|
|
86924
|
+
/******/ // [resolve, reject, Promise] = chunk loading, 0 = chunk loaded
|
|
86925
|
+
/******/ var installedChunks = {
|
|
86926
|
+
/******/ 387: 0,
|
|
86927
|
+
/******/ 93: 0
|
|
86928
|
+
/******/ };
|
|
86929
|
+
/******/
|
|
86930
|
+
/******/ // no chunk on demand loading
|
|
86931
|
+
/******/
|
|
86932
|
+
/******/ // no prefetching
|
|
86933
|
+
/******/
|
|
86934
|
+
/******/ // no preloaded
|
|
86935
|
+
/******/
|
|
86936
|
+
/******/ // no HMR
|
|
86937
|
+
/******/
|
|
86938
|
+
/******/ // no HMR manifest
|
|
86939
|
+
/******/
|
|
86940
|
+
/******/ // no on chunks loaded
|
|
86941
|
+
/******/
|
|
86942
|
+
/******/ // no jsonp function
|
|
86943
|
+
/******/ }();
|
|
86944
|
+
/******/
|
|
86945
|
+
/******/ /* webpack/runtime/nonce */
|
|
86946
|
+
/******/ !function() {
|
|
86947
|
+
/******/ __webpack_require__.nc = undefined;
|
|
86948
|
+
/******/ }();
|
|
86949
|
+
/******/
|
|
84069
86950
|
/************************************************************************/
|
|
84070
86951
|
/******/
|
|
84071
86952
|
/******/ // startup
|