@maplibre/geojson-vt 5.0.3 → 6.0.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.
Files changed (65) hide show
  1. package/README.md +3 -13
  2. package/dist/clip.d.ts +22 -0
  3. package/dist/clip.d.ts.map +1 -0
  4. package/dist/clip.test.d.ts +2 -0
  5. package/dist/clip.test.d.ts.map +1 -0
  6. package/dist/cluster-tile-index.d.ts +76 -0
  7. package/dist/cluster-tile-index.d.ts.map +1 -0
  8. package/dist/cluster-tile-index.test.d.ts +2 -0
  9. package/dist/cluster-tile-index.test.d.ts.map +1 -0
  10. package/dist/convert.d.ts +17 -0
  11. package/dist/convert.d.ts.map +1 -0
  12. package/dist/deconvert.d.ts +19 -0
  13. package/dist/deconvert.d.ts.map +1 -0
  14. package/dist/deconvert.test.d.ts +2 -0
  15. package/dist/deconvert.test.d.ts.map +1 -0
  16. package/dist/definitions.d.ts +241 -0
  17. package/dist/definitions.d.ts.map +1 -0
  18. package/dist/difference.d.ts +67 -0
  19. package/dist/difference.d.ts.map +1 -0
  20. package/dist/difference.test.d.ts +2 -0
  21. package/dist/difference.test.d.ts.map +1 -0
  22. package/dist/feature.d.ts +20 -0
  23. package/dist/feature.d.ts.map +1 -0
  24. package/dist/geojson-to-tile.d.ts +35 -0
  25. package/dist/geojson-to-tile.d.ts.map +1 -0
  26. package/dist/geojson-vt-dev.js +1582 -478
  27. package/dist/geojson-vt.js +1 -1
  28. package/dist/geojson-vt.mjs +1250 -473
  29. package/dist/geojson-vt.mjs.map +1 -1
  30. package/dist/geojsonvt.d.ts +76 -0
  31. package/dist/geojsonvt.d.ts.map +1 -0
  32. package/dist/geojsonvt.test.d.ts +2 -0
  33. package/dist/geojsonvt.test.d.ts.map +1 -0
  34. package/dist/index.d.ts +9 -0
  35. package/dist/index.d.ts.map +1 -0
  36. package/dist/simplify.d.ts +9 -0
  37. package/dist/simplify.d.ts.map +1 -0
  38. package/dist/simplify.test.d.ts +2 -0
  39. package/dist/simplify.test.d.ts.map +1 -0
  40. package/dist/tile-index.d.ts +51 -0
  41. package/dist/tile-index.d.ts.map +1 -0
  42. package/dist/tile.d.ts +12 -0
  43. package/dist/tile.d.ts.map +1 -0
  44. package/dist/transform.d.ts +10 -0
  45. package/dist/transform.d.ts.map +1 -0
  46. package/dist/wrap.d.ts +3 -0
  47. package/dist/wrap.d.ts.map +1 -0
  48. package/package.json +26 -12
  49. package/src/clip.ts +119 -81
  50. package/src/cluster-tile-index.test.ts +205 -0
  51. package/src/cluster-tile-index.ts +513 -0
  52. package/src/convert.ts +97 -75
  53. package/src/deconvert.test.ts +153 -0
  54. package/src/deconvert.ts +92 -0
  55. package/src/definitions.ts +196 -18
  56. package/src/difference.ts +3 -3
  57. package/src/feature.ts +11 -4
  58. package/src/geojson-to-tile.ts +58 -0
  59. package/src/geojsonvt.test.ts +39 -0
  60. package/src/geojsonvt.ts +209 -0
  61. package/src/index.ts +27 -378
  62. package/src/tile-index.ts +310 -0
  63. package/src/tile.ts +92 -103
  64. package/src/transform.ts +41 -39
  65. package/src/wrap.ts +4 -4
@@ -1 +1 @@
1
- !function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t="undefined"!=typeof globalThis?globalThis:t||self).geojsonvt=e()}(this,(function(){"use strict";function t(o,n,i,s){let r=s;const l=n+(i-n>>1);let a,c=i-n;const u=o[n],m=o[n+1],f=o[i],d=o[i+1];for(let t=n+3;t<i;t+=3){const n=e(o[t],o[t+1],u,m,f,d);if(n>r)a=t,r=n;else if(n===r){const e=Math.abs(t-l);e<c&&(a=t,c=e)}}r>s&&(a-n>3&&t(o,n,a,s),o[a+2]=r,i-a>3&&t(o,a,i,s))}function e(t,e,o,n,i,s){let r=i-o,l=s-n;if(0!==r||0!==l){const a=((t-o)*r+(e-n)*l)/(r*r+l*l);a>1?(o=i,n=s):a>0&&(o+=r*a,n+=l*a)}return r=t-o,l=e-n,r*r+l*l}function o(t,e,o,i){const s={type:e,geom:o},r={id:null==t?null:t,type:s.type,geometry:s.geom,tags:i,minX:1/0,minY:1/0,maxX:-1/0,maxY:-1/0};switch(s.type){case"Point":case"MultiPoint":case"LineString":n(r,s.geom);break;case"Polygon":n(r,s.geom[0]);break;case"MultiLineString":for(const t of s.geom)n(r,t);break;case"MultiPolygon":for(const t of s.geom)n(r,t[0])}return r}function n(t,e){for(let o=0;o<e.length;o+=3)t.minX=Math.min(t.minX,e[o]),t.minY=Math.min(t.minY,e[o+1]),t.maxX=Math.max(t.maxX,e[o]),t.maxY=Math.max(t.maxY,e[o+1])}function i(t,e){const o=[];switch(t.type){case"FeatureCollection":for(let n=0;n<t.features.length;n++)s(o,t.features[n],e,n);break;case"Feature":s(o,t,e);break;default:s(o,{geometry:t,properties:void 0},e)}return o}function s(t,e,n,i){if(!e.geometry)return;if("GeometryCollection"===e.geometry.type){for(const o of e.geometry.geometries)s(t,{id:e.id,geometry:o,properties:e.properties},n,i);return}const c=e.geometry.coordinates;if(!c?.length)return;const u=Math.pow(n.tolerance/((1<<n.maxZoom)*n.extent),2);let m=e.id;switch(n.promoteId?m=e.properties?.[n.promoteId]:n.generateId&&(m=i||0),e.geometry.type){case"Point":{const n=[];return r(e.geometry.coordinates,n),void t.push(o(m,e.geometry.type,n,e.properties))}case"MultiPoint":{const n=[];for(const t of e.geometry.coordinates)r(t,n);return void t.push(o(m,e.geometry.type,n,e.properties))}case"LineString":{const n=[];return l(e.geometry.coordinates,n,u,!1),void t.push(o(m,e.geometry.type,n,e.properties))}case"MultiLineString":{if(n.lineMetrics){for(const n of e.geometry.coordinates){const i=[];l(n,i,u,!1),t.push(o(m,"LineString",i,e.properties))}return}const i=[];return a(e.geometry.coordinates,i,u,!1),void t.push(o(m,e.geometry.type,i,e.properties))}case"Polygon":{const n=[];return a(e.geometry.coordinates,n,u,!0),void t.push(o(m,e.geometry.type,n,e.properties))}case"MultiPolygon":{const n=[];for(const t of e.geometry.coordinates){const e=[];a(t,e,u,!0),n.push(e)}return void t.push(o(m,e.geometry.type,n,e.properties))}default:throw new Error("Input data is not a valid GeoJSON object.")}}function r(t,e){e.push(c(t[0]),u(t[1]),0)}function l(e,o,n,i){let s,r,l=0;for(let t=0;t<e.length;t++){const n=c(e[t][0]),a=u(e[t][1]);o.push(n,a,0),t>0&&(l+=i?(s*a-n*r)/2:Math.sqrt(Math.pow(n-s,2)+Math.pow(a-r,2))),s=n,r=a}const a=o.length-3;o[2]=1,n>0&&t(o,0,a,n),o[a+2]=1,o.size=Math.abs(l),o.start=0,o.end=o.size}function a(t,e,o,n){for(let i=0;i<t.length;i++){const s=[];l(t[i],s,o,n),e.push(s)}}function c(t){return t/360+.5}function u(t){const e=Math.sin(t*Math.PI/180),o=.5-.25*Math.log((1+e)/(1-e))/Math.PI;return o<0?0:o>1?1:o}function m(t,e,n,i,s,r,l,a){if(i/=e,r>=(n/=e)&&l<i)return t;if(l<n||r>=i)return null;const c=[];for(const e of t){const t=0===s?e.minX:e.minY,r=0===s?e.maxX:e.maxY;if(t>=n&&r<i)c.push(e);else if(!(r<n||t>=i))switch(e.type){case"Point":case"MultiPoint":{const t=[];if(f(e.geometry,t,n,i,s),!t.length)continue;const r=3===t.length?"Point":"MultiPoint";c.push(o(e.id,r,t,e.tags));continue}case"LineString":{const t=[];if(d(e.geometry,t,n,i,s,!1,a.lineMetrics),!t.length)continue;if(a.lineMetrics){for(const n of t)c.push(o(e.id,e.type,n,e.tags));continue}if(t.length>1){c.push(o(e.id,"MultiLineString",t,e.tags));continue}c.push(o(e.id,e.type,t[0],e.tags));continue}case"MultiLineString":{const t=[];if(g(e.geometry,t,n,i,s,!1),!t.length)continue;if(1===t.length){c.push(o(e.id,"LineString",t[0],e.tags));continue}c.push(o(e.id,e.type,t,e.tags));continue}case"Polygon":{const t=[];if(g(e.geometry,t,n,i,s,!0),!t.length)continue;c.push(o(e.id,e.type,t,e.tags));continue}case"MultiPolygon":{const t=[];for(const o of e.geometry){const e=[];g(o,e,n,i,s,!0),e.length&&t.push(e)}if(!t.length)continue;c.push(o(e.id,e.type,t,e.tags));continue}}}return c.length?c:null}function f(t,e,o,n,i){for(let s=0;s<t.length;s+=3){const r=t[s+i];r>=o&&r<=n&&h(e,t[s],t[s+1],t[s+2])}}function d(t,e,o,n,i,s,r){let l=p(t);const a=0===i?y:x;let c,u,m=t.start;for(let f=0;f<t.length-3;f+=3){const d=t[f],g=t[f+1],y=t[f+2],x=t[f+3],M=t[f+4],P=0===i?d:g,b=0===i?x:M;let w=!1;r&&(c=Math.sqrt(Math.pow(d-x,2)+Math.pow(g-M,2))),P<o?b>o&&(u=a(l,d,g,x,M,o),r&&(l.start=m+c*u)):P>n?b<n&&(u=a(l,d,g,x,M,n),r&&(l.start=m+c*u)):h(l,d,g,y),b<o&&P>=o&&(u=a(l,d,g,x,M,o),w=!0),b>n&&P<=n&&(u=a(l,d,g,x,M,n),w=!0),!s&&w&&(r&&(l.end=m+c*u),e.push(l),l=p(t)),r&&(m+=c)}let f=t.length-3;const d=t[f],g=t[f+1],M=t[f+2],P=0===i?d:g;P>=o&&P<=n&&h(l,d,g,M),f=l.length-3,s&&f>=3&&(l[f]!==l[0]||l[f+1]!==l[1])&&h(l,l[0],l[1],l[2]),l.length&&e.push(l)}function p(t){const e=[];return e.size=t.size,e.start=t.start,e.end=t.end,e}function g(t,e,o,n,i,s){for(const r of t)d(r,e,o,n,i,s,!1)}function h(t,e,o,n){t.push(e,o,n)}function y(t,e,o,n,i,s){const r=(s-e)/(n-e);return h(t,s,o+(i-o)*r,1),r}function x(t,e,o,n,i,s){const r=(s-o)/(i-o);return h(t,e+(n-e)*r,s,1),r}function M(t,e){const o=e.buffer/e.extent;let n=t;const i=m(t,1,-1-o,o,0,-1,2,e),s=m(t,1,1-o,2+o,0,-1,2,e);return i||s?(n=m(t,1,-o,1+o,0,-1,2,e)||[],i&&(n=P(i,1).concat(n)),s&&(n=n.concat(P(s,-1))),n):n}function P(t,e){const n=[];for(const i of t)switch(i.type){case"Point":case"MultiPoint":case"LineString":{const t=b(i.geometry,e);n.push(o(i.id,i.type,t,i.tags));continue}case"MultiLineString":case"Polygon":{const t=[];for(const o of i.geometry)t.push(b(o,e));n.push(o(i.id,i.type,t,i.tags));continue}case"MultiPolygon":{const t=[];for(const o of i.geometry){const n=[];for(const t of o)n.push(b(t,e));t.push(n)}n.push(o(i.id,i.type,t,i.tags));continue}}return n}function b(t,e){const o=[];o.size=t.size,void 0!==t.start&&(o.start=t.start,o.end=t.end);for(let n=0;n<t.length;n+=3)o.push(t[n]+e,t[n+1],t[n+2]);return o}function w(t,e){if(t.transformed)return t;const o=1<<t.z,n=t.x,i=t.y;for(const s of t.features){if(1===s.type){const t=[];for(let r=0;r<s.geometry.length;r+=2)t.push(v(s.geometry[r],s.geometry[r+1],e,o,n,i));s.geometry=t;continue}const t=[];for(const r of s.geometry){const s=[];for(let t=0;t<r.length;t+=2)s.push(v(r[t],r[t+1],e,o,n,i));t.push(s)}s.geometry=t}return t.transformed=!0,t}function v(t,e,o,n,i,s){return[Math.round(o*(t*n-i)),Math.round(o*(e*n-s))]}function z(t,e,o,n,i){const s=e===i.maxZoom?0:i.tolerance/((1<<e)*i.extent),r={features:[],numPoints:0,numSimplified:0,numFeatures:t.length,source:null,x:o,y:n,z:e,transformed:!1,minX:2,minY:1,maxX:-1,maxY:0};for(const e of t)Y(r,e,s,i);return r}function Y(t,e,o,n){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);let i,s=e.tags||null;switch(e.type){case"Point":case"MultiPoint":{const o=[];for(let n=0;n<e.geometry.length;n+=3)o.push(e.geometry[n],e.geometry[n+1]),t.numPoints++,t.numSimplified++;if(!o.length)return;i={type:1,tags:s,geometry:o};break}case"LineString":{const r=[];if(S(r,e.geometry,t,o,!1,!1),!r.length)return;if(n.lineMetrics){s={};for(const t in e.tags)s[t]=e.tags[t];s.mapbox_clip_start=e.geometry.start/e.geometry.size,s.mapbox_clip_end=e.geometry.end/e.geometry.size}i={type:2,tags:s,geometry:r};break}case"MultiLineString":case"Polygon":{const n=[];for(let i=0;i<e.geometry.length;i++)S(n,e.geometry[i],t,o,"Polygon"===e.type,0===i);if(!n.length)return;i={type:"Polygon"===e.type?3:2,tags:s,geometry:n};break}case"MultiPolygon":{const n=[];for(let i=0;i<e.geometry.length;i++){const s=e.geometry[i];for(let e=0;e<s.length;e++)S(n,s[e],t,o,!0,0===e)}if(!n.length)return;i={type:3,tags:s,geometry:n};break}}null!==e.id&&(i.id=e.id),t.features.push(i)}function S(t,e,o,n,i,s){const r=n*n;if(n>0&&e.size<(i?r:n))return void(o.numPoints+=e.length/3);const l=[];for(let t=0;t<e.length;t+=3)(0===n||e[t+2]>r)&&(o.numSimplified++,l.push(e[t],e[t+1])),o.numPoints++;i&&function(t,e){let o=0;for(let e=0,n=t.length,i=n-2;e<n;i=e,e+=2)o+=(t[e]-t[i])*(t[e+1]+t[i+1]);if(o>0!==e)return;for(let e=0,o=t.length;e<o/2;e+=2){const n=t[e],i=t[e+1];t[e]=t[o-2-e],t[e+1]=t[o-1-e],t[o-2-e]=n,t[o-1-e]=i}}(l,s),t.push(l)}function X(t,e,o){const n=function(t){if(!t)return{remove:new Set,add:new Map,update:new Map};const e={removeAll:t.removeAll,remove:new Set(t.remove||[]),add:new Map(t.add?.map((t=>[t.id,t]))),update:new Map(t.update?.map((t=>[t.id,t])))};return e}(e);let s=[];if(n.removeAll&&(s=t,t=[]),n.remove.size||n.add.size){const e=[];for(const o of t){const{id:t}=o;(n.remove.has(t)||n.add.has(t))&&e.push(o)}if(e.length){s.push(...e);const o=new Set(e.map((t=>t.id)));t=t.filter((t=>!o.has(t.id)))}if(n.add.size){let e=i({type:"FeatureCollection",features:Array.from(n.add.values())},o);e=M(e,o),s.push(...e),t.push(...e)}}if(n.update.size)for(const[e,i]of n.update){const n=t.findIndex((t=>t.id===e));if(-1===n)continue;const r=t[n],l=I(r,i,o);l&&(s.push(r,l),t[n]=l)}return{affected:s,source:t}}function I(t,e,o){const n=!!e.newGeometry,s=e.removeAllProperties||e.removeProperties?.length>0||e.addOrUpdateProperties?.length>0;if(n){let n=i({type:"FeatureCollection",features:[{type:"Feature",id:t.id,geometry:e.newGeometry,properties:s?L(t.tags,e):t.tags}]},o);return n=M(n,o),n[0]}if(s){const o={...t};return o.tags=L(o.tags,e),o}return null}function L(t,e){if(e.removeAllProperties)return{};const o={...t||{}};if(e.removeProperties)for(const t of e.removeProperties)delete o[t];if(e.addOrUpdateProperties)for(const{key:t,value:n}of e.addOrUpdateProperties)o[t]=n;return o}const k={maxZoom:14,indexMaxZoom:5,indexMaxPoints:1e5,tolerance:3,extent:4096,buffer:64,lineMetrics:!1,promoteId:null,generateId:!1,updateable:!1,debug:0};class Z{options;tiles;tileCoords;stats={};total=0;source;constructor(t,e){const o=(e=this.options=Object.assign({},k,e)).debug;if(o&&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 n=i(t,e);this.tiles={},this.tileCoords=[],o&&(console.timeEnd("preprocess data"),console.log("index: maxZoom: %d, maxPoints: %d",e.indexMaxZoom,e.indexMaxPoints),console.time("generate tiles"),this.stats={},this.total=0),n=M(n,e),n.length&&this.splitTile(n,0,0,0),e.updateable&&(this.source=n),o&&(n.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)))}splitTile(t,e,o,n,i,s,r){const l=[t,e,o,n],a=this.options,c=a.debug;for(;l.length;){n=l.pop(),o=l.pop(),e=l.pop(),t=l.pop();const u=1<<e,f=C(e,o,n);let d=this.tiles[f];if(!d&&(c>1&&console.time("creation"),d=this.tiles[f]=z(t,e,o,n,a),this.tileCoords.push({z:e,x:o,y:n,id:f}),c)){c>1&&(console.log("tile z%d-%d-%d (features: %d, points: %d, simplified: %d)",e,o,n,d.numFeatures,d.numPoints,d.numSimplified),console.timeEnd("creation"));const t=`z${e}`;this.stats[t]=(this.stats[t]||0)+1,this.total++}if(d.source=t,null==i){if(e===a.indexMaxZoom||d.numPoints<=a.indexMaxPoints)continue}else{if(e===a.maxZoom||e===i)continue;if(null!=i){const t=i-e;if(o!==s>>t||n!==r>>t)continue}}if(d.source=null,!t.length)continue;c>1&&console.time("clipping");const p=.5*a.buffer/a.extent,g=.5-p,h=.5+p,y=1+p;let x=null,M=null,P=null,b=null;const w=m(t,u,o-p,o+h,0,d.minX,d.maxX,a),v=m(t,u,o+g,o+y,0,d.minX,d.maxX,a);w&&(x=m(w,u,n-p,n+h,1,d.minY,d.maxY,a),M=m(w,u,n+g,n+y,1,d.minY,d.maxY,a)),v&&(P=m(v,u,n-p,n+h,1,d.minY,d.maxY,a),b=m(v,u,n+g,n+y,1,d.minY,d.maxY,a)),c>1&&console.timeEnd("clipping"),l.push(x||[],e+1,2*o,2*n),l.push(M||[],e+1,2*o,2*n+1),l.push(P||[],e+1,2*o+1,2*n),l.push(b||[],e+1,2*o+1,2*n+1)}}getTile(t,e,o){t=+t,e=+e,o=+o;const n=this.options,{extent:i,debug:s}=n;if(t<0||t>24)return null;const r=1<<t,l=C(t,e=e+r&r-1,o);if(this.tiles[l])return w(this.tiles[l],i);s>1&&console.log("drilling down to z%d-%d-%d",t,e,o);let a,c=t,u=e,m=o;for(;!a&&c>0;)c--,u>>=1,m>>=1,a=this.tiles[C(c,u,m)];return a?.source?(s>1&&(console.log("found parent tile z%d-%d-%d",c,u,m),console.time("drilling down")),this.splitTile(a.source,c,u,m,t,e,o),s>1&&console.timeEnd("drilling down"),this.tiles[l]?w(this.tiles[l],i):null):null}invalidateTiles(t){const e=this.options,{debug:o}=e;let n=1/0,i=-1/0,s=1/0,r=-1/0;for(const e of t)n=Math.min(n,e.minX),i=Math.max(i,e.maxX),s=Math.min(s,e.minY),r=Math.max(r,e.maxY);const l=e.buffer/e.extent,a=new Set;for(const e in this.tiles){const c=this.tiles[e],u=1<<c.z,m=(c.x-l)/u,f=(c.x+1+l)/u,d=(c.y-l)/u,p=(c.y+1+l)/u;if(i<m||n>=f||r<d||s>=p)continue;let g=!1;for(const e of t)if(e.maxX>=m&&e.minX<f&&e.maxY>=d&&e.minY<p){g=!0;break}if(g){if(o){o>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],a.add(e)}}a.size&&(this.tileCoords=this.tileCoords.filter((t=>!a.has(t.id))))}updateData(t){const e=this.options,o=e.debug;if(!e.updateable)throw new Error("to update tile geojson `updateable` option must be set to true");const{affected:n,source:i}=X(this.source,t,e);if(!n.length)return;this.source=i,o>1&&(console.log("invalidating tiles"),console.time("invalidating")),this.invalidateTiles(n),o>1&&console.timeEnd("invalidating");const[s,r,l]=[0,0,0],a=z(this.source,s,r,l,this.options);a.source=this.source;const c=C(s,r,l);if(this.tiles[c]=a,this.tileCoords.push({z:s,x:r,y:l,id:c}),o){const t=`z${s}`;this.stats[t]=(this.stats[t]||0)+1,this.total++}}}function C(t,e,o){return 32*((1<<t)*o+e)+t}return function(t,e){return new Z(t,e)}}));
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,i,s){let r=s;const a=o+(i-o>>1);let u,l=i-o;const c=t[o],h=t[o+1],d=t[i],p=t[i+1];for(let e=o+3;e<i;e+=3){const o=n(t[e],t[e+1],c,h,d,p);if(o>r)u=e,r=o;else if(o===r){const t=Math.abs(e-a);t<l&&(u=e,l=t)}}r>s&&(u-o>3&&e(t,o,u,s),t[u+2]=r,i-u>3&&e(t,u,i,s))}function n(t,e,n,o,i,s){let r=i-n,a=s-o;if(0!==r||0!==a){const u=((t-n)*r+(e-o)*a)/(r*r+a*a);u>1?(n=i,o=s):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":case"LineString":i(r,s.geom);break;case"Polygon":i(r,s.geom[0]);break;case"MultiLineString":for(const t of s.geom)i(r,t);break;case"MultiPolygon":for(const t of s.geom)i(r,t[0])}return r}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 s(t,e){const n=[];switch(t.type){case"FeatureCollection":for(let o=0;o<t.features.length;o++)r(n,t.features[o],e,o);break;case"Feature":r(n,t,e);break;default:r(n,{geometry:t,properties:void 0},e)}return n}function r(t,e,n,i){if(!e.geometry)return;if("GeometryCollection"===e.geometry.type)return void function(t,e,n,o,i){for(const s of n.geometries)r(t,{id:e.id,geometry:s,properties:e.properties},o,i)}(t,e,e.geometry,n,i);const s=e.geometry.coordinates;if(!s?.length)return;const h=function(t,e,n){if(e.promoteId)return t.properties?.[e.promoteId];if(e.generateId)return n||0;return t.id}(e,n,i),d=Math.pow(n.tolerance/((1<<n.maxZoom)*n.extent),2);switch(e.geometry.type){case"Point":return void function(t,e,n,i){const s=[];s.push(l(n.coordinates[0]),c(n.coordinates[1]),0),t.push(o(e,"Point",s,i))}(t,h,e.geometry,e.properties);case"MultiPoint":return void function(t,e,n,i){const s=[];for(const t of n.coordinates)s.push(l(t[0]),c(t[1]),0);t.push(o(e,"MultiPoint",s,i))}(t,h,e.geometry,e.properties);case"LineString":return void function(t,e,n,i,s){const r=[];a(n.coordinates,r,i,!1),t.push(o(e,"LineString",r,s))}(t,h,e.geometry,d,e.properties);case"MultiLineString":return void function(t,e,n,i,s,r){if(s.lineMetrics)for(const s of n.coordinates){const n=[];a(s,n,i,!1),t.push(o(e,"LineString",n,r))}else{const s=[];u(n.coordinates,s,i,!1),t.push(o(e,"MultiLineString",s,r))}}(t,h,e.geometry,d,n,e.properties);case"Polygon":return void function(t,e,n,i,s){const r=[];u(n.coordinates,r,i,!0),t.push(o(e,"Polygon",r,s))}(t,h,e.geometry,d,e.properties);case"MultiPolygon":return void function(t,e,n,i,s){const r=[];for(const t of n.coordinates){const e=[];u(t,e,i,!0),r.push(e)}t.push(o(e,"MultiPolygon",r,s))}(t,h,e.geometry,d,e.properties);default:throw new Error("Input data is not a valid GeoJSON object.")}}function a(t,n,o,i){let s,r,a=0;for(let e=0;e<t.length;e++){const o=l(t[e][0]),u=c(t[e][1]);n.push(o,u,0),e>0&&(a+=i?(s*u-o*r)/2:Math.sqrt(Math.pow(o-s,2)+Math.pow(u-r,2))),s=o,r=u}const u=n.length-3;n[2]=1,o>0&&e(n,0,u,o),n[u+2]=1,n.size=Math.abs(a),n.start=0,n.end=n.size}function u(t,e,n,o){for(let i=0;i<t.length;i++){const s=[];a(t[i],s,n,o),e.push(s)}}function l(t){return t/360+.5}function c(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 h(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:f(n[0],n[1])};case"MultiPoint":case"LineString":return{type:e,coordinates:p(n)};case"MultiLineString":case"Polygon":return{type:e,coordinates:n.map((t=>p(t)))};case"MultiPolygon":return{type:e,coordinates:n.map((t=>t.map((t=>p(t)))))}}}function p(t){const e=[];for(let n=0;n<t.length;n+=3)e.push(f(t[n],t[n+1]));return e}function f(t,e){return[g(t),m(e)]}function g(t){return 360*(t-.5)}function m(t){const e=(180-360*t)*Math.PI/180;return 360*Math.atan(Math.exp(e))/Math.PI-90}var y;function x(t,e,n,o,i,s,r,a){if(o/=e,s>=(n/=e)&&r<o)return t;if(r<n||s>=o)return null;const u=[];for(const e of t){const t=i===y.X?e.minX:e.minY,s=i===y.X?e.maxX:e.maxY;if(t>=n&&s<o)u.push(e);else if(!(s<n||t>=o))switch(e.type){case"Point":case"MultiPoint":M(e,u,n,o,i);continue;case"LineString":w(e,u,n,o,i,a);continue;case"MultiLineString":P(e,u,n,o,i);continue;case"Polygon":I(e,u,n,o,i);continue;case"MultiPolygon":v(e,u,n,o,i);continue}}return u.length?u:null}function M(t,e,n,i,s){const r=[];if(function(t,e,n,o,i){for(let s=0;s<t.length;s+=3){const r=t[s+i];r>=n&&r<=o&&A(e,t[s],t[s+1],t[s+2])}}(t.geometry,r,n,i,s),!r.length)return;const a=3===r.length?"Point":"MultiPoint";e.push(o(t.id,a,r,t.tags))}function w(t,e,n,i,s,r){const a=[];if(b(t.geometry,a,n,i,s,!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 P(t,e,n,i,s){const r=[];S(t.geometry,r,n,i,s,!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 I(t,e,n,i,s){const r=[];S(t.geometry,r,n,i,s,!0),r.length&&e.push(o(t.id,"Polygon",r,t.tags))}function v(t,e,n,i,s){const r=[];for(const e of t.geometry){const t=[];S(e,t,n,i,s,!0),t.length&&r.push(t)}r.length&&e.push(o(t.id,"MultiPolygon",r,t.tags))}function b(t,e,n,o,i,s,r){let a=z(t);const u=i===y.X?X:E;let l,c,h=t.start;for(let d=0;d<t.length-3;d+=3){const p=t[d],f=t[d+1],g=t[d+2],m=t[d+3],x=t[d+4],M=i===y.X?p:f,w=i===y.X?m:x;let P=!1;r&&(l=Math.sqrt(Math.pow(p-m,2)+Math.pow(f-x,2))),M<n?w>n&&(c=u(a,p,f,m,x,n),r&&(a.start=h+l*c)):M>o?w<o&&(c=u(a,p,f,m,x,o),r&&(a.start=h+l*c)):A(a,p,f,g),w<n&&M>=n&&(c=u(a,p,f,m,x,n),P=!0),w>o&&M<=o&&(c=u(a,p,f,m,x,o),P=!0),!s&&P&&(r&&(a.end=h+l*c),e.push(a),a=z(t)),r&&(h+=l)}let d=t.length-3;const p=t[d],f=t[d+1],g=t[d+2],m=i===y.X?p:f;m>=n&&m<=o&&A(a,p,f,g),d=a.length-3,s&&d>=3&&(a[d]!==a[0]||a[d+1]!==a[1])&&A(a,a[0],a[1],a[2]),a.length&&e.push(a)}function z(t){const e=[];return e.size=t.size,e.start=t.start,e.end=t.end,e}function S(t,e,n,o,i,s){for(const r of t)b(r,e,n,o,i,s,!1)}function A(t,e,n,o){t.push(e,n,o)}function X(t,e,n,o,i,s){const r=(s-e)/(o-e);return A(t,s,n+(i-n)*r,1),r}function E(t,e,n,o,i,s){const r=(s-n)/(i-n);return A(t,e+(o-e)*r,s,1),r}function Y(t,e){const n=e.buffer/e.extent;let o=t;const i=x(t,1,-1-n,n,y.X,-1,2,e),s=x(t,1,1-n,2+n,y.X,-1,2,e);return i||s?(o=x(t,1,-n,1+n,y.X,-1,2,e)||[],i&&(o=T(i,1).concat(o)),s&&(o=o.concat(T(s,-1))),o):o}function T(t,e){const n=[];for(const i of t)switch(i.type){case"Point":case"MultiPoint":case"LineString":{const t=C(i.geometry,e);n.push(o(i.id,i.type,t,i.tags));continue}case"MultiLineString":case"Polygon":{const t=[];for(const n of i.geometry)t.push(C(n,e));n.push(o(i.id,i.type,t,i.tags));continue}case"MultiPolygon":{const t=[];for(const n of i.geometry){const o=[];for(const t of n)o.push(C(t,e));t.push(o)}n.push(o(i.id,i.type,t,i.tags));continue}}return n}function C(t,e){const n=[];n.size=t.size,void 0!==t.start&&(n.start=t.start,n.end=t.end);for(let o=0;o<t.length;o+=3)n.push(t[o]+e,t[o+1],t[o+2]);return n}function L(t,e,n){const o=function(t){if(!t)return{remove:new Set,add:new Map,update:new Map};const e={removeAll:t.removeAll,remove:new Set(t.remove||[]),add:new Map(t.add?.map((t=>[t.id,t]))),update:new Map(t.update?.map((t=>[t.id,t])))};return e}(e);let i=[];if(o.removeAll&&(i=t,t=[]),o.remove.size||o.add.size){const e=[];for(const n of t){const{id:t}=n;(o.remove.has(t)||o.add.has(t))&&e.push(n)}if(e.length){i.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=s({type:"FeatureCollection",features:Array.from(o.add.values())},n);e=Y(e,n),i.push(...e),t.push(...e)}}if(o.update.size)for(const[e,s]of o.update){const o=t.findIndex((t=>t.id===e));if(-1===o)continue;const r=t[o],a=Z(r,s,n);a&&(i.push(r,a),t[o]=a)}return{affected:i,source:t}}function Z(t,e,n){const o=!!e.newGeometry,i=e.removeAllProperties||e.removeProperties?.length>0||e.addOrUpdateProperties?.length>0;if(o){let o=s({type:"FeatureCollection",features:[{type:"Feature",id:t.id,geometry:e.newGeometry,properties:i?O(t.tags,e):t.tags}]},n);return o=Y(o,n),o[0]}if(i){const n={...t};return n.tags=O(n.tags,e),n}return null}function O(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"}(y||(y={}));const _=[Int8Array,Uint8Array,Uint8ClampedArray,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array];class F{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 i=_[15&n];if(!i)throw new Error("Unrecognized array type.");const[s]=new Uint16Array(t,2,1),[r]=new Uint32Array(t,4,1);return new F(r,s,i,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 i=_.indexOf(this.ArrayType),s=2*t*this.ArrayType.BYTES_PER_ELEMENT,r=t*this.IndexArrayType.BYTES_PER_ELEMENT,a=(8-r%8)%8;if(i<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+s+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+i]),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 U(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:i,coords:s,nodeSize:r}=this,a=[0,i.length-1,0],u=[];for(;a.length;){const l=a.pop()||0,c=a.pop()||0,h=a.pop()||0;if(c-h<=r){for(let r=h;r<=c;r++){const a=s[2*r],l=s[2*r+1];a>=t&&a<=n&&l>=e&&l<=o&&u.push(i[r])}continue}const d=h+c>>1,p=s[2*d],f=s[2*d+1];p>=t&&p<=n&&f>=e&&f<=o&&u.push(i[d]),(0===l?t<=p:e<=f)&&(a.push(h),a.push(d-1),a.push(1-l)),(0===l?n>=p:o>=f)&&(a.push(d+1),a.push(c),a.push(1-l))}return u}within(t,e,n){if(!this._finished)throw new Error("Data not yet indexed - call index.finish().");const{ids:o,coords:i,nodeSize:s}=this,r=[0,o.length-1,0],a=[],u=n*n;for(;r.length;){const l=r.pop()||0,c=r.pop()||0,h=r.pop()||0;if(c-h<=s){for(let n=h;n<=c;n++)$(i[2*n],i[2*n+1],t,e)<=u&&a.push(o[n]);continue}const d=h+c>>1,p=i[2*d],f=i[2*d+1];$(p,f,t,e)<=u&&a.push(o[d]),(0===l?t-n<=p:e-n<=f)&&(r.push(h),r.push(d-1),r.push(1-l)),(0===l?t+n>=p:e+n>=f)&&(r.push(d+1),r.push(c),r.push(1-l))}return a}}function U(t,e,n,o,i,s){if(i-o<=n)return;const r=o+i>>1;D(t,e,r,o,i,s),U(t,e,n,o,r-1,1-s),U(t,e,n,r+1,i,1-s)}function D(t,e,n,o,i,s){for(;i>o;){if(i-o>600){const r=i-o+1,a=n-o+1,u=Math.log(r),l=.5*Math.exp(2*u/3),c=.5*Math.sqrt(u*l*(r-l)/r)*(a-r/2<0?-1:1);D(t,e,n,Math.max(o,Math.floor(n-a*l/r+c)),Math.min(i,Math.floor(n+(r-a)*l/r+c)),s)}const r=e[2*n+s];let a=o,u=i;for(j(t,e,o,n),e[2*i+s]>r&&j(t,e,o,i);a<u;){for(j(t,e,a,u),a++,u--;e[2*a+s]<r;)a++;for(;e[2*u+s]>r;)u--}e[2*o+s]===r?j(t,e,o,u):(u++,j(t,e,u,i)),u<=n&&(o=u+1),n<=u&&(i=u-1)}}function j(t,e,n,o){k(t,n,o),k(e,2*n,2*o),k(e,2*n+1,2*o+1)}function k(t,e,n){const o=t[e];t[e]=t[n],t[n]=o}function $(t,e,n,o){const i=t-n,s=e-o;return i*i+s*s}const N={minZoom:0,maxZoom:16,minPoints:2,radius:40,extent:512,nodeSize:64,log:!1,generateId:!1,reduce:null,map:t=>t},B=3,G=5,J=6;class q{options;trees;stride;clusterProps;points;constructor(t){this.options=Object.assign(Object.create(N),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,[i,s]=[l(t),c(o)],r={id:n.id,type:"Point",geometry:[i,s],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(N),n.clusterOptions),this.initialize(t)}createIndex(t){const{log:e,minZoom:n,maxZoom:o}=this.options;e&&console.time("total time");const i=`prepare ${t.length} points`;e&&console.time(i),this.points=t;const s=[];for(let e=0;e<t.length;e++){const n=t[e];if(!n?.geometry)continue;let[o,i]=n.geometry;o=Math.fround(o),i=Math.fround(i),s.push(o,i,1/0,e,-1,1),this.options.reduce&&s.push(0)}let r=this.trees[o+1]=this.createTree(s);e&&console.timeEnd(i);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=>h(t)))}getClustersInternal(t,e){let n=((t[0]+180)%360+360)%360-180;const o=Math.max(-90,Math.min(90,t[1]));let i=180===t[2]?180:((t[2]+180)%360+360)%360-180;const s=Math.max(-90,Math.min(90,t[3]));if(t[2]-t[0]>=360)n=-180,i=180;else if(n>i){const t=this.getClustersInternal([n,o,180,s],e),r=this.getClustersInternal([-180,o,i,s],e);return t.concat(r)}const r=this.trees[this.limitZoom(e)],a=r.range(l(n),c(s),l(i),c(o)),u=r.flatData,h=[];for(const t of a){const e=this.stride*t;h.push(u[e+G]>1?R(u,e,this.clusterProps):this.points[u[e+B]])}return h}getChildren(t){const e=this.getOriginId(t),n=this.getOriginZoom(t),o=new Error("No cluster with the specified id: "+t),i=this.trees[n];if(!i)throw o;const s=i.flatData;if(e*this.stride>=s.length)throw o;const r=this.options.radius/(this.options.extent*Math.pow(2,n-1)),a=s[e*this.stride],u=s[e*this.stride+1],l=i.within(a,u,r),c=[];for(const e of l){const n=e*this.stride;s[n+4]===t&&c.push(s[n+G]>1?K(s,n,this.clusterProps):h(this.points[s[n+B]]))}if(0===c.length)throw o;return c}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)],i=Math.pow(2,t),{extent:s,radius:r}=this.options,a=r/s,u=(n-a)/i,l=(n+1+a)/i,c={transformed:!0,features:[],source:null,x:e,y:n,z:t};return this.addTileFeatures(o.range((e-a)/i,u,(e+1+a)/i,l),o.flatData,e,n,i,c),0===e&&this.addTileFeatures(o.range(1-a/i,u,1,l),o.flatData,i,n,i,c),e===i-1&&this.addTileFeatures(o.range(0,u,a/i,l),o.flatData,-1,n,i,c),c}getClusterExpansionZoom(t){return this.getOriginZoom(t)}appendLeaves(t,e,n,o,i){const s=this.getChildren(e);for(const e of s){const s=e.properties;if(s?.cluster?i+s.point_count<=o?i+=s.point_count:i=this.appendLeaves(t,s.cluster_id,n,o,i):i<o?i++:t.push(e),t.length===n)break}return i}createTree(t){const e=new F(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,i,s){for(const r of t){const t=r*this.stride,a=e[t+G]>1;let u,l,c;if(a)u=V(e,t,this.clusterProps),l=e[t],c=e[t+1];else{const n=this.points[e[t+B]];u=n.tags,[l,c]=n.geometry}const h={type:1,geometry:[[Math.round(this.options.extent*(l*i-n)),Math.round(this.options.extent*(c*i-o))]],tags:u};let d;d=a||this.options.generateId?e[t+B]:this.points[e[t+B]].id,void 0!==d&&(h.id=d),s.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:i,minPoints:s}=this.options,r=n/(o*Math.pow(2,e)),a=t.flatData,u=[],l=this.stride;for(let n=0;n<a.length;n+=l){if(a[n+2]<=e)continue;a[n+2]=e;const o=a[n],c=a[n+1],h=t.within(a[n],a[n+1],r),d=a[n+G];let p=d;for(const t of h){const n=t*l;a[n+2]>e&&(p+=a[n+G])}if(p>d&&p>=s){let t,s=o*d,r=c*d,f=-1;const g=(n/l<<5)+(e+1)+this.points.length;for(const o of h){const u=o*l;if(a[u+2]<=e)continue;a[u+2]=e;const c=a[u+G];s+=a[u]*c,r+=a[u+1]*c,a[u+4]=g,i&&(t||(t=this.map(a,n,!0),f=this.clusterProps.length,this.clusterProps.push(t)),i(t,this.map(a,u)))}a[n+4]=g,u.push(s/p,r/p,1/0,g,-1,p),i&&u.push(f)}else{for(let t=0;t<l;t++)u.push(a[n+t]);if(p>1)for(const t of h){const n=t*l;if(!(a[n+2]<=e)){a[n+2]=e;for(let t=0;t<l;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+G]>1){const o=this.clusterProps[t[e+J]];return n?Object.assign({},o):o}const o=this.points[t[e+B]].tags,i=this.options.map(o);return n&&i===o?Object.assign({},i):i}}function R(t,e,n){return{id:t[e+B],type:"Point",tags:V(t,e,n),geometry:[t[e],t[e+1]]}}function K(t,e,n){return{type:"Feature",id:t[e+B],properties:V(t,e,n),geometry:{type:"Point",coordinates:[g(t[e]),m(t[e+1])]}}}function V(t,e,n){const o=t[e+G],i=o>=1e4?`${Math.round(o/1e3)}k`:o>=1e3?Math.round(o/100)/10+"k":o,s=t[e+J],r=-1===s?{}:Object.assign({},n[s]);return Object.assign(r,{cluster:!0,cluster_id:t[e+B],point_count:o,point_count_abbreviated:i})}function H(t,e,n,o,i){const s=e===i.maxZoom?0:i.tolerance/((1<<e)*i.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)Q(r,e,s,i);return r}function Q(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 i=[];if(W(i,e.geometry,t,n,!1,!1),!i.length)return;let s=e.tags||null;if(o.lineMetrics){s={};for(const t in e.tags)s[t]=e.tags[t];s.geojsonvt_clip_start=e.geometry.start/e.geometry.size,s.geojsonvt_clip_end=e.geometry.end/e.geometry.size}const r={type:2,tags:s,geometry:i};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 i=0;i<e.geometry.length;i++)W(o,e.geometry[i],t,n,"Polygon"===e.type,0===i);if(!o.length)return;const i={type:"Polygon"===e.type?3:2,tags:e.tags||null,geometry:o};null!==e.id&&(i.id=e.id);t.features.push(i)}(t,e,n);case"MultiPolygon":return void function(t,e,n){const o=[];for(let i=0;i<e.geometry.length;i++){const s=e.geometry[i];for(let e=0;e<s.length;e++)W(o,s[e],t,n,!0,0===e)}if(!o.length)return;const i={type:3,tags:e.tags||null,geometry:o};null!==e.id&&(i.id=e.id);t.features.push(i)}(t,e,n)}}function W(t,e,n,o,i,s){const r=o*o;if(o>0&&e.size<(i?r:o))return void(n.numPoints+=e.length/3);const a=[];for(let t=0;t<e.length;t+=3)(0===o||e[t+2]>r)&&(n.numSimplified++,a.push(e[t],e[t+1])),n.numPoints++;i&&function(t,e){let n=0;for(let e=0,o=t.length,i=o-2;e<o;i=e,e+=2)n+=(t[e]-t[i])*(t[e+1]+t[i+1]);if(n>0!==e)return;for(let e=0,n=t.length;e<n/2;e+=2){const o=t[e],i=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]=i}}(a,s),t.push(a)}function tt(t,e){if(t.transformed)return t;const n=1<<t.z,o=t.x,i=t.y;for(const s of t.features)1===s.type?et(s,e,n,o,i):nt(s,e,n,o,i);return t.transformed=!0,t}function et(t,e,n,o,i){const s=t,r=t.geometry,a=[];for(let t=0;t<r.length;t+=2)a.push(ot(r[t],r[t+1],e,n,o,i));return s.geometry=a,s}function nt(t,e,n,o,i){const s=t,r=t.geometry,a=[];for(const t of r){const s=[];for(let r=0;r<t.length;r+=2)s.push(ot(t[r],t[r+1],e,n,o,i));a.push(s)}return s.geometry=a,s}function ot(t,e,n,o,i,s){return[Math.round(n*(t*o-i)),Math.round(n*(e*o-s))]}class it{options;tileCoords;tiles;stats={};total=0;constructor(t){this.options=t,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,i,s]=[0,0,0],r=H(t,o,i,s,n);r.source=t;const a=st(o,i,s);if(this.tiles[a]=r,this.tileCoords.push({z:o,x:i,y:s,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:i}=this.options,s=1<<t,r=st(t,e=e+s&s-1,n);if(this.tiles[r])return tt(this.tiles[r],o);i>1&&console.log("drilling down to z%d-%d-%d",t,e,n);let a,u=t,l=e,c=n;for(;!a&&u>0;)u--,l>>=1,c>>=1,a=this.tiles[st(u,l,c)];return a?.source?(i>1&&(console.log("found parent tile z%d-%d-%d",u,l,c),console.time("drilling down")),this.splitTile(a.source,u,l,c,t,e,n),i>1&&console.timeEnd("drilling down"),this.tiles[r]?tt(this.tiles[r],o):null):null}splitTile(t,e,n,o,i,s,r){const a=[t,e,n,o],u=this.options,l=u.debug;for(;a.length;){o=a.pop(),n=a.pop(),e=a.pop(),t=a.pop();const c=1<<e,h=st(e,n,o);let d=this.tiles[h];if(!d&&(l>1&&console.time("creation"),d=this.tiles[h]=H(t,e,n,o,u),this.tileCoords.push({z:e,x:n,y:o,id:h}),l)){l>1&&(console.log("tile z%d-%d-%d (features: %d, points: %d, simplified: %d)",e,n,o,d.numFeatures,d.numPoints,d.numSimplified),console.timeEnd("creation"));const t=`z${e}`;this.stats[t]=(this.stats[t]||0)+1,this.total++}if(d.source=t,null==i){if(e===u.indexMaxZoom||d.numPoints<=u.indexMaxPoints)continue}else{if(e===u.maxZoom||e===i)continue;if(null!=i){const t=i-e;if(n!==s>>t||o!==r>>t)continue}}if(d.source=null,!t.length)continue;l>1&&console.time("clipping");const p=.5*u.buffer/u.extent,f=.5-p,g=.5+p,m=1+p;let M=null,w=null,P=null,I=null;const v=x(t,c,n-p,n+g,y.X,d.minX,d.maxX,u),b=x(t,c,n+f,n+m,y.X,d.minX,d.maxX,u);v&&(M=x(v,c,o-p,o+g,y.Y,d.minY,d.maxY,u),w=x(v,c,o+f,o+m,y.Y,d.minY,d.maxY,u)),b&&(P=x(b,c,o-p,o+g,y.Y,d.minY,d.maxY,u),I=x(b,c,o+f,o+m,y.Y,d.minY,d.maxY,u)),l>1&&console.timeEnd("clipping"),a.push(M||[],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,i=-1/0,s=1/0,r=-1/0;for(const e of t)o=Math.min(o,e.minX),i=Math.max(i,e.maxX),s=Math.min(s,e.minY),r=Math.max(r,e.maxY);const a=e.buffer/e.extent,u=new Set;for(const e in this.tiles){const l=this.tiles[e],c=1<<l.z,h=(l.x-a)/c,d=(l.x+1+a)/c,p=(l.y-a)/c,f=(l.y+1+a)/c;if(i<h||o>=d||r<p||s>=f)continue;let g=!1;for(const e of t)if(e.maxX>=h&&e.minX<d&&e.maxY>=p&&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)",l.z,l.x,l.y,l.numFeatures,l.numPoints,l.numSimplified);const t=`z${l.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 st(t,e,n){return 32*((1<<t)*n+e)+t}const rt={maxZoom:14,indexMaxZoom:5,indexMaxPoints:1e5,tolerance:3,extent:4096,buffer:64,lineMetrics:!1,promoteId:null,generateId:!1,updateable:!1,cluster:!1,clusterOptions:N,debug:0};t.GeoJSONVT=class{get tiles(){return this.tileIndex?.tiles??{}}get stats(){return this.tileIndex.stats}get total(){return this.tileIndex.total}options;source;tileIndex;constructor(t,e){const n=(e=this.options=Object.assign({},rt,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=s(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 q(e.clusterOptions):new it(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:i}=L(this.source,t,n);e&&({affected:o,source:i}=this.filterUpdate(i,o,e)),o.length&&(this.source=i,this.tileIndex.updateIndex(i,o,n))}filterUpdate(t,e,n){const o=new Set;for(const i of t)null!=i.id&&(n(h(i))||(e.push(i),o.add(i.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=>h(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=q,t.geoJSONToTile=function(t,e,n,o,i={}){i={...rt,...i};const{wrap:r=!1,clip:a=!1}=i;let u=s(t,i);if(r&&(u=Y(u,i)),a||i.lineMetrics){const t=1<<e,s=i.buffer/i.extent,r=x(u,t,n-s,n+1+s,y.X,-1,2,i);u=x(r||[],t,o-s,o+1+s,y.Y,-1,2,i)}return tt(H(u??[],e,n,o,i),i.extent)}}));