@maplibre/geojson-vt 6.0.5 → 6.1.0
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/dist/difference.d.ts.map +1 -1
- package/dist/geojson-vt-dev.js +15 -41
- package/dist/geojson-vt.js +1 -1
- package/dist/geojson-vt.mjs +15 -41
- package/dist/geojson-vt.mjs.map +1 -1
- package/dist/geojsonvt.d.ts +0 -15
- package/dist/geojsonvt.d.ts.map +1 -1
- package/dist/tile-index.d.ts +1 -2
- package/dist/tile-index.d.ts.map +1 -1
- package/dist/tile-index.test.d.ts +2 -0
- package/dist/tile-index.test.d.ts.map +1 -0
- package/package.json +1 -1
- package/src/difference.ts +13 -15
- package/src/geojsonvt.ts +0 -26
- package/src/tile-index.test.ts +270 -0
- package/src/tile-index.ts +5 -5
package/dist/difference.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"difference.d.ts","sourceRoot":"","sources":["../src/difference.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,wBAAwB,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAEhF,MAAM,MAAM,mBAAmB,GAAG;IAC9B;;OAEG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB;;OAEG;IACH,MAAM,CAAC,EAAE,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,CAAC;IAC7B;;OAEG;IACH,GAAG,CAAC,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC;IACxB;;OAEG;IACH,MAAM,CAAC,EAAE,oBAAoB,EAAE,CAAC;CACnC,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG;IAC/B;;OAEG;IACH,EAAE,EAAE,MAAM,GAAG,MAAM,CAAC;IACpB;;OAEG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC,QAAQ,CAAC;IAC/B;;OAEG;IACH,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B;;OAEG;IACH,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC5B;;OAEG;IACH,qBAAqB,CAAC,EAAE;QACpB,GAAG,EAAE,MAAM,CAAC;QACZ,KAAK,EAAE,OAAO,CAAC;KAClB,EAAE,CAAC;CACP,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG;IAChC;;OAEG;IACH,QAAQ,EAAE,wBAAwB,EAAE,CAAC;IACrC;;OAEG;IACH,MAAM,EAAE,wBAAwB,EAAE,CAAC;CACtC,CAAC;AAEF,KAAK,yBAAyB,GAAG;IAC7B,SAAS,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAChC,MAAM,EAAE,GAAG,CAAC,MAAM,GAAG,MAAM,CAAC,CAAC;IAC7B,GAAG,EAAE,GAAG,CAAC,MAAM,GAAG,MAAM,GAAG,SAAS,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;IACvD,MAAM,EAAE,GAAG,CAAC,MAAM,GAAG,MAAM,EAAE,oBAAoB,CAAC,CAAC;CACtD,CAAC;AAEF;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,wBAAwB,EAAE,EAAE,QAAQ,EAAE,mBAAmB,EAAE,OAAO,EAAE,gBAAgB,GAAG,qBAAqB,
|
|
1
|
+
{"version":3,"file":"difference.d.ts","sourceRoot":"","sources":["../src/difference.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,wBAAwB,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAEhF,MAAM,MAAM,mBAAmB,GAAG;IAC9B;;OAEG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB;;OAEG;IACH,MAAM,CAAC,EAAE,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,CAAC;IAC7B;;OAEG;IACH,GAAG,CAAC,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC;IACxB;;OAEG;IACH,MAAM,CAAC,EAAE,oBAAoB,EAAE,CAAC;CACnC,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG;IAC/B;;OAEG;IACH,EAAE,EAAE,MAAM,GAAG,MAAM,CAAC;IACpB;;OAEG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC,QAAQ,CAAC;IAC/B;;OAEG;IACH,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B;;OAEG;IACH,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC5B;;OAEG;IACH,qBAAqB,CAAC,EAAE;QACpB,GAAG,EAAE,MAAM,CAAC;QACZ,KAAK,EAAE,OAAO,CAAC;KAClB,EAAE,CAAC;CACP,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG;IAChC;;OAEG;IACH,QAAQ,EAAE,wBAAwB,EAAE,CAAC;IACrC;;OAEG;IACH,MAAM,EAAE,wBAAwB,EAAE,CAAC;CACtC,CAAC;AAEF,KAAK,yBAAyB,GAAG;IAC7B,SAAS,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAChC,MAAM,EAAE,GAAG,CAAC,MAAM,GAAG,MAAM,CAAC,CAAC;IAC7B,GAAG,EAAE,GAAG,CAAC,MAAM,GAAG,MAAM,GAAG,SAAS,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;IACvD,MAAM,EAAE,GAAG,CAAC,MAAM,GAAG,MAAM,EAAE,oBAAoB,CAAC,CAAC;CACtD,CAAC;AAEF;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,wBAAwB,EAAE,EAAE,QAAQ,EAAE,mBAAmB,EAAE,OAAO,EAAE,gBAAgB,GAAG,qBAAqB,CA2DnJ;AAqED;;GAEG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,mBAAmB,EAAE,OAAO,EAAE,gBAAgB,GAAG,yBAAyB,CAe5G"}
|
package/dist/geojson-vt-dev.js
CHANGED
|
@@ -737,26 +737,25 @@ function applySourceDiff(source, dataDiff, options) {
|
|
|
737
737
|
}
|
|
738
738
|
if (diff.update.size) {
|
|
739
739
|
// Features can be duplicated across the antimeridian (wrap) in a single tile, so must update all instances with the same id
|
|
740
|
-
|
|
741
|
-
|
|
742
|
-
|
|
743
|
-
|
|
744
|
-
|
|
745
|
-
|
|
746
|
-
|
|
747
|
-
|
|
748
|
-
keepFeatures.push(feature);
|
|
749
|
-
}
|
|
740
|
+
const oldFeaturesMap = new Map();
|
|
741
|
+
const keepFeatures = [];
|
|
742
|
+
for (const feature of source) {
|
|
743
|
+
if (diff.update.has(feature.id)) {
|
|
744
|
+
oldFeaturesMap.set(feature.id, [...(oldFeaturesMap.get(feature.id) || []), feature]);
|
|
745
|
+
}
|
|
746
|
+
else {
|
|
747
|
+
keepFeatures.push(feature);
|
|
750
748
|
}
|
|
751
|
-
|
|
749
|
+
}
|
|
750
|
+
for (const [id, update] of diff.update) {
|
|
751
|
+
const oldFeatures = oldFeaturesMap.get(id);
|
|
752
|
+
if (!oldFeatures || oldFeatures.length === 0)
|
|
752
753
|
continue;
|
|
753
754
|
const updatedFeatures = getUpdatedFeatures(oldFeatures, update, options);
|
|
754
|
-
if (!updatedFeatures.length)
|
|
755
|
-
continue;
|
|
756
755
|
affected.push(...oldFeatures, ...updatedFeatures);
|
|
757
756
|
keepFeatures.push(...updatedFeatures);
|
|
758
|
-
source = keepFeatures;
|
|
759
757
|
}
|
|
758
|
+
source = keepFeatures;
|
|
760
759
|
}
|
|
761
760
|
return { affected, source };
|
|
762
761
|
}
|
|
@@ -794,7 +793,7 @@ function getUpdatedFeatures(vtFeatures, update, options) {
|
|
|
794
793
|
}
|
|
795
794
|
return updated;
|
|
796
795
|
}
|
|
797
|
-
return
|
|
796
|
+
return vtFeatures;
|
|
798
797
|
}
|
|
799
798
|
/**
|
|
800
799
|
* helper to apply property updates from a diff update object to a properties object
|
|
@@ -1831,10 +1830,9 @@ function transformPoint(x, y, extent, z2, tx, ty) {
|
|
|
1831
1830
|
class TileIndex {
|
|
1832
1831
|
constructor(options) {
|
|
1833
1832
|
this.options = options;
|
|
1833
|
+
this.total = 0;
|
|
1834
1834
|
/** @internal */
|
|
1835
1835
|
this.stats = {};
|
|
1836
|
-
/** @internal */
|
|
1837
|
-
this.total = 0;
|
|
1838
1836
|
this.tiles = {};
|
|
1839
1837
|
this.tileCoords = [];
|
|
1840
1838
|
this.stats = {};
|
|
@@ -2109,30 +2107,6 @@ const defaultOptions = {
|
|
|
2109
2107
|
* Main class for creating and managing a vector tile index from GeoJSON data.
|
|
2110
2108
|
*/
|
|
2111
2109
|
class GeoJSONVT {
|
|
2112
|
-
/**
|
|
2113
|
-
* @internal
|
|
2114
|
-
* This is for the tests
|
|
2115
|
-
*/
|
|
2116
|
-
get tiles() {
|
|
2117
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
2118
|
-
return this.tileIndex?.tiles ?? {};
|
|
2119
|
-
}
|
|
2120
|
-
/**
|
|
2121
|
-
* @internal
|
|
2122
|
-
* This is for the tests
|
|
2123
|
-
*/
|
|
2124
|
-
get stats() {
|
|
2125
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
2126
|
-
return this.tileIndex.stats;
|
|
2127
|
-
}
|
|
2128
|
-
/**
|
|
2129
|
-
* @internal
|
|
2130
|
-
* This is for the tests
|
|
2131
|
-
*/
|
|
2132
|
-
get total() {
|
|
2133
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
2134
|
-
return this.tileIndex.total;
|
|
2135
|
-
}
|
|
2136
2110
|
constructor(data, options) {
|
|
2137
2111
|
options = this.options = Object.assign({}, defaultOptions, options);
|
|
2138
2112
|
const debug = options.debug;
|
package/dist/geojson-vt.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports):"function"==typeof define&&define.amd?define(["exports"],e):e((t="undefined"!=typeof globalThis?globalThis:t||self).geojsonvt={})}(this,(function(t){"use strict";function e(t,o,s,i){let r=i;const a=o+(s-o>>1);let u,c=s-o;const l=t[o],h=t[o+1],p=t[s],d=t[s+1];for(let e=o+3;e<s;e+=3){const o=n(t[e],t[e+1],l,h,p,d);if(o>r)u=e,r=o;else if(o===r){const t=Math.abs(e-a);t<c&&(u=e,c=t)}}r>i&&(u-o>3&&e(t,o,u,i),t[u+2]=r,s-u>3&&e(t,u,s,i))}function n(t,e,n,o,s,i){let r=s-n,a=i-o;if(0!==r||0!==a){const u=((t-n)*r+(e-o)*a)/(r*r+a*a);u>1?(n=s,o=i):u>0&&(n+=r*u,o+=a*u)}return r=t-n,a=e-o,r*r+a*a}function o(t,e,n,o){const s={type:e,geom:n},r={id:null==t?null:t,type:s.type,geometry:s.geom,tags:o,minX:1/0,minY:1/0,maxX:-1/0,maxY:-1/0};switch(s.type){case"Point":case"MultiPoint":i(r,s.geom);break;case"LineString":i(r,s.geom.points);break;case"Polygon":i(r,s.geom[0].points);break;case"MultiLineString":for(const t of s.geom)i(r,t.points);break;case"MultiPolygon":for(const t of s.geom)i(r,t[0].points)}return r}function s(t){const e=t;t.points.length>64&&(e.points=new Float64Array(t.points))}function i(t,e){for(let n=0;n<e.length;n+=3)t.minX=Math.min(t.minX,e[n]),t.minY=Math.min(t.minY,e[n+1]),t.maxX=Math.max(t.maxX,e[n]),t.maxY=Math.max(t.maxY,e[n+1])}function r(t,e){const n=[];switch(t.type){case"FeatureCollection":for(let o=0;o<t.features.length;o++)a(n,t.features[o],e,o);break;case"Feature":a(n,t,e);break;default:a(n,{geometry:t,properties:void 0},e)}return n}function a(t,e,n,s){if(!e.geometry)return;if("GeometryCollection"===e.geometry.type)return void function(t,e,n,o,s){for(const i of n.geometries)a(t,{id:e.id,geometry:i,properties:e.properties},o,s)}(t,e,e.geometry,n,s);const i=e.geometry.coordinates;if(!i?.length)return;const r=function(t,e,n){if(e.promoteId)return t.properties?.[e.promoteId];if(e.generateId)return n||0;return t.id}(e,n,s),p=Math.pow(n.tolerance/((1<<n.maxZoom)*n.extent),2);switch(e.geometry.type){case"Point":return void function(t,e,n,s){const i=[];i.push(l(n.coordinates[0]),h(n.coordinates[1]),0),t.push(o(e,"Point",i,s))}(t,r,e.geometry,e.properties);case"MultiPoint":return void function(t,e,n,s){const i=[];for(const t of n.coordinates)i.push(l(t[0]),h(t[1]),0);t.push(o(e,"MultiPoint",i,s))}(t,r,e.geometry,e.properties);case"LineString":return void function(t,e,n,s,i){const r={points:[]};u(n.coordinates,r,s,!1),t.push(o(e,"LineString",r,i))}(t,r,e.geometry,p,e.properties);case"MultiLineString":return void function(t,e,n,s,i,r){if(i.lineMetrics)for(const i of n.coordinates){const n={points:[]};u(i,n,s,!1),t.push(o(e,"LineString",n,r))}else{const i=[];c(n.coordinates,i,s,!1),t.push(o(e,"MultiLineString",i,r))}}(t,r,e.geometry,p,n,e.properties);case"Polygon":return void function(t,e,n,s,i){const r=[];c(n.coordinates,r,s,!0),t.push(o(e,"Polygon",r,i))}(t,r,e.geometry,p,e.properties);case"MultiPolygon":return void function(t,e,n,s,i){const r=[];for(const t of n.coordinates){const e=[];c(t,e,s,!0),r.push(e)}t.push(o(e,"MultiPolygon",r,i))}(t,r,e.geometry,p,e.properties);default:throw new Error("Input data is not a valid GeoJSON object.")}}function u(t,n,o,i){let r,a,u=0;for(let e=0;e<t.length;e++){const o=l(t[e][0]),s=h(t[e][1]);n.points.push(o,s,0),e>0&&(u+=i?(r*s-o*a)/2:Math.sqrt(Math.pow(o-r,2)+Math.pow(s-a,2))),r=o,a=s}const c=n.points.length-3;n.points[2]=1,o>0&&e(n.points,0,c,o),n.points[c+2]=1,s(n),n.size=Math.abs(u),n.start=0,n.end=n.size}function c(t,e,n,o){for(let s=0;s<t.length;s++){const i={points:[]};u(t[s],i,n,o),e.push(i)}}function l(t){return t/360+.5}function h(t){const e=Math.sin(t*Math.PI/180),n=.5-.25*Math.log((1+e)/(1-e))/Math.PI;return n<0?0:n>1?1:n}function p(t){const e={type:"Feature",geometry:d(t),properties:t.tags};return null!=t.id&&(e.id=t.id),e}function d(t){const{type:e,geometry:n}=t;switch(e){case"Point":return{type:e,coordinates:g(n[0],n[1])};case"MultiPoint":return{type:e,coordinates:f(n)};case"LineString":return{type:e,coordinates:f(n.points)};case"MultiLineString":case"Polygon":return{type:e,coordinates:n.map((t=>f(t.points)))};case"MultiPolygon":return{type:e,coordinates:n.map((t=>t.map((t=>f(t.points)))))}}}function f(t){const e=[];for(let n=0;n<t.length;n+=3)e.push(g(t[n],t[n+1]));return e}function g(t,e){return[m(t),y(e)]}function m(t){return 360*(t-.5)}function y(t){const e=(180-360*t)*Math.PI/180;return 360*Math.atan(Math.exp(e))/Math.PI-90}var x;function M(t,e,n,o,s,i,r,a){if(o/=e,i>=(n/=e)&&r<o)return t;if(r<n||i>=o)return null;const u=[];for(const e of t){const t=s===x.X?e.minX:e.minY,i=s===x.X?e.maxX:e.maxY;if(t>=n&&i<o)u.push(e);else if(!(i<n||t>=o))switch(e.type){case"Point":case"MultiPoint":w(e,u,n,o,s);continue;case"LineString":P(e,u,n,o,s,a);continue;case"MultiLineString":I(e,u,n,o,s);continue;case"Polygon":v(e,u,n,o,s);continue;case"MultiPolygon":b(e,u,n,o,s);continue}}return u.length?u:null}function w(t,e,n,s,i){const r=[];if(function(t,e,n,o,s){for(let i=0;i<t.length;i+=3){const r=t[i+s];r>=n&&r<=o&&E(e,t[i],t[i+1],t[i+2])}}(t.geometry,r,n,s,i),!r.length)return;const a=3===r.length?"Point":"MultiPoint";e.push(o(t.id,a,r,t.tags))}function P(t,e,n,s,i,r){const a=[];if(S(t.geometry,a,n,s,i,!1,r.lineMetrics),a.length)if(r.lineMetrics)for(const n of a)e.push(o(t.id,"LineString",n,t.tags));else a.length>1?e.push(o(t.id,"MultiLineString",a,t.tags)):e.push(o(t.id,"LineString",a[0],t.tags))}function I(t,e,n,s,i){const r=[];A(t.geometry,r,n,s,i,!1),r.length&&(1!==r.length?e.push(o(t.id,"MultiLineString",r,t.tags)):e.push(o(t.id,"LineString",r[0],t.tags)))}function v(t,e,n,s,i){const r=[];A(t.geometry,r,n,s,i,!0),r.length&&e.push(o(t.id,"Polygon",r,t.tags))}function b(t,e,n,s,i){const r=[];for(const e of t.geometry){const t=[];A(e,t,n,s,i,!0),t.length&&r.push(t)}r.length&&e.push(o(t.id,"MultiPolygon",r,t.tags))}function S(t,e,n,o,i,r,a){let u=z(t);const c=i===x.X?T:X;let l,h,p=t.start;for(let s=0;s<t.points.length-3;s+=3){const d=t.points[s],f=t.points[s+1],g=t.points[s+2],m=t.points[s+3],y=t.points[s+4],M=i===x.X?d:f,w=i===x.X?m:y;let P=!1;a&&(l=Math.sqrt(Math.pow(d-m,2)+Math.pow(f-y,2))),M<n?w>n&&(h=c(u,d,f,m,y,n),a&&(u.start=p+l*h)):M>o?w<o&&(h=c(u,d,f,m,y,o),a&&(u.start=p+l*h)):E(u.points,d,f,g),w<n&&M>=n&&(h=c(u,d,f,m,y,n),P=!0),w>o&&M<=o&&(h=c(u,d,f,m,y,o),P=!0),!r&&P&&(a&&(u.end=p+l*h),e.push(u),u=z(t)),a&&(p+=l)}let d=t.points.length-3;const f=t.points[d],g=t.points[d+1],m=t.points[d+2],y=i===x.X?f:g;y>=n&&y<=o&&E(u.points,f,g,m),d=u.points.length-3,r&&d>=3&&(u.points[d]!==u.points[0]||u.points[d+1]!==u.points[1])&&E(u.points,u.points[0],u.points[1],u.points[2]),u.points.length&&(s(u),e.push(u))}function z(t){return{points:[],size:t.size,start:t.start,end:t.end}}function A(t,e,n,o,s,i){for(const r of t)S(r,e,n,o,s,i,!1)}function E(t,e,n,o){t.push(e,n,o)}function T(t,e,n,o,s,i){const r=(i-e)/(o-e);return E(t.points,i,n+(s-n)*r,1),r}function X(t,e,n,o,s,i){const r=(i-n)/(s-n);return E(t.points,e+(o-e)*r,i,1),r}function Y(t,e){const n=e.buffer/e.extent;let o=t;const s=M(t,1,-1-n,n,x.X,-1,2,e),i=M(t,1,1-n,2+n,x.X,-1,2,e);return s||i?(o=M(t,1,-n,1+n,x.X,-1,2,e)||[],s&&(o=L(s,1).concat(o)),i&&(o=o.concat(L(i,-1))),o):o}function L(t,e){const n=[];for(const s of t)switch(s.type){case"Point":case"MultiPoint":{const t=O(s.geometry,e);n.push(o(s.id,s.type,t,s.tags));continue}case"LineString":{const t=C(s.geometry,e);n.push(o(s.id,s.type,t,s.tags));continue}case"MultiLineString":case"Polygon":{const t=[];for(const n of s.geometry)t.push(C(n,e));n.push(o(s.id,s.type,t,s.tags));continue}case"MultiPolygon":{const t=[];for(const n of s.geometry){const o=[];for(const t of n)o.push(C(t,e));t.push(o)}n.push(o(s.id,s.type,t,s.tags));continue}}return n}function O(t,e){const n=[];for(let o=0;o<t.length;o+=3)n.push(t[o]+e,t[o+1],t[o+2]);return n}function C(t,e){const n={points:[],size:t.size};void 0!==t.start&&(n.start=t.start,n.end=t.end);for(let o=0;o<t.points.length;o+=3)n.points.push(t.points[o]+e,t.points[o+1],t.points[o+2]);return s(n),n}function _(t,e,n){const o=function(t,e){if(!t)return{remove:new Set,add:new Map,update:new Map};const n={removeAll:t.removeAll,remove:new Set(t.remove||[]),add:new Map(t.add?.map((t=>[e.promoteId?t.properties[e.promoteId]:t.id,t]))),update:new Map(t.update?.map((t=>[t.id,t])))};return n}(e,n);let s=[];if(o.removeAll&&(s=t,t=[]),o.remove.size||o.add.size){const e=[];for(const n of t)(o.remove.has(n.id)||o.add.has(n.id))&&e.push(n);if(e.length){s.push(...e);const n=new Set(e.map((t=>t.id)));t=t.filter((t=>!n.has(t.id)))}if(o.add.size){let e=r({type:"FeatureCollection",features:Array.from(o.add.values())},n);e=Y(e,n),s.push(...e),t.push(...e)}}if(o.update.size)for(const[e,i]of o.update){const o=[],r=[];for(const n of t)n.id===e?o.push(n):r.push(n);if(!o.length)continue;const a=Z(o,i,n);a.length&&(s.push(...o,...a),r.push(...a),t=r)}return{affected:s,source:t}}function Z(t,e,n){const o=!!e.newGeometry,s=e.removeAllProperties||e.removeProperties?.length>0||e.addOrUpdateProperties?.length>0;if(o){const o=t[0];let i=r({type:"FeatureCollection",features:[{type:"Feature",id:o.id,geometry:e.newGeometry,properties:s?F(o.tags,e):o.tags}]},n);return i=Y(i,n),i}if(s){const n=[];for(const o of t){const t={...o};t.tags=F(t.tags,e),n.push(t)}return n}return[]}function F(t,e){if(e.removeAllProperties)return{};const n={...t||{}};if(e.removeProperties)for(const t of e.removeProperties)delete n[t];if(e.addOrUpdateProperties)for(const{key:t,value:o}of e.addOrUpdateProperties)n[t]=o;return n}!function(t){t[t.X=0]="X",t[t.Y=1]="Y"}(x||(x={}));const U=[Int8Array,Uint8Array,Uint8ClampedArray,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array];class D{static from(t){if(!(t instanceof ArrayBuffer))throw new Error("Data must be an instance of ArrayBuffer.");const[e,n]=new Uint8Array(t,0,2);if(219!==e)throw new Error("Data does not appear to be in a KDBush format.");const o=n>>4;if(1!==o)throw new Error(`Got v${o} data when expected v1.`);const s=U[15&n];if(!s)throw new Error("Unrecognized array type.");const[i]=new Uint16Array(t,2,1),[r]=new Uint32Array(t,4,1);return new D(r,i,s,t)}constructor(t,e=64,n=Float64Array,o){if(isNaN(t)||t<0)throw new Error(`Unpexpected numItems value: ${t}.`);this.numItems=+t,this.nodeSize=Math.min(Math.max(+e,2),65535),this.ArrayType=n,this.IndexArrayType=t<65536?Uint16Array:Uint32Array;const s=U.indexOf(this.ArrayType),i=2*t*this.ArrayType.BYTES_PER_ELEMENT,r=t*this.IndexArrayType.BYTES_PER_ELEMENT,a=(8-r%8)%8;if(s<0)throw new Error(`Unexpected typed array class: ${n}.`);o&&o instanceof ArrayBuffer?(this.data=o,this.ids=new this.IndexArrayType(this.data,8,t),this.coords=new this.ArrayType(this.data,8+r+a,2*t),this._pos=2*t,this._finished=!0):(this.data=new ArrayBuffer(8+i+r+a),this.ids=new this.IndexArrayType(this.data,8,t),this.coords=new this.ArrayType(this.data,8+r+a,2*t),this._pos=0,this._finished=!1,new Uint8Array(this.data,0,2).set([219,16+s]),new Uint16Array(this.data,2,1)[0]=e,new Uint32Array(this.data,4,1)[0]=t)}add(t,e){const n=this._pos>>1;return this.ids[n]=n,this.coords[this._pos++]=t,this.coords[this._pos++]=e,n}finish(){const t=this._pos>>1;if(t!==this.numItems)throw new Error(`Added ${t} items when expected ${this.numItems}.`);return j(this.ids,this.coords,this.nodeSize,0,this.numItems-1,0),this._finished=!0,this}range(t,e,n,o){if(!this._finished)throw new Error("Data not yet indexed - call index.finish().");const{ids:s,coords:i,nodeSize:r}=this,a=[0,s.length-1,0],u=[];for(;a.length;){const c=a.pop()||0,l=a.pop()||0,h=a.pop()||0;if(l-h<=r){for(let r=h;r<=l;r++){const a=i[2*r],c=i[2*r+1];a>=t&&a<=n&&c>=e&&c<=o&&u.push(s[r])}continue}const p=h+l>>1,d=i[2*p],f=i[2*p+1];d>=t&&d<=n&&f>=e&&f<=o&&u.push(s[p]),(0===c?t<=d:e<=f)&&(a.push(h),a.push(p-1),a.push(1-c)),(0===c?n>=d:o>=f)&&(a.push(p+1),a.push(l),a.push(1-c))}return u}within(t,e,n){if(!this._finished)throw new Error("Data not yet indexed - call index.finish().");const{ids:o,coords:s,nodeSize:i}=this,r=[0,o.length-1,0],a=[],u=n*n;for(;r.length;){const c=r.pop()||0,l=r.pop()||0,h=r.pop()||0;if(l-h<=i){for(let n=h;n<=l;n++)G(s[2*n],s[2*n+1],t,e)<=u&&a.push(o[n]);continue}const p=h+l>>1,d=s[2*p],f=s[2*p+1];G(d,f,t,e)<=u&&a.push(o[p]),(0===c?t-n<=d:e-n<=f)&&(r.push(h),r.push(p-1),r.push(1-c)),(0===c?t+n>=d:e+n>=f)&&(r.push(p+1),r.push(l),r.push(1-c))}return a}}function j(t,e,n,o,s,i){if(s-o<=n)return;const r=o+s>>1;N(t,e,r,o,s,i),j(t,e,n,o,r-1,1-i),j(t,e,n,r+1,s,1-i)}function N(t,e,n,o,s,i){for(;s>o;){if(s-o>600){const r=s-o+1,a=n-o+1,u=Math.log(r),c=.5*Math.exp(2*u/3),l=.5*Math.sqrt(u*c*(r-c)/r)*(a-r/2<0?-1:1);N(t,e,n,Math.max(o,Math.floor(n-a*c/r+l)),Math.min(s,Math.floor(n+(r-a)*c/r+l)),i)}const r=e[2*n+i];let a=o,u=s;for(k(t,e,o,n),e[2*s+i]>r&&k(t,e,o,s);a<u;){for(k(t,e,a,u),a++,u--;e[2*a+i]<r;)a++;for(;e[2*u+i]>r;)u--}e[2*o+i]===r?k(t,e,o,u):(u++,k(t,e,u,s)),u<=n&&(o=u+1),n<=u&&(s=u-1)}}function k(t,e,n,o){$(t,n,o),$(e,2*n,2*o),$(e,2*n+1,2*o+1)}function $(t,e,n){const o=t[e];t[e]=t[n],t[n]=o}function G(t,e,n,o){const s=t-n,i=e-o;return s*s+i*i}const B={minZoom:0,maxZoom:16,minPoints:2,radius:40,extent:512,nodeSize:64,log:!1,generateId:!1,reduce:null,map:t=>t},J=3,q=5,R=6;class V{constructor(t){this.options=Object.assign(Object.create(B),t),this.trees=new Array(this.options.maxZoom+1),this.stride=this.options.reduce?7:6,this.clusterProps=[],this.points=[]}load(t){const e=[];for(const n of t){if(!n.geometry)continue;const[t,o]=n.geometry.coordinates,[s,i]=[l(t),h(o)],r={id:n.id,type:"Point",geometry:[s,i],tags:n.properties};e.push(r)}this.createIndex(e)}initialize(t){const e=[];for(const n of t)"Point"===n.type&&e.push(n);this.createIndex(e)}updateIndex(t,e,n){this.options=Object.assign(Object.create(B),n.clusterOptions),this.initialize(t)}createIndex(t){const{log:e,minZoom:n,maxZoom:o}=this.options;e&&console.time("total time");const s=`prepare ${t.length} points`;e&&console.time(s),this.points=t;const i=[];for(let e=0;e<t.length;e++){const n=t[e];if(!n?.geometry)continue;let[o,s]=n.geometry;o=Math.fround(o),s=Math.fround(s),i.push(o,s,1/0,e,-1,1),this.options.reduce&&i.push(0)}let r=this.trees[o+1]=this.createTree(i);e&&console.timeEnd(s);for(let t=o;t>=n;t--){const n=Date.now();r=this.trees[t]=this.createTree(this.cluster(r,t)),e&&console.log("z%d: %d clusters in %dms",t,r.numItems,Date.now()-n)}e&&console.timeEnd("total time")}getClusters(t,e){return this.getClustersInternal(t,e).map((t=>p(t)))}getClustersInternal(t,e){let n=((t[0]+180)%360+360)%360-180;const o=Math.max(-90,Math.min(90,t[1]));let s=180===t[2]?180:((t[2]+180)%360+360)%360-180;const i=Math.max(-90,Math.min(90,t[3]));if(t[2]-t[0]>=360)n=-180,s=180;else if(n>s){const t=this.getClustersInternal([n,o,180,i],e),r=this.getClustersInternal([-180,o,s,i],e);return t.concat(r)}const r=this.trees[this.limitZoom(e)],a=r.range(l(n),h(i),l(s),h(o)),u=r.flatData,c=[];for(const t of a){const e=this.stride*t;c.push(u[e+q]>1?K(u,e,this.clusterProps):this.points[u[e+J]])}return c}getChildren(t){const e=this.getOriginId(t),n=this.getOriginZoom(t),o=new Error("No cluster with the specified id: "+t),s=this.trees[n];if(!s)throw o;const i=s.flatData;if(e*this.stride>=i.length)throw o;const r=this.options.radius/(this.options.extent*Math.pow(2,n-1)),a=i[e*this.stride],u=i[e*this.stride+1],c=s.within(a,u,r),l=[];for(const e of c){const n=e*this.stride;i[n+4]===t&&l.push(i[n+q]>1?H(i,n,this.clusterProps):p(this.points[i[n+J]]))}if(0===l.length)throw o;return l}getLeaves(t,e,n){e=e||10,n=n||0;const o=[];return this.appendLeaves(o,t,e,n,0),o}getTile(t,e,n){const o=this.trees[this.limitZoom(t)];if(!o)return null;const s=Math.pow(2,t),{extent:i,radius:r}=this.options,a=r/i,u=(n-a)/s,c=(n+1+a)/s,l={transformed:!0,features:[],source:null,x:e,y:n,z:t};return this.addTileFeatures(o.range((e-a)/s,u,(e+1+a)/s,c),o.flatData,e,n,s,l),0===e&&this.addTileFeatures(o.range(1-a/s,u,1,c),o.flatData,s,n,s,l),e===s-1&&this.addTileFeatures(o.range(0,u,a/s,c),o.flatData,-1,n,s,l),l}getClusterExpansionZoom(t){return this.getOriginZoom(t)}appendLeaves(t,e,n,o,s){const i=this.getChildren(e);for(const e of i){const i=e.properties;if(i?.cluster?s+i.point_count<=o?s+=i.point_count:s=this.appendLeaves(t,i.cluster_id,n,o,s):s<o?s++:t.push(e),t.length===n)break}return s}createTree(t){const e=new D(t.length/this.stride|0,this.options.nodeSize,Float32Array);for(let n=0;n<t.length;n+=this.stride)e.add(t[n],t[n+1]);return e.finish(),e.flatData=t,e.data=null,e}addTileFeatures(t,e,n,o,s,i){for(const r of t){const t=r*this.stride,a=e[t+q]>1;let u,c,l;if(a)u=Q(e,t,this.clusterProps),c=e[t],l=e[t+1];else{const n=this.points[e[t+J]];u=n.tags,[c,l]=n.geometry}const h={type:1,geometry:[[Math.round(this.options.extent*(c*s-n)),Math.round(this.options.extent*(l*s-o))]],tags:u};let p;p=a||this.options.generateId?e[t+J]:this.points[e[t+J]].id,void 0!==p&&(h.id=p),i.features.push(h)}}limitZoom(t){return Math.max(this.options.minZoom,Math.min(Math.floor(+t),this.options.maxZoom+1))}cluster(t,e){const{radius:n,extent:o,reduce:s,minPoints:i}=this.options,r=n/(o*Math.pow(2,e)),a=t.flatData,u=[],c=this.stride;for(let n=0;n<a.length;n+=c){if(a[n+2]<=e)continue;a[n+2]=e;const o=a[n],l=a[n+1],h=t.within(a[n],a[n+1],r),p=a[n+q];let d=p;for(const t of h){const n=t*c;a[n+2]>e&&(d+=a[n+q])}if(d>p&&d>=i){let t,i=o*p,r=l*p,f=-1;const g=(n/c<<5)+(e+1)+this.points.length;for(const o of h){const u=o*c;if(a[u+2]<=e)continue;a[u+2]=e;const l=a[u+q];i+=a[u]*l,r+=a[u+1]*l,a[u+4]=g,s&&(t||(t=this.map(a,n,!0),f=this.clusterProps.length,this.clusterProps.push(t)),s(t,this.map(a,u)))}a[n+4]=g,u.push(i/d,r/d,1/0,g,-1,d),s&&u.push(f)}else{for(let t=0;t<c;t++)u.push(a[n+t]);if(d>1)for(const t of h){const n=t*c;if(!(a[n+2]<=e)){a[n+2]=e;for(let t=0;t<c;t++)u.push(a[n+t])}}}}return u}getOriginId(t){return t-this.points.length>>5}getOriginZoom(t){return(t-this.points.length)%32}map(t,e,n){if(t[e+q]>1){const o=this.clusterProps[t[e+R]];return n?Object.assign({},o):o}const o=this.points[t[e+J]].tags,s=this.options.map(o);return n&&s===o?Object.assign({},s):s}}function K(t,e,n){return{id:t[e+J],type:"Point",tags:Q(t,e,n),geometry:[t[e],t[e+1]]}}function H(t,e,n){return{type:"Feature",id:t[e+J],properties:Q(t,e,n),geometry:{type:"Point",coordinates:[m(t[e]),y(t[e+1])]}}}function Q(t,e,n){const o=t[e+q],s=o>=1e4?`${Math.round(o/1e3)}k`:o>=1e3?Math.round(o/100)/10+"k":o,i=t[e+R],r=-1===i?{}:Object.assign({},n[i]);return Object.assign(r,{cluster:!0,cluster_id:t[e+J],point_count:o,point_count_abbreviated:s})}const W="geojsonvt_clip_start",tt="geojsonvt_clip_end";function et(t,e,n,o,s){const i=e===s.maxZoom?0:s.tolerance/((1<<e)*s.extent),r={transformed:!1,features:[],source:null,x:n,y:o,z:e,minX:2,minY:1,maxX:-1,maxY:0,numPoints:0,numSimplified:0,numFeatures:t.length};for(const e of t)nt(r,e,i,s);return r}function nt(t,e,n,o){switch(t.minX=Math.min(t.minX,e.minX),t.minY=Math.min(t.minY,e.minY),t.maxX=Math.max(t.maxX,e.maxX),t.maxY=Math.max(t.maxY,e.maxY),e.type){case"Point":case"MultiPoint":return void function(t,e){const n=[];for(let o=0;o<e.geometry.length;o+=3)n.push(e.geometry[o],e.geometry[o+1]),t.numPoints++,t.numSimplified++;if(!n.length)return;const o={type:1,tags:e.tags||null,geometry:n};null!==e.id&&(o.id=e.id);t.features.push(o)}(t,e);case"LineString":return void function(t,e,n,o){const s=[];if(ot(s,e.geometry,t,n,!1,!1),!s.length)return;let i=e.tags||null;if(o.lineMetrics){i={};for(const t in e.tags)i[t]=e.tags[t];i[W]=e.geometry.start/e.geometry.size,i[tt]=e.geometry.end/e.geometry.size}const r={type:2,tags:i,geometry:s};null!==e.id&&(r.id=e.id);t.features.push(r)}(t,e,n,o);case"MultiLineString":case"Polygon":return void function(t,e,n){const o=[];for(let s=0;s<e.geometry.length;s++)ot(o,e.geometry[s],t,n,"Polygon"===e.type,0===s);if(!o.length)return;const s={type:"Polygon"===e.type?3:2,tags:e.tags||null,geometry:o};null!==e.id&&(s.id=e.id);t.features.push(s)}(t,e,n);case"MultiPolygon":return void function(t,e,n){const o=[];for(let s=0;s<e.geometry.length;s++){const i=e.geometry[s];for(let e=0;e<i.length;e++)ot(o,i[e],t,n,!0,0===e)}if(!o.length)return;const s={type:3,tags:e.tags||null,geometry:o};null!==e.id&&(s.id=e.id);t.features.push(s)}(t,e,n)}}function ot(t,e,n,o,s,i){const r=o*o;if(o>0&&e.size<(s?r:o))return void(n.numPoints+=e.points.length/3);const a=[];for(let t=0;t<e.points.length;t+=3)(0===o||e.points[t+2]>r)&&(n.numSimplified++,a.push(e.points[t],e.points[t+1])),n.numPoints++;s&&function(t,e){let n=0;for(let e=0,o=t.length,s=o-2;e<o;s=e,e+=2)n+=(t[e]-t[s])*(t[e+1]+t[s+1]);if(n>0!==e)return;for(let e=0,n=t.length;e<n/2;e+=2){const o=t[e],s=t[e+1];t[e]=t[n-2-e],t[e+1]=t[n-1-e],t[n-2-e]=o,t[n-1-e]=s}}(a,i),t.push(a)}function st(t,e){if(t.transformed)return t;const n=1<<t.z,o=t.x,s=t.y;for(const i of t.features)1===i.type?it(i,e,n,o,s):rt(i,e,n,o,s);return t.transformed=!0,t}function it(t,e,n,o,s){const i=t,r=t.geometry,a=[];for(let t=0;t<r.length;t+=2)a.push(at(r[t],r[t+1],e,n,o,s));return i.geometry=a,i}function rt(t,e,n,o,s){const i=t,r=t.geometry,a=[];for(const t of r){const i=[];for(let r=0;r<t.length;r+=2)i.push(at(t[r],t[r+1],e,n,o,s));a.push(i)}return i.geometry=a,i}function at(t,e,n,o,s,i){return[Math.round(n*(t*o-s)),Math.round(n*(e*o-i))]}class ut{constructor(t){this.options=t,this.stats={},this.total=0,this.tiles={},this.tileCoords=[],this.stats={},this.total=0}initialize(t){this.splitTile(t,0,0,0),this.options.debug&&(t.length&&console.log("features: %d, points: %d",this.tiles[0].numFeatures,this.tiles[0].numPoints),console.timeEnd("generate tiles"),console.log("tiles generated:",this.total,JSON.stringify(this.stats)))}updateIndex(t,e,n){n.debug>1&&(console.log("invalidating tiles"),console.time("invalidating")),this.invalidateTiles(e),n.debug>1&&console.timeEnd("invalidating");const[o,s,i]=[0,0,0],r=et(t,o,s,i,n);r.source=t;const a=ct(o,s,i);if(this.tiles[a]=r,this.tileCoords.push({z:o,x:s,y:i,id:a}),n.debug){const t=`z${o}`;this.stats[t]=(this.stats[t]||0)+1,this.total++}}getClusterExpansionZoom(t){return null}getChildren(t){return null}getLeaves(t,e,n){return null}getTile(t,e,n){const{extent:o,debug:s}=this.options,i=1<<t,r=ct(t,e=e+i&i-1,n);if(this.tiles[r])return st(this.tiles[r],o);s>1&&console.log("drilling down to z%d-%d-%d",t,e,n);let a,u=t,c=e,l=n;for(;!a&&u>0;)u--,c>>=1,l>>=1,a=this.tiles[ct(u,c,l)];return a?.source?(s>1&&(console.log("found parent tile z%d-%d-%d",u,c,l),console.time("drilling down")),this.splitTile(a.source,u,c,l,t,e,n),s>1&&console.timeEnd("drilling down"),this.tiles[r]?st(this.tiles[r],o):null):null}splitTile(t,e,n,o,s,i,r){const a=[t,e,n,o],u=this.options,c=u.debug;for(;a.length;){o=a.pop(),n=a.pop(),e=a.pop(),t=a.pop();const l=1<<e,h=ct(e,n,o);let p=this.tiles[h];if(!p&&(c>1&&console.time("creation"),p=this.tiles[h]=et(t,e,n,o,u),this.tileCoords.push({z:e,x:n,y:o,id:h}),c)){c>1&&(console.log("tile z%d-%d-%d (features: %d, points: %d, simplified: %d)",e,n,o,p.numFeatures,p.numPoints,p.numSimplified),console.timeEnd("creation"));const t=`z${e}`;this.stats[t]=(this.stats[t]||0)+1,this.total++}if(p.source=t,null==s){if(e===u.indexMaxZoom||p.numPoints<=u.indexMaxPoints)continue}else{if(e===u.maxZoom||e===s)continue;if(null!=s){const t=s-e;if(n!==i>>t||o!==r>>t)continue}}if(p.source=null,!t.length)continue;c>1&&console.time("clipping");const d=.5*u.buffer/u.extent,f=.5-d,g=.5+d,m=1+d;let y=null,w=null,P=null,I=null;const v=M(t,l,n-d,n+g,x.X,p.minX,p.maxX,u),b=M(t,l,n+f,n+m,x.X,p.minX,p.maxX,u);v&&(y=M(v,l,o-d,o+g,x.Y,p.minY,p.maxY,u),w=M(v,l,o+f,o+m,x.Y,p.minY,p.maxY,u)),b&&(P=M(b,l,o-d,o+g,x.Y,p.minY,p.maxY,u),I=M(b,l,o+f,o+m,x.Y,p.minY,p.maxY,u)),c>1&&console.timeEnd("clipping"),a.push(y||[],e+1,2*n,2*o),a.push(w||[],e+1,2*n,2*o+1),a.push(P||[],e+1,2*n+1,2*o),a.push(I||[],e+1,2*n+1,2*o+1)}}invalidateTiles(t){if(!t.length)return;const e=this.options,{debug:n}=e;let o=1/0,s=-1/0,i=1/0,r=-1/0;for(const e of t)o=Math.min(o,e.minX),s=Math.max(s,e.maxX),i=Math.min(i,e.minY),r=Math.max(r,e.maxY);const a=e.buffer/e.extent,u=new Set;for(const e in this.tiles){const c=this.tiles[e],l=1<<c.z,h=(c.x-a)/l,p=(c.x+1+a)/l,d=(c.y-a)/l,f=(c.y+1+a)/l;if(s<h||o>=p||r<d||i>=f)continue;let g=!1;for(const e of t)if(e.maxX>=h&&e.minX<p&&e.maxY>=d&&e.minY<f){g=!0;break}if(g){if(n){n>1&&console.log("invalidate tile z%d-%d-%d (features: %d, points: %d, simplified: %d)",c.z,c.x,c.y,c.numFeatures,c.numPoints,c.numSimplified);const t=`z${c.z}`;this.stats[t]=(this.stats[t]||0)-1,this.total--}delete this.tiles[e],u.add(e)}}u.size&&(this.tileCoords=this.tileCoords.filter((t=>!u.has(t.id))))}}function ct(t,e,n){return 32*((1<<t)*n+e)+t}const lt={maxZoom:14,indexMaxZoom:5,indexMaxPoints:1e5,tolerance:3,extent:4096,buffer:64,lineMetrics:!1,promoteId:null,generateId:!1,updateable:!1,cluster:!1,clusterOptions:B,debug:0};t.GEOJSONVT_CLIP_END=tt,t.GEOJSONVT_CLIP_START=W,t.GeoJSONVT=class{get tiles(){return this.tileIndex?.tiles??{}}get stats(){return this.tileIndex.stats}get total(){return this.tileIndex.total}constructor(t,e){const n=(e=this.options=Object.assign({},lt,e)).debug;if(n&&console.time("preprocess data"),e.maxZoom<0||e.maxZoom>24)throw new Error("maxZoom should be in the 0-24 range");if(e.promoteId&&e.generateId)throw new Error("promoteId and generateId cannot be used together.");let o=r(t,e);n&&(console.timeEnd("preprocess data"),console.log("index: maxZoom: %d, maxPoints: %d",e.indexMaxZoom,e.indexMaxPoints),console.time("generate tiles")),o=Y(o,e),e.updateable&&(this.source=o),this.initializeIndex(o,e)}initializeIndex(t,e){this.tileIndex=e.cluster?new V(e.clusterOptions):new ut(e),t.length&&this.tileIndex.initialize(t)}getTile(t,e,n){return e=+e,n=+n,(t=+t)<0||t>24?null:this.tileIndex.getTile(t,e,n)}updateData(t,e){const n=this.options;if(!n.updateable)throw new Error("to update tile geojson `updateable` option must be set to true");let{affected:o,source:s}=_(this.source,t,n);e&&({affected:o,source:s}=this.filterUpdate(s,o,e)),o.length&&(this.source=s,this.tileIndex.updateIndex(s,o,n))}filterUpdate(t,e,n){const o=new Set;for(const s of t)null!=s.id&&(n(p(s))||(e.push(s),o.add(s.id)));return{affected:e,source:t=t.filter((t=>!o.has(t.id)))}}getData(){if(!this.options.updateable)throw new Error("to retrieve data the `updateable` option must be set to true");return{type:"FeatureCollection",features:this.source.map((t=>p(t)))}}updateClusterOptions(t,e){const n=this.options.cluster;this.options.cluster=t,this.options.clusterOptions=e,n!=t?this.initializeIndex(this.source,this.options):this.tileIndex.updateIndex(this.source,[],this.options)}getClusterExpansionZoom(t){return this.tileIndex.getClusterExpansionZoom(t)}getClusterChildren(t){return this.tileIndex.getChildren(t)}getClusterLeaves(t,e,n){return this.tileIndex.getLeaves(t,e,n)}},t.Supercluster=V,t.geoJSONToTile=function(t,e,n,o,s={}){s={...lt,...s};const{wrap:i=!1,clip:a=!1}=s;let u=r(t,s);if(i&&(u=Y(u,s)),a||s.lineMetrics){const t=1<<e,i=s.buffer/s.extent,r=M(u,t,n-i,n+1+i,x.X,-1,2,s);u=M(r||[],t,o-i,o+1+i,x.Y,-1,2,s)}return st(et(u??[],e,n,o,s),s.extent)}}));
|
|
1
|
+
!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports):"function"==typeof define&&define.amd?define(["exports"],e):e((t="undefined"!=typeof globalThis?globalThis:t||self).geojsonvt={})}(this,(function(t){"use strict";function e(t,o,s,i){let r=i;const a=o+(s-o>>1);let u,c=s-o;const l=t[o],h=t[o+1],p=t[s],d=t[s+1];for(let e=o+3;e<s;e+=3){const o=n(t[e],t[e+1],l,h,p,d);if(o>r)u=e,r=o;else if(o===r){const t=Math.abs(e-a);t<c&&(u=e,c=t)}}r>i&&(u-o>3&&e(t,o,u,i),t[u+2]=r,s-u>3&&e(t,u,s,i))}function n(t,e,n,o,s,i){let r=s-n,a=i-o;if(0!==r||0!==a){const u=((t-n)*r+(e-o)*a)/(r*r+a*a);u>1?(n=s,o=i):u>0&&(n+=r*u,o+=a*u)}return r=t-n,a=e-o,r*r+a*a}function o(t,e,n,o){const s={type:e,geom:n},r={id:null==t?null:t,type:s.type,geometry:s.geom,tags:o,minX:1/0,minY:1/0,maxX:-1/0,maxY:-1/0};switch(s.type){case"Point":case"MultiPoint":i(r,s.geom);break;case"LineString":i(r,s.geom.points);break;case"Polygon":i(r,s.geom[0].points);break;case"MultiLineString":for(const t of s.geom)i(r,t.points);break;case"MultiPolygon":for(const t of s.geom)i(r,t[0].points)}return r}function s(t){const e=t;t.points.length>64&&(e.points=new Float64Array(t.points))}function i(t,e){for(let n=0;n<e.length;n+=3)t.minX=Math.min(t.minX,e[n]),t.minY=Math.min(t.minY,e[n+1]),t.maxX=Math.max(t.maxX,e[n]),t.maxY=Math.max(t.maxY,e[n+1])}function r(t,e){const n=[];switch(t.type){case"FeatureCollection":for(let o=0;o<t.features.length;o++)a(n,t.features[o],e,o);break;case"Feature":a(n,t,e);break;default:a(n,{geometry:t,properties:void 0},e)}return n}function a(t,e,n,s){if(!e.geometry)return;if("GeometryCollection"===e.geometry.type)return void function(t,e,n,o,s){for(const i of n.geometries)a(t,{id:e.id,geometry:i,properties:e.properties},o,s)}(t,e,e.geometry,n,s);const i=e.geometry.coordinates;if(!i?.length)return;const r=function(t,e,n){if(e.promoteId)return t.properties?.[e.promoteId];if(e.generateId)return n||0;return t.id}(e,n,s),p=Math.pow(n.tolerance/((1<<n.maxZoom)*n.extent),2);switch(e.geometry.type){case"Point":return void function(t,e,n,s){const i=[];i.push(l(n.coordinates[0]),h(n.coordinates[1]),0),t.push(o(e,"Point",i,s))}(t,r,e.geometry,e.properties);case"MultiPoint":return void function(t,e,n,s){const i=[];for(const t of n.coordinates)i.push(l(t[0]),h(t[1]),0);t.push(o(e,"MultiPoint",i,s))}(t,r,e.geometry,e.properties);case"LineString":return void function(t,e,n,s,i){const r={points:[]};u(n.coordinates,r,s,!1),t.push(o(e,"LineString",r,i))}(t,r,e.geometry,p,e.properties);case"MultiLineString":return void function(t,e,n,s,i,r){if(i.lineMetrics)for(const i of n.coordinates){const n={points:[]};u(i,n,s,!1),t.push(o(e,"LineString",n,r))}else{const i=[];c(n.coordinates,i,s,!1),t.push(o(e,"MultiLineString",i,r))}}(t,r,e.geometry,p,n,e.properties);case"Polygon":return void function(t,e,n,s,i){const r=[];c(n.coordinates,r,s,!0),t.push(o(e,"Polygon",r,i))}(t,r,e.geometry,p,e.properties);case"MultiPolygon":return void function(t,e,n,s,i){const r=[];for(const t of n.coordinates){const e=[];c(t,e,s,!0),r.push(e)}t.push(o(e,"MultiPolygon",r,i))}(t,r,e.geometry,p,e.properties);default:throw new Error("Input data is not a valid GeoJSON object.")}}function u(t,n,o,i){let r,a,u=0;for(let e=0;e<t.length;e++){const o=l(t[e][0]),s=h(t[e][1]);n.points.push(o,s,0),e>0&&(u+=i?(r*s-o*a)/2:Math.sqrt(Math.pow(o-r,2)+Math.pow(s-a,2))),r=o,a=s}const c=n.points.length-3;n.points[2]=1,o>0&&e(n.points,0,c,o),n.points[c+2]=1,s(n),n.size=Math.abs(u),n.start=0,n.end=n.size}function c(t,e,n,o){for(let s=0;s<t.length;s++){const i={points:[]};u(t[s],i,n,o),e.push(i)}}function l(t){return t/360+.5}function h(t){const e=Math.sin(t*Math.PI/180),n=.5-.25*Math.log((1+e)/(1-e))/Math.PI;return n<0?0:n>1?1:n}function p(t){const e={type:"Feature",geometry:d(t),properties:t.tags};return null!=t.id&&(e.id=t.id),e}function d(t){const{type:e,geometry:n}=t;switch(e){case"Point":return{type:e,coordinates:g(n[0],n[1])};case"MultiPoint":return{type:e,coordinates:f(n)};case"LineString":return{type:e,coordinates:f(n.points)};case"MultiLineString":case"Polygon":return{type:e,coordinates:n.map((t=>f(t.points)))};case"MultiPolygon":return{type:e,coordinates:n.map((t=>t.map((t=>f(t.points)))))}}}function f(t){const e=[];for(let n=0;n<t.length;n+=3)e.push(g(t[n],t[n+1]));return e}function g(t,e){return[m(t),y(e)]}function m(t){return 360*(t-.5)}function y(t){const e=(180-360*t)*Math.PI/180;return 360*Math.atan(Math.exp(e))/Math.PI-90}var x;function M(t,e,n,o,s,i,r,a){if(o/=e,i>=(n/=e)&&r<o)return t;if(r<n||i>=o)return null;const u=[];for(const e of t){const t=s===x.X?e.minX:e.minY,i=s===x.X?e.maxX:e.maxY;if(t>=n&&i<o)u.push(e);else if(!(i<n||t>=o))switch(e.type){case"Point":case"MultiPoint":w(e,u,n,o,s);continue;case"LineString":P(e,u,n,o,s,a);continue;case"MultiLineString":I(e,u,n,o,s);continue;case"Polygon":v(e,u,n,o,s);continue;case"MultiPolygon":b(e,u,n,o,s);continue}}return u.length?u:null}function w(t,e,n,s,i){const r=[];if(function(t,e,n,o,s){for(let i=0;i<t.length;i+=3){const r=t[i+s];r>=n&&r<=o&&E(e,t[i],t[i+1],t[i+2])}}(t.geometry,r,n,s,i),!r.length)return;const a=3===r.length?"Point":"MultiPoint";e.push(o(t.id,a,r,t.tags))}function P(t,e,n,s,i,r){const a=[];if(S(t.geometry,a,n,s,i,!1,r.lineMetrics),a.length)if(r.lineMetrics)for(const n of a)e.push(o(t.id,"LineString",n,t.tags));else a.length>1?e.push(o(t.id,"MultiLineString",a,t.tags)):e.push(o(t.id,"LineString",a[0],t.tags))}function I(t,e,n,s,i){const r=[];A(t.geometry,r,n,s,i,!1),r.length&&(1!==r.length?e.push(o(t.id,"MultiLineString",r,t.tags)):e.push(o(t.id,"LineString",r[0],t.tags)))}function v(t,e,n,s,i){const r=[];A(t.geometry,r,n,s,i,!0),r.length&&e.push(o(t.id,"Polygon",r,t.tags))}function b(t,e,n,s,i){const r=[];for(const e of t.geometry){const t=[];A(e,t,n,s,i,!0),t.length&&r.push(t)}r.length&&e.push(o(t.id,"MultiPolygon",r,t.tags))}function S(t,e,n,o,i,r,a){let u=z(t);const c=i===x.X?T:X;let l,h,p=t.start;for(let s=0;s<t.points.length-3;s+=3){const d=t.points[s],f=t.points[s+1],g=t.points[s+2],m=t.points[s+3],y=t.points[s+4],M=i===x.X?d:f,w=i===x.X?m:y;let P=!1;a&&(l=Math.sqrt(Math.pow(d-m,2)+Math.pow(f-y,2))),M<n?w>n&&(h=c(u,d,f,m,y,n),a&&(u.start=p+l*h)):M>o?w<o&&(h=c(u,d,f,m,y,o),a&&(u.start=p+l*h)):E(u.points,d,f,g),w<n&&M>=n&&(h=c(u,d,f,m,y,n),P=!0),w>o&&M<=o&&(h=c(u,d,f,m,y,o),P=!0),!r&&P&&(a&&(u.end=p+l*h),e.push(u),u=z(t)),a&&(p+=l)}let d=t.points.length-3;const f=t.points[d],g=t.points[d+1],m=t.points[d+2],y=i===x.X?f:g;y>=n&&y<=o&&E(u.points,f,g,m),d=u.points.length-3,r&&d>=3&&(u.points[d]!==u.points[0]||u.points[d+1]!==u.points[1])&&E(u.points,u.points[0],u.points[1],u.points[2]),u.points.length&&(s(u),e.push(u))}function z(t){return{points:[],size:t.size,start:t.start,end:t.end}}function A(t,e,n,o,s,i){for(const r of t)S(r,e,n,o,s,i,!1)}function E(t,e,n,o){t.push(e,n,o)}function T(t,e,n,o,s,i){const r=(i-e)/(o-e);return E(t.points,i,n+(s-n)*r,1),r}function X(t,e,n,o,s,i){const r=(i-n)/(s-n);return E(t.points,e+(o-e)*r,i,1),r}function Y(t,e){const n=e.buffer/e.extent;let o=t;const s=M(t,1,-1-n,n,x.X,-1,2,e),i=M(t,1,1-n,2+n,x.X,-1,2,e);return s||i?(o=M(t,1,-n,1+n,x.X,-1,2,e)||[],s&&(o=L(s,1).concat(o)),i&&(o=o.concat(L(i,-1))),o):o}function L(t,e){const n=[];for(const s of t)switch(s.type){case"Point":case"MultiPoint":{const t=O(s.geometry,e);n.push(o(s.id,s.type,t,s.tags));continue}case"LineString":{const t=C(s.geometry,e);n.push(o(s.id,s.type,t,s.tags));continue}case"MultiLineString":case"Polygon":{const t=[];for(const n of s.geometry)t.push(C(n,e));n.push(o(s.id,s.type,t,s.tags));continue}case"MultiPolygon":{const t=[];for(const n of s.geometry){const o=[];for(const t of n)o.push(C(t,e));t.push(o)}n.push(o(s.id,s.type,t,s.tags));continue}}return n}function O(t,e){const n=[];for(let o=0;o<t.length;o+=3)n.push(t[o]+e,t[o+1],t[o+2]);return n}function C(t,e){const n={points:[],size:t.size};void 0!==t.start&&(n.start=t.start,n.end=t.end);for(let o=0;o<t.points.length;o+=3)n.points.push(t.points[o]+e,t.points[o+1],t.points[o+2]);return s(n),n}function _(t,e,n){const o=function(t,e){if(!t)return{remove:new Set,add:new Map,update:new Map};const n={removeAll:t.removeAll,remove:new Set(t.remove||[]),add:new Map(t.add?.map((t=>[e.promoteId?t.properties[e.promoteId]:t.id,t]))),update:new Map(t.update?.map((t=>[t.id,t])))};return n}(e,n);let s=[];if(o.removeAll&&(s=t,t=[]),o.remove.size||o.add.size){const e=[];for(const n of t)(o.remove.has(n.id)||o.add.has(n.id))&&e.push(n);if(e.length){s.push(...e);const n=new Set(e.map((t=>t.id)));t=t.filter((t=>!n.has(t.id)))}if(o.add.size){let e=r({type:"FeatureCollection",features:Array.from(o.add.values())},n);e=Y(e,n),s.push(...e),t.push(...e)}}if(o.update.size){const e=new Map,i=[];for(const n of t)o.update.has(n.id)?e.set(n.id,[...e.get(n.id)||[],n]):i.push(n);for(const[t,r]of o.update){const o=e.get(t);if(!o||0===o.length)continue;const a=Z(o,r,n);s.push(...o,...a),i.push(...a)}t=i}return{affected:s,source:t}}function Z(t,e,n){const o=!!e.newGeometry,s=e.removeAllProperties||e.removeProperties?.length>0||e.addOrUpdateProperties?.length>0;if(o){const o=t[0];let i=r({type:"FeatureCollection",features:[{type:"Feature",id:o.id,geometry:e.newGeometry,properties:s?F(o.tags,e):o.tags}]},n);return i=Y(i,n),i}if(s){const n=[];for(const o of t){const t={...o};t.tags=F(t.tags,e),n.push(t)}return n}return t}function F(t,e){if(e.removeAllProperties)return{};const n={...t||{}};if(e.removeProperties)for(const t of e.removeProperties)delete n[t];if(e.addOrUpdateProperties)for(const{key:t,value:o}of e.addOrUpdateProperties)n[t]=o;return n}!function(t){t[t.X=0]="X",t[t.Y=1]="Y"}(x||(x={}));const U=[Int8Array,Uint8Array,Uint8ClampedArray,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array];class D{static from(t){if(!(t instanceof ArrayBuffer))throw new Error("Data must be an instance of ArrayBuffer.");const[e,n]=new Uint8Array(t,0,2);if(219!==e)throw new Error("Data does not appear to be in a KDBush format.");const o=n>>4;if(1!==o)throw new Error(`Got v${o} data when expected v1.`);const s=U[15&n];if(!s)throw new Error("Unrecognized array type.");const[i]=new Uint16Array(t,2,1),[r]=new Uint32Array(t,4,1);return new D(r,i,s,t)}constructor(t,e=64,n=Float64Array,o){if(isNaN(t)||t<0)throw new Error(`Unpexpected numItems value: ${t}.`);this.numItems=+t,this.nodeSize=Math.min(Math.max(+e,2),65535),this.ArrayType=n,this.IndexArrayType=t<65536?Uint16Array:Uint32Array;const s=U.indexOf(this.ArrayType),i=2*t*this.ArrayType.BYTES_PER_ELEMENT,r=t*this.IndexArrayType.BYTES_PER_ELEMENT,a=(8-r%8)%8;if(s<0)throw new Error(`Unexpected typed array class: ${n}.`);o&&o instanceof ArrayBuffer?(this.data=o,this.ids=new this.IndexArrayType(this.data,8,t),this.coords=new this.ArrayType(this.data,8+r+a,2*t),this._pos=2*t,this._finished=!0):(this.data=new ArrayBuffer(8+i+r+a),this.ids=new this.IndexArrayType(this.data,8,t),this.coords=new this.ArrayType(this.data,8+r+a,2*t),this._pos=0,this._finished=!1,new Uint8Array(this.data,0,2).set([219,16+s]),new Uint16Array(this.data,2,1)[0]=e,new Uint32Array(this.data,4,1)[0]=t)}add(t,e){const n=this._pos>>1;return this.ids[n]=n,this.coords[this._pos++]=t,this.coords[this._pos++]=e,n}finish(){const t=this._pos>>1;if(t!==this.numItems)throw new Error(`Added ${t} items when expected ${this.numItems}.`);return j(this.ids,this.coords,this.nodeSize,0,this.numItems-1,0),this._finished=!0,this}range(t,e,n,o){if(!this._finished)throw new Error("Data not yet indexed - call index.finish().");const{ids:s,coords:i,nodeSize:r}=this,a=[0,s.length-1,0],u=[];for(;a.length;){const c=a.pop()||0,l=a.pop()||0,h=a.pop()||0;if(l-h<=r){for(let r=h;r<=l;r++){const a=i[2*r],c=i[2*r+1];a>=t&&a<=n&&c>=e&&c<=o&&u.push(s[r])}continue}const p=h+l>>1,d=i[2*p],f=i[2*p+1];d>=t&&d<=n&&f>=e&&f<=o&&u.push(s[p]),(0===c?t<=d:e<=f)&&(a.push(h),a.push(p-1),a.push(1-c)),(0===c?n>=d:o>=f)&&(a.push(p+1),a.push(l),a.push(1-c))}return u}within(t,e,n){if(!this._finished)throw new Error("Data not yet indexed - call index.finish().");const{ids:o,coords:s,nodeSize:i}=this,r=[0,o.length-1,0],a=[],u=n*n;for(;r.length;){const c=r.pop()||0,l=r.pop()||0,h=r.pop()||0;if(l-h<=i){for(let n=h;n<=l;n++)G(s[2*n],s[2*n+1],t,e)<=u&&a.push(o[n]);continue}const p=h+l>>1,d=s[2*p],f=s[2*p+1];G(d,f,t,e)<=u&&a.push(o[p]),(0===c?t-n<=d:e-n<=f)&&(r.push(h),r.push(p-1),r.push(1-c)),(0===c?t+n>=d:e+n>=f)&&(r.push(p+1),r.push(l),r.push(1-c))}return a}}function j(t,e,n,o,s,i){if(s-o<=n)return;const r=o+s>>1;N(t,e,r,o,s,i),j(t,e,n,o,r-1,1-i),j(t,e,n,r+1,s,1-i)}function N(t,e,n,o,s,i){for(;s>o;){if(s-o>600){const r=s-o+1,a=n-o+1,u=Math.log(r),c=.5*Math.exp(2*u/3),l=.5*Math.sqrt(u*c*(r-c)/r)*(a-r/2<0?-1:1);N(t,e,n,Math.max(o,Math.floor(n-a*c/r+l)),Math.min(s,Math.floor(n+(r-a)*c/r+l)),i)}const r=e[2*n+i];let a=o,u=s;for(k(t,e,o,n),e[2*s+i]>r&&k(t,e,o,s);a<u;){for(k(t,e,a,u),a++,u--;e[2*a+i]<r;)a++;for(;e[2*u+i]>r;)u--}e[2*o+i]===r?k(t,e,o,u):(u++,k(t,e,u,s)),u<=n&&(o=u+1),n<=u&&(s=u-1)}}function k(t,e,n,o){$(t,n,o),$(e,2*n,2*o),$(e,2*n+1,2*o+1)}function $(t,e,n){const o=t[e];t[e]=t[n],t[n]=o}function G(t,e,n,o){const s=t-n,i=e-o;return s*s+i*i}const B={minZoom:0,maxZoom:16,minPoints:2,radius:40,extent:512,nodeSize:64,log:!1,generateId:!1,reduce:null,map:t=>t},J=3,q=5,R=6;class V{constructor(t){this.options=Object.assign(Object.create(B),t),this.trees=new Array(this.options.maxZoom+1),this.stride=this.options.reduce?7:6,this.clusterProps=[],this.points=[]}load(t){const e=[];for(const n of t){if(!n.geometry)continue;const[t,o]=n.geometry.coordinates,[s,i]=[l(t),h(o)],r={id:n.id,type:"Point",geometry:[s,i],tags:n.properties};e.push(r)}this.createIndex(e)}initialize(t){const e=[];for(const n of t)"Point"===n.type&&e.push(n);this.createIndex(e)}updateIndex(t,e,n){this.options=Object.assign(Object.create(B),n.clusterOptions),this.initialize(t)}createIndex(t){const{log:e,minZoom:n,maxZoom:o}=this.options;e&&console.time("total time");const s=`prepare ${t.length} points`;e&&console.time(s),this.points=t;const i=[];for(let e=0;e<t.length;e++){const n=t[e];if(!n?.geometry)continue;let[o,s]=n.geometry;o=Math.fround(o),s=Math.fround(s),i.push(o,s,1/0,e,-1,1),this.options.reduce&&i.push(0)}let r=this.trees[o+1]=this.createTree(i);e&&console.timeEnd(s);for(let t=o;t>=n;t--){const n=Date.now();r=this.trees[t]=this.createTree(this.cluster(r,t)),e&&console.log("z%d: %d clusters in %dms",t,r.numItems,Date.now()-n)}e&&console.timeEnd("total time")}getClusters(t,e){return this.getClustersInternal(t,e).map((t=>p(t)))}getClustersInternal(t,e){let n=((t[0]+180)%360+360)%360-180;const o=Math.max(-90,Math.min(90,t[1]));let s=180===t[2]?180:((t[2]+180)%360+360)%360-180;const i=Math.max(-90,Math.min(90,t[3]));if(t[2]-t[0]>=360)n=-180,s=180;else if(n>s){const t=this.getClustersInternal([n,o,180,i],e),r=this.getClustersInternal([-180,o,s,i],e);return t.concat(r)}const r=this.trees[this.limitZoom(e)],a=r.range(l(n),h(i),l(s),h(o)),u=r.flatData,c=[];for(const t of a){const e=this.stride*t;c.push(u[e+q]>1?K(u,e,this.clusterProps):this.points[u[e+J]])}return c}getChildren(t){const e=this.getOriginId(t),n=this.getOriginZoom(t),o=new Error("No cluster with the specified id: "+t),s=this.trees[n];if(!s)throw o;const i=s.flatData;if(e*this.stride>=i.length)throw o;const r=this.options.radius/(this.options.extent*Math.pow(2,n-1)),a=i[e*this.stride],u=i[e*this.stride+1],c=s.within(a,u,r),l=[];for(const e of c){const n=e*this.stride;i[n+4]===t&&l.push(i[n+q]>1?H(i,n,this.clusterProps):p(this.points[i[n+J]]))}if(0===l.length)throw o;return l}getLeaves(t,e,n){e=e||10,n=n||0;const o=[];return this.appendLeaves(o,t,e,n,0),o}getTile(t,e,n){const o=this.trees[this.limitZoom(t)];if(!o)return null;const s=Math.pow(2,t),{extent:i,radius:r}=this.options,a=r/i,u=(n-a)/s,c=(n+1+a)/s,l={transformed:!0,features:[],source:null,x:e,y:n,z:t};return this.addTileFeatures(o.range((e-a)/s,u,(e+1+a)/s,c),o.flatData,e,n,s,l),0===e&&this.addTileFeatures(o.range(1-a/s,u,1,c),o.flatData,s,n,s,l),e===s-1&&this.addTileFeatures(o.range(0,u,a/s,c),o.flatData,-1,n,s,l),l}getClusterExpansionZoom(t){return this.getOriginZoom(t)}appendLeaves(t,e,n,o,s){const i=this.getChildren(e);for(const e of i){const i=e.properties;if(i?.cluster?s+i.point_count<=o?s+=i.point_count:s=this.appendLeaves(t,i.cluster_id,n,o,s):s<o?s++:t.push(e),t.length===n)break}return s}createTree(t){const e=new D(t.length/this.stride|0,this.options.nodeSize,Float32Array);for(let n=0;n<t.length;n+=this.stride)e.add(t[n],t[n+1]);return e.finish(),e.flatData=t,e.data=null,e}addTileFeatures(t,e,n,o,s,i){for(const r of t){const t=r*this.stride,a=e[t+q]>1;let u,c,l;if(a)u=Q(e,t,this.clusterProps),c=e[t],l=e[t+1];else{const n=this.points[e[t+J]];u=n.tags,[c,l]=n.geometry}const h={type:1,geometry:[[Math.round(this.options.extent*(c*s-n)),Math.round(this.options.extent*(l*s-o))]],tags:u};let p;p=a||this.options.generateId?e[t+J]:this.points[e[t+J]].id,void 0!==p&&(h.id=p),i.features.push(h)}}limitZoom(t){return Math.max(this.options.minZoom,Math.min(Math.floor(+t),this.options.maxZoom+1))}cluster(t,e){const{radius:n,extent:o,reduce:s,minPoints:i}=this.options,r=n/(o*Math.pow(2,e)),a=t.flatData,u=[],c=this.stride;for(let n=0;n<a.length;n+=c){if(a[n+2]<=e)continue;a[n+2]=e;const o=a[n],l=a[n+1],h=t.within(a[n],a[n+1],r),p=a[n+q];let d=p;for(const t of h){const n=t*c;a[n+2]>e&&(d+=a[n+q])}if(d>p&&d>=i){let t,i=o*p,r=l*p,f=-1;const g=(n/c<<5)+(e+1)+this.points.length;for(const o of h){const u=o*c;if(a[u+2]<=e)continue;a[u+2]=e;const l=a[u+q];i+=a[u]*l,r+=a[u+1]*l,a[u+4]=g,s&&(t||(t=this.map(a,n,!0),f=this.clusterProps.length,this.clusterProps.push(t)),s(t,this.map(a,u)))}a[n+4]=g,u.push(i/d,r/d,1/0,g,-1,d),s&&u.push(f)}else{for(let t=0;t<c;t++)u.push(a[n+t]);if(d>1)for(const t of h){const n=t*c;if(!(a[n+2]<=e)){a[n+2]=e;for(let t=0;t<c;t++)u.push(a[n+t])}}}}return u}getOriginId(t){return t-this.points.length>>5}getOriginZoom(t){return(t-this.points.length)%32}map(t,e,n){if(t[e+q]>1){const o=this.clusterProps[t[e+R]];return n?Object.assign({},o):o}const o=this.points[t[e+J]].tags,s=this.options.map(o);return n&&s===o?Object.assign({},s):s}}function K(t,e,n){return{id:t[e+J],type:"Point",tags:Q(t,e,n),geometry:[t[e],t[e+1]]}}function H(t,e,n){return{type:"Feature",id:t[e+J],properties:Q(t,e,n),geometry:{type:"Point",coordinates:[m(t[e]),y(t[e+1])]}}}function Q(t,e,n){const o=t[e+q],s=o>=1e4?`${Math.round(o/1e3)}k`:o>=1e3?Math.round(o/100)/10+"k":o,i=t[e+R],r=-1===i?{}:Object.assign({},n[i]);return Object.assign(r,{cluster:!0,cluster_id:t[e+J],point_count:o,point_count_abbreviated:s})}const W="geojsonvt_clip_start",tt="geojsonvt_clip_end";function et(t,e,n,o,s){const i=e===s.maxZoom?0:s.tolerance/((1<<e)*s.extent),r={transformed:!1,features:[],source:null,x:n,y:o,z:e,minX:2,minY:1,maxX:-1,maxY:0,numPoints:0,numSimplified:0,numFeatures:t.length};for(const e of t)nt(r,e,i,s);return r}function nt(t,e,n,o){switch(t.minX=Math.min(t.minX,e.minX),t.minY=Math.min(t.minY,e.minY),t.maxX=Math.max(t.maxX,e.maxX),t.maxY=Math.max(t.maxY,e.maxY),e.type){case"Point":case"MultiPoint":return void function(t,e){const n=[];for(let o=0;o<e.geometry.length;o+=3)n.push(e.geometry[o],e.geometry[o+1]),t.numPoints++,t.numSimplified++;if(!n.length)return;const o={type:1,tags:e.tags||null,geometry:n};null!==e.id&&(o.id=e.id);t.features.push(o)}(t,e);case"LineString":return void function(t,e,n,o){const s=[];if(ot(s,e.geometry,t,n,!1,!1),!s.length)return;let i=e.tags||null;if(o.lineMetrics){i={};for(const t in e.tags)i[t]=e.tags[t];i[W]=e.geometry.start/e.geometry.size,i[tt]=e.geometry.end/e.geometry.size}const r={type:2,tags:i,geometry:s};null!==e.id&&(r.id=e.id);t.features.push(r)}(t,e,n,o);case"MultiLineString":case"Polygon":return void function(t,e,n){const o=[];for(let s=0;s<e.geometry.length;s++)ot(o,e.geometry[s],t,n,"Polygon"===e.type,0===s);if(!o.length)return;const s={type:"Polygon"===e.type?3:2,tags:e.tags||null,geometry:o};null!==e.id&&(s.id=e.id);t.features.push(s)}(t,e,n);case"MultiPolygon":return void function(t,e,n){const o=[];for(let s=0;s<e.geometry.length;s++){const i=e.geometry[s];for(let e=0;e<i.length;e++)ot(o,i[e],t,n,!0,0===e)}if(!o.length)return;const s={type:3,tags:e.tags||null,geometry:o};null!==e.id&&(s.id=e.id);t.features.push(s)}(t,e,n)}}function ot(t,e,n,o,s,i){const r=o*o;if(o>0&&e.size<(s?r:o))return void(n.numPoints+=e.points.length/3);const a=[];for(let t=0;t<e.points.length;t+=3)(0===o||e.points[t+2]>r)&&(n.numSimplified++,a.push(e.points[t],e.points[t+1])),n.numPoints++;s&&function(t,e){let n=0;for(let e=0,o=t.length,s=o-2;e<o;s=e,e+=2)n+=(t[e]-t[s])*(t[e+1]+t[s+1]);if(n>0!==e)return;for(let e=0,n=t.length;e<n/2;e+=2){const o=t[e],s=t[e+1];t[e]=t[n-2-e],t[e+1]=t[n-1-e],t[n-2-e]=o,t[n-1-e]=s}}(a,i),t.push(a)}function st(t,e){if(t.transformed)return t;const n=1<<t.z,o=t.x,s=t.y;for(const i of t.features)1===i.type?it(i,e,n,o,s):rt(i,e,n,o,s);return t.transformed=!0,t}function it(t,e,n,o,s){const i=t,r=t.geometry,a=[];for(let t=0;t<r.length;t+=2)a.push(at(r[t],r[t+1],e,n,o,s));return i.geometry=a,i}function rt(t,e,n,o,s){const i=t,r=t.geometry,a=[];for(const t of r){const i=[];for(let r=0;r<t.length;r+=2)i.push(at(t[r],t[r+1],e,n,o,s));a.push(i)}return i.geometry=a,i}function at(t,e,n,o,s,i){return[Math.round(n*(t*o-s)),Math.round(n*(e*o-i))]}class ut{constructor(t){this.options=t,this.total=0,this.stats={},this.tiles={},this.tileCoords=[],this.stats={},this.total=0}initialize(t){this.splitTile(t,0,0,0),this.options.debug&&(t.length&&console.log("features: %d, points: %d",this.tiles[0].numFeatures,this.tiles[0].numPoints),console.timeEnd("generate tiles"),console.log("tiles generated:",this.total,JSON.stringify(this.stats)))}updateIndex(t,e,n){n.debug>1&&(console.log("invalidating tiles"),console.time("invalidating")),this.invalidateTiles(e),n.debug>1&&console.timeEnd("invalidating");const[o,s,i]=[0,0,0],r=et(t,o,s,i,n);r.source=t;const a=ct(o,s,i);if(this.tiles[a]=r,this.tileCoords.push({z:o,x:s,y:i,id:a}),n.debug){const t=`z${o}`;this.stats[t]=(this.stats[t]||0)+1,this.total++}}getClusterExpansionZoom(t){return null}getChildren(t){return null}getLeaves(t,e,n){return null}getTile(t,e,n){const{extent:o,debug:s}=this.options,i=1<<t,r=ct(t,e=e+i&i-1,n);if(this.tiles[r])return st(this.tiles[r],o);s>1&&console.log("drilling down to z%d-%d-%d",t,e,n);let a,u=t,c=e,l=n;for(;!a&&u>0;)u--,c>>=1,l>>=1,a=this.tiles[ct(u,c,l)];return a?.source?(s>1&&(console.log("found parent tile z%d-%d-%d",u,c,l),console.time("drilling down")),this.splitTile(a.source,u,c,l,t,e,n),s>1&&console.timeEnd("drilling down"),this.tiles[r]?st(this.tiles[r],o):null):null}splitTile(t,e,n,o,s,i,r){const a=[t,e,n,o],u=this.options,c=u.debug;for(;a.length;){o=a.pop(),n=a.pop(),e=a.pop(),t=a.pop();const l=1<<e,h=ct(e,n,o);let p=this.tiles[h];if(!p&&(c>1&&console.time("creation"),p=this.tiles[h]=et(t,e,n,o,u),this.tileCoords.push({z:e,x:n,y:o,id:h}),c)){c>1&&(console.log("tile z%d-%d-%d (features: %d, points: %d, simplified: %d)",e,n,o,p.numFeatures,p.numPoints,p.numSimplified),console.timeEnd("creation"));const t=`z${e}`;this.stats[t]=(this.stats[t]||0)+1,this.total++}if(p.source=t,null==s){if(e===u.indexMaxZoom||p.numPoints<=u.indexMaxPoints)continue}else{if(e===u.maxZoom||e===s)continue;if(null!=s){const t=s-e;if(n!==i>>t||o!==r>>t)continue}}if(p.source=null,!t.length)continue;c>1&&console.time("clipping");const d=.5*u.buffer/u.extent,f=.5-d,g=.5+d,m=1+d;let y=null,w=null,P=null,I=null;const v=M(t,l,n-d,n+g,x.X,p.minX,p.maxX,u),b=M(t,l,n+f,n+m,x.X,p.minX,p.maxX,u);v&&(y=M(v,l,o-d,o+g,x.Y,p.minY,p.maxY,u),w=M(v,l,o+f,o+m,x.Y,p.minY,p.maxY,u)),b&&(P=M(b,l,o-d,o+g,x.Y,p.minY,p.maxY,u),I=M(b,l,o+f,o+m,x.Y,p.minY,p.maxY,u)),c>1&&console.timeEnd("clipping"),a.push(y||[],e+1,2*n,2*o),a.push(w||[],e+1,2*n,2*o+1),a.push(P||[],e+1,2*n+1,2*o),a.push(I||[],e+1,2*n+1,2*o+1)}}invalidateTiles(t){if(!t.length)return;const e=this.options,{debug:n}=e;let o=1/0,s=-1/0,i=1/0,r=-1/0;for(const e of t)o=Math.min(o,e.minX),s=Math.max(s,e.maxX),i=Math.min(i,e.minY),r=Math.max(r,e.maxY);const a=e.buffer/e.extent,u=new Set;for(const e in this.tiles){const c=this.tiles[e],l=1<<c.z,h=(c.x-a)/l,p=(c.x+1+a)/l,d=(c.y-a)/l,f=(c.y+1+a)/l;if(s<h||o>=p||r<d||i>=f)continue;let g=!1;for(const e of t)if(e.maxX>=h&&e.minX<p&&e.maxY>=d&&e.minY<f){g=!0;break}if(g){if(n){n>1&&console.log("invalidate tile z%d-%d-%d (features: %d, points: %d, simplified: %d)",c.z,c.x,c.y,c.numFeatures,c.numPoints,c.numSimplified);const t=`z${c.z}`;this.stats[t]=(this.stats[t]||0)-1,this.total--}delete this.tiles[e],u.add(e)}}u.size&&(this.tileCoords=this.tileCoords.filter((t=>!u.has(t.id))))}}function ct(t,e,n){return 32*((1<<t)*n+e)+t}const lt={maxZoom:14,indexMaxZoom:5,indexMaxPoints:1e5,tolerance:3,extent:4096,buffer:64,lineMetrics:!1,promoteId:null,generateId:!1,updateable:!1,cluster:!1,clusterOptions:B,debug:0};t.GEOJSONVT_CLIP_END=tt,t.GEOJSONVT_CLIP_START=W,t.GeoJSONVT=class{constructor(t,e){const n=(e=this.options=Object.assign({},lt,e)).debug;if(n&&console.time("preprocess data"),e.maxZoom<0||e.maxZoom>24)throw new Error("maxZoom should be in the 0-24 range");if(e.promoteId&&e.generateId)throw new Error("promoteId and generateId cannot be used together.");let o=r(t,e);n&&(console.timeEnd("preprocess data"),console.log("index: maxZoom: %d, maxPoints: %d",e.indexMaxZoom,e.indexMaxPoints),console.time("generate tiles")),o=Y(o,e),e.updateable&&(this.source=o),this.initializeIndex(o,e)}initializeIndex(t,e){this.tileIndex=e.cluster?new V(e.clusterOptions):new ut(e),t.length&&this.tileIndex.initialize(t)}getTile(t,e,n){return e=+e,n=+n,(t=+t)<0||t>24?null:this.tileIndex.getTile(t,e,n)}updateData(t,e){const n=this.options;if(!n.updateable)throw new Error("to update tile geojson `updateable` option must be set to true");let{affected:o,source:s}=_(this.source,t,n);e&&({affected:o,source:s}=this.filterUpdate(s,o,e)),o.length&&(this.source=s,this.tileIndex.updateIndex(s,o,n))}filterUpdate(t,e,n){const o=new Set;for(const s of t)null!=s.id&&(n(p(s))||(e.push(s),o.add(s.id)));return{affected:e,source:t=t.filter((t=>!o.has(t.id)))}}getData(){if(!this.options.updateable)throw new Error("to retrieve data the `updateable` option must be set to true");return{type:"FeatureCollection",features:this.source.map((t=>p(t)))}}updateClusterOptions(t,e){const n=this.options.cluster;this.options.cluster=t,this.options.clusterOptions=e,n!=t?this.initializeIndex(this.source,this.options):this.tileIndex.updateIndex(this.source,[],this.options)}getClusterExpansionZoom(t){return this.tileIndex.getClusterExpansionZoom(t)}getClusterChildren(t){return this.tileIndex.getChildren(t)}getClusterLeaves(t,e,n){return this.tileIndex.getLeaves(t,e,n)}},t.Supercluster=V,t.geoJSONToTile=function(t,e,n,o,s={}){s={...lt,...s};const{wrap:i=!1,clip:a=!1}=s;let u=r(t,s);if(i&&(u=Y(u,s)),a||s.lineMetrics){const t=1<<e,i=s.buffer/s.extent,r=M(u,t,n-i,n+1+i,x.X,-1,2,s);u=M(r||[],t,o-i,o+1+i,x.Y,-1,2,s)}return st(et(u??[],e,n,o,s),s.extent)}}));
|
package/dist/geojson-vt.mjs
CHANGED
|
@@ -733,26 +733,25 @@ function applySourceDiff(source, dataDiff, options) {
|
|
|
733
733
|
}
|
|
734
734
|
if (diff.update.size) {
|
|
735
735
|
// Features can be duplicated across the antimeridian (wrap) in a single tile, so must update all instances with the same id
|
|
736
|
-
|
|
737
|
-
|
|
738
|
-
|
|
739
|
-
|
|
740
|
-
|
|
741
|
-
|
|
742
|
-
|
|
743
|
-
|
|
744
|
-
keepFeatures.push(feature);
|
|
745
|
-
}
|
|
736
|
+
const oldFeaturesMap = new Map();
|
|
737
|
+
const keepFeatures = [];
|
|
738
|
+
for (const feature of source) {
|
|
739
|
+
if (diff.update.has(feature.id)) {
|
|
740
|
+
oldFeaturesMap.set(feature.id, [...(oldFeaturesMap.get(feature.id) || []), feature]);
|
|
741
|
+
}
|
|
742
|
+
else {
|
|
743
|
+
keepFeatures.push(feature);
|
|
746
744
|
}
|
|
747
|
-
|
|
745
|
+
}
|
|
746
|
+
for (const [id, update] of diff.update) {
|
|
747
|
+
const oldFeatures = oldFeaturesMap.get(id);
|
|
748
|
+
if (!oldFeatures || oldFeatures.length === 0)
|
|
748
749
|
continue;
|
|
749
750
|
const updatedFeatures = getUpdatedFeatures(oldFeatures, update, options);
|
|
750
|
-
if (!updatedFeatures.length)
|
|
751
|
-
continue;
|
|
752
751
|
affected.push(...oldFeatures, ...updatedFeatures);
|
|
753
752
|
keepFeatures.push(...updatedFeatures);
|
|
754
|
-
source = keepFeatures;
|
|
755
753
|
}
|
|
754
|
+
source = keepFeatures;
|
|
756
755
|
}
|
|
757
756
|
return { affected, source };
|
|
758
757
|
}
|
|
@@ -790,7 +789,7 @@ function getUpdatedFeatures(vtFeatures, update, options) {
|
|
|
790
789
|
}
|
|
791
790
|
return updated;
|
|
792
791
|
}
|
|
793
|
-
return
|
|
792
|
+
return vtFeatures;
|
|
794
793
|
}
|
|
795
794
|
/**
|
|
796
795
|
* helper to apply property updates from a diff update object to a properties object
|
|
@@ -1500,10 +1499,9 @@ function transformPoint(x, y, extent, z2, tx, ty) {
|
|
|
1500
1499
|
class TileIndex {
|
|
1501
1500
|
constructor(options) {
|
|
1502
1501
|
this.options = options;
|
|
1502
|
+
this.total = 0;
|
|
1503
1503
|
/** @internal */
|
|
1504
1504
|
this.stats = {};
|
|
1505
|
-
/** @internal */
|
|
1506
|
-
this.total = 0;
|
|
1507
1505
|
this.tiles = {};
|
|
1508
1506
|
this.tileCoords = [];
|
|
1509
1507
|
this.stats = {};
|
|
@@ -1778,30 +1776,6 @@ const defaultOptions = {
|
|
|
1778
1776
|
* Main class for creating and managing a vector tile index from GeoJSON data.
|
|
1779
1777
|
*/
|
|
1780
1778
|
class GeoJSONVT {
|
|
1781
|
-
/**
|
|
1782
|
-
* @internal
|
|
1783
|
-
* This is for the tests
|
|
1784
|
-
*/
|
|
1785
|
-
get tiles() {
|
|
1786
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
1787
|
-
return this.tileIndex?.tiles ?? {};
|
|
1788
|
-
}
|
|
1789
|
-
/**
|
|
1790
|
-
* @internal
|
|
1791
|
-
* This is for the tests
|
|
1792
|
-
*/
|
|
1793
|
-
get stats() {
|
|
1794
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
1795
|
-
return this.tileIndex.stats;
|
|
1796
|
-
}
|
|
1797
|
-
/**
|
|
1798
|
-
* @internal
|
|
1799
|
-
* This is for the tests
|
|
1800
|
-
*/
|
|
1801
|
-
get total() {
|
|
1802
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
1803
|
-
return this.tileIndex.total;
|
|
1804
|
-
}
|
|
1805
1779
|
constructor(data, options) {
|
|
1806
1780
|
options = this.options = Object.assign({}, defaultOptions, options);
|
|
1807
1781
|
const debug = options.debug;
|