highcharts
Version:
JavaScript charting framework
13 lines • 16.2 kB
JavaScript
/**
* Highcharts JS v12.6.0 (2026-04-13)
* @module highcharts/modules/tiledwebmap
* @requires highcharts
*
* (c) 2009-2026
*
* A commercial license may be required depending on use.
* See www.highcharts.com/license
*/import*as e from"../highcharts.js";var t={};t.n=e=>{var o=e&&e.__esModule?()=>e.default:()=>e;return t.d(o,{a:o}),o},t.d=(e,o)=>{for(var r in o)t.o(o,r)&&!t.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:o[r]})},t.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t);let o=e.default;var r=t.n(o);let i={Esri:class{constructor(){this.defaultCredits="Tiles © Esri — Source: Esri, DeLorme, NAVTEQ, USGS, Intermap, iPC, NRCAN, Esri Japan, METI, Esri China (Hong Kong), Esri (Thailand), TomTom, 2012",this.initialProjectionName="WebMercator",this.themes={WorldStreetMap:{url:"https://server.arcgisonline.com/ArcGIS/rest/services/World_Street_Map/MapServer/tile/{z}/{y}/{x}",minZoom:0,maxZoom:20},DeLorme:{url:"https://server.arcgisonline.com/ArcGIS/rest/services/Specialty/DeLorme_World_Base_Map/MapServer/tile/{z}/{y}/{x}",minZoom:1,maxZoom:11,credits:"Tiles © Esri — Copyright: ©2012 DeLorme"},WorldTopoMap:{url:"https://server.arcgisonline.com/ArcGIS/rest/services/World_Topo_Map/MapServer/tile/{z}/{y}/{x}",minZoom:0,maxZoom:20,credits:"Tiles © Esri — Esri, DeLorme, NAVTEQ, TomTom, Intermap, iPC, USGS, FAO, NPS, NRCAN, GeoBase, Kadaster NL, Ordnance Survey, Esri Japan, METI, Esri China (Hong Kong), and the GIS User Community"},WorldImagery:{url:"https://server.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer/tile/{z}/{y}/{x}",minZoom:0,maxZoom:20,credits:"Tiles © Esri — Source: Esri, i-cubed, USDA, USGS, AEX, GeoEye, Getmapping, Aerogrid, IGN, IGP, UPR-EGP, and the GIS User Community"},WorldTerrain:{url:"https://server.arcgisonline.com/ArcGIS/rest/services/World_Terrain_Base/MapServer/tile/{z}/{y}/{x}",minZoom:0,maxZoom:13,credits:"Tiles © Esri — Source: USGS, Esri, TANA, DeLorme, and NPS"},WorldShadedRelief:{url:"https://server.arcgisonline.com/ArcGIS/rest/services/World_Shaded_Relief/MapServer/tile/{z}/{y}/{x}",minZoom:0,maxZoom:13,credits:"Tiles © Esri — Source: Esri"},WorldPhysical:{url:"https://server.arcgisonline.com/ArcGIS/rest/services/World_Physical_Map/MapServer/tile/{z}/{y}/{x}",minZoom:0,maxZoom:8,credits:"Tiles © Esri — Source: US National Park Service"},NatGeoWorldMap:{url:"https://server.arcgisonline.com/ArcGIS/rest/services/NatGeo_World_Map/MapServer/tile/{z}/{y}/{x}",minZoom:0,maxZoom:16,credits:"Tiles © Esri — National Geographic, Esri, DeLorme, NAVTEQ, UNEP-WCMC, USGS, NASA, ESA, METI, NRCAN, GEBCO, NOAA, iPC"},WorldGrayCanvas:{url:"https://server.arcgisonline.com/ArcGIS/rest/services/Canvas/World_Light_Gray_Base/MapServer/tile/{z}/{y}/{x}",minZoom:0,maxZoom:16,credits:"Tiles © Esri — Esri, DeLorme, NAVTEQ"}}}},LimaLabs:class{constructor(){this.defaultCredits='Map data ©2023 <a href="https://maps.lima-labs.com/">LimaLabs</a>',this.initialProjectionName="WebMercator",this.requiresApiKey=!0,this.themes={Standard:{url:"https://cdn.lima-labs.com/{zoom}/{x}/{y}.png?api={apikey}",minZoom:0,maxZoom:20}}}},OpenStreetMap:class{constructor(){this.defaultCredits='Map data ©2023 <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a>',this.initialProjectionName="WebMercator",this.subdomains=["a","b","c"],this.themes={Standard:{url:"https://tile.openstreetmap.org/{zoom}/{x}/{y}.png",minZoom:0,maxZoom:19},Hot:{url:"https://{s}.tile.openstreetmap.fr/hot/{z}/{x}/{y}.png",minZoom:0,maxZoom:19},OpenTopoMap:{url:"https://{s}.tile.opentopomap.org/{z}/{x}/{y}.png",minZoom:0,maxZoom:17,credits:`Map data: © <a href="https://www.openstreetmap.org/copyright">
OpenStreetMap</a> contributors, <a href="https://viewfinderpanoramas.org">SRTM</a>
| Map style: © <a href="https://opentopomap.org">OpenTopoMap</a>
(<a href="https://creativecommons.org/licenses/by-sa/3.0/">CC-BY-SA</a>)`}}}},Stamen:class{constructor(){this.defaultCredits='© Map tiles by <a href="https://stamen.com">Stamen Design</a>, under <a href="https://creativecommons.org/licenses/by/3.0">CC BY 3.0</a>. Data by <a href="https://openstreetmap.org">OpenStreetMap</a>, under <a href="https://www.openstreetmap.org/copyright">ODbL</a>',this.initialProjectionName="WebMercator",this.subdomains=["a","b","c","d"],this.themes={Toner:{url:"https://stamen-tiles-{s}.a.ssl.fastly.net/toner/{z}/{x}/{y}.png",minZoom:0,maxZoom:20},TonerBackground:{url:"https://stamen-tiles-{s}.a.ssl.fastly.net/toner-background/{z}/{x}/{y}.png",minZoom:0,maxZoom:20},TonerLite:{url:"https://stamen-tiles-{s}.a.ssl.fastly.net/toner-lite/{z}/{x}/{y}.png",minZoom:0,maxZoom:20},Terrain:{url:"https://stamen-tiles-{s}.a.ssl.fastly.net/terrain/{z}/{x}/{y}.png",minZoom:0,maxZoom:18},TerrainBackground:{url:"https://stamen-tiles-{s}.a.ssl.fastly.net/terrain-background/{z}/{x}/{y}.png",minZoom:0,maxZoom:18},Watercolor:{url:"https://stamen-tiles-{s}.a.ssl.fastly.net/watercolor/{z}/{x}/{y}.png",minZoom:1,maxZoom:16,credits:'© Map tiles by <a href="https://stamen.com">Stamen Design</a>, under <a href="https://creativecommons.org/licenses/by/3.0">CC BY 3.0</a>. Data by <a href="https://openstreetmap.org">OpenStreetMap</a>, under <a href="https://creativecommons.org/licenses/by-sa/3.0">CC BY SA</a>'}}}},Thunderforest:class{constructor(){this.defaultCredits='Maps © <a href="https://www.thunderforest.com">Thunderforest</a>, Data © <a href="https://www.openstreetmap.org/copyright">OpenStreetMap contributors</a>',this.initialProjectionName="WebMercator",this.requiresApiKey=!0,this.subdomains=["a","b","c"],this.themes={OpenCycleMap:{url:"https://{s}.tile.thunderforest.com/cycle/{z}/{x}/{y}.png?apikey={apikey}",minZoom:0,maxZoom:22},Transport:{url:"https://{s}.tile.thunderforest.com/transport/{z}/{x}/{y}.png?apikey={apikey}",minZoom:0,maxZoom:22},TransportDark:{url:"https://{s}.tile.thunderforest.com/transport-dark/{z}/{x}/{y}.png?apikey={apikey}",minZoom:0,maxZoom:22},SpinalMap:{url:"https://{s}.tile.thunderforest.com/spinal-map/{z}/{x}/{y}.png?apikey={apikey}",minZoom:0,maxZoom:22},Landscape:{url:"https://{s}.tile.thunderforest.com/landscape/{z}/{x}/{y}.png?apikey={apikey}",minZoom:0,maxZoom:22},Outdoors:{url:"https://{s}.tile.thunderforest.com/outdoors/{z}/{x}/{y}.png?apikey={apikey}",minZoom:0,maxZoom:22},Pioneer:{url:"https://{s}.tile.thunderforest.com/pioneer/{z}/{x}/{y}.png?apikey={apikey}",minZoom:0,maxZoom:22},MobileAtlas:{url:"https://{s}.tile.thunderforest.com/mobile-atlas/{z}/{x}/{y}.png?apikey={apikey}",minZoom:0,maxZoom:22},Neighbourhood:{url:"https://{s}.tile.thunderforest.com/neighbourhood/{z}/{x}/{y}.png?apikey={apikey}",minZoom:0,maxZoom:22}}}},USGS:class{constructor(){this.defaultCredits='Tiles courtesy of the <a href="https://usgs.gov/">U.S. GeologicalSurvey</a>',this.initialProjectionName="WebMercator",this.themes={USTopo:{url:"https://basemap.nationalmap.gov/arcgis/rest/services/USGSTopo/MapServer/tile/{z}/{y}/{x}",minZoom:0,maxZoom:20},USImagery:{url:"https://basemap.nationalmap.gov/arcgis/rest/services/USGSImageryOnly/MapServer/tile/{z}/{y}/{x}",minZoom:0,maxZoom:20},USImageryTopo:{url:"https://basemap.nationalmap.gov/arcgis/rest/services/USGSImageryTopo/MapServer/tile/{z}/{y}/{x}",minZoom:0,maxZoom:20}}}}},a=e.default.SeriesRegistry;var s=t.n(a);let{doc:n,win:l}=r();function p(e){return null!=e}function m(e){return c(e)&&"number"==typeof e.nodeType}function c(e,t){let o;return!!e&&"object"==typeof e&&(!t||"[object Array]"!==(o=Object.prototype.toString.call(e))&&"[object Array Iterator]"!==o)}Array.prototype.find;function h(){let e=arguments,t=e.length;for(let o=0;o<t;o++){let t=e[o];if(null!=t)return t}}let{composed:d}=r(),{map:y}=s().seriesTypes;function u(e){let{geoBounds:t,chart:r}=e,a=(r.options.series||[]).filter(e=>"tiledwebmap"===e.type)[0];if(a&&a.provider&&a.provider.type&&!a.provider.url){let e=i[a.provider.type];if(p(e)){let{initialProjectionName:o}=new e;if(t){let{x1:e,y1:r,x2:i,y2:a}=t;this.recommendedMapView={projection:{name:o,parallels:[r,a],rotation:[-(e+i)/2]}}}else this.recommendedMapView={projection:{name:o},minZoom:0};return!1}(0,o.error)("Highcharts warning: Tiles Provider not defined in the Provider Registry.",!1)}return!0}class f extends y{constructor(){super(...arguments),this.redrawTiles=!1,this.isAnimating=!1}static compose(e){0>d.indexOf("TiledWebMapSeries")&&d.push("TiledWebMapSeries")&&function(e,t,o,i={}){let a="function"==typeof e&&e.prototype||e;Object.hasOwnProperty.call(a,"hcEvents")||(a.hcEvents={});let s=a.hcEvents;r().Point&&e instanceof r().Point&&e.series&&e.series.chart&&(e.series.chart.runTrackerClick=!0);let n=e.addEventListener;n&&n.call(e,t,o,!!r().supportsPassiveEvents&&{passive:void 0===i.passive?-1!==t.indexOf("touch"):i.passive,capture:!1}),s[t]||(s[t]=[]);let l={fn:o,order:"number"==typeof i.order?i.order:1/0};s[t].push(l),s[t].sort((e,t)=>e.order-t.order)}(e,"onRecommendMapView",u)}lonLatToTile(e,t){let{lon:o,lat:r}=e;return{x:Math.floor((o+180)/360*Math.pow(2,t)),y:Math.floor((1-Math.log(Math.tan(r*Math.PI/180)+1/Math.cos(r*Math.PI/180))/Math.PI)/2*Math.pow(2,t))}}tileToLonLat(e,t,o){let r=e/Math.pow(2,o)*360-180,i=Math.PI-2*Math.PI*t/Math.pow(2,o);return{lon:r,lat:180/Math.PI*Math.atan(.5*(Math.exp(i)-Math.exp(-i)))}}drawPoints(){let e=this.chart,t=e.mapView;if(!t)return;let r=this.tiles=this.tiles||{},a=this.transformGroups=this.transformGroups||[],s=this,n=this.options.provider,{zoom:l}=t,m=h(t.projection.options.rotation&&t.projection.options.rotation[0],0),c=200*!e.renderer.forExport,d=e=>{for(let o of Object.keys(r))parseFloat(o)===(t.zoom<0?0:Math.floor(t.zoom))||s.minZoom&&(t.zoom<0?0:Math.floor(t.zoom))<s.minZoom&&parseFloat(o)===s.minZoom||s.maxZoom&&(t.zoom<0?0:Math.floor(t.zoom))>s.maxZoom&&parseFloat(o)===s.maxZoom?Object.keys(r[o].tiles).forEach((t,i)=>{r[o].tiles[t].animate({opacity:1},{duration:e},()=>{i===Object.keys(r[o].tiles).length-1&&(r[o].isActive=!0)})}):Object.keys(r[o].tiles).forEach((t,i)=>{r[o].tiles[t].animate({opacity:0},{duration:e,defer:e/2},()=>{r[o].tiles[t].destroy(),delete r[o].tiles[t],i===Object.keys(r[o].tiles).length-1&&(r[o].isActive=!1,r[o].loaded=!1)})})},y=l<0?0:Math.floor(l),u=Math.pow(2,y),f=.638436911716859*Math.pow(2,l)/(.638436911716859*Math.pow(2,y)),g=256*f;if(n&&(n.type||n.url)){if(n.type&&!n.url){let r=i[n.type];if(!p(r))return void(0,o.error)("Highcharts warning: Tiles Provider '"+n.type+"' not defined in the ProviderRegistry.",!1);let a=new r,s=a.initialProjectionName,l,m="";if(n.theme&&p(a.themes[n.theme]))l=a.themes[n.theme];else{let e=Object.keys(a.themes)[0];l=a.themes[e],(0,o.error)("Highcharts warning: The Tiles Provider's Theme '"+n.theme+"' is not defined in the Provider definition - falling back to '"+e+"'.",!1)}n.subdomain&&a.subdomains&&-1!==a.subdomains.indexOf(n.subdomain)?m=n.subdomain:p(a.subdomains)&&-1!==l.url.indexOf("{s}")&&(m=h(a.subdomains&&a.subdomains[0],""),(0,o.error)("Highcharts warning: The Tiles Provider's Subdomain '"+n.subdomain+"' is not defined in the Provider definition - falling back to '"+m+"'.",!1)),a.requiresApiKey&&(n.apiKey?l.url=l.url.replace("{apikey}",n.apiKey):((0,o.error)("Highcharts warning: The Tiles Provider requires API Key to use tiles, use provider.apiKey to provide a token.",!1),l.url=l.url.replace("?apikey={apikey}",""))),n.url=l.url.replace("{s}",m),this.minZoom=l.minZoom,this.maxZoom=l.maxZoom;let c=h(e.userOptions.credits&&e.userOptions.credits.text,"Highcharts.com "+h(l.credits,a.defaultCredits));e.credits?e.credits.update({text:c}):e.addCredits({text:c,style:h(e.options.credits?.style,{})}),t.projection.options.name!==s&&(0,o.error)("Highcharts warning: The set projection is different than supported by Tiles Provider.",!1)}else t.projection.options.name||(0,o.error)("Highcharts warning: The set projection is different than supported by Tiles Provider.",!1);if(p(this.minZoom)&&y<this.minZoom?(u=Math.pow(2,y=this.minZoom),g=256*(f=.638436911716859*Math.pow(2,l)/(.638436911716859*Math.pow(2,y)))):p(this.maxZoom)&&y>this.maxZoom&&(u=Math.pow(2,y=this.maxZoom),g=256*(f=.638436911716859*Math.pow(2,l)/(.638436911716859*Math.pow(2,y)))),t.projection&&t.projection.def){t.projection.hasCoordinates=!0,a[y]||(a[y]=e.renderer.g().add(this.group));let o=(o,i,l,p,m)=>{let h=o%u,y=i%u,f=h<0?h+u:h,x=y<0?y+u:y;if(!r[`${l}`].tiles[`${o},${i}`]&&n.url){let h,y=(h=n.url,h.replace("{x}",f.toString()).replace("{y}",x.toString()).replace("{zoom}",l.toString()).replace("{z}",l.toString()));r[l].loaded=!1,r[`${l}`].tiles[`${o},${i}`]=e.renderer.image(y,o*g-p,i*g-m,g,g).attr({zIndex:2,opacity:0}).on("load",function(){n.onload&&n.onload.apply(this),(l===(t.zoom<0?0:Math.floor(t.zoom))||l===s.minZoom)&&(r[`${l}`].actualTilesCount++,r[`${l}`].howManyTiles===r[`${l}`].actualTilesCount&&(r[l].loaded=!0,s.isAnimating?s.redrawTiles=!0:(s.redrawTiles=!1,d(c)),r[`${l}`].actualTilesCount=0))}).add(a[l]),r[`${l}`].tiles[`${o},${i}`].posX=o,r[`${l}`].tiles[`${o},${i}`].posY=i,r[`${l}`].tiles[`${o},${i}`].originalURL=y}},i=t.pixelsToProjectedUnits({x:0,y:0}),l=t.projection.def.inverse([i.x,i.y]),p={lon:l[0]-m,lat:l[1]},h=t.pixelsToProjectedUnits({x:e.plotWidth,y:e.plotHeight}),f=t.projection.def.inverse([h.x,h.y]),x={lon:f[0]-m,lat:f[1]};(p.lat>t.projection.maxLatitude||x.lat<-1*t.projection.maxLatitude)&&(p.lat=t.projection.maxLatitude,x.lat=-1*t.projection.maxLatitude);let M=this.lonLatToTile(p,y),T=this.lonLatToTile(x,y),v=this.tileToLonLat(M.x,M.y,y),S=t.projection.def.forward([v.lon+m,v.lat]),b=t.projectedUnitsToPixels({x:S[0],y:S[1]}),Z=M.x*g-b.x,w=M.y*g-b.y;r[`${y}`]||(r[`${y}`]={tiles:{},isActive:!1,howManyTiles:0,actualTilesCount:0,loaded:!1}),r[`${y}`].howManyTiles=(T.x-M.x+1)*(T.y-M.y+1),r[`${y}`].actualTilesCount=0;for(let e=M.x;e<=T.x;e++)for(let t=M.y;t<=T.y;t++)o(e,t,y,Z,w)}for(let o of Object.keys(r))for(let i of Object.keys(r[o].tiles))if(t.projection&&t.projection.def){let a=256*(.638436911716859*Math.pow(2,l)/(.638436911716859*Math.pow(2,parseFloat(o)))),n=r[o].tiles[Object.keys(r[o].tiles)[0]],{posX:h,posY:u}=r[o].tiles[i];if(p(h)&&p(u)&&p(n.posX)&&p(n.posY)){let l=this.tileToLonLat(n.posX,n.posY,parseFloat(o)),p=t.projection.def.forward([l.lon+m,l.lat]),f=t.projectedUnitsToPixels({x:p[0],y:p[1]}),g=n.posX*a-f.x,x=n.posY*a-f.y;if(e.renderer.globalAnimation&&e.hasRendered){let e=Number(r[o].tiles[i].attr("x")),t=Number(r[o].tiles[i].attr("y")),n=Number(r[o].tiles[i].attr("width")),l=Number(r[o].tiles[i].attr("height")),p=(s,p)=>{r[o].tiles[i].attr({x:e+(h*a-g-e)*p.pos,y:t+(u*a-x-t)*p.pos,width:n+(Math.ceil(a)+1-n)*p.pos,height:l+(Math.ceil(a)+1-l)*p.pos})};s.isAnimating=!0,r[o].tiles[i].attr({animator:0}).animate({animator:1},{step:p},function(){s.isAnimating=!1,s.redrawTiles&&(s.redrawTiles=!1,d(c))})}else(s.redrawTiles||parseFloat(o)!==y||(r[o].isActive||parseFloat(o)===y)&&Object.keys(r[o].tiles).map(e=>r[o].tiles[e]).some(e=>0===e.opacity))&&(s.redrawTiles=!1,d(c)),r[o].tiles[i].attr({x:h*a-g,y:u*a-x,width:Math.ceil(a)+1,height:Math.ceil(a)+1})}}}else(0,o.error)("Highcharts warning: Tiles Provider not defined in the Provider Registry.",!1)}update(e){let{transformGroups:t}=this,o=this.chart,r=o.mapView,{provider:a}=e;if(t&&(t.forEach(e=>{0!==Object.keys(e).length&&e.destroy()}),this.transformGroups=[]),r&&!p(o.userOptions.mapView?.projection)&&a?.type){let e=i[a.type];e&&r.update({projection:{name:new e().initialProjectionName}})}super.update.apply(this,arguments)}}f.defaultOptions=function(e,...t){let o,r=[e,...t],i={},a=function(e,t){return"object"!=typeof e&&(e={}),function(e,t,o){for(let o in e)Object.hasOwnProperty.call(e,o)&&t.call((0,e[o]),e[o],o,e)}(t,function(o,r){if("__proto__"!==r&&"constructor"!==r){let i;!c(o,!0)||(i=o?.constructor,c(o,!0)&&!m(o)&&i?.name&&"Object"!==i.name)||m(o)?e[r]=t[r]:e[r]=a(e[r]||{},o)}}),e};!0===e&&(i=r[1],r=Array.prototype.slice.call(r,2));let s=r.length;for(o=0;o<s;o++)i=a(i,r[o]);return i}(y.defaultOptions,{states:{inactive:{enabled:!1}}}),s().registerSeriesType("tiledwebmap",f);let g=r();g.TilesProviderRegistry=g.TilesProviderRegistry||i,f.compose(g.MapView);let x=r();export{x as default};