geojs 1.12.3 → 1.12.5
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 +4 -2
- package/.pre-commit-config.yaml +4 -3
- package/README.md +0 -1
- package/geo.js +1430 -1467
- package/geo.lean.js +864 -901
- package/geo.lean.min.js +3 -3
- package/geo.min.js +3 -3
- package/package.json +15 -14
- package/src/annotationLayer.js +7 -6
- package/src/map.js +4 -4
- package/src/mapInteractor.js +1 -1
- package/src/pointFeature.js +1 -1
- package/src/polygonFeature.js +1 -1
- package/src/ui/scaleWidget.js +1 -1
- package/src/vtkjs/vtkjsRenderer.js +1 -1
- package/src/webgl/polygonFeature.js +1 -0
package/geo.lean.js
CHANGED
|
@@ -3445,6 +3445,7 @@ var _annotationLayer = function annotationLayer(arg) {
|
|
|
3445
3445
|
m_options,
|
|
3446
3446
|
m_mode = null,
|
|
3447
3447
|
m_annotations = [],
|
|
3448
|
+
m_annotationIds = {},
|
|
3448
3449
|
m_features = [],
|
|
3449
3450
|
m_labelFeature,
|
|
3450
3451
|
m_labelLayer,
|
|
@@ -3886,6 +3887,7 @@ var _annotationLayer = function annotationLayer(arg) {
|
|
|
3886
3887
|
annotation: annotation
|
|
3887
3888
|
});
|
|
3888
3889
|
m_annotations.push(annotation);
|
|
3890
|
+
m_annotationIds[annotation.id()] = annotation;
|
|
3889
3891
|
annotation.layer(m_this);
|
|
3890
3892
|
var map = m_this.map();
|
|
3891
3893
|
gcs = gcs === null ? map.gcs() : gcs === undefined ? map.ingcs() : gcs;
|
|
@@ -3918,6 +3920,9 @@ var _annotationLayer = function annotationLayer(arg) {
|
|
|
3918
3920
|
if (annotation === m_this.currentAnnotation) {
|
|
3919
3921
|
m_this.currentAnnotation = null;
|
|
3920
3922
|
}
|
|
3923
|
+
if (m_annotationIds[annotation.id()] !== undefined) {
|
|
3924
|
+
delete m_annotationIds[annotation.id()];
|
|
3925
|
+
}
|
|
3921
3926
|
annotation._exit();
|
|
3922
3927
|
m_annotations.splice(pos, 1);
|
|
3923
3928
|
if (update !== false) {
|
|
@@ -3980,12 +3985,7 @@ var _annotationLayer = function annotationLayer(arg) {
|
|
|
3980
3985
|
if (id !== undefined && id !== null) {
|
|
3981
3986
|
id = +id; /* Cast to int */
|
|
3982
3987
|
}
|
|
3983
|
-
|
|
3984
|
-
return annotation.id() === id;
|
|
3985
|
-
});
|
|
3986
|
-
if (annotations.length) {
|
|
3987
|
-
return annotations[0];
|
|
3988
|
-
}
|
|
3988
|
+
return m_annotationIds[id];
|
|
3989
3989
|
};
|
|
3990
3990
|
|
|
3991
3991
|
/* A list of special modes */
|
|
@@ -4840,6 +4840,7 @@ var _annotationLayer = function annotationLayer(arg) {
|
|
|
4840
4840
|
// Call super class exit
|
|
4841
4841
|
s_exit.call(m_this);
|
|
4842
4842
|
m_annotations = [];
|
|
4843
|
+
m_annotationIds = {};
|
|
4843
4844
|
m_features = [];
|
|
4844
4845
|
return m_this;
|
|
4845
4846
|
};
|
|
@@ -16352,10 +16353,10 @@ var _map2 = function map(arg) {
|
|
|
16352
16353
|
this.layers = this.children;
|
|
16353
16354
|
|
|
16354
16355
|
/**
|
|
16355
|
-
*
|
|
16356
|
-
*
|
|
16357
|
-
*
|
|
16358
|
-
*
|
|
16356
|
+
* Compare two layers by zIndex. If the zIndex is the same, the order in the
|
|
16357
|
+
* parent element is used. If the two layers don't have the same parent (for
|
|
16358
|
+
* instance, one layer isn't attached to the map), layers in the map are
|
|
16359
|
+
* sorted below detached layers.
|
|
16359
16360
|
*
|
|
16360
16361
|
* @param {geo.layer} a First layer to compare.
|
|
16361
16362
|
* @param {geo.layer} b Second layer to compare.
|
|
@@ -17268,7 +17269,7 @@ var Mousetrap = __webpack_require__(7549);
|
|
|
17268
17269
|
* @property {boolean} [keyboard.focusHighlight=true] If truthy, when the map
|
|
17269
17270
|
* gains focus, a highlight style is shown around it. This gives an
|
|
17270
17271
|
* indicator that keyboard events will affect the map, but may not be
|
|
17271
|
-
*
|
|
17272
|
+
* visually desirable.
|
|
17272
17273
|
* @property {boolean} [alwaysTouch=false] If true, add touch support even if
|
|
17273
17274
|
* the browser doesn't apepar to be touch-aware.
|
|
17274
17275
|
* @property {number} [wheelScaleX=1] A scale multiplier for horizontal wheel
|
|
@@ -22015,7 +22016,7 @@ var _pointFeature = function pointFeature(arg) {
|
|
|
22015
22016
|
m_clusterTree = new ClusterGroup(opts);
|
|
22016
22017
|
m_allData.forEach(function (d, i) {
|
|
22017
22018
|
// for each point in the data set normalize the coordinate
|
|
22018
|
-
// representation and add the point to the cluster
|
|
22019
|
+
// representation and add the point to the cluster tree
|
|
22019
22020
|
var pt = util.normalizeCoordinates(position(d, i));
|
|
22020
22021
|
pt.index = i;
|
|
22021
22022
|
m_clusterTree.addPoint(pt);
|
|
@@ -23200,7 +23201,7 @@ var _polygonFeature = function polygonFeature(arg) {
|
|
|
23200
23201
|
return data;
|
|
23201
23202
|
}
|
|
23202
23203
|
|
|
23203
|
-
/* Set the reduced
|
|
23204
|
+
/* Set the reduced polygons as the data and use simple accessors. */
|
|
23204
23205
|
m_this.style('position', util.identityFunction);
|
|
23205
23206
|
m_this.style('polygon', util.identityFunction);
|
|
23206
23207
|
m_this.data(data);
|
|
@@ -25072,7 +25073,7 @@ module.exports = _sceneObject;
|
|
|
25072
25073
|
* @constant
|
|
25073
25074
|
* @type {string}
|
|
25074
25075
|
*/
|
|
25075
|
-
module.exports = "
|
|
25076
|
+
module.exports = "1fd3450e4c094c4475819ff627ee93484c684c3c";
|
|
25076
25077
|
|
|
25077
25078
|
/***/ }),
|
|
25078
25079
|
|
|
@@ -32276,7 +32277,7 @@ __webpack_require__(615);
|
|
|
32276
32277
|
* that determine what round values are displayed.
|
|
32277
32278
|
* @property {number} multiples.multiple The value that is selected for display.
|
|
32278
32279
|
* @property {number} multiples.digit The number of significant digits in
|
|
32279
|
-
* `
|
|
32280
|
+
* `multiple`.
|
|
32280
32281
|
*/
|
|
32281
32282
|
|
|
32282
32283
|
/**
|
|
@@ -36911,7 +36912,7 @@ module.exports = _vectorFeature;
|
|
|
36911
36912
|
* @constant
|
|
36912
36913
|
* @type {string}
|
|
36913
36914
|
*/
|
|
36914
|
-
module.exports = "1.12.
|
|
36915
|
+
module.exports = "1.12.5";
|
|
36915
36916
|
|
|
36916
36917
|
/***/ }),
|
|
36917
36918
|
|
|
@@ -41676,7 +41677,7 @@ var _vtkjsRenderer = function vtkjsRenderer(arg) {
|
|
|
41676
41677
|
/* If we are already scheduled to render, don't schedule again. Rather,
|
|
41677
41678
|
* mark that we should render after other animation frame requests occur.
|
|
41678
41679
|
* It would be nice if we could just reschedule the call by removing and
|
|
41679
|
-
*
|
|
41680
|
+
* re-adding the animation frame request, but this doesn't work for if the
|
|
41680
41681
|
* reschedule occurs during another animation frame callback (it then waits
|
|
41681
41682
|
* until a subsequent frame). */
|
|
41682
41683
|
m_this.layer().map().scheduleAnimationFrame(m_this._renderFrame, true);
|
|
@@ -44664,7 +44665,8 @@ var _webgl_polygonFeature = function webgl_polygonFeature(arg) {
|
|
|
44664
44665
|
arg = arg || {};
|
|
44665
44666
|
polygonFeature.call(this, arg);
|
|
44666
44667
|
var vgl = __webpack_require__(1611);
|
|
44667
|
-
var earcut = __webpack_require__(
|
|
44668
|
+
var earcut = __webpack_require__(9747);
|
|
44669
|
+
earcut = earcut.__esModule ? earcut.default : earcut;
|
|
44668
44670
|
var transform = __webpack_require__(5325);
|
|
44669
44671
|
var util = __webpack_require__(642);
|
|
44670
44672
|
var object = __webpack_require__(4084);
|
|
@@ -46433,695 +46435,6 @@ module.exports = function (item) {
|
|
|
46433
46435
|
return [content].join("\n");
|
|
46434
46436
|
};
|
|
46435
46437
|
|
|
46436
|
-
/***/ }),
|
|
46437
|
-
|
|
46438
|
-
/***/ 5230:
|
|
46439
|
-
/***/ (function(module) {
|
|
46440
|
-
|
|
46441
|
-
"use strict";
|
|
46442
|
-
|
|
46443
|
-
|
|
46444
|
-
module.exports = earcut;
|
|
46445
|
-
module.exports["default"] = earcut;
|
|
46446
|
-
|
|
46447
|
-
function earcut(data, holeIndices, dim) {
|
|
46448
|
-
|
|
46449
|
-
dim = dim || 2;
|
|
46450
|
-
|
|
46451
|
-
var hasHoles = holeIndices && holeIndices.length,
|
|
46452
|
-
outerLen = hasHoles ? holeIndices[0] * dim : data.length,
|
|
46453
|
-
outerNode = linkedList(data, 0, outerLen, dim, true),
|
|
46454
|
-
triangles = [];
|
|
46455
|
-
|
|
46456
|
-
if (!outerNode || outerNode.next === outerNode.prev) return triangles;
|
|
46457
|
-
|
|
46458
|
-
var minX, minY, maxX, maxY, x, y, invSize;
|
|
46459
|
-
|
|
46460
|
-
if (hasHoles) outerNode = eliminateHoles(data, holeIndices, outerNode, dim);
|
|
46461
|
-
|
|
46462
|
-
// if the shape is not too simple, we'll use z-order curve hash later; calculate polygon bbox
|
|
46463
|
-
if (data.length > 80 * dim) {
|
|
46464
|
-
minX = maxX = data[0];
|
|
46465
|
-
minY = maxY = data[1];
|
|
46466
|
-
|
|
46467
|
-
for (var i = dim; i < outerLen; i += dim) {
|
|
46468
|
-
x = data[i];
|
|
46469
|
-
y = data[i + 1];
|
|
46470
|
-
if (x < minX) minX = x;
|
|
46471
|
-
if (y < minY) minY = y;
|
|
46472
|
-
if (x > maxX) maxX = x;
|
|
46473
|
-
if (y > maxY) maxY = y;
|
|
46474
|
-
}
|
|
46475
|
-
|
|
46476
|
-
// minX, minY and invSize are later used to transform coords into integers for z-order calculation
|
|
46477
|
-
invSize = Math.max(maxX - minX, maxY - minY);
|
|
46478
|
-
invSize = invSize !== 0 ? 32767 / invSize : 0;
|
|
46479
|
-
}
|
|
46480
|
-
|
|
46481
|
-
earcutLinked(outerNode, triangles, dim, minX, minY, invSize, 0);
|
|
46482
|
-
|
|
46483
|
-
return triangles;
|
|
46484
|
-
}
|
|
46485
|
-
|
|
46486
|
-
// create a circular doubly linked list from polygon points in the specified winding order
|
|
46487
|
-
function linkedList(data, start, end, dim, clockwise) {
|
|
46488
|
-
var i, last;
|
|
46489
|
-
|
|
46490
|
-
if (clockwise === (signedArea(data, start, end, dim) > 0)) {
|
|
46491
|
-
for (i = start; i < end; i += dim) last = insertNode(i, data[i], data[i + 1], last);
|
|
46492
|
-
} else {
|
|
46493
|
-
for (i = end - dim; i >= start; i -= dim) last = insertNode(i, data[i], data[i + 1], last);
|
|
46494
|
-
}
|
|
46495
|
-
|
|
46496
|
-
if (last && equals(last, last.next)) {
|
|
46497
|
-
removeNode(last);
|
|
46498
|
-
last = last.next;
|
|
46499
|
-
}
|
|
46500
|
-
|
|
46501
|
-
return last;
|
|
46502
|
-
}
|
|
46503
|
-
|
|
46504
|
-
// eliminate colinear or duplicate points
|
|
46505
|
-
function filterPoints(start, end) {
|
|
46506
|
-
if (!start) return start;
|
|
46507
|
-
if (!end) end = start;
|
|
46508
|
-
|
|
46509
|
-
var p = start,
|
|
46510
|
-
again;
|
|
46511
|
-
do {
|
|
46512
|
-
again = false;
|
|
46513
|
-
|
|
46514
|
-
if (!p.steiner && (equals(p, p.next) || area(p.prev, p, p.next) === 0)) {
|
|
46515
|
-
removeNode(p);
|
|
46516
|
-
p = end = p.prev;
|
|
46517
|
-
if (p === p.next) break;
|
|
46518
|
-
again = true;
|
|
46519
|
-
|
|
46520
|
-
} else {
|
|
46521
|
-
p = p.next;
|
|
46522
|
-
}
|
|
46523
|
-
} while (again || p !== end);
|
|
46524
|
-
|
|
46525
|
-
return end;
|
|
46526
|
-
}
|
|
46527
|
-
|
|
46528
|
-
// main ear slicing loop which triangulates a polygon (given as a linked list)
|
|
46529
|
-
function earcutLinked(ear, triangles, dim, minX, minY, invSize, pass) {
|
|
46530
|
-
if (!ear) return;
|
|
46531
|
-
|
|
46532
|
-
// interlink polygon nodes in z-order
|
|
46533
|
-
if (!pass && invSize) indexCurve(ear, minX, minY, invSize);
|
|
46534
|
-
|
|
46535
|
-
var stop = ear,
|
|
46536
|
-
prev, next;
|
|
46537
|
-
|
|
46538
|
-
// iterate through ears, slicing them one by one
|
|
46539
|
-
while (ear.prev !== ear.next) {
|
|
46540
|
-
prev = ear.prev;
|
|
46541
|
-
next = ear.next;
|
|
46542
|
-
|
|
46543
|
-
if (invSize ? isEarHashed(ear, minX, minY, invSize) : isEar(ear)) {
|
|
46544
|
-
// cut off the triangle
|
|
46545
|
-
triangles.push(prev.i / dim | 0);
|
|
46546
|
-
triangles.push(ear.i / dim | 0);
|
|
46547
|
-
triangles.push(next.i / dim | 0);
|
|
46548
|
-
|
|
46549
|
-
removeNode(ear);
|
|
46550
|
-
|
|
46551
|
-
// skipping the next vertex leads to less sliver triangles
|
|
46552
|
-
ear = next.next;
|
|
46553
|
-
stop = next.next;
|
|
46554
|
-
|
|
46555
|
-
continue;
|
|
46556
|
-
}
|
|
46557
|
-
|
|
46558
|
-
ear = next;
|
|
46559
|
-
|
|
46560
|
-
// if we looped through the whole remaining polygon and can't find any more ears
|
|
46561
|
-
if (ear === stop) {
|
|
46562
|
-
// try filtering points and slicing again
|
|
46563
|
-
if (!pass) {
|
|
46564
|
-
earcutLinked(filterPoints(ear), triangles, dim, minX, minY, invSize, 1);
|
|
46565
|
-
|
|
46566
|
-
// if this didn't work, try curing all small self-intersections locally
|
|
46567
|
-
} else if (pass === 1) {
|
|
46568
|
-
ear = cureLocalIntersections(filterPoints(ear), triangles, dim);
|
|
46569
|
-
earcutLinked(ear, triangles, dim, minX, minY, invSize, 2);
|
|
46570
|
-
|
|
46571
|
-
// as a last resort, try splitting the remaining polygon into two
|
|
46572
|
-
} else if (pass === 2) {
|
|
46573
|
-
splitEarcut(ear, triangles, dim, minX, minY, invSize);
|
|
46574
|
-
}
|
|
46575
|
-
|
|
46576
|
-
break;
|
|
46577
|
-
}
|
|
46578
|
-
}
|
|
46579
|
-
}
|
|
46580
|
-
|
|
46581
|
-
// check whether a polygon node forms a valid ear with adjacent nodes
|
|
46582
|
-
function isEar(ear) {
|
|
46583
|
-
var a = ear.prev,
|
|
46584
|
-
b = ear,
|
|
46585
|
-
c = ear.next;
|
|
46586
|
-
|
|
46587
|
-
if (area(a, b, c) >= 0) return false; // reflex, can't be an ear
|
|
46588
|
-
|
|
46589
|
-
// now make sure we don't have other points inside the potential ear
|
|
46590
|
-
var ax = a.x, bx = b.x, cx = c.x, ay = a.y, by = b.y, cy = c.y;
|
|
46591
|
-
|
|
46592
|
-
// triangle bbox; min & max are calculated like this for speed
|
|
46593
|
-
var x0 = ax < bx ? (ax < cx ? ax : cx) : (bx < cx ? bx : cx),
|
|
46594
|
-
y0 = ay < by ? (ay < cy ? ay : cy) : (by < cy ? by : cy),
|
|
46595
|
-
x1 = ax > bx ? (ax > cx ? ax : cx) : (bx > cx ? bx : cx),
|
|
46596
|
-
y1 = ay > by ? (ay > cy ? ay : cy) : (by > cy ? by : cy);
|
|
46597
|
-
|
|
46598
|
-
var p = c.next;
|
|
46599
|
-
while (p !== a) {
|
|
46600
|
-
if (p.x >= x0 && p.x <= x1 && p.y >= y0 && p.y <= y1 &&
|
|
46601
|
-
pointInTriangle(ax, ay, bx, by, cx, cy, p.x, p.y) &&
|
|
46602
|
-
area(p.prev, p, p.next) >= 0) return false;
|
|
46603
|
-
p = p.next;
|
|
46604
|
-
}
|
|
46605
|
-
|
|
46606
|
-
return true;
|
|
46607
|
-
}
|
|
46608
|
-
|
|
46609
|
-
function isEarHashed(ear, minX, minY, invSize) {
|
|
46610
|
-
var a = ear.prev,
|
|
46611
|
-
b = ear,
|
|
46612
|
-
c = ear.next;
|
|
46613
|
-
|
|
46614
|
-
if (area(a, b, c) >= 0) return false; // reflex, can't be an ear
|
|
46615
|
-
|
|
46616
|
-
var ax = a.x, bx = b.x, cx = c.x, ay = a.y, by = b.y, cy = c.y;
|
|
46617
|
-
|
|
46618
|
-
// triangle bbox; min & max are calculated like this for speed
|
|
46619
|
-
var x0 = ax < bx ? (ax < cx ? ax : cx) : (bx < cx ? bx : cx),
|
|
46620
|
-
y0 = ay < by ? (ay < cy ? ay : cy) : (by < cy ? by : cy),
|
|
46621
|
-
x1 = ax > bx ? (ax > cx ? ax : cx) : (bx > cx ? bx : cx),
|
|
46622
|
-
y1 = ay > by ? (ay > cy ? ay : cy) : (by > cy ? by : cy);
|
|
46623
|
-
|
|
46624
|
-
// z-order range for the current triangle bbox;
|
|
46625
|
-
var minZ = zOrder(x0, y0, minX, minY, invSize),
|
|
46626
|
-
maxZ = zOrder(x1, y1, minX, minY, invSize);
|
|
46627
|
-
|
|
46628
|
-
var p = ear.prevZ,
|
|
46629
|
-
n = ear.nextZ;
|
|
46630
|
-
|
|
46631
|
-
// look for points inside the triangle in both directions
|
|
46632
|
-
while (p && p.z >= minZ && n && n.z <= maxZ) {
|
|
46633
|
-
if (p.x >= x0 && p.x <= x1 && p.y >= y0 && p.y <= y1 && p !== a && p !== c &&
|
|
46634
|
-
pointInTriangle(ax, ay, bx, by, cx, cy, p.x, p.y) && area(p.prev, p, p.next) >= 0) return false;
|
|
46635
|
-
p = p.prevZ;
|
|
46636
|
-
|
|
46637
|
-
if (n.x >= x0 && n.x <= x1 && n.y >= y0 && n.y <= y1 && n !== a && n !== c &&
|
|
46638
|
-
pointInTriangle(ax, ay, bx, by, cx, cy, n.x, n.y) && area(n.prev, n, n.next) >= 0) return false;
|
|
46639
|
-
n = n.nextZ;
|
|
46640
|
-
}
|
|
46641
|
-
|
|
46642
|
-
// look for remaining points in decreasing z-order
|
|
46643
|
-
while (p && p.z >= minZ) {
|
|
46644
|
-
if (p.x >= x0 && p.x <= x1 && p.y >= y0 && p.y <= y1 && p !== a && p !== c &&
|
|
46645
|
-
pointInTriangle(ax, ay, bx, by, cx, cy, p.x, p.y) && area(p.prev, p, p.next) >= 0) return false;
|
|
46646
|
-
p = p.prevZ;
|
|
46647
|
-
}
|
|
46648
|
-
|
|
46649
|
-
// look for remaining points in increasing z-order
|
|
46650
|
-
while (n && n.z <= maxZ) {
|
|
46651
|
-
if (n.x >= x0 && n.x <= x1 && n.y >= y0 && n.y <= y1 && n !== a && n !== c &&
|
|
46652
|
-
pointInTriangle(ax, ay, bx, by, cx, cy, n.x, n.y) && area(n.prev, n, n.next) >= 0) return false;
|
|
46653
|
-
n = n.nextZ;
|
|
46654
|
-
}
|
|
46655
|
-
|
|
46656
|
-
return true;
|
|
46657
|
-
}
|
|
46658
|
-
|
|
46659
|
-
// go through all polygon nodes and cure small local self-intersections
|
|
46660
|
-
function cureLocalIntersections(start, triangles, dim) {
|
|
46661
|
-
var p = start;
|
|
46662
|
-
do {
|
|
46663
|
-
var a = p.prev,
|
|
46664
|
-
b = p.next.next;
|
|
46665
|
-
|
|
46666
|
-
if (!equals(a, b) && intersects(a, p, p.next, b) && locallyInside(a, b) && locallyInside(b, a)) {
|
|
46667
|
-
|
|
46668
|
-
triangles.push(a.i / dim | 0);
|
|
46669
|
-
triangles.push(p.i / dim | 0);
|
|
46670
|
-
triangles.push(b.i / dim | 0);
|
|
46671
|
-
|
|
46672
|
-
// remove two nodes involved
|
|
46673
|
-
removeNode(p);
|
|
46674
|
-
removeNode(p.next);
|
|
46675
|
-
|
|
46676
|
-
p = start = b;
|
|
46677
|
-
}
|
|
46678
|
-
p = p.next;
|
|
46679
|
-
} while (p !== start);
|
|
46680
|
-
|
|
46681
|
-
return filterPoints(p);
|
|
46682
|
-
}
|
|
46683
|
-
|
|
46684
|
-
// try splitting polygon into two and triangulate them independently
|
|
46685
|
-
function splitEarcut(start, triangles, dim, minX, minY, invSize) {
|
|
46686
|
-
// look for a valid diagonal that divides the polygon into two
|
|
46687
|
-
var a = start;
|
|
46688
|
-
do {
|
|
46689
|
-
var b = a.next.next;
|
|
46690
|
-
while (b !== a.prev) {
|
|
46691
|
-
if (a.i !== b.i && isValidDiagonal(a, b)) {
|
|
46692
|
-
// split the polygon in two by the diagonal
|
|
46693
|
-
var c = splitPolygon(a, b);
|
|
46694
|
-
|
|
46695
|
-
// filter colinear points around the cuts
|
|
46696
|
-
a = filterPoints(a, a.next);
|
|
46697
|
-
c = filterPoints(c, c.next);
|
|
46698
|
-
|
|
46699
|
-
// run earcut on each half
|
|
46700
|
-
earcutLinked(a, triangles, dim, minX, minY, invSize, 0);
|
|
46701
|
-
earcutLinked(c, triangles, dim, minX, minY, invSize, 0);
|
|
46702
|
-
return;
|
|
46703
|
-
}
|
|
46704
|
-
b = b.next;
|
|
46705
|
-
}
|
|
46706
|
-
a = a.next;
|
|
46707
|
-
} while (a !== start);
|
|
46708
|
-
}
|
|
46709
|
-
|
|
46710
|
-
// link every hole into the outer loop, producing a single-ring polygon without holes
|
|
46711
|
-
function eliminateHoles(data, holeIndices, outerNode, dim) {
|
|
46712
|
-
var queue = [],
|
|
46713
|
-
i, len, start, end, list;
|
|
46714
|
-
|
|
46715
|
-
for (i = 0, len = holeIndices.length; i < len; i++) {
|
|
46716
|
-
start = holeIndices[i] * dim;
|
|
46717
|
-
end = i < len - 1 ? holeIndices[i + 1] * dim : data.length;
|
|
46718
|
-
list = linkedList(data, start, end, dim, false);
|
|
46719
|
-
if (list === list.next) list.steiner = true;
|
|
46720
|
-
queue.push(getLeftmost(list));
|
|
46721
|
-
}
|
|
46722
|
-
|
|
46723
|
-
queue.sort(compareX);
|
|
46724
|
-
|
|
46725
|
-
// process holes from left to right
|
|
46726
|
-
for (i = 0; i < queue.length; i++) {
|
|
46727
|
-
outerNode = eliminateHole(queue[i], outerNode);
|
|
46728
|
-
}
|
|
46729
|
-
|
|
46730
|
-
return outerNode;
|
|
46731
|
-
}
|
|
46732
|
-
|
|
46733
|
-
function compareX(a, b) {
|
|
46734
|
-
return a.x - b.x;
|
|
46735
|
-
}
|
|
46736
|
-
|
|
46737
|
-
// find a bridge between vertices that connects hole with an outer ring and and link it
|
|
46738
|
-
function eliminateHole(hole, outerNode) {
|
|
46739
|
-
var bridge = findHoleBridge(hole, outerNode);
|
|
46740
|
-
if (!bridge) {
|
|
46741
|
-
return outerNode;
|
|
46742
|
-
}
|
|
46743
|
-
|
|
46744
|
-
var bridgeReverse = splitPolygon(bridge, hole);
|
|
46745
|
-
|
|
46746
|
-
// filter collinear points around the cuts
|
|
46747
|
-
filterPoints(bridgeReverse, bridgeReverse.next);
|
|
46748
|
-
return filterPoints(bridge, bridge.next);
|
|
46749
|
-
}
|
|
46750
|
-
|
|
46751
|
-
// David Eberly's algorithm for finding a bridge between hole and outer polygon
|
|
46752
|
-
function findHoleBridge(hole, outerNode) {
|
|
46753
|
-
var p = outerNode,
|
|
46754
|
-
hx = hole.x,
|
|
46755
|
-
hy = hole.y,
|
|
46756
|
-
qx = -Infinity,
|
|
46757
|
-
m;
|
|
46758
|
-
|
|
46759
|
-
// find a segment intersected by a ray from the hole's leftmost point to the left;
|
|
46760
|
-
// segment's endpoint with lesser x will be potential connection point
|
|
46761
|
-
do {
|
|
46762
|
-
if (hy <= p.y && hy >= p.next.y && p.next.y !== p.y) {
|
|
46763
|
-
var x = p.x + (hy - p.y) * (p.next.x - p.x) / (p.next.y - p.y);
|
|
46764
|
-
if (x <= hx && x > qx) {
|
|
46765
|
-
qx = x;
|
|
46766
|
-
m = p.x < p.next.x ? p : p.next;
|
|
46767
|
-
if (x === hx) return m; // hole touches outer segment; pick leftmost endpoint
|
|
46768
|
-
}
|
|
46769
|
-
}
|
|
46770
|
-
p = p.next;
|
|
46771
|
-
} while (p !== outerNode);
|
|
46772
|
-
|
|
46773
|
-
if (!m) return null;
|
|
46774
|
-
|
|
46775
|
-
// look for points inside the triangle of hole point, segment intersection and endpoint;
|
|
46776
|
-
// if there are no points found, we have a valid connection;
|
|
46777
|
-
// otherwise choose the point of the minimum angle with the ray as connection point
|
|
46778
|
-
|
|
46779
|
-
var stop = m,
|
|
46780
|
-
mx = m.x,
|
|
46781
|
-
my = m.y,
|
|
46782
|
-
tanMin = Infinity,
|
|
46783
|
-
tan;
|
|
46784
|
-
|
|
46785
|
-
p = m;
|
|
46786
|
-
|
|
46787
|
-
do {
|
|
46788
|
-
if (hx >= p.x && p.x >= mx && hx !== p.x &&
|
|
46789
|
-
pointInTriangle(hy < my ? hx : qx, hy, mx, my, hy < my ? qx : hx, hy, p.x, p.y)) {
|
|
46790
|
-
|
|
46791
|
-
tan = Math.abs(hy - p.y) / (hx - p.x); // tangential
|
|
46792
|
-
|
|
46793
|
-
if (locallyInside(p, hole) &&
|
|
46794
|
-
(tan < tanMin || (tan === tanMin && (p.x > m.x || (p.x === m.x && sectorContainsSector(m, p)))))) {
|
|
46795
|
-
m = p;
|
|
46796
|
-
tanMin = tan;
|
|
46797
|
-
}
|
|
46798
|
-
}
|
|
46799
|
-
|
|
46800
|
-
p = p.next;
|
|
46801
|
-
} while (p !== stop);
|
|
46802
|
-
|
|
46803
|
-
return m;
|
|
46804
|
-
}
|
|
46805
|
-
|
|
46806
|
-
// whether sector in vertex m contains sector in vertex p in the same coordinates
|
|
46807
|
-
function sectorContainsSector(m, p) {
|
|
46808
|
-
return area(m.prev, m, p.prev) < 0 && area(p.next, m, m.next) < 0;
|
|
46809
|
-
}
|
|
46810
|
-
|
|
46811
|
-
// interlink polygon nodes in z-order
|
|
46812
|
-
function indexCurve(start, minX, minY, invSize) {
|
|
46813
|
-
var p = start;
|
|
46814
|
-
do {
|
|
46815
|
-
if (p.z === 0) p.z = zOrder(p.x, p.y, minX, minY, invSize);
|
|
46816
|
-
p.prevZ = p.prev;
|
|
46817
|
-
p.nextZ = p.next;
|
|
46818
|
-
p = p.next;
|
|
46819
|
-
} while (p !== start);
|
|
46820
|
-
|
|
46821
|
-
p.prevZ.nextZ = null;
|
|
46822
|
-
p.prevZ = null;
|
|
46823
|
-
|
|
46824
|
-
sortLinked(p);
|
|
46825
|
-
}
|
|
46826
|
-
|
|
46827
|
-
// Simon Tatham's linked list merge sort algorithm
|
|
46828
|
-
// http://www.chiark.greenend.org.uk/~sgtatham/algorithms/listsort.html
|
|
46829
|
-
function sortLinked(list) {
|
|
46830
|
-
var i, p, q, e, tail, numMerges, pSize, qSize,
|
|
46831
|
-
inSize = 1;
|
|
46832
|
-
|
|
46833
|
-
do {
|
|
46834
|
-
p = list;
|
|
46835
|
-
list = null;
|
|
46836
|
-
tail = null;
|
|
46837
|
-
numMerges = 0;
|
|
46838
|
-
|
|
46839
|
-
while (p) {
|
|
46840
|
-
numMerges++;
|
|
46841
|
-
q = p;
|
|
46842
|
-
pSize = 0;
|
|
46843
|
-
for (i = 0; i < inSize; i++) {
|
|
46844
|
-
pSize++;
|
|
46845
|
-
q = q.nextZ;
|
|
46846
|
-
if (!q) break;
|
|
46847
|
-
}
|
|
46848
|
-
qSize = inSize;
|
|
46849
|
-
|
|
46850
|
-
while (pSize > 0 || (qSize > 0 && q)) {
|
|
46851
|
-
|
|
46852
|
-
if (pSize !== 0 && (qSize === 0 || !q || p.z <= q.z)) {
|
|
46853
|
-
e = p;
|
|
46854
|
-
p = p.nextZ;
|
|
46855
|
-
pSize--;
|
|
46856
|
-
} else {
|
|
46857
|
-
e = q;
|
|
46858
|
-
q = q.nextZ;
|
|
46859
|
-
qSize--;
|
|
46860
|
-
}
|
|
46861
|
-
|
|
46862
|
-
if (tail) tail.nextZ = e;
|
|
46863
|
-
else list = e;
|
|
46864
|
-
|
|
46865
|
-
e.prevZ = tail;
|
|
46866
|
-
tail = e;
|
|
46867
|
-
}
|
|
46868
|
-
|
|
46869
|
-
p = q;
|
|
46870
|
-
}
|
|
46871
|
-
|
|
46872
|
-
tail.nextZ = null;
|
|
46873
|
-
inSize *= 2;
|
|
46874
|
-
|
|
46875
|
-
} while (numMerges > 1);
|
|
46876
|
-
|
|
46877
|
-
return list;
|
|
46878
|
-
}
|
|
46879
|
-
|
|
46880
|
-
// z-order of a point given coords and inverse of the longer side of data bbox
|
|
46881
|
-
function zOrder(x, y, minX, minY, invSize) {
|
|
46882
|
-
// coords are transformed into non-negative 15-bit integer range
|
|
46883
|
-
x = (x - minX) * invSize | 0;
|
|
46884
|
-
y = (y - minY) * invSize | 0;
|
|
46885
|
-
|
|
46886
|
-
x = (x | (x << 8)) & 0x00FF00FF;
|
|
46887
|
-
x = (x | (x << 4)) & 0x0F0F0F0F;
|
|
46888
|
-
x = (x | (x << 2)) & 0x33333333;
|
|
46889
|
-
x = (x | (x << 1)) & 0x55555555;
|
|
46890
|
-
|
|
46891
|
-
y = (y | (y << 8)) & 0x00FF00FF;
|
|
46892
|
-
y = (y | (y << 4)) & 0x0F0F0F0F;
|
|
46893
|
-
y = (y | (y << 2)) & 0x33333333;
|
|
46894
|
-
y = (y | (y << 1)) & 0x55555555;
|
|
46895
|
-
|
|
46896
|
-
return x | (y << 1);
|
|
46897
|
-
}
|
|
46898
|
-
|
|
46899
|
-
// find the leftmost node of a polygon ring
|
|
46900
|
-
function getLeftmost(start) {
|
|
46901
|
-
var p = start,
|
|
46902
|
-
leftmost = start;
|
|
46903
|
-
do {
|
|
46904
|
-
if (p.x < leftmost.x || (p.x === leftmost.x && p.y < leftmost.y)) leftmost = p;
|
|
46905
|
-
p = p.next;
|
|
46906
|
-
} while (p !== start);
|
|
46907
|
-
|
|
46908
|
-
return leftmost;
|
|
46909
|
-
}
|
|
46910
|
-
|
|
46911
|
-
// check if a point lies within a convex triangle
|
|
46912
|
-
function pointInTriangle(ax, ay, bx, by, cx, cy, px, py) {
|
|
46913
|
-
return (cx - px) * (ay - py) >= (ax - px) * (cy - py) &&
|
|
46914
|
-
(ax - px) * (by - py) >= (bx - px) * (ay - py) &&
|
|
46915
|
-
(bx - px) * (cy - py) >= (cx - px) * (by - py);
|
|
46916
|
-
}
|
|
46917
|
-
|
|
46918
|
-
// check if a diagonal between two polygon nodes is valid (lies in polygon interior)
|
|
46919
|
-
function isValidDiagonal(a, b) {
|
|
46920
|
-
return a.next.i !== b.i && a.prev.i !== b.i && !intersectsPolygon(a, b) && // dones't intersect other edges
|
|
46921
|
-
(locallyInside(a, b) && locallyInside(b, a) && middleInside(a, b) && // locally visible
|
|
46922
|
-
(area(a.prev, a, b.prev) || area(a, b.prev, b)) || // does not create opposite-facing sectors
|
|
46923
|
-
equals(a, b) && area(a.prev, a, a.next) > 0 && area(b.prev, b, b.next) > 0); // special zero-length case
|
|
46924
|
-
}
|
|
46925
|
-
|
|
46926
|
-
// signed area of a triangle
|
|
46927
|
-
function area(p, q, r) {
|
|
46928
|
-
return (q.y - p.y) * (r.x - q.x) - (q.x - p.x) * (r.y - q.y);
|
|
46929
|
-
}
|
|
46930
|
-
|
|
46931
|
-
// check if two points are equal
|
|
46932
|
-
function equals(p1, p2) {
|
|
46933
|
-
return p1.x === p2.x && p1.y === p2.y;
|
|
46934
|
-
}
|
|
46935
|
-
|
|
46936
|
-
// check if two segments intersect
|
|
46937
|
-
function intersects(p1, q1, p2, q2) {
|
|
46938
|
-
var o1 = sign(area(p1, q1, p2));
|
|
46939
|
-
var o2 = sign(area(p1, q1, q2));
|
|
46940
|
-
var o3 = sign(area(p2, q2, p1));
|
|
46941
|
-
var o4 = sign(area(p2, q2, q1));
|
|
46942
|
-
|
|
46943
|
-
if (o1 !== o2 && o3 !== o4) return true; // general case
|
|
46944
|
-
|
|
46945
|
-
if (o1 === 0 && onSegment(p1, p2, q1)) return true; // p1, q1 and p2 are collinear and p2 lies on p1q1
|
|
46946
|
-
if (o2 === 0 && onSegment(p1, q2, q1)) return true; // p1, q1 and q2 are collinear and q2 lies on p1q1
|
|
46947
|
-
if (o3 === 0 && onSegment(p2, p1, q2)) return true; // p2, q2 and p1 are collinear and p1 lies on p2q2
|
|
46948
|
-
if (o4 === 0 && onSegment(p2, q1, q2)) return true; // p2, q2 and q1 are collinear and q1 lies on p2q2
|
|
46949
|
-
|
|
46950
|
-
return false;
|
|
46951
|
-
}
|
|
46952
|
-
|
|
46953
|
-
// for collinear points p, q, r, check if point q lies on segment pr
|
|
46954
|
-
function onSegment(p, q, r) {
|
|
46955
|
-
return q.x <= Math.max(p.x, r.x) && q.x >= Math.min(p.x, r.x) && q.y <= Math.max(p.y, r.y) && q.y >= Math.min(p.y, r.y);
|
|
46956
|
-
}
|
|
46957
|
-
|
|
46958
|
-
function sign(num) {
|
|
46959
|
-
return num > 0 ? 1 : num < 0 ? -1 : 0;
|
|
46960
|
-
}
|
|
46961
|
-
|
|
46962
|
-
// check if a polygon diagonal intersects any polygon segments
|
|
46963
|
-
function intersectsPolygon(a, b) {
|
|
46964
|
-
var p = a;
|
|
46965
|
-
do {
|
|
46966
|
-
if (p.i !== a.i && p.next.i !== a.i && p.i !== b.i && p.next.i !== b.i &&
|
|
46967
|
-
intersects(p, p.next, a, b)) return true;
|
|
46968
|
-
p = p.next;
|
|
46969
|
-
} while (p !== a);
|
|
46970
|
-
|
|
46971
|
-
return false;
|
|
46972
|
-
}
|
|
46973
|
-
|
|
46974
|
-
// check if a polygon diagonal is locally inside the polygon
|
|
46975
|
-
function locallyInside(a, b) {
|
|
46976
|
-
return area(a.prev, a, a.next) < 0 ?
|
|
46977
|
-
area(a, b, a.next) >= 0 && area(a, a.prev, b) >= 0 :
|
|
46978
|
-
area(a, b, a.prev) < 0 || area(a, a.next, b) < 0;
|
|
46979
|
-
}
|
|
46980
|
-
|
|
46981
|
-
// check if the middle point of a polygon diagonal is inside the polygon
|
|
46982
|
-
function middleInside(a, b) {
|
|
46983
|
-
var p = a,
|
|
46984
|
-
inside = false,
|
|
46985
|
-
px = (a.x + b.x) / 2,
|
|
46986
|
-
py = (a.y + b.y) / 2;
|
|
46987
|
-
do {
|
|
46988
|
-
if (((p.y > py) !== (p.next.y > py)) && p.next.y !== p.y &&
|
|
46989
|
-
(px < (p.next.x - p.x) * (py - p.y) / (p.next.y - p.y) + p.x))
|
|
46990
|
-
inside = !inside;
|
|
46991
|
-
p = p.next;
|
|
46992
|
-
} while (p !== a);
|
|
46993
|
-
|
|
46994
|
-
return inside;
|
|
46995
|
-
}
|
|
46996
|
-
|
|
46997
|
-
// link two polygon vertices with a bridge; if the vertices belong to the same ring, it splits polygon into two;
|
|
46998
|
-
// if one belongs to the outer ring and another to a hole, it merges it into a single ring
|
|
46999
|
-
function splitPolygon(a, b) {
|
|
47000
|
-
var a2 = new Node(a.i, a.x, a.y),
|
|
47001
|
-
b2 = new Node(b.i, b.x, b.y),
|
|
47002
|
-
an = a.next,
|
|
47003
|
-
bp = b.prev;
|
|
47004
|
-
|
|
47005
|
-
a.next = b;
|
|
47006
|
-
b.prev = a;
|
|
47007
|
-
|
|
47008
|
-
a2.next = an;
|
|
47009
|
-
an.prev = a2;
|
|
47010
|
-
|
|
47011
|
-
b2.next = a2;
|
|
47012
|
-
a2.prev = b2;
|
|
47013
|
-
|
|
47014
|
-
bp.next = b2;
|
|
47015
|
-
b2.prev = bp;
|
|
47016
|
-
|
|
47017
|
-
return b2;
|
|
47018
|
-
}
|
|
47019
|
-
|
|
47020
|
-
// create a node and optionally link it with previous one (in a circular doubly linked list)
|
|
47021
|
-
function insertNode(i, x, y, last) {
|
|
47022
|
-
var p = new Node(i, x, y);
|
|
47023
|
-
|
|
47024
|
-
if (!last) {
|
|
47025
|
-
p.prev = p;
|
|
47026
|
-
p.next = p;
|
|
47027
|
-
|
|
47028
|
-
} else {
|
|
47029
|
-
p.next = last.next;
|
|
47030
|
-
p.prev = last;
|
|
47031
|
-
last.next.prev = p;
|
|
47032
|
-
last.next = p;
|
|
47033
|
-
}
|
|
47034
|
-
return p;
|
|
47035
|
-
}
|
|
47036
|
-
|
|
47037
|
-
function removeNode(p) {
|
|
47038
|
-
p.next.prev = p.prev;
|
|
47039
|
-
p.prev.next = p.next;
|
|
47040
|
-
|
|
47041
|
-
if (p.prevZ) p.prevZ.nextZ = p.nextZ;
|
|
47042
|
-
if (p.nextZ) p.nextZ.prevZ = p.prevZ;
|
|
47043
|
-
}
|
|
47044
|
-
|
|
47045
|
-
function Node(i, x, y) {
|
|
47046
|
-
// vertex index in coordinates array
|
|
47047
|
-
this.i = i;
|
|
47048
|
-
|
|
47049
|
-
// vertex coordinates
|
|
47050
|
-
this.x = x;
|
|
47051
|
-
this.y = y;
|
|
47052
|
-
|
|
47053
|
-
// previous and next vertex nodes in a polygon ring
|
|
47054
|
-
this.prev = null;
|
|
47055
|
-
this.next = null;
|
|
47056
|
-
|
|
47057
|
-
// z-order curve value
|
|
47058
|
-
this.z = 0;
|
|
47059
|
-
|
|
47060
|
-
// previous and next nodes in z-order
|
|
47061
|
-
this.prevZ = null;
|
|
47062
|
-
this.nextZ = null;
|
|
47063
|
-
|
|
47064
|
-
// indicates whether this is a steiner point
|
|
47065
|
-
this.steiner = false;
|
|
47066
|
-
}
|
|
47067
|
-
|
|
47068
|
-
// return a percentage difference between the polygon area and its triangulation area;
|
|
47069
|
-
// used to verify correctness of triangulation
|
|
47070
|
-
earcut.deviation = function (data, holeIndices, dim, triangles) {
|
|
47071
|
-
var hasHoles = holeIndices && holeIndices.length;
|
|
47072
|
-
var outerLen = hasHoles ? holeIndices[0] * dim : data.length;
|
|
47073
|
-
|
|
47074
|
-
var polygonArea = Math.abs(signedArea(data, 0, outerLen, dim));
|
|
47075
|
-
if (hasHoles) {
|
|
47076
|
-
for (var i = 0, len = holeIndices.length; i < len; i++) {
|
|
47077
|
-
var start = holeIndices[i] * dim;
|
|
47078
|
-
var end = i < len - 1 ? holeIndices[i + 1] * dim : data.length;
|
|
47079
|
-
polygonArea -= Math.abs(signedArea(data, start, end, dim));
|
|
47080
|
-
}
|
|
47081
|
-
}
|
|
47082
|
-
|
|
47083
|
-
var trianglesArea = 0;
|
|
47084
|
-
for (i = 0; i < triangles.length; i += 3) {
|
|
47085
|
-
var a = triangles[i] * dim;
|
|
47086
|
-
var b = triangles[i + 1] * dim;
|
|
47087
|
-
var c = triangles[i + 2] * dim;
|
|
47088
|
-
trianglesArea += Math.abs(
|
|
47089
|
-
(data[a] - data[c]) * (data[b + 1] - data[a + 1]) -
|
|
47090
|
-
(data[a] - data[b]) * (data[c + 1] - data[a + 1]));
|
|
47091
|
-
}
|
|
47092
|
-
|
|
47093
|
-
return polygonArea === 0 && trianglesArea === 0 ? 0 :
|
|
47094
|
-
Math.abs((trianglesArea - polygonArea) / polygonArea);
|
|
47095
|
-
};
|
|
47096
|
-
|
|
47097
|
-
function signedArea(data, start, end, dim) {
|
|
47098
|
-
var sum = 0;
|
|
47099
|
-
for (var i = start, j = end - dim; i < end; i += dim) {
|
|
47100
|
-
sum += (data[j] - data[i]) * (data[i + 1] + data[j + 1]);
|
|
47101
|
-
j = i;
|
|
47102
|
-
}
|
|
47103
|
-
return sum;
|
|
47104
|
-
}
|
|
47105
|
-
|
|
47106
|
-
// turn a polygon in a multi-dimensional array form (e.g. as in GeoJSON) into a form Earcut accepts
|
|
47107
|
-
earcut.flatten = function (data) {
|
|
47108
|
-
var dim = data[0][0].length,
|
|
47109
|
-
result = {vertices: [], holes: [], dimensions: dim},
|
|
47110
|
-
holeIndex = 0;
|
|
47111
|
-
|
|
47112
|
-
for (var i = 0; i < data.length; i++) {
|
|
47113
|
-
for (var j = 0; j < data[i].length; j++) {
|
|
47114
|
-
for (var d = 0; d < dim; d++) result.vertices.push(data[i][j][d]);
|
|
47115
|
-
}
|
|
47116
|
-
if (i > 0) {
|
|
47117
|
-
holeIndex += data[i - 1].length;
|
|
47118
|
-
result.holes.push(holeIndex);
|
|
47119
|
-
}
|
|
47120
|
-
}
|
|
47121
|
-
return result;
|
|
47122
|
-
};
|
|
47123
|
-
|
|
47124
|
-
|
|
47125
46438
|
/***/ }),
|
|
47126
46439
|
|
|
47127
46440
|
/***/ 3369:
|
|
@@ -65028,11 +64341,16 @@ __webpack_require__.d(__webpack_exports__, {
|
|
|
65028
64341
|
"default": function() { return /* binding */ lib; }
|
|
65029
64342
|
});
|
|
65030
64343
|
|
|
65031
|
-
;//
|
|
64344
|
+
;// ../node_modules/proj4/lib/global.js
|
|
65032
64345
|
/* harmony default export */ function global(defs) {
|
|
65033
64346
|
defs('EPSG:4326', "+title=WGS 84 (long/lat) +proj=longlat +ellps=WGS84 +datum=WGS84 +units=degrees");
|
|
65034
64347
|
defs('EPSG:4269', "+title=NAD83 (long/lat) +proj=longlat +a=6378137.0 +b=6356752.31414036 +ellps=GRS80 +datum=NAD83 +units=degrees");
|
|
65035
64348
|
defs('EPSG:3857', "+title=WGS 84 / Pseudo-Mercator +proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +no_defs");
|
|
64349
|
+
// UTM WGS84
|
|
64350
|
+
for (var i = 0; i <= 60; ++i) {
|
|
64351
|
+
defs('EPSG:' + (32600 + i), "+proj=utm +zone=" + i + " +datum=WGS84 +units=m");
|
|
64352
|
+
defs('EPSG:' + (32700 + i), "+proj=utm +zone=" + i + " +south +datum=WGS84 +units=m");
|
|
64353
|
+
}
|
|
65036
64354
|
|
|
65037
64355
|
defs.WGS84 = defs['EPSG:4326'];
|
|
65038
64356
|
defs['EPSG:3785'] = defs['EPSG:3857']; // maintain backward compat, official code is 3857
|
|
@@ -65043,7 +64361,7 @@ __webpack_require__.d(__webpack_exports__, {
|
|
|
65043
64361
|
|
|
65044
64362
|
// EXTERNAL MODULE: ../node_modules/proj4/lib/constants/values.js
|
|
65045
64363
|
var values = __webpack_require__(2556);
|
|
65046
|
-
;//
|
|
64364
|
+
;// ../node_modules/proj4/lib/constants/PrimeMeridian.js
|
|
65047
64365
|
var PrimeMeridian_exports = {};
|
|
65048
64366
|
|
|
65049
64367
|
|
|
@@ -65061,13 +64379,31 @@ PrimeMeridian_exports.stockholm = 18.058277777778; //"18d3'29.8\"E",
|
|
|
65061
64379
|
PrimeMeridian_exports.athens = 23.7163375; //"23d42'58.815\"E",
|
|
65062
64380
|
PrimeMeridian_exports.oslo = 10.722916666667; //"10d43'22.5\"E"
|
|
65063
64381
|
|
|
65064
|
-
;//
|
|
64382
|
+
;// ../node_modules/proj4/lib/constants/units.js
|
|
65065
64383
|
/* harmony default export */ var units = ({
|
|
65066
|
-
|
|
65067
|
-
'
|
|
64384
|
+
'mm': {to_meter: 0.001},
|
|
64385
|
+
'cm': {to_meter: 0.01},
|
|
64386
|
+
'ft': {to_meter: 0.3048},
|
|
64387
|
+
'us-ft': {to_meter: 1200 / 3937},
|
|
64388
|
+
'fath': {to_meter: 1.8288},
|
|
64389
|
+
'kmi': {to_meter: 1852},
|
|
64390
|
+
'us-ch': {to_meter: 20.1168402336805},
|
|
64391
|
+
'us-mi': {to_meter: 1609.34721869444},
|
|
64392
|
+
'km': {to_meter: 1000},
|
|
64393
|
+
'ind-ft': {to_meter: 0.30479841},
|
|
64394
|
+
'ind-yd': {to_meter: 0.91439523},
|
|
64395
|
+
'mi': {to_meter: 1609.344},
|
|
64396
|
+
'yd': {to_meter: 0.9144},
|
|
64397
|
+
'ch': {to_meter: 20.1168},
|
|
64398
|
+
'link': {to_meter: 0.201168},
|
|
64399
|
+
'dm': {to_meter: 0.01},
|
|
64400
|
+
'in': {to_meter: 0.0254},
|
|
64401
|
+
'ind-ch': {to_meter: 20.11669506},
|
|
64402
|
+
'us-in': {to_meter: 0.025400050800101},
|
|
64403
|
+
'us-yd': {to_meter: 0.914401828803658}
|
|
65068
64404
|
});
|
|
65069
64405
|
|
|
65070
|
-
;//
|
|
64406
|
+
;// ../node_modules/proj4/lib/match.js
|
|
65071
64407
|
var ignoredChar = /[\s_\-\/\(\)]/g;
|
|
65072
64408
|
function match(obj, key) {
|
|
65073
64409
|
if (obj[key]) {
|
|
@@ -65086,7 +64422,7 @@ function match(obj, key) {
|
|
|
65086
64422
|
}
|
|
65087
64423
|
}
|
|
65088
64424
|
|
|
65089
|
-
;//
|
|
64425
|
+
;// ../node_modules/proj4/lib/projString.js
|
|
65090
64426
|
|
|
65091
64427
|
|
|
65092
64428
|
|
|
@@ -65232,7 +64568,7 @@ function match(obj, key) {
|
|
|
65232
64568
|
return self;
|
|
65233
64569
|
}
|
|
65234
64570
|
|
|
65235
|
-
;//
|
|
64571
|
+
;// ../node_modules/wkt-parser/parser.js
|
|
65236
64572
|
/* harmony default export */ var parser = (parseString);
|
|
65237
64573
|
|
|
65238
64574
|
var NEUTRAL = 1;
|
|
@@ -65403,7 +64739,7 @@ function parseString(txt) {
|
|
|
65403
64739
|
return parser.output();
|
|
65404
64740
|
}
|
|
65405
64741
|
|
|
65406
|
-
;//
|
|
64742
|
+
;// ../node_modules/wkt-parser/process.js
|
|
65407
64743
|
|
|
65408
64744
|
|
|
65409
64745
|
function mapit(obj, key, value) {
|
|
@@ -65483,6 +64819,21 @@ function sExpr(v, obj) {
|
|
|
65483
64819
|
sExpr(v[3], obj[key]);
|
|
65484
64820
|
}
|
|
65485
64821
|
return;
|
|
64822
|
+
case 'EDATUM':
|
|
64823
|
+
case 'ENGINEERINGDATUM':
|
|
64824
|
+
case 'LOCAL_DATUM':
|
|
64825
|
+
case 'DATUM':
|
|
64826
|
+
case 'VERT_CS':
|
|
64827
|
+
case 'VERTCRS':
|
|
64828
|
+
case 'VERTICALCRS':
|
|
64829
|
+
v[0] = ['name', v[0]];
|
|
64830
|
+
mapit(obj, key, v);
|
|
64831
|
+
return;
|
|
64832
|
+
case 'COMPD_CS':
|
|
64833
|
+
case 'COMPOUNDCRS':
|
|
64834
|
+
case 'FITTED_CS':
|
|
64835
|
+
// the followings are the crs defined in
|
|
64836
|
+
// https://github.com/proj4js/proj4js/blob/1da4ed0b865d0fcb51c136090569210cdcc9019e/lib/parseCode.js#L11
|
|
65486
64837
|
case 'PROJECTEDCRS':
|
|
65487
64838
|
case 'PROJCRS':
|
|
65488
64839
|
case 'GEOGCS':
|
|
@@ -65492,20 +64843,11 @@ function sExpr(v, obj) {
|
|
|
65492
64843
|
case 'GEODCRS':
|
|
65493
64844
|
case 'GEODETICCRS':
|
|
65494
64845
|
case 'GEODETICDATUM':
|
|
65495
|
-
case 'EDATUM':
|
|
65496
|
-
case 'ENGINEERINGDATUM':
|
|
65497
|
-
case 'VERT_CS':
|
|
65498
|
-
case 'VERTCRS':
|
|
65499
|
-
case 'VERTICALCRS':
|
|
65500
|
-
case 'COMPD_CS':
|
|
65501
|
-
case 'COMPOUNDCRS':
|
|
65502
|
-
case 'ENGINEERINGCRS':
|
|
65503
64846
|
case 'ENGCRS':
|
|
65504
|
-
case '
|
|
65505
|
-
case 'LOCAL_DATUM':
|
|
65506
|
-
case 'DATUM':
|
|
64847
|
+
case 'ENGINEERINGCRS':
|
|
65507
64848
|
v[0] = ['name', v[0]];
|
|
65508
64849
|
mapit(obj, key, v);
|
|
64850
|
+
obj[key].type = key;
|
|
65509
64851
|
return;
|
|
65510
64852
|
default:
|
|
65511
64853
|
i = -1;
|
|
@@ -65518,12 +64860,13 @@ function sExpr(v, obj) {
|
|
|
65518
64860
|
}
|
|
65519
64861
|
}
|
|
65520
64862
|
|
|
65521
|
-
;//
|
|
64863
|
+
;// ../node_modules/wkt-parser/index.js
|
|
65522
64864
|
var D2R = 0.01745329251994329577;
|
|
65523
64865
|
|
|
65524
64866
|
|
|
65525
64867
|
|
|
65526
|
-
|
|
64868
|
+
var knownTypes = ['PROJECTEDCRS', 'PROJCRS', 'GEOGCS', 'GEOCCS', 'PROJCS', 'LOCAL_CS', 'GEODCRS',
|
|
64869
|
+
'GEODETICCRS', 'GEODETICDATUM', 'ENGCRS', 'ENGINEERINGCRS'];
|
|
65527
64870
|
|
|
65528
64871
|
function rename(obj, params) {
|
|
65529
64872
|
var outName = params[0];
|
|
@@ -65541,6 +64884,27 @@ function d2r(input) {
|
|
|
65541
64884
|
}
|
|
65542
64885
|
|
|
65543
64886
|
function cleanWKT(wkt) {
|
|
64887
|
+
var keys = Object.keys(wkt);
|
|
64888
|
+
for (var i = 0, ii = keys.length; i <ii; ++i) {
|
|
64889
|
+
var key = keys[i];
|
|
64890
|
+
// the followings are the crs defined in
|
|
64891
|
+
// https://github.com/proj4js/proj4js/blob/1da4ed0b865d0fcb51c136090569210cdcc9019e/lib/parseCode.js#L11
|
|
64892
|
+
if (knownTypes.indexOf(key) !== -1) {
|
|
64893
|
+
setPropertiesFromWkt(wkt[key]);
|
|
64894
|
+
}
|
|
64895
|
+
if (typeof wkt[key] === 'object') {
|
|
64896
|
+
cleanWKT(wkt[key]);
|
|
64897
|
+
}
|
|
64898
|
+
}
|
|
64899
|
+
}
|
|
64900
|
+
|
|
64901
|
+
function setPropertiesFromWkt(wkt) {
|
|
64902
|
+
if (wkt.AUTHORITY) {
|
|
64903
|
+
var authority = Object.keys(wkt.AUTHORITY)[0];
|
|
64904
|
+
if (authority && authority in wkt.AUTHORITY) {
|
|
64905
|
+
wkt.title = authority + ':' + wkt.AUTHORITY[authority];
|
|
64906
|
+
}
|
|
64907
|
+
}
|
|
65544
64908
|
if (wkt.type === 'GEOGCS') {
|
|
65545
64909
|
wkt.projName = 'longlat';
|
|
65546
64910
|
} else if (wkt.type === 'LOCAL_CS') {
|
|
@@ -65605,7 +64969,7 @@ function cleanWKT(wkt) {
|
|
|
65605
64969
|
if (wkt.datumCode.slice(0, 2) === 'd_') {
|
|
65606
64970
|
wkt.datumCode = wkt.datumCode.slice(2);
|
|
65607
64971
|
}
|
|
65608
|
-
if (wkt.datumCode === '
|
|
64972
|
+
if (wkt.datumCode === 'new_zealand_1949') {
|
|
65609
64973
|
wkt.datumCode = 'nzgd49';
|
|
65610
64974
|
}
|
|
65611
64975
|
if (wkt.datumCode === 'wgs_1984' || wkt.datumCode === 'world_geodetic_system_1984') {
|
|
@@ -65614,13 +64978,7 @@ function cleanWKT(wkt) {
|
|
|
65614
64978
|
}
|
|
65615
64979
|
wkt.datumCode = 'wgs84';
|
|
65616
64980
|
}
|
|
65617
|
-
if (wkt.datumCode
|
|
65618
|
-
wkt.datumCode = wkt.datumCode.slice(0, - 6);
|
|
65619
|
-
}
|
|
65620
|
-
if (wkt.datumCode.slice(-8) === '_jakarta') {
|
|
65621
|
-
wkt.datumCode = wkt.datumCode.slice(0, - 8);
|
|
65622
|
-
}
|
|
65623
|
-
if (~wkt.datumCode.indexOf('belge')) {
|
|
64981
|
+
if (wkt.datumCode === 'belge_1972') {
|
|
65624
64982
|
wkt.datumCode = 'rnb72';
|
|
65625
64983
|
}
|
|
65626
64984
|
if (geogcs.DATUM && geogcs.DATUM.SPHEROID) {
|
|
@@ -65715,17 +65073,14 @@ function cleanWKT(wkt) {
|
|
|
65715
65073
|
}
|
|
65716
65074
|
/* harmony default export */ function wkt_parser(wkt) {
|
|
65717
65075
|
var lisp = parser(wkt);
|
|
65718
|
-
var type = lisp
|
|
65719
|
-
var name = lisp.shift();
|
|
65720
|
-
lisp.unshift(['name', name]);
|
|
65721
|
-
lisp.unshift(['type', type]);
|
|
65076
|
+
var type = lisp[0];
|
|
65722
65077
|
var obj = {};
|
|
65723
65078
|
sExpr(lisp, obj);
|
|
65724
65079
|
cleanWKT(obj);
|
|
65725
|
-
return obj;
|
|
65080
|
+
return obj[type];
|
|
65726
65081
|
}
|
|
65727
65082
|
|
|
65728
|
-
;//
|
|
65083
|
+
;// ../node_modules/proj4/lib/defs.js
|
|
65729
65084
|
|
|
65730
65085
|
|
|
65731
65086
|
|
|
@@ -65782,7 +65137,7 @@ function defs(name) {
|
|
|
65782
65137
|
global(defs);
|
|
65783
65138
|
/* harmony default export */ var lib_defs = (defs);
|
|
65784
65139
|
|
|
65785
|
-
;//
|
|
65140
|
+
;// ../node_modules/proj4/lib/parseCode.js
|
|
65786
65141
|
|
|
65787
65142
|
|
|
65788
65143
|
|
|
@@ -65846,7 +65201,7 @@ function parse(code){
|
|
|
65846
65201
|
|
|
65847
65202
|
/* harmony default export */ var parseCode = (parse);
|
|
65848
65203
|
|
|
65849
|
-
;//
|
|
65204
|
+
;// ../node_modules/proj4/lib/extend.js
|
|
65850
65205
|
/* harmony default export */ function extend(destination, source) {
|
|
65851
65206
|
destination = destination || {};
|
|
65852
65207
|
var value, property;
|
|
@@ -65866,7 +65221,7 @@ function parse(code){
|
|
|
65866
65221
|
var merc = __webpack_require__(2286);
|
|
65867
65222
|
// EXTERNAL MODULE: ../node_modules/proj4/lib/projections/longlat.js
|
|
65868
65223
|
var longlat = __webpack_require__(2848);
|
|
65869
|
-
;//
|
|
65224
|
+
;// ../node_modules/proj4/lib/projections.js
|
|
65870
65225
|
|
|
65871
65226
|
|
|
65872
65227
|
var projs = [merc["default"], longlat["default"]];
|
|
@@ -65907,7 +65262,7 @@ function start() {
|
|
|
65907
65262
|
get: get
|
|
65908
65263
|
});
|
|
65909
65264
|
|
|
65910
|
-
;//
|
|
65265
|
+
;// ../node_modules/proj4/lib/constants/Ellipsoid.js
|
|
65911
65266
|
var Ellipsoid_exports = {};
|
|
65912
65267
|
|
|
65913
65268
|
Ellipsoid_exports.MERIT = {
|
|
@@ -66175,7 +65530,7 @@ Ellipsoid_exports.sphere = {
|
|
|
66175
65530
|
ellipseName: "Normal Sphere (r=6370997)"
|
|
66176
65531
|
};
|
|
66177
65532
|
|
|
66178
|
-
;//
|
|
65533
|
+
;// ../node_modules/proj4/lib/deriveConstants.js
|
|
66179
65534
|
|
|
66180
65535
|
|
|
66181
65536
|
|
|
@@ -66225,121 +65580,111 @@ function sphere(a, b, rf, ellps, sphere) {
|
|
|
66225
65580
|
};
|
|
66226
65581
|
}
|
|
66227
65582
|
|
|
66228
|
-
;//
|
|
66229
|
-
var
|
|
66230
|
-
|
|
66231
|
-
|
|
66232
|
-
|
|
66233
|
-
|
|
66234
|
-
|
|
66235
|
-
|
|
66236
|
-
|
|
66237
|
-
|
|
66238
|
-
|
|
66239
|
-
|
|
66240
|
-
|
|
66241
|
-
|
|
66242
|
-
|
|
66243
|
-
|
|
66244
|
-
|
|
66245
|
-
|
|
66246
|
-
|
|
66247
|
-
|
|
66248
|
-
|
|
66249
|
-
|
|
66250
|
-
|
|
66251
|
-
|
|
66252
|
-
|
|
66253
|
-
|
|
66254
|
-
|
|
66255
|
-
|
|
66256
|
-
|
|
66257
|
-
|
|
66258
|
-
|
|
66259
|
-
}
|
|
66260
|
-
|
|
66261
|
-
|
|
66262
|
-
|
|
66263
|
-
|
|
66264
|
-
|
|
66265
|
-
|
|
66266
|
-
|
|
66267
|
-
|
|
66268
|
-
|
|
66269
|
-
|
|
66270
|
-
|
|
66271
|
-
|
|
66272
|
-
|
|
66273
|
-
|
|
66274
|
-
|
|
66275
|
-
|
|
66276
|
-
|
|
66277
|
-
|
|
66278
|
-
|
|
66279
|
-
|
|
66280
|
-
|
|
66281
|
-
|
|
66282
|
-
|
|
66283
|
-
|
|
66284
|
-
|
|
66285
|
-
|
|
66286
|
-
|
|
66287
|
-
|
|
66288
|
-
|
|
66289
|
-
}
|
|
66290
|
-
|
|
66291
|
-
|
|
66292
|
-
|
|
66293
|
-
|
|
66294
|
-
|
|
66295
|
-
|
|
66296
|
-
|
|
66297
|
-
|
|
66298
|
-
|
|
66299
|
-
|
|
66300
|
-
|
|
66301
|
-
|
|
66302
|
-
|
|
66303
|
-
|
|
66304
|
-
|
|
66305
|
-
|
|
66306
|
-
|
|
66307
|
-
|
|
66308
|
-
|
|
66309
|
-
|
|
66310
|
-
|
|
66311
|
-
|
|
66312
|
-
|
|
66313
|
-
|
|
66314
|
-
|
|
66315
|
-
|
|
66316
|
-
|
|
66317
|
-
|
|
66318
|
-
|
|
66319
|
-
}
|
|
66320
|
-
|
|
66321
|
-
Datum_exports.beduaram = {
|
|
66322
|
-
towgs84: '-106,-87,188',
|
|
66323
|
-
ellipse: 'clrk80',
|
|
66324
|
-
datumName: 'Beduaram'
|
|
65583
|
+
;// ../node_modules/proj4/lib/constants/Datum.js
|
|
65584
|
+
var datums = {
|
|
65585
|
+
wgs84: {
|
|
65586
|
+
towgs84: "0,0,0",
|
|
65587
|
+
ellipse: "WGS84",
|
|
65588
|
+
datumName: "WGS84"
|
|
65589
|
+
},
|
|
65590
|
+
ch1903: {
|
|
65591
|
+
towgs84: "674.374,15.056,405.346",
|
|
65592
|
+
ellipse: "bessel",
|
|
65593
|
+
datumName: "swiss"
|
|
65594
|
+
},
|
|
65595
|
+
ggrs87: {
|
|
65596
|
+
towgs84: "-199.87,74.79,246.62",
|
|
65597
|
+
ellipse: "GRS80",
|
|
65598
|
+
datumName: "Greek_Geodetic_Reference_System_1987"
|
|
65599
|
+
},
|
|
65600
|
+
nad83: {
|
|
65601
|
+
towgs84: "0,0,0",
|
|
65602
|
+
ellipse: "GRS80",
|
|
65603
|
+
datumName: "North_American_Datum_1983"
|
|
65604
|
+
},
|
|
65605
|
+
nad27: {
|
|
65606
|
+
nadgrids: "@conus,@alaska,@ntv2_0.gsb,@ntv1_can.dat",
|
|
65607
|
+
ellipse: "clrk66",
|
|
65608
|
+
datumName: "North_American_Datum_1927"
|
|
65609
|
+
},
|
|
65610
|
+
potsdam: {
|
|
65611
|
+
towgs84: "598.1,73.7,418.2,0.202,0.045,-2.455,6.7",
|
|
65612
|
+
ellipse: "bessel",
|
|
65613
|
+
datumName: "Potsdam Rauenberg 1950 DHDN"
|
|
65614
|
+
},
|
|
65615
|
+
carthage: {
|
|
65616
|
+
towgs84: "-263.0,6.0,431.0",
|
|
65617
|
+
ellipse: "clark80",
|
|
65618
|
+
datumName: "Carthage 1934 Tunisia"
|
|
65619
|
+
},
|
|
65620
|
+
hermannskogel: {
|
|
65621
|
+
towgs84: "577.326,90.129,463.919,5.137,1.474,5.297,2.4232",
|
|
65622
|
+
ellipse: "bessel",
|
|
65623
|
+
datumName: "Hermannskogel"
|
|
65624
|
+
},
|
|
65625
|
+
militargeographische_institut: {
|
|
65626
|
+
towgs84: "577.326,90.129,463.919,5.137,1.474,5.297,2.4232",
|
|
65627
|
+
ellipse: "bessel",
|
|
65628
|
+
datumName: "Militar-Geographische Institut",
|
|
65629
|
+
},
|
|
65630
|
+
osni52: {
|
|
65631
|
+
towgs84: "482.530,-130.596,564.557,-1.042,-0.214,-0.631,8.15",
|
|
65632
|
+
ellipse: "airy",
|
|
65633
|
+
datumName: "Irish National"
|
|
65634
|
+
},
|
|
65635
|
+
ire65: {
|
|
65636
|
+
towgs84: "482.530,-130.596,564.557,-1.042,-0.214,-0.631,8.15",
|
|
65637
|
+
ellipse: "mod_airy",
|
|
65638
|
+
datumName: "Ireland 1965"
|
|
65639
|
+
},
|
|
65640
|
+
rassadiran: {
|
|
65641
|
+
towgs84: "-133.63,-157.5,-158.62",
|
|
65642
|
+
ellipse: "intl",
|
|
65643
|
+
datumName: "Rassadiran"
|
|
65644
|
+
},
|
|
65645
|
+
nzgd49: {
|
|
65646
|
+
towgs84: "59.47,-5.04,187.44,0.47,-0.1,1.024,-4.5993",
|
|
65647
|
+
ellipse: "intl",
|
|
65648
|
+
datumName: "New Zealand Geodetic Datum 1949"
|
|
65649
|
+
},
|
|
65650
|
+
osgb36: {
|
|
65651
|
+
towgs84: "446.448,-125.157,542.060,0.1502,0.2470,0.8421,-20.4894",
|
|
65652
|
+
ellipse: "airy",
|
|
65653
|
+
datumName: "Ordnance Survey of Great Britain 1936"
|
|
65654
|
+
},
|
|
65655
|
+
s_jtsk: {
|
|
65656
|
+
towgs84: "589,76,480",
|
|
65657
|
+
ellipse: 'bessel',
|
|
65658
|
+
datumName: 'S-JTSK (Ferro)'
|
|
65659
|
+
},
|
|
65660
|
+
beduaram: {
|
|
65661
|
+
towgs84: '-106,-87,188',
|
|
65662
|
+
ellipse: 'clrk80',
|
|
65663
|
+
datumName: 'Beduaram'
|
|
65664
|
+
},
|
|
65665
|
+
gunung_segara: {
|
|
65666
|
+
towgs84: '-403,684,41',
|
|
65667
|
+
ellipse: 'bessel',
|
|
65668
|
+
datumName: 'Gunung Segara Jakarta'
|
|
65669
|
+
},
|
|
65670
|
+
rnb72: {
|
|
65671
|
+
towgs84: "106.869,-52.2978,103.724,-0.33657,0.456955,-1.84218,1",
|
|
65672
|
+
ellipse: "intl",
|
|
65673
|
+
datumName: "Reseau National Belge 1972"
|
|
65674
|
+
}
|
|
66325
65675
|
};
|
|
66326
65676
|
|
|
66327
|
-
|
|
66328
|
-
|
|
66329
|
-
|
|
66330
|
-
|
|
66331
|
-
};
|
|
65677
|
+
for (var key in datums) {
|
|
65678
|
+
var datum = datums[key];
|
|
65679
|
+
datums[datum.datumName] = datum;
|
|
65680
|
+
}
|
|
66332
65681
|
|
|
66333
|
-
|
|
66334
|
-
towgs84: "106.869,-52.2978,103.724,-0.33657,0.456955,-1.84218,1",
|
|
66335
|
-
ellipse: "intl",
|
|
66336
|
-
datumName: "Reseau National Belge 1972"
|
|
66337
|
-
};
|
|
65682
|
+
/* harmony default export */ var Datum = (datums);
|
|
66338
65683
|
|
|
66339
|
-
;//
|
|
65684
|
+
;// ../node_modules/proj4/lib/datum.js
|
|
66340
65685
|
|
|
66341
65686
|
|
|
66342
|
-
function
|
|
65687
|
+
function datum_datum(datumCode, datum_params, a, b, es, ep2, nadgrids) {
|
|
66343
65688
|
var out = {};
|
|
66344
65689
|
|
|
66345
65690
|
if (datumCode === undefined || datumCode === 'none') {
|
|
@@ -66375,9 +65720,9 @@ function datum(datumCode, datum_params, a, b, es, ep2, nadgrids) {
|
|
|
66375
65720
|
return out;
|
|
66376
65721
|
}
|
|
66377
65722
|
|
|
66378
|
-
/* harmony default export */ var lib_datum = (
|
|
65723
|
+
/* harmony default export */ var lib_datum = (datum_datum);
|
|
66379
65724
|
|
|
66380
|
-
;//
|
|
65725
|
+
;// ../node_modules/proj4/lib/nadgrid.js
|
|
66381
65726
|
/**
|
|
66382
65727
|
* Resources for details of NTv2 file formats:
|
|
66383
65728
|
* - https://web.archive.org/web/20140127204822if_/http://www.mgs.gov.on.ca:80/stdprodconsume/groups/content/@mgs/@iandit/documents/resourcelist/stel02_047447.pdf
|
|
@@ -66519,7 +65864,7 @@ function readGridNodes(view, offset, gridHeader, isLittleEndian) {
|
|
|
66519
65864
|
return gridShiftRecords;
|
|
66520
65865
|
}
|
|
66521
65866
|
|
|
66522
|
-
;//
|
|
65867
|
+
;// ../node_modules/proj4/lib/Proj.js
|
|
66523
65868
|
|
|
66524
65869
|
|
|
66525
65870
|
|
|
@@ -66549,7 +65894,7 @@ function Projection(srsCode,callback) {
|
|
|
66549
65894
|
return;
|
|
66550
65895
|
}
|
|
66551
65896
|
if (json.datumCode && json.datumCode !== 'none') {
|
|
66552
|
-
var datumDef = match(
|
|
65897
|
+
var datumDef = match(Datum, json.datumCode);
|
|
66553
65898
|
if (datumDef) {
|
|
66554
65899
|
json.datum_params = json.datum_params || (datumDef.towgs84 ? datumDef.towgs84.split(',') : null);
|
|
66555
65900
|
json.ellps = datumDef.ellipse;
|
|
@@ -66599,7 +65944,7 @@ Projection.projections.start();
|
|
|
66599
65944
|
var datumUtils = __webpack_require__(9160);
|
|
66600
65945
|
// EXTERNAL MODULE: ../node_modules/proj4/lib/common/adjust_lon.js
|
|
66601
65946
|
var adjust_lon = __webpack_require__(737);
|
|
66602
|
-
;//
|
|
65947
|
+
;// ../node_modules/proj4/lib/datum_transform.js
|
|
66603
65948
|
|
|
66604
65949
|
|
|
66605
65950
|
|
|
@@ -66789,7 +66134,7 @@ function nadInterpolate(pin, ct) {
|
|
|
66789
66134
|
return val;
|
|
66790
66135
|
}
|
|
66791
66136
|
|
|
66792
|
-
;//
|
|
66137
|
+
;// ../node_modules/proj4/lib/adjust_axis.js
|
|
66793
66138
|
/* harmony default export */ function adjust_axis(crs, denorm, point) {
|
|
66794
66139
|
var xin = point.x,
|
|
66795
66140
|
yin = point.y,
|
|
@@ -66852,7 +66197,7 @@ function nadInterpolate(pin, ct) {
|
|
|
66852
66197
|
return out;
|
|
66853
66198
|
}
|
|
66854
66199
|
|
|
66855
|
-
;//
|
|
66200
|
+
;// ../node_modules/proj4/lib/common/toPoint.js
|
|
66856
66201
|
/* harmony default export */ function toPoint(array){
|
|
66857
66202
|
var out = {
|
|
66858
66203
|
x: array[0],
|
|
@@ -66866,7 +66211,7 @@ function nadInterpolate(pin, ct) {
|
|
|
66866
66211
|
}
|
|
66867
66212
|
return out;
|
|
66868
66213
|
}
|
|
66869
|
-
;//
|
|
66214
|
+
;// ../node_modules/proj4/lib/checkSanity.js
|
|
66870
66215
|
/* harmony default export */ function checkSanity(point) {
|
|
66871
66216
|
checkCoord(point.x);
|
|
66872
66217
|
checkCoord(point.y);
|
|
@@ -66883,7 +66228,7 @@ function checkCoord(num) {
|
|
|
66883
66228
|
}
|
|
66884
66229
|
}
|
|
66885
66230
|
|
|
66886
|
-
;//
|
|
66231
|
+
;// ../node_modules/proj4/lib/transform.js
|
|
66887
66232
|
|
|
66888
66233
|
|
|
66889
66234
|
|
|
@@ -66991,7 +66336,7 @@ function transform(source, dest, point, enforceAxis) {
|
|
|
66991
66336
|
return point;
|
|
66992
66337
|
}
|
|
66993
66338
|
|
|
66994
|
-
;//
|
|
66339
|
+
;// ../node_modules/proj4/lib/core.js
|
|
66995
66340
|
|
|
66996
66341
|
|
|
66997
66342
|
var wgs84 = Proj('WGS84');
|
|
@@ -67003,12 +66348,12 @@ function transformer(from, to, coords, enforceAxis) {
|
|
|
67003
66348
|
if (coords.length > 2) {
|
|
67004
66349
|
if ((typeof from.name !== 'undefined' && from.name === 'geocent') || (typeof to.name !== 'undefined' && to.name === 'geocent')) {
|
|
67005
66350
|
if (typeof transformedArray.z === 'number') {
|
|
67006
|
-
return [transformedArray.x, transformedArray.y, transformedArray.z].concat(coords.
|
|
66351
|
+
return [transformedArray.x, transformedArray.y, transformedArray.z].concat(coords.slice(3));
|
|
67007
66352
|
} else {
|
|
67008
|
-
return [transformedArray.x, transformedArray.y, coords[2]].concat(coords.
|
|
66353
|
+
return [transformedArray.x, transformedArray.y, coords[2]].concat(coords.slice(3));
|
|
67009
66354
|
}
|
|
67010
66355
|
} else {
|
|
67011
|
-
return [transformedArray.x, transformedArray.y].concat(coords.
|
|
66356
|
+
return [transformedArray.x, transformedArray.y].concat(coords.slice(2));
|
|
67012
66357
|
}
|
|
67013
66358
|
} else {
|
|
67014
66359
|
return [transformedArray.x, transformedArray.y];
|
|
@@ -67078,7 +66423,7 @@ function proj4(fromProj, toProj, coord) {
|
|
|
67078
66423
|
}
|
|
67079
66424
|
}
|
|
67080
66425
|
/* harmony default export */ var core = (proj4);
|
|
67081
|
-
;//
|
|
66426
|
+
;// ../node_modules/mgrs/mgrs.js
|
|
67082
66427
|
|
|
67083
66428
|
|
|
67084
66429
|
|
|
@@ -67826,7 +67171,7 @@ function getMinNorthing(zoneLetter) {
|
|
|
67826
67171
|
|
|
67827
67172
|
}
|
|
67828
67173
|
|
|
67829
|
-
;//
|
|
67174
|
+
;// ../node_modules/proj4/lib/Point.js
|
|
67830
67175
|
|
|
67831
67176
|
|
|
67832
67177
|
function Point(x, y, z) {
|
|
@@ -67924,7 +67269,7 @@ var geos = __webpack_require__(469);
|
|
|
67924
67269
|
var eqearth = __webpack_require__(7129);
|
|
67925
67270
|
// EXTERNAL MODULE: ../node_modules/proj4/lib/projections/bonne.js
|
|
67926
67271
|
var bonne = __webpack_require__(5789);
|
|
67927
|
-
;//
|
|
67272
|
+
;// ../node_modules/proj4/projs.js
|
|
67928
67273
|
|
|
67929
67274
|
|
|
67930
67275
|
|
|
@@ -67989,7 +67334,7 @@ var bonne = __webpack_require__(5789);
|
|
|
67989
67334
|
proj4.Proj.projections.add(eqearth["default"]);
|
|
67990
67335
|
proj4.Proj.projections.add(bonne["default"]);
|
|
67991
67336
|
}
|
|
67992
|
-
;//
|
|
67337
|
+
;// ../node_modules/proj4/lib/index.js
|
|
67993
67338
|
|
|
67994
67339
|
|
|
67995
67340
|
|
|
@@ -68688,7 +68033,7 @@ var qsfnz = __webpack_require__(7200);
|
|
|
68688
68033
|
var msfnz = __webpack_require__(444);
|
|
68689
68034
|
// EXTERNAL MODULE: ../node_modules/proj4/lib/constants/values.js
|
|
68690
68035
|
var values = __webpack_require__(2556);
|
|
68691
|
-
;//
|
|
68036
|
+
;// ../node_modules/proj4/lib/common/iqsfnz.js
|
|
68692
68037
|
|
|
68693
68038
|
|
|
68694
68039
|
/* harmony default export */ function iqsfnz(eccent, q) {
|
|
@@ -68722,7 +68067,7 @@ var values = __webpack_require__(2556);
|
|
|
68722
68067
|
return NaN;
|
|
68723
68068
|
}
|
|
68724
68069
|
|
|
68725
|
-
;//
|
|
68070
|
+
;// ../node_modules/proj4/lib/projections/cea.js
|
|
68726
68071
|
|
|
68727
68072
|
|
|
68728
68073
|
|
|
@@ -69198,7 +68543,7 @@ var tmerc = __webpack_require__(5602);
|
|
|
69198
68543
|
var sinh = __webpack_require__(3882);
|
|
69199
68544
|
// EXTERNAL MODULE: ../node_modules/proj4/lib/common/hypot.js
|
|
69200
68545
|
var hypot = __webpack_require__(1708);
|
|
69201
|
-
;//
|
|
68546
|
+
;// ../node_modules/proj4/lib/common/log1py.js
|
|
69202
68547
|
/* harmony default export */ function log1py(x) {
|
|
69203
68548
|
var y = 1 + x;
|
|
69204
68549
|
var z = y - 1;
|
|
@@ -69206,7 +68551,7 @@ var hypot = __webpack_require__(1708);
|
|
|
69206
68551
|
return z === 0 ? x : x * Math.log(y) / z;
|
|
69207
68552
|
}
|
|
69208
68553
|
|
|
69209
|
-
;//
|
|
68554
|
+
;// ../node_modules/proj4/lib/common/asinhy.js
|
|
69210
68555
|
|
|
69211
68556
|
|
|
69212
68557
|
|
|
@@ -69217,7 +68562,7 @@ var hypot = __webpack_require__(1708);
|
|
|
69217
68562
|
return x < 0 ? -y : y;
|
|
69218
68563
|
}
|
|
69219
68564
|
|
|
69220
|
-
;//
|
|
68565
|
+
;// ../node_modules/proj4/lib/common/gatg.js
|
|
69221
68566
|
/* harmony default export */ function gatg(pp, B) {
|
|
69222
68567
|
var cos_2B = 2 * Math.cos(2 * B);
|
|
69223
68568
|
var i = pp.length - 1;
|
|
@@ -69234,7 +68579,7 @@ var hypot = __webpack_require__(1708);
|
|
|
69234
68579
|
return (B + h * Math.sin(2 * B));
|
|
69235
68580
|
}
|
|
69236
68581
|
|
|
69237
|
-
;//
|
|
68582
|
+
;// ../node_modules/proj4/lib/common/clens.js
|
|
69238
68583
|
/* harmony default export */ function clens(pp, arg_r) {
|
|
69239
68584
|
var r = 2 * Math.cos(arg_r);
|
|
69240
68585
|
var i = pp.length - 1;
|
|
@@ -69253,7 +68598,7 @@ var hypot = __webpack_require__(1708);
|
|
|
69253
68598
|
|
|
69254
68599
|
// EXTERNAL MODULE: ../node_modules/proj4/lib/common/cosh.js
|
|
69255
68600
|
var cosh = __webpack_require__(4885);
|
|
69256
|
-
;//
|
|
68601
|
+
;// ../node_modules/proj4/lib/common/clens_cmplx.js
|
|
69257
68602
|
|
|
69258
68603
|
|
|
69259
68604
|
|
|
@@ -69289,7 +68634,7 @@ var cosh = __webpack_require__(4885);
|
|
|
69289
68634
|
|
|
69290
68635
|
// EXTERNAL MODULE: ../node_modules/proj4/lib/common/adjust_lon.js
|
|
69291
68636
|
var adjust_lon = __webpack_require__(737);
|
|
69292
|
-
;//
|
|
68637
|
+
;// ../node_modules/proj4/lib/projections/etmerc.js
|
|
69293
68638
|
// Heavily based on this etmerc projection implementation
|
|
69294
68639
|
// https://github.com/mbloch/mapshaper-proj/blob/master/src/projections/etmerc.js
|
|
69295
68640
|
|
|
@@ -69482,13 +68827,13 @@ __webpack_require__.d(__webpack_exports__, {
|
|
|
69482
68827
|
names: function() { return /* binding */ names; }
|
|
69483
68828
|
});
|
|
69484
68829
|
|
|
69485
|
-
;//
|
|
68830
|
+
;// ../node_modules/proj4/lib/common/srat.js
|
|
69486
68831
|
/* harmony default export */ function srat(esinp, exp) {
|
|
69487
68832
|
return (Math.pow((1 - esinp) / (1 + esinp), exp));
|
|
69488
68833
|
}
|
|
69489
68834
|
// EXTERNAL MODULE: ../node_modules/proj4/lib/constants/values.js
|
|
69490
68835
|
var values = __webpack_require__(2556);
|
|
69491
|
-
;//
|
|
68836
|
+
;// ../node_modules/proj4/lib/projections/gauss.js
|
|
69492
68837
|
|
|
69493
68838
|
var MAX_ITER = 20;
|
|
69494
68839
|
|
|
@@ -69897,7 +69242,7 @@ __webpack_require__.d(__webpack_exports__, {
|
|
|
69897
69242
|
|
|
69898
69243
|
// EXTERNAL MODULE: ../node_modules/proj4/lib/constants/values.js
|
|
69899
69244
|
var values = __webpack_require__(2556);
|
|
69900
|
-
;//
|
|
69245
|
+
;// ../node_modules/proj4/lib/common/latiso.js
|
|
69901
69246
|
|
|
69902
69247
|
|
|
69903
69248
|
/* harmony default export */ function latiso(eccent, phi, sinphi) {
|
|
@@ -69919,14 +69264,14 @@ var values = __webpack_require__(2556);
|
|
|
69919
69264
|
var sinh = __webpack_require__(3882);
|
|
69920
69265
|
// EXTERNAL MODULE: ../node_modules/proj4/lib/common/cosh.js
|
|
69921
69266
|
var cosh = __webpack_require__(4885);
|
|
69922
|
-
;//
|
|
69267
|
+
;// ../node_modules/proj4/lib/common/fL.js
|
|
69923
69268
|
|
|
69924
69269
|
|
|
69925
69270
|
/* harmony default export */ function fL(x, L) {
|
|
69926
69271
|
return 2 * Math.atan(x * Math.exp(L)) - values/* HALF_PI */.sK;
|
|
69927
69272
|
}
|
|
69928
69273
|
|
|
69929
|
-
;//
|
|
69274
|
+
;// ../node_modules/proj4/lib/common/invlatiso.js
|
|
69930
69275
|
|
|
69931
69276
|
|
|
69932
69277
|
/* harmony default export */ function invlatiso(eccent, ts) {
|
|
@@ -69940,7 +69285,7 @@ var cosh = __webpack_require__(4885);
|
|
|
69940
69285
|
} while (Math.abs(phi - Iphi) > 1.0e-12);
|
|
69941
69286
|
return phi;
|
|
69942
69287
|
}
|
|
69943
|
-
;//
|
|
69288
|
+
;// ../node_modules/proj4/lib/projections/gstmerc.js
|
|
69944
69289
|
|
|
69945
69290
|
|
|
69946
69291
|
|
|
@@ -73196,7 +72541,7 @@ __webpack_require__.d(__webpack_exports__, {
|
|
|
73196
72541
|
|
|
73197
72542
|
// EXTERNAL MODULE: ../node_modules/proj4/lib/common/adjust_lon.js
|
|
73198
72543
|
var adjust_lon = __webpack_require__(737);
|
|
73199
|
-
;//
|
|
72544
|
+
;// ../node_modules/proj4/lib/common/adjust_zone.js
|
|
73200
72545
|
|
|
73201
72546
|
|
|
73202
72547
|
/* harmony default export */ function adjust_zone(zone, lon) {
|
|
@@ -73216,7 +72561,7 @@ var adjust_lon = __webpack_require__(737);
|
|
|
73216
72561
|
var etmerc = __webpack_require__(994);
|
|
73217
72562
|
// EXTERNAL MODULE: ../node_modules/proj4/lib/constants/values.js
|
|
73218
72563
|
var values = __webpack_require__(2556);
|
|
73219
|
-
;//
|
|
72564
|
+
;// ../node_modules/proj4/lib/projections/utm.js
|
|
73220
72565
|
|
|
73221
72566
|
|
|
73222
72567
|
var dependsOn = 'etmerc';
|
|
@@ -73633,9 +72978,7 @@ var options = {};
|
|
|
73633
72978
|
|
|
73634
72979
|
options.styleTagTransform = (_node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5___default());
|
|
73635
72980
|
options.setAttributes = (_node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3___default());
|
|
73636
|
-
|
|
73637
|
-
options.insert = _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2___default().bind(null, "head");
|
|
73638
|
-
|
|
72981
|
+
options.insert = _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2___default().bind(null, "head");
|
|
73639
72982
|
options.domAPI = (_node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1___default());
|
|
73640
72983
|
options.insertStyleElement = (_node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4___default());
|
|
73641
72984
|
|
|
@@ -73682,9 +73025,7 @@ var options = {};
|
|
|
73682
73025
|
|
|
73683
73026
|
options.styleTagTransform = (_node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5___default());
|
|
73684
73027
|
options.setAttributes = (_node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3___default());
|
|
73685
|
-
|
|
73686
|
-
options.insert = _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2___default().bind(null, "head");
|
|
73687
|
-
|
|
73028
|
+
options.insert = _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2___default().bind(null, "head");
|
|
73688
73029
|
options.domAPI = (_node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1___default());
|
|
73689
73030
|
options.insertStyleElement = (_node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4___default());
|
|
73690
73031
|
|
|
@@ -73731,9 +73072,7 @@ var options = {};
|
|
|
73731
73072
|
|
|
73732
73073
|
options.styleTagTransform = (_node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5___default());
|
|
73733
73074
|
options.setAttributes = (_node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3___default());
|
|
73734
|
-
|
|
73735
|
-
options.insert = _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2___default().bind(null, "head");
|
|
73736
|
-
|
|
73075
|
+
options.insert = _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2___default().bind(null, "head");
|
|
73737
73076
|
options.domAPI = (_node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1___default());
|
|
73738
73077
|
options.insertStyleElement = (_node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4___default());
|
|
73739
73078
|
|
|
@@ -74064,6 +73403,630 @@ module.exports = __WEBPACK_EXTERNAL_MODULE__7606__;
|
|
|
74064
73403
|
|
|
74065
73404
|
/***/ }),
|
|
74066
73405
|
|
|
73406
|
+
/***/ 9747:
|
|
73407
|
+
/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
|
|
73408
|
+
|
|
73409
|
+
"use strict";
|
|
73410
|
+
__webpack_require__.r(__webpack_exports__);
|
|
73411
|
+
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
73412
|
+
/* harmony export */ "default": function() { return /* binding */ earcut; },
|
|
73413
|
+
/* harmony export */ deviation: function() { return /* binding */ deviation; },
|
|
73414
|
+
/* harmony export */ flatten: function() { return /* binding */ flatten; }
|
|
73415
|
+
/* harmony export */ });
|
|
73416
|
+
function _createForOfIteratorHelper(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t.return || t.return(); } finally { if (u) throw o; } } }; }
|
|
73417
|
+
function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
|
|
73418
|
+
function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
|
|
73419
|
+
function earcut(data, holeIndices) {
|
|
73420
|
+
var dim = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 2;
|
|
73421
|
+
var hasHoles = holeIndices && holeIndices.length;
|
|
73422
|
+
var outerLen = hasHoles ? holeIndices[0] * dim : data.length;
|
|
73423
|
+
var outerNode = linkedList(data, 0, outerLen, dim, true);
|
|
73424
|
+
var triangles = [];
|
|
73425
|
+
if (!outerNode || outerNode.next === outerNode.prev) return triangles;
|
|
73426
|
+
var minX, minY, invSize;
|
|
73427
|
+
if (hasHoles) outerNode = eliminateHoles(data, holeIndices, outerNode, dim);
|
|
73428
|
+
|
|
73429
|
+
// if the shape is not too simple, we'll use z-order curve hash later; calculate polygon bbox
|
|
73430
|
+
if (data.length > 80 * dim) {
|
|
73431
|
+
minX = Infinity;
|
|
73432
|
+
minY = Infinity;
|
|
73433
|
+
var maxX = -Infinity;
|
|
73434
|
+
var maxY = -Infinity;
|
|
73435
|
+
for (var i = dim; i < outerLen; i += dim) {
|
|
73436
|
+
var x = data[i];
|
|
73437
|
+
var y = data[i + 1];
|
|
73438
|
+
if (x < minX) minX = x;
|
|
73439
|
+
if (y < minY) minY = y;
|
|
73440
|
+
if (x > maxX) maxX = x;
|
|
73441
|
+
if (y > maxY) maxY = y;
|
|
73442
|
+
}
|
|
73443
|
+
|
|
73444
|
+
// minX, minY and invSize are later used to transform coords into integers for z-order calculation
|
|
73445
|
+
invSize = Math.max(maxX - minX, maxY - minY);
|
|
73446
|
+
invSize = invSize !== 0 ? 32767 / invSize : 0;
|
|
73447
|
+
}
|
|
73448
|
+
earcutLinked(outerNode, triangles, dim, minX, minY, invSize, 0);
|
|
73449
|
+
return triangles;
|
|
73450
|
+
}
|
|
73451
|
+
|
|
73452
|
+
// create a circular doubly linked list from polygon points in the specified winding order
|
|
73453
|
+
function linkedList(data, start, end, dim, clockwise) {
|
|
73454
|
+
var last;
|
|
73455
|
+
if (clockwise === signedArea(data, start, end, dim) > 0) {
|
|
73456
|
+
for (var i = start; i < end; i += dim) last = insertNode(i / dim | 0, data[i], data[i + 1], last);
|
|
73457
|
+
} else {
|
|
73458
|
+
for (var _i = end - dim; _i >= start; _i -= dim) last = insertNode(_i / dim | 0, data[_i], data[_i + 1], last);
|
|
73459
|
+
}
|
|
73460
|
+
if (last && equals(last, last.next)) {
|
|
73461
|
+
removeNode(last);
|
|
73462
|
+
last = last.next;
|
|
73463
|
+
}
|
|
73464
|
+
return last;
|
|
73465
|
+
}
|
|
73466
|
+
|
|
73467
|
+
// eliminate colinear or duplicate points
|
|
73468
|
+
function filterPoints(start, end) {
|
|
73469
|
+
if (!start) return start;
|
|
73470
|
+
if (!end) end = start;
|
|
73471
|
+
var p = start,
|
|
73472
|
+
again;
|
|
73473
|
+
do {
|
|
73474
|
+
again = false;
|
|
73475
|
+
if (!p.steiner && (equals(p, p.next) || area(p.prev, p, p.next) === 0)) {
|
|
73476
|
+
removeNode(p);
|
|
73477
|
+
p = end = p.prev;
|
|
73478
|
+
if (p === p.next) break;
|
|
73479
|
+
again = true;
|
|
73480
|
+
} else {
|
|
73481
|
+
p = p.next;
|
|
73482
|
+
}
|
|
73483
|
+
} while (again || p !== end);
|
|
73484
|
+
return end;
|
|
73485
|
+
}
|
|
73486
|
+
|
|
73487
|
+
// main ear slicing loop which triangulates a polygon (given as a linked list)
|
|
73488
|
+
function earcutLinked(ear, triangles, dim, minX, minY, invSize, pass) {
|
|
73489
|
+
if (!ear) return;
|
|
73490
|
+
|
|
73491
|
+
// interlink polygon nodes in z-order
|
|
73492
|
+
if (!pass && invSize) indexCurve(ear, minX, minY, invSize);
|
|
73493
|
+
var stop = ear;
|
|
73494
|
+
|
|
73495
|
+
// iterate through ears, slicing them one by one
|
|
73496
|
+
while (ear.prev !== ear.next) {
|
|
73497
|
+
var prev = ear.prev;
|
|
73498
|
+
var next = ear.next;
|
|
73499
|
+
if (invSize ? isEarHashed(ear, minX, minY, invSize) : isEar(ear)) {
|
|
73500
|
+
triangles.push(prev.i, ear.i, next.i); // cut off the triangle
|
|
73501
|
+
|
|
73502
|
+
removeNode(ear);
|
|
73503
|
+
|
|
73504
|
+
// skipping the next vertex leads to less sliver triangles
|
|
73505
|
+
ear = next.next;
|
|
73506
|
+
stop = next.next;
|
|
73507
|
+
continue;
|
|
73508
|
+
}
|
|
73509
|
+
ear = next;
|
|
73510
|
+
|
|
73511
|
+
// if we looped through the whole remaining polygon and can't find any more ears
|
|
73512
|
+
if (ear === stop) {
|
|
73513
|
+
// try filtering points and slicing again
|
|
73514
|
+
if (!pass) {
|
|
73515
|
+
earcutLinked(filterPoints(ear), triangles, dim, minX, minY, invSize, 1);
|
|
73516
|
+
|
|
73517
|
+
// if this didn't work, try curing all small self-intersections locally
|
|
73518
|
+
} else if (pass === 1) {
|
|
73519
|
+
ear = cureLocalIntersections(filterPoints(ear), triangles);
|
|
73520
|
+
earcutLinked(ear, triangles, dim, minX, minY, invSize, 2);
|
|
73521
|
+
|
|
73522
|
+
// as a last resort, try splitting the remaining polygon into two
|
|
73523
|
+
} else if (pass === 2) {
|
|
73524
|
+
splitEarcut(ear, triangles, dim, minX, minY, invSize);
|
|
73525
|
+
}
|
|
73526
|
+
break;
|
|
73527
|
+
}
|
|
73528
|
+
}
|
|
73529
|
+
}
|
|
73530
|
+
|
|
73531
|
+
// check whether a polygon node forms a valid ear with adjacent nodes
|
|
73532
|
+
function isEar(ear) {
|
|
73533
|
+
var a = ear.prev,
|
|
73534
|
+
b = ear,
|
|
73535
|
+
c = ear.next;
|
|
73536
|
+
if (area(a, b, c) >= 0) return false; // reflex, can't be an ear
|
|
73537
|
+
|
|
73538
|
+
// now make sure we don't have other points inside the potential ear
|
|
73539
|
+
var ax = a.x,
|
|
73540
|
+
bx = b.x,
|
|
73541
|
+
cx = c.x,
|
|
73542
|
+
ay = a.y,
|
|
73543
|
+
by = b.y,
|
|
73544
|
+
cy = c.y;
|
|
73545
|
+
|
|
73546
|
+
// triangle bbox; min & max are calculated like this for speed
|
|
73547
|
+
var x0 = ax < bx ? ax < cx ? ax : cx : bx < cx ? bx : cx,
|
|
73548
|
+
y0 = ay < by ? ay < cy ? ay : cy : by < cy ? by : cy,
|
|
73549
|
+
x1 = ax > bx ? ax > cx ? ax : cx : bx > cx ? bx : cx,
|
|
73550
|
+
y1 = ay > by ? ay > cy ? ay : cy : by > cy ? by : cy;
|
|
73551
|
+
var p = c.next;
|
|
73552
|
+
while (p !== a) {
|
|
73553
|
+
if (p.x >= x0 && p.x <= x1 && p.y >= y0 && p.y <= y1 && pointInTriangle(ax, ay, bx, by, cx, cy, p.x, p.y) && area(p.prev, p, p.next) >= 0) return false;
|
|
73554
|
+
p = p.next;
|
|
73555
|
+
}
|
|
73556
|
+
return true;
|
|
73557
|
+
}
|
|
73558
|
+
function isEarHashed(ear, minX, minY, invSize) {
|
|
73559
|
+
var a = ear.prev,
|
|
73560
|
+
b = ear,
|
|
73561
|
+
c = ear.next;
|
|
73562
|
+
if (area(a, b, c) >= 0) return false; // reflex, can't be an ear
|
|
73563
|
+
|
|
73564
|
+
var ax = a.x,
|
|
73565
|
+
bx = b.x,
|
|
73566
|
+
cx = c.x,
|
|
73567
|
+
ay = a.y,
|
|
73568
|
+
by = b.y,
|
|
73569
|
+
cy = c.y;
|
|
73570
|
+
|
|
73571
|
+
// triangle bbox; min & max are calculated like this for speed
|
|
73572
|
+
var x0 = ax < bx ? ax < cx ? ax : cx : bx < cx ? bx : cx,
|
|
73573
|
+
y0 = ay < by ? ay < cy ? ay : cy : by < cy ? by : cy,
|
|
73574
|
+
x1 = ax > bx ? ax > cx ? ax : cx : bx > cx ? bx : cx,
|
|
73575
|
+
y1 = ay > by ? ay > cy ? ay : cy : by > cy ? by : cy;
|
|
73576
|
+
|
|
73577
|
+
// z-order range for the current triangle bbox;
|
|
73578
|
+
var minZ = zOrder(x0, y0, minX, minY, invSize),
|
|
73579
|
+
maxZ = zOrder(x1, y1, minX, minY, invSize);
|
|
73580
|
+
var p = ear.prevZ,
|
|
73581
|
+
n = ear.nextZ;
|
|
73582
|
+
|
|
73583
|
+
// look for points inside the triangle in both directions
|
|
73584
|
+
while (p && p.z >= minZ && n && n.z <= maxZ) {
|
|
73585
|
+
if (p.x >= x0 && p.x <= x1 && p.y >= y0 && p.y <= y1 && p !== a && p !== c && pointInTriangle(ax, ay, bx, by, cx, cy, p.x, p.y) && area(p.prev, p, p.next) >= 0) return false;
|
|
73586
|
+
p = p.prevZ;
|
|
73587
|
+
if (n.x >= x0 && n.x <= x1 && n.y >= y0 && n.y <= y1 && n !== a && n !== c && pointInTriangle(ax, ay, bx, by, cx, cy, n.x, n.y) && area(n.prev, n, n.next) >= 0) return false;
|
|
73588
|
+
n = n.nextZ;
|
|
73589
|
+
}
|
|
73590
|
+
|
|
73591
|
+
// look for remaining points in decreasing z-order
|
|
73592
|
+
while (p && p.z >= minZ) {
|
|
73593
|
+
if (p.x >= x0 && p.x <= x1 && p.y >= y0 && p.y <= y1 && p !== a && p !== c && pointInTriangle(ax, ay, bx, by, cx, cy, p.x, p.y) && area(p.prev, p, p.next) >= 0) return false;
|
|
73594
|
+
p = p.prevZ;
|
|
73595
|
+
}
|
|
73596
|
+
|
|
73597
|
+
// look for remaining points in increasing z-order
|
|
73598
|
+
while (n && n.z <= maxZ) {
|
|
73599
|
+
if (n.x >= x0 && n.x <= x1 && n.y >= y0 && n.y <= y1 && n !== a && n !== c && pointInTriangle(ax, ay, bx, by, cx, cy, n.x, n.y) && area(n.prev, n, n.next) >= 0) return false;
|
|
73600
|
+
n = n.nextZ;
|
|
73601
|
+
}
|
|
73602
|
+
return true;
|
|
73603
|
+
}
|
|
73604
|
+
|
|
73605
|
+
// go through all polygon nodes and cure small local self-intersections
|
|
73606
|
+
function cureLocalIntersections(start, triangles) {
|
|
73607
|
+
var p = start;
|
|
73608
|
+
do {
|
|
73609
|
+
var a = p.prev,
|
|
73610
|
+
b = p.next.next;
|
|
73611
|
+
if (!equals(a, b) && intersects(a, p, p.next, b) && locallyInside(a, b) && locallyInside(b, a)) {
|
|
73612
|
+
triangles.push(a.i, p.i, b.i);
|
|
73613
|
+
|
|
73614
|
+
// remove two nodes involved
|
|
73615
|
+
removeNode(p);
|
|
73616
|
+
removeNode(p.next);
|
|
73617
|
+
p = start = b;
|
|
73618
|
+
}
|
|
73619
|
+
p = p.next;
|
|
73620
|
+
} while (p !== start);
|
|
73621
|
+
return filterPoints(p);
|
|
73622
|
+
}
|
|
73623
|
+
|
|
73624
|
+
// try splitting polygon into two and triangulate them independently
|
|
73625
|
+
function splitEarcut(start, triangles, dim, minX, minY, invSize) {
|
|
73626
|
+
// look for a valid diagonal that divides the polygon into two
|
|
73627
|
+
var a = start;
|
|
73628
|
+
do {
|
|
73629
|
+
var b = a.next.next;
|
|
73630
|
+
while (b !== a.prev) {
|
|
73631
|
+
if (a.i !== b.i && isValidDiagonal(a, b)) {
|
|
73632
|
+
// split the polygon in two by the diagonal
|
|
73633
|
+
var c = splitPolygon(a, b);
|
|
73634
|
+
|
|
73635
|
+
// filter colinear points around the cuts
|
|
73636
|
+
a = filterPoints(a, a.next);
|
|
73637
|
+
c = filterPoints(c, c.next);
|
|
73638
|
+
|
|
73639
|
+
// run earcut on each half
|
|
73640
|
+
earcutLinked(a, triangles, dim, minX, minY, invSize, 0);
|
|
73641
|
+
earcutLinked(c, triangles, dim, minX, minY, invSize, 0);
|
|
73642
|
+
return;
|
|
73643
|
+
}
|
|
73644
|
+
b = b.next;
|
|
73645
|
+
}
|
|
73646
|
+
a = a.next;
|
|
73647
|
+
} while (a !== start);
|
|
73648
|
+
}
|
|
73649
|
+
|
|
73650
|
+
// link every hole into the outer loop, producing a single-ring polygon without holes
|
|
73651
|
+
function eliminateHoles(data, holeIndices, outerNode, dim) {
|
|
73652
|
+
var queue = [];
|
|
73653
|
+
for (var i = 0, len = holeIndices.length; i < len; i++) {
|
|
73654
|
+
var start = holeIndices[i] * dim;
|
|
73655
|
+
var end = i < len - 1 ? holeIndices[i + 1] * dim : data.length;
|
|
73656
|
+
var list = linkedList(data, start, end, dim, false);
|
|
73657
|
+
if (list === list.next) list.steiner = true;
|
|
73658
|
+
queue.push(getLeftmost(list));
|
|
73659
|
+
}
|
|
73660
|
+
queue.sort(compareX);
|
|
73661
|
+
|
|
73662
|
+
// process holes from left to right
|
|
73663
|
+
for (var _i2 = 0; _i2 < queue.length; _i2++) {
|
|
73664
|
+
outerNode = eliminateHole(queue[_i2], outerNode);
|
|
73665
|
+
}
|
|
73666
|
+
return outerNode;
|
|
73667
|
+
}
|
|
73668
|
+
function compareX(a, b) {
|
|
73669
|
+
return a.x - b.x;
|
|
73670
|
+
}
|
|
73671
|
+
|
|
73672
|
+
// find a bridge between vertices that connects hole with an outer ring and and link it
|
|
73673
|
+
function eliminateHole(hole, outerNode) {
|
|
73674
|
+
var bridge = findHoleBridge(hole, outerNode);
|
|
73675
|
+
if (!bridge) {
|
|
73676
|
+
return outerNode;
|
|
73677
|
+
}
|
|
73678
|
+
var bridgeReverse = splitPolygon(bridge, hole);
|
|
73679
|
+
|
|
73680
|
+
// filter collinear points around the cuts
|
|
73681
|
+
filterPoints(bridgeReverse, bridgeReverse.next);
|
|
73682
|
+
return filterPoints(bridge, bridge.next);
|
|
73683
|
+
}
|
|
73684
|
+
|
|
73685
|
+
// David Eberly's algorithm for finding a bridge between hole and outer polygon
|
|
73686
|
+
function findHoleBridge(hole, outerNode) {
|
|
73687
|
+
var p = outerNode;
|
|
73688
|
+
var hx = hole.x;
|
|
73689
|
+
var hy = hole.y;
|
|
73690
|
+
var qx = -Infinity;
|
|
73691
|
+
var m;
|
|
73692
|
+
|
|
73693
|
+
// find a segment intersected by a ray from the hole's leftmost point to the left;
|
|
73694
|
+
// segment's endpoint with lesser x will be potential connection point
|
|
73695
|
+
do {
|
|
73696
|
+
if (hy <= p.y && hy >= p.next.y && p.next.y !== p.y) {
|
|
73697
|
+
var x = p.x + (hy - p.y) * (p.next.x - p.x) / (p.next.y - p.y);
|
|
73698
|
+
if (x <= hx && x > qx) {
|
|
73699
|
+
qx = x;
|
|
73700
|
+
m = p.x < p.next.x ? p : p.next;
|
|
73701
|
+
if (x === hx) return m; // hole touches outer segment; pick leftmost endpoint
|
|
73702
|
+
}
|
|
73703
|
+
}
|
|
73704
|
+
p = p.next;
|
|
73705
|
+
} while (p !== outerNode);
|
|
73706
|
+
if (!m) return null;
|
|
73707
|
+
|
|
73708
|
+
// look for points inside the triangle of hole point, segment intersection and endpoint;
|
|
73709
|
+
// if there are no points found, we have a valid connection;
|
|
73710
|
+
// otherwise choose the point of the minimum angle with the ray as connection point
|
|
73711
|
+
|
|
73712
|
+
var stop = m;
|
|
73713
|
+
var mx = m.x;
|
|
73714
|
+
var my = m.y;
|
|
73715
|
+
var tanMin = Infinity;
|
|
73716
|
+
p = m;
|
|
73717
|
+
do {
|
|
73718
|
+
if (hx >= p.x && p.x >= mx && hx !== p.x && pointInTriangle(hy < my ? hx : qx, hy, mx, my, hy < my ? qx : hx, hy, p.x, p.y)) {
|
|
73719
|
+
var tan = Math.abs(hy - p.y) / (hx - p.x); // tangential
|
|
73720
|
+
|
|
73721
|
+
if (locallyInside(p, hole) && (tan < tanMin || tan === tanMin && (p.x > m.x || p.x === m.x && sectorContainsSector(m, p)))) {
|
|
73722
|
+
m = p;
|
|
73723
|
+
tanMin = tan;
|
|
73724
|
+
}
|
|
73725
|
+
}
|
|
73726
|
+
p = p.next;
|
|
73727
|
+
} while (p !== stop);
|
|
73728
|
+
return m;
|
|
73729
|
+
}
|
|
73730
|
+
|
|
73731
|
+
// whether sector in vertex m contains sector in vertex p in the same coordinates
|
|
73732
|
+
function sectorContainsSector(m, p) {
|
|
73733
|
+
return area(m.prev, m, p.prev) < 0 && area(p.next, m, m.next) < 0;
|
|
73734
|
+
}
|
|
73735
|
+
|
|
73736
|
+
// interlink polygon nodes in z-order
|
|
73737
|
+
function indexCurve(start, minX, minY, invSize) {
|
|
73738
|
+
var p = start;
|
|
73739
|
+
do {
|
|
73740
|
+
if (p.z === 0) p.z = zOrder(p.x, p.y, minX, minY, invSize);
|
|
73741
|
+
p.prevZ = p.prev;
|
|
73742
|
+
p.nextZ = p.next;
|
|
73743
|
+
p = p.next;
|
|
73744
|
+
} while (p !== start);
|
|
73745
|
+
p.prevZ.nextZ = null;
|
|
73746
|
+
p.prevZ = null;
|
|
73747
|
+
sortLinked(p);
|
|
73748
|
+
}
|
|
73749
|
+
|
|
73750
|
+
// Simon Tatham's linked list merge sort algorithm
|
|
73751
|
+
// http://www.chiark.greenend.org.uk/~sgtatham/algorithms/listsort.html
|
|
73752
|
+
function sortLinked(list) {
|
|
73753
|
+
var numMerges;
|
|
73754
|
+
var inSize = 1;
|
|
73755
|
+
do {
|
|
73756
|
+
var p = list;
|
|
73757
|
+
var e = void 0;
|
|
73758
|
+
list = null;
|
|
73759
|
+
var tail = null;
|
|
73760
|
+
numMerges = 0;
|
|
73761
|
+
while (p) {
|
|
73762
|
+
numMerges++;
|
|
73763
|
+
var q = p;
|
|
73764
|
+
var pSize = 0;
|
|
73765
|
+
for (var i = 0; i < inSize; i++) {
|
|
73766
|
+
pSize++;
|
|
73767
|
+
q = q.nextZ;
|
|
73768
|
+
if (!q) break;
|
|
73769
|
+
}
|
|
73770
|
+
var qSize = inSize;
|
|
73771
|
+
while (pSize > 0 || qSize > 0 && q) {
|
|
73772
|
+
if (pSize !== 0 && (qSize === 0 || !q || p.z <= q.z)) {
|
|
73773
|
+
e = p;
|
|
73774
|
+
p = p.nextZ;
|
|
73775
|
+
pSize--;
|
|
73776
|
+
} else {
|
|
73777
|
+
e = q;
|
|
73778
|
+
q = q.nextZ;
|
|
73779
|
+
qSize--;
|
|
73780
|
+
}
|
|
73781
|
+
if (tail) tail.nextZ = e;else list = e;
|
|
73782
|
+
e.prevZ = tail;
|
|
73783
|
+
tail = e;
|
|
73784
|
+
}
|
|
73785
|
+
p = q;
|
|
73786
|
+
}
|
|
73787
|
+
tail.nextZ = null;
|
|
73788
|
+
inSize *= 2;
|
|
73789
|
+
} while (numMerges > 1);
|
|
73790
|
+
return list;
|
|
73791
|
+
}
|
|
73792
|
+
|
|
73793
|
+
// z-order of a point given coords and inverse of the longer side of data bbox
|
|
73794
|
+
function zOrder(x, y, minX, minY, invSize) {
|
|
73795
|
+
// coords are transformed into non-negative 15-bit integer range
|
|
73796
|
+
x = (x - minX) * invSize | 0;
|
|
73797
|
+
y = (y - minY) * invSize | 0;
|
|
73798
|
+
x = (x | x << 8) & 0x00FF00FF;
|
|
73799
|
+
x = (x | x << 4) & 0x0F0F0F0F;
|
|
73800
|
+
x = (x | x << 2) & 0x33333333;
|
|
73801
|
+
x = (x | x << 1) & 0x55555555;
|
|
73802
|
+
y = (y | y << 8) & 0x00FF00FF;
|
|
73803
|
+
y = (y | y << 4) & 0x0F0F0F0F;
|
|
73804
|
+
y = (y | y << 2) & 0x33333333;
|
|
73805
|
+
y = (y | y << 1) & 0x55555555;
|
|
73806
|
+
return x | y << 1;
|
|
73807
|
+
}
|
|
73808
|
+
|
|
73809
|
+
// find the leftmost node of a polygon ring
|
|
73810
|
+
function getLeftmost(start) {
|
|
73811
|
+
var p = start,
|
|
73812
|
+
leftmost = start;
|
|
73813
|
+
do {
|
|
73814
|
+
if (p.x < leftmost.x || p.x === leftmost.x && p.y < leftmost.y) leftmost = p;
|
|
73815
|
+
p = p.next;
|
|
73816
|
+
} while (p !== start);
|
|
73817
|
+
return leftmost;
|
|
73818
|
+
}
|
|
73819
|
+
|
|
73820
|
+
// check if a point lies within a convex triangle
|
|
73821
|
+
function pointInTriangle(ax, ay, bx, by, cx, cy, px, py) {
|
|
73822
|
+
return (cx - px) * (ay - py) >= (ax - px) * (cy - py) && (ax - px) * (by - py) >= (bx - px) * (ay - py) && (bx - px) * (cy - py) >= (cx - px) * (by - py);
|
|
73823
|
+
}
|
|
73824
|
+
|
|
73825
|
+
// check if a diagonal between two polygon nodes is valid (lies in polygon interior)
|
|
73826
|
+
function isValidDiagonal(a, b) {
|
|
73827
|
+
return a.next.i !== b.i && a.prev.i !== b.i && !intersectsPolygon(a, b) && (
|
|
73828
|
+
// dones't intersect other edges
|
|
73829
|
+
locallyInside(a, b) && locallyInside(b, a) && middleInside(a, b) && (
|
|
73830
|
+
// locally visible
|
|
73831
|
+
area(a.prev, a, b.prev) || area(a, b.prev, b)) ||
|
|
73832
|
+
// does not create opposite-facing sectors
|
|
73833
|
+
equals(a, b) && area(a.prev, a, a.next) > 0 && area(b.prev, b, b.next) > 0); // special zero-length case
|
|
73834
|
+
}
|
|
73835
|
+
|
|
73836
|
+
// signed area of a triangle
|
|
73837
|
+
function area(p, q, r) {
|
|
73838
|
+
return (q.y - p.y) * (r.x - q.x) - (q.x - p.x) * (r.y - q.y);
|
|
73839
|
+
}
|
|
73840
|
+
|
|
73841
|
+
// check if two points are equal
|
|
73842
|
+
function equals(p1, p2) {
|
|
73843
|
+
return p1.x === p2.x && p1.y === p2.y;
|
|
73844
|
+
}
|
|
73845
|
+
|
|
73846
|
+
// check if two segments intersect
|
|
73847
|
+
function intersects(p1, q1, p2, q2) {
|
|
73848
|
+
var o1 = sign(area(p1, q1, p2));
|
|
73849
|
+
var o2 = sign(area(p1, q1, q2));
|
|
73850
|
+
var o3 = sign(area(p2, q2, p1));
|
|
73851
|
+
var o4 = sign(area(p2, q2, q1));
|
|
73852
|
+
if (o1 !== o2 && o3 !== o4) return true; // general case
|
|
73853
|
+
|
|
73854
|
+
if (o1 === 0 && onSegment(p1, p2, q1)) return true; // p1, q1 and p2 are collinear and p2 lies on p1q1
|
|
73855
|
+
if (o2 === 0 && onSegment(p1, q2, q1)) return true; // p1, q1 and q2 are collinear and q2 lies on p1q1
|
|
73856
|
+
if (o3 === 0 && onSegment(p2, p1, q2)) return true; // p2, q2 and p1 are collinear and p1 lies on p2q2
|
|
73857
|
+
if (o4 === 0 && onSegment(p2, q1, q2)) return true; // p2, q2 and q1 are collinear and q1 lies on p2q2
|
|
73858
|
+
|
|
73859
|
+
return false;
|
|
73860
|
+
}
|
|
73861
|
+
|
|
73862
|
+
// for collinear points p, q, r, check if point q lies on segment pr
|
|
73863
|
+
function onSegment(p, q, r) {
|
|
73864
|
+
return q.x <= Math.max(p.x, r.x) && q.x >= Math.min(p.x, r.x) && q.y <= Math.max(p.y, r.y) && q.y >= Math.min(p.y, r.y);
|
|
73865
|
+
}
|
|
73866
|
+
function sign(num) {
|
|
73867
|
+
return num > 0 ? 1 : num < 0 ? -1 : 0;
|
|
73868
|
+
}
|
|
73869
|
+
|
|
73870
|
+
// check if a polygon diagonal intersects any polygon segments
|
|
73871
|
+
function intersectsPolygon(a, b) {
|
|
73872
|
+
var p = a;
|
|
73873
|
+
do {
|
|
73874
|
+
if (p.i !== a.i && p.next.i !== a.i && p.i !== b.i && p.next.i !== b.i && intersects(p, p.next, a, b)) return true;
|
|
73875
|
+
p = p.next;
|
|
73876
|
+
} while (p !== a);
|
|
73877
|
+
return false;
|
|
73878
|
+
}
|
|
73879
|
+
|
|
73880
|
+
// check if a polygon diagonal is locally inside the polygon
|
|
73881
|
+
function locallyInside(a, b) {
|
|
73882
|
+
return area(a.prev, a, a.next) < 0 ? area(a, b, a.next) >= 0 && area(a, a.prev, b) >= 0 : area(a, b, a.prev) < 0 || area(a, a.next, b) < 0;
|
|
73883
|
+
}
|
|
73884
|
+
|
|
73885
|
+
// check if the middle point of a polygon diagonal is inside the polygon
|
|
73886
|
+
function middleInside(a, b) {
|
|
73887
|
+
var p = a;
|
|
73888
|
+
var inside = false;
|
|
73889
|
+
var px = (a.x + b.x) / 2;
|
|
73890
|
+
var py = (a.y + b.y) / 2;
|
|
73891
|
+
do {
|
|
73892
|
+
if (p.y > py !== p.next.y > py && p.next.y !== p.y && px < (p.next.x - p.x) * (py - p.y) / (p.next.y - p.y) + p.x) inside = !inside;
|
|
73893
|
+
p = p.next;
|
|
73894
|
+
} while (p !== a);
|
|
73895
|
+
return inside;
|
|
73896
|
+
}
|
|
73897
|
+
|
|
73898
|
+
// link two polygon vertices with a bridge; if the vertices belong to the same ring, it splits polygon into two;
|
|
73899
|
+
// if one belongs to the outer ring and another to a hole, it merges it into a single ring
|
|
73900
|
+
function splitPolygon(a, b) {
|
|
73901
|
+
var a2 = createNode(a.i, a.x, a.y),
|
|
73902
|
+
b2 = createNode(b.i, b.x, b.y),
|
|
73903
|
+
an = a.next,
|
|
73904
|
+
bp = b.prev;
|
|
73905
|
+
a.next = b;
|
|
73906
|
+
b.prev = a;
|
|
73907
|
+
a2.next = an;
|
|
73908
|
+
an.prev = a2;
|
|
73909
|
+
b2.next = a2;
|
|
73910
|
+
a2.prev = b2;
|
|
73911
|
+
bp.next = b2;
|
|
73912
|
+
b2.prev = bp;
|
|
73913
|
+
return b2;
|
|
73914
|
+
}
|
|
73915
|
+
|
|
73916
|
+
// create a node and optionally link it with previous one (in a circular doubly linked list)
|
|
73917
|
+
function insertNode(i, x, y, last) {
|
|
73918
|
+
var p = createNode(i, x, y);
|
|
73919
|
+
if (!last) {
|
|
73920
|
+
p.prev = p;
|
|
73921
|
+
p.next = p;
|
|
73922
|
+
} else {
|
|
73923
|
+
p.next = last.next;
|
|
73924
|
+
p.prev = last;
|
|
73925
|
+
last.next.prev = p;
|
|
73926
|
+
last.next = p;
|
|
73927
|
+
}
|
|
73928
|
+
return p;
|
|
73929
|
+
}
|
|
73930
|
+
function removeNode(p) {
|
|
73931
|
+
p.next.prev = p.prev;
|
|
73932
|
+
p.prev.next = p.next;
|
|
73933
|
+
if (p.prevZ) p.prevZ.nextZ = p.nextZ;
|
|
73934
|
+
if (p.nextZ) p.nextZ.prevZ = p.prevZ;
|
|
73935
|
+
}
|
|
73936
|
+
function createNode(i, x, y) {
|
|
73937
|
+
return {
|
|
73938
|
+
i: i,
|
|
73939
|
+
// vertex index in coordinates array
|
|
73940
|
+
x: x,
|
|
73941
|
+
y: y,
|
|
73942
|
+
// vertex coordinates
|
|
73943
|
+
prev: null,
|
|
73944
|
+
// previous and next vertex nodes in a polygon ring
|
|
73945
|
+
next: null,
|
|
73946
|
+
z: 0,
|
|
73947
|
+
// z-order curve value
|
|
73948
|
+
prevZ: null,
|
|
73949
|
+
// previous and next nodes in z-order
|
|
73950
|
+
nextZ: null,
|
|
73951
|
+
steiner: false // indicates whether this is a steiner point
|
|
73952
|
+
};
|
|
73953
|
+
}
|
|
73954
|
+
|
|
73955
|
+
// return a percentage difference between the polygon area and its triangulation area;
|
|
73956
|
+
// used to verify correctness of triangulation
|
|
73957
|
+
function deviation(data, holeIndices, dim, triangles) {
|
|
73958
|
+
var hasHoles = holeIndices && holeIndices.length;
|
|
73959
|
+
var outerLen = hasHoles ? holeIndices[0] * dim : data.length;
|
|
73960
|
+
var polygonArea = Math.abs(signedArea(data, 0, outerLen, dim));
|
|
73961
|
+
if (hasHoles) {
|
|
73962
|
+
for (var i = 0, len = holeIndices.length; i < len; i++) {
|
|
73963
|
+
var start = holeIndices[i] * dim;
|
|
73964
|
+
var end = i < len - 1 ? holeIndices[i + 1] * dim : data.length;
|
|
73965
|
+
polygonArea -= Math.abs(signedArea(data, start, end, dim));
|
|
73966
|
+
}
|
|
73967
|
+
}
|
|
73968
|
+
var trianglesArea = 0;
|
|
73969
|
+
for (var _i3 = 0; _i3 < triangles.length; _i3 += 3) {
|
|
73970
|
+
var a = triangles[_i3] * dim;
|
|
73971
|
+
var b = triangles[_i3 + 1] * dim;
|
|
73972
|
+
var c = triangles[_i3 + 2] * dim;
|
|
73973
|
+
trianglesArea += Math.abs((data[a] - data[c]) * (data[b + 1] - data[a + 1]) - (data[a] - data[b]) * (data[c + 1] - data[a + 1]));
|
|
73974
|
+
}
|
|
73975
|
+
return polygonArea === 0 && trianglesArea === 0 ? 0 : Math.abs((trianglesArea - polygonArea) / polygonArea);
|
|
73976
|
+
}
|
|
73977
|
+
function signedArea(data, start, end, dim) {
|
|
73978
|
+
var sum = 0;
|
|
73979
|
+
for (var i = start, j = end - dim; i < end; i += dim) {
|
|
73980
|
+
sum += (data[j] - data[i]) * (data[i + 1] + data[j + 1]);
|
|
73981
|
+
j = i;
|
|
73982
|
+
}
|
|
73983
|
+
return sum;
|
|
73984
|
+
}
|
|
73985
|
+
|
|
73986
|
+
// turn a polygon in a multi-dimensional array form (e.g. as in GeoJSON) into a form Earcut accepts
|
|
73987
|
+
function flatten(data) {
|
|
73988
|
+
var vertices = [];
|
|
73989
|
+
var holes = [];
|
|
73990
|
+
var dimensions = data[0][0].length;
|
|
73991
|
+
var holeIndex = 0;
|
|
73992
|
+
var prevLen = 0;
|
|
73993
|
+
var _iterator = _createForOfIteratorHelper(data),
|
|
73994
|
+
_step;
|
|
73995
|
+
try {
|
|
73996
|
+
for (_iterator.s(); !(_step = _iterator.n()).done;) {
|
|
73997
|
+
var ring = _step.value;
|
|
73998
|
+
var _iterator2 = _createForOfIteratorHelper(ring),
|
|
73999
|
+
_step2;
|
|
74000
|
+
try {
|
|
74001
|
+
for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
|
|
74002
|
+
var p = _step2.value;
|
|
74003
|
+
for (var d = 0; d < dimensions; d++) vertices.push(p[d]);
|
|
74004
|
+
}
|
|
74005
|
+
} catch (err) {
|
|
74006
|
+
_iterator2.e(err);
|
|
74007
|
+
} finally {
|
|
74008
|
+
_iterator2.f();
|
|
74009
|
+
}
|
|
74010
|
+
if (prevLen) {
|
|
74011
|
+
holeIndex += prevLen;
|
|
74012
|
+
holes.push(holeIndex);
|
|
74013
|
+
}
|
|
74014
|
+
prevLen = ring.length;
|
|
74015
|
+
}
|
|
74016
|
+
} catch (err) {
|
|
74017
|
+
_iterator.e(err);
|
|
74018
|
+
} finally {
|
|
74019
|
+
_iterator.f();
|
|
74020
|
+
}
|
|
74021
|
+
return {
|
|
74022
|
+
vertices: vertices,
|
|
74023
|
+
holes: holes,
|
|
74024
|
+
dimensions: dimensions
|
|
74025
|
+
};
|
|
74026
|
+
}
|
|
74027
|
+
|
|
74028
|
+
/***/ }),
|
|
74029
|
+
|
|
74067
74030
|
/***/ 4279:
|
|
74068
74031
|
/***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) {
|
|
74069
74032
|
|
|
@@ -74655,8 +74618,8 @@ __webpack_require__.r(__webpack_exports__);
|
|
|
74655
74618
|
/******/ // undefined = chunk not loaded, null = chunk preloaded/prefetched
|
|
74656
74619
|
/******/ // [resolve, reject, Promise] = chunk loading, 0 = chunk loaded
|
|
74657
74620
|
/******/ var installedChunks = {
|
|
74658
|
-
/******/
|
|
74659
|
-
/******/
|
|
74621
|
+
/******/ 294: 0,
|
|
74622
|
+
/******/ 692: 0
|
|
74660
74623
|
/******/ };
|
|
74661
74624
|
/******/
|
|
74662
74625
|
/******/ // no chunk on demand loading
|