!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).MaplibreGraticule=e()}(this,(function(){"use strict";var t=6371008.8,e={centimeters:637100880,centimetres:637100880,degrees:57.22891354143274,feet:20902260.511392,inches:39.37*t,kilometers:6371.0088,kilometres:6371.0088,meters:t,metres:t,miles:3958.761333810546,millimeters:6371008800,millimetres:6371008800,nauticalmiles:t/1852,radians:1,yards:5825721.287490856};function i(t){return 180*(t%(2*Math.PI))/Math.PI}function o(t){return t%360*Math.PI/180}function r(t){return!isNaN(t)&&null!==t&&!Array.isArray(t)}function s(t){if(!t)throw new Error("coord is required");if(!Array.isArray(t)){if("Feature"===t.type&&null!==t.geometry&&"Point"===t.geometry.type)return t.geometry.coordinates;if("Point"===t.type)return t.coordinates}if(Array.isArray(t)&&t.length>=2&&!Array.isArray(t[0])&&!Array.isArray(t[1]))return t;throw new Error("coord must be GeoJSON Point or an Array of numbers")}function a(t,i,r){void 0===r&&(r={});var a=s(t),n=s(i),h=o(n[1]-a[1]),d=o(n[0]-a[0]),l=o(a[1]),u=o(n[1]),c=Math.pow(Math.sin(h/2),2)+Math.pow(Math.sin(d/2),2)*Math.cos(l)*Math.cos(u);return function(t,i){void 0===i&&(i="kilometers");var o=e[i];if(!o)throw new Error(i+" units is invalid");return t*o}(2*Math.atan2(Math.sqrt(c),Math.sqrt(1-c)),r.units)}function n(t,a,n,h){void 0===h&&(h={});var d=s(t),l=o(d[0]),u=o(d[1]),c=o(n),m=function(t,i){void 0===i&&(i="kilometers");var o=e[i];if(!o)throw new Error(i+" units is invalid");return t/o}(a,h.units),p=Math.asin(Math.sin(u)*Math.cos(m)+Math.cos(u)*Math.sin(m)*Math.cos(c));return function(t,e,i){if(void 0===i&&(i={}),!t)throw new Error("coordinates is required");if(!Array.isArray(t))throw new Error("coordinates must be an Array");if(t.length<2)throw new Error("coordinates must be at least 2 numbers long");if(!r(t[0])||!r(t[1]))throw new Error("coordinates must contain numbers");return function(t,e,i){void 0===i&&(i={});var o={type:"Feature"};return(0===i.id||i.id)&&(o.id=i.id),i.bbox&&(o.bbox=i.bbox),o.properties=e||{},o.geometry=t,o}({type:"Point",coordinates:t},e,i)}([i(l+Math.atan2(Math.sin(c)*Math.sin(m)*Math.cos(u),Math.cos(m)-Math.sin(u)*Math.sin(p))),i(p)],h.properties)}function h(t,e,i=void 0){const o=void 0!==i?t.toFixed(i):""+t;let r=o.indexOf(".");return r=-1===r?o.length:r,r>e?o:new Array(1+e-r).join("0")+o}function d(t,e,i){const o=function(t,e){const i=t%e;return i*e<0?i+e:i}(e+180,360)-180,r=Math.abs(3600*o),s=i||0;let a=Math.floor(r/3600),n=Math.floor((r-3600*a)/60),d=function(t,e){const i=Math.pow(10,e);return Math.round(t*i)/i}(r-3600*a-60*n,s);d>=60&&(d=0,n+=1),n>=60&&(n=0,a+=1);let l=a+"°";return 0===n&&0===d||(l+=" "+h(n,2)+"′"),0!==d&&(l+=" "+h(d,2,s)+"″"),0!==o&&(l+=" "+t),l}function l(){return Math.floor(1e13*Math.random()).toString(36)}return class{constructor(t){this.xid=`graticule-meridains-${l()}`,this.yid=`graticule-parallels-${l()}`,this.config=t,this.updateBound=this.update.bind(this),this.labelSize=this.config.labelSize}onAdd(t){return this.map=t,this.map.on("load",this.updateBound),this.map.on("move",this.updateBound),this.map.loaded()&&this.update(),document.createElement("div")}onRemove(){if(!this.map)return;this.map.getLayer(`symbols${this.xid}`)&&this.map.removeLayer(`symbols${this.xid}`);this.map.getLayer(`symbols${this.yid}`)&&this.map.removeLayer(`symbols${this.yid}`);this.map.getSource(this.xid)&&(this.map.removeLayer(this.xid),this.map.removeSource(this.xid));this.map.getSource(this.yid)&&(this.map.removeLayer(this.yid),this.map.removeSource(this.yid)),this.map.off("load",this.updateBound),this.map.off("move",this.updateBound),this.map=void 0}update(){if(!this.map)return;const t=this.config.longitudePosition??"bottom",e=this.config.latitudePosition??"right",i=this.config.labelType??"hdms",o=function(t){const e=t.getZoom(),i=t.getContainer(),o=i.offsetWidth,r=i.offsetHeight,s=2*Math.PI*6378137/(256*2**e);return{x:s*(o/256),y:s*(r/256)}}(this.map),r=o.x/100*2,s=o.y/100*2;let h={meridians:[],parallels:[]};this.active&&(h=function(t,e,i,o,r,s,h){const l=Math.ceil(2*a([0,0],[180,0],{units:o})),u=Math.floor(l/e),c=(t,e,i)=>{const o=a(t,e,i);return Math.abs(e[0]-t[0])>=180?l-o:o},m=[],p=[],f=t[0],y=t[1],g=t[2],b=t[3],x=(f<0?-1:1)*c([0,0],[f,0],{units:o}),M=(y<0?-1:1)*c([0,0],[0,y],{units:o}),v=Math.ceil(x/e)*e,w=Math.ceil(M/i)*i,S=[n([0,0],v,90,{units:o}).geometry.coordinates[0],n([0,0],w,0,{units:o}).geometry.coordinates[1]],A=c([f,0],[g,0],{units:o}),L=c([0,y],[0,b],{units:o}),E=Math.min(Math.ceil(A/e),u),F=Math.ceil(L/i);let P;P=S;for(let t=0;t<E;t++){let t,i;t="bottom"===s?[[P[0],y],[P[0],b]]:[[P[0],b],[P[0],y]],i=P[0]>0?"E":"W";const a=d(i,P[0],2);let h;h="hdms"===r?{type:"Feature",geometry:{type:"LineString",coordinates:t},properties:{coord:a}}:{type:"Feature",geometry:{type:"LineString",coordinates:t},properties:{coord:P[0].toFixed(3)+"°"}},m.push(h),P=[n([P[0],0],e,90,{units:o}).geometry.coordinates[0],P[1]]}P=S;for(let t=0;t<F;t++){let t;t="right"===h?[[g,P[1]],[f,P[1]]]:[[f,P[1]],[g,P[1]]];let e="S";e=P[1]>0?"N":"S";const s=d(e,P[1],2);let a;a="hdms"===r?{type:"Feature",geometry:{type:"LineString",coordinates:t},properties:{coord:s}}:{type:"Feature",geometry:{type:"LineString",coordinates:t},properties:{coord:P[1].toFixed(3)+"°"}},p.push(a),P=[P[0],n([0,P[1]],i,0,{units:o}).geometry.coordinates[1]]}return{meridians:m,parallels:p}}(this.bbox,r,s,"kilometers",i,t,e));const l=this.map.getSource(this.xid);l?l.setData({type:"FeatureCollection",features:h.meridians}):(this.map.addSource(this.xid,{type:"geojson",data:{type:"FeatureCollection",features:h.meridians}}),this.map.addLayer({id:this.xid,source:this.xid,type:"line",paint:this.config.paint??{}}),this.config.showLabels&&this.map.addLayer({id:`symbols${this.xid}`,type:"symbol",source:this.xid,layout:{"symbol-placement":"point","text-field":"{coord}","text-size":this.config.labelSize??12,"text-anchor":"top"===t?"top":"bottom","text-offset":this.config.longitudeOffset??[0,0]},paint:{"text-color":this.config.labelColor??"#000000","text-halo-blur":1,"text-halo-color":"rgba(255,255,255,1)","text-halo-width":3}}));const u=this.map.getSource(this.yid);u?u.setData({type:"FeatureCollection",features:h.parallels}):(this.map.addSource(this.yid,{type:"geojson",data:{type:"FeatureCollection",features:h.parallels}}),this.map.addLayer({id:this.yid,source:this.yid,type:"line",paint:this.config.paint??{}}),this.config.showLabels&&this.map.addLayer({id:`symbols${this.yid}`,type:"symbol",source:this.yid,layout:{"symbol-placement":"point","text-field":"{coord}","text-size":this.config.labelSize??12,"text-anchor":"left"===e?"left":"right","text-offset":this.config.latitudeOffset??[0,0]},paint:{"text-color":this.config.labelColor??"#000000","text-halo-blur":1,"text-halo-color":"rgba(255,255,255,1)","text-halo-width":3}}))}get active(){if(!this.map)return!1;const t=this.config.minZoom??0,e=this.config.maxZoom??22,i=this.map.getZoom();return t<=i&&i<e}get bbox(){if(!this.map)throw new Error("Invalid state");const t=this.map.getBounds();t.getEast()-t.getWest()>=360&&t.setNorthEast([t.getWest()+360,t.getNorth()]);return t.toArray().flat()}}}));
//# sourceMappingURL=maplibre-graticule.min.js.map
