{"id":25535,"date":"2024-05-28T12:56:33","date_gmt":"2024-05-28T12:56:33","guid":{"rendered":"https:\/\/www.highcharts.com\/blog\/?p=25535"},"modified":"2026-01-13T11:56:45","modified_gmt":"2026-01-13T11:56:45","slug":"lightning-map-create-your-own-using-highcharts","status":"publish","type":"post","link":"https:\/\/www.highcharts.com\/blog\/tutorials\/lightning-map-create-your-own-using-highcharts\/","title":{"rendered":"Lightning map &#8211; create your own using Highcharts"},"content":{"rendered":"<p>Globally, lightning strikes about 100 times per second, totaling 8 million strikes daily. These strikes can cause severe damage, including forest fires, power outages, and fatalities. In the U.S., lightning results in 20 to 30 deaths and hundreds of injuries annually, costing billions in damages. Effective lightning data visualization is essential due to these significant impacts.<\/p>\n<p>The unpredictability of lightning makes accurate visualization crucial for decision-making in meteorology, aviation, and public safety. Traditional static maps can&#8217;t capture this dynamic, real-time data. Interactive lightning maps, however, allow users to zoom, examine trends, and predict patterns, making them vital for informed decisions in time-sensitive situations like flight rerouting and issuing safety warnings.<\/p>\n<p>This post will explore an interactive lightning map created in Highcharts\u00ae Maps. Part of the Highcharts suite, it is designed for interactive, responsive maps. It supports various map types and integrates complex data sources, such as real-time lightning strikes. Its features, like zooming, panning, and drill-downs, enable detailed data exploration.<\/p>\n<p>To see more examples and get an even better understanding of the opportunities Highcharts offers, please head over to the <a href=\"https:\/\/www.highcharts.com\/demo\">demo section<\/a> of our website or read up on the <a href=\"https:\/\/www.highcharts.com\/docs\/index\">technical documentation<\/a> on how to get started. Once you get the hang of it, the <a href=\"https:\/\/api.highcharts.com\/highcharts\/\">API reference<\/a> will help you customize your charts in no time.<\/p>\n<p>Whether you\u2019re a developer working with JavaScript, .NET, React or other common frameworks, we\u2019re confident you\u2019ll find the inspiration you need.<\/p>\n<p>Highcharts also integrates seamlessly with popular languages such as Python, R, PHP and Java, as well as mobile platforms like iOS and Android. Additional support for frameworks like Svelte, Angular, and Vue, makes it a versatile tool for various development environments.<\/p>\n<p>&nbsp;<\/p>\n<h2><b>Highcharts\u00ae Maps features and benefits<\/b><\/h2>\n<ul>\n<li style=\"margin-left: 20px; margin-bottom: 20px;\"><b>Real-time data integration for up-to-the-minute lightning strike information:<\/b> Highcharts\u00ae Maps excels in integrating real-time data, a crucial feature for creating a lightning map. With the ability to update data dynamically, users can track lightning strikes as they happen, providing a near-instantaneous view of storm activity.<\/li>\n<li style=\"margin-left: 20px; margin-bottom: 20px;\"><b>Interactive elements like zooming, panning, and tooltips for enhanced user experience:<\/b> Highcharts\u00ae Maps offers a range of interactive features that enhance the user experience. Zooming and panning allow users to focus on specific regions, while tooltips provide additional information when hovering over data points. These features make it easier to interpret complex data and draw actionable insights.<\/li>\n<li style=\"margin-left: 20px; margin-bottom: 20px;\"><b>Customizable design to suit specific project needs:<\/b> Highcharts\u00ae Maps is highly customizable, allowing developers to tailor the appearance and functionality of their maps to meet specific project requirements. From adjusting color schemes to adding custom markers, the possibilities are extensive, enabling a seamless integration into any application or website.<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<h2><b>Interactive lightning map example<\/b><\/h2>\n<p><iframe style=\"width: 100%;\" title=\"Untitled\" src=\"https:\/\/codepen.io\/hs-demo\/embed\/VwJdqoG?default-tab=result&amp;theme-id=light\" height=\"900\" frameborder=\"no\" scrolling=\"no\" allowfullscreen=\"allowfullscreen\"><span data-mce-type=\"bookmark\" style=\"display: inline-block; width: 0px; overflow: hidden; line-height: 0;\" class=\"mce_SELRES_start\">\ufeff<\/span>\u00a0<span data-mce-type=\"bookmark\" style=\"display: inline-block; width: 0px; overflow: hidden; line-height: 0;\" class=\"mce_SELRES_start\">\ufeff<\/span>&nbsp;<\/p>\n<p><\/iframe><\/p>\n<p>&nbsp;<\/p>\n<p><a href=\"https:\/\/www.highcharts.com\/demo\/maps\/lightning\">Go directly to the Highcharts demo page for \u201cLightning Map\u201d to view its code, play around with different theme colors or edit it on JSFiddle or Codepen.<\/a><\/p>\n<p>&nbsp;<\/p>\n<h2><b>Here\u2019s how to recreate the lightning map<\/b><\/h2>\n<p>&nbsp;<\/p>\n<p><b><i>Please note that this example uses historical lightning strike data from <\/i><\/b><a href=\"https:\/\/frost.met.no\/api.html#\/\"><b><i>frost.met.no<\/i><\/b><\/a><b><i>. However, the same approach can be applied to create a real-time lightning strike map using similar techniques. To learn more on how you can customize your own lightning map with live data, map navigation and more, <a href=\"https:\/\/www.highcharts.com\/docs\/maps\/getting-started\">visit the documentation here<\/a>.<\/i><\/b><\/p>\n<p>&nbsp;<\/p>\n<p>For basics, see <a href=\"https:\/\/highcharts.com\/docs\/getting-started\/installation\">Highcharts installation<\/a>. The framework requirements and installation is the same for Highcharts\u00ae Maps as for Highcharts. To load Highcharts\u00ae Maps as a standalone product (if you don\u2019t have a license for Highcharts), include this script tag:<\/p>\n<p>&nbsp;<\/p>\n<pre><code>&lt;script src=\"https:\/\/code.highcharts.com\/maps\/highmaps.js\"&gt;&lt;\/script&gt;<\/code><\/pre>\n<p>&nbsp;<\/p>\n<p>If you already have Highcharts installed in the web page and want to run Highcharts\u00ae Maps as a plugin, include this script tag after highcharts.js:<\/p>\n<p>&nbsp;<\/p>\n<pre><code>&lt;script src=\"https:\/\/code.highcharts.com\/maps\/modules\/map.js\"&gt;&lt;\/script&gt;<\/code><\/pre>\n<p>&nbsp;<\/p>\n<p><strong>Create a container for the chart and some controls<\/strong><\/p>\n<pre><code>&lt;figure class=\"highcharts-figure\"&gt;\r\n    &lt;div id=\"container\"&gt;&lt;\/div&gt;\r\n\r\n    &lt;div id=\"controls\"&gt;\r\n        &lt;input id=\"date-range\" type=\"range\"&gt;\r\n        &lt;button id=\"play-pause\"&gt;\u25b6\ufe0e&lt;\/button&gt;\r\n        &lt;span id=\"report-time\"&gt;&lt;\/span&gt;\r\n    &lt;\/div&gt;\r\n\r\n    &lt;p class=\"highcharts-description\"&gt;\r\n        This is an advanced demo showing how to use a dynamic mapbubble series\r\n        on top of a map, with extended graphic effects to highlight changes in\r\n        the data.\r\n    &lt;\/p&gt;\r\n&lt;\/figure&gt;\r\n\r\n* &lt;!-- Data from https:\/\/frost.met.no\/api.html#!\/lightning\/getLightning --&gt;\r\n<\/code><\/pre>\n<p>&nbsp;<\/p>\n<p><a href=\"https:\/\/www.highcharts.com\/demo\/maps\/lightning\">* Go to the demo page for \u201cLightning Map\u201d to view its code and get all the lightning data<\/a><\/p>\n<p>&nbsp;<\/p>\n<p><b>Add some CSS to control the size and style of your container and other elements<\/b><\/p>\n<pre><code>.highcharts-figure {\r\n    margin: 0 auto;\r\n    min-width: 360px;\r\n    max-width: 800px;\r\n    padding: 0 10px;\r\n}\r\n\r\n#container {\r\n    margin: 0 -10px;\r\n}\r\n\r\n#controls {\r\n    margin-bottom: 1em;\r\n}\r\n\r\n#date-range {\r\n    margin-top: 1rem;\r\n    width: 100%;\r\n}\r\n\r\n#play-pause {\r\n    width: 3rem;\r\n    height: 3rem;\r\n    border-radius: 1.5rem;\r\n    background-color: #1767ce;\r\n    color: white;\r\n    border-width: 0;\r\n    text-align: center;\r\n    font-size: 1rem;\r\n    transition: background-color 250ms;\r\n}\r\n\r\n#play-pause:hover {\r\n    background-color: #68a9ff;\r\n    color: white;\r\n}\r\n\r\n#report-time {\r\n    float: right;\r\n    margin-top: 0.8rem;\r\n}\r\n\r\n.loading {\r\n    margin-top: 10em;\r\n    text-align: center;\r\n    color: gray;\r\n}\r\n\r\n#data {\r\n    display: none;\r\n}\r\n<\/code><\/pre>\n<p>&nbsp;<\/p>\n<p><b>Load and initialize the lightning map<\/b><\/p>\n<pre><code>\/\/ Start at this time\r\nlet currentTime = Date.UTC(2022, 6, 3, 20);\r\n\r\n\/\/ Get the data class of a lightning strike based on the time ago\r\nconst getDataClass = (now, datetime) =&gt; {\r\n    if (now - datetime &gt; 20 * 60000) {\r\n        return 3;\r\n    }\r\n    if (now - datetime &gt; 10 * 60000) {\r\n        return 2;\r\n    }\r\n    if (now - datetime &gt; 60000) {\r\n        return 1;\r\n    }\r\n    return 0;\r\n};\r\n\r\n\/\/ Parse the data which comes in the ualf format, a subset of CSV\r\nconst parseData = () =&gt; {\r\n    const ualf = document.getElementById('data').innerText,\r\n        lines = ualf.split('\\n');\r\n\r\n    const data = lines\r\n        .map(line =&gt; {\r\n            const values = line.split(' ');\r\n\r\n            const p = {\r\n                lon: parseFloat(values[9]),\r\n                lat: parseFloat(values[8]),\r\n                datetime: Date.UTC(\r\n                    values[1],\r\n                    parseInt(values[2], 10) - 1,\r\n                    values[3],\r\n                    values[4],\r\n                    values[5],\r\n                    values[6]\r\n                ),\r\n                peakCurrent: parseFloat(values[10]),\r\n                cloudIndicator: Boolean(+values[21]),\r\n                z: Math.round(parseFloat(values[10])),\r\n                colorValue: 0\r\n            };\r\n\r\n            return p.cloudIndicator ? undefined : p;\r\n        })\r\n        .filter(p =&gt; p !== undefined)\r\n        .sort((a, b) =&gt; a.datetime - b.datetime);\r\n\r\n    return data;\r\n};\r\n\r\nconst ualf = parseData();\r\n\r\n\/\/ Get the data for the initial time\r\nconst getInitialData = time =&gt; ualf.slice(\r\n    ualf.findIndex(p =&gt; p.datetime &gt; time - 30 * 60000),\r\n    ualf.findLastIndex(p =&gt; p.datetime &lt;= time)\r\n).map(p =&gt; {\r\n    p.colorValue = getDataClass(time, p.datetime);\r\n    return p;\r\n});\r\n\r\nconst displayTime = time =&gt; {\r\n    document.getElementById('report-time').innerText = Highcharts.dateFormat(\r\n        '%B %e, %Y %H:%M',\r\n        time\r\n    );\r\n};\r\n\r\n(async () =&gt; {\r\n\r\n    \/\/ Load the map\r\n    const topology = await fetch(\r\n        'https:\/\/code.highcharts.com\/mapdata\/custom\/europe.topo.json'\r\n    ).then(response =&gt; response.json());\r\n\r\n    \/\/ Create the chart\r\n    const chart = Highcharts.mapChart('container', {\r\n        chart: {\r\n            map: topology,\r\n            height: '80%',\r\n            margin: 0,\r\n            backgroundColor: '#222',\r\n            animation: false\r\n        },\r\n\r\n        accessibility: {\r\n            enabled: false\r\n        },\r\n\r\n        title: {\r\n            text: 'Lightning strikes',\r\n            align: 'left',\r\n            style: {\r\n                color: 'rgba(255,255,196,1)'\r\n            }\r\n        },\r\n\r\n        subtitle: {\r\n            text: 'Source: &lt;a href=\"https:\/\/frost.met.no\/api.html#!\/lightning\/getLightning\" style=\"color: inherit\"&gt;frost.met.no&lt;\/a&gt;',\r\n            align: 'left',\r\n            style: {\r\n                color: '#aaa'\r\n            }\r\n        },\r\n\r\n        legend: {\r\n            align: 'right',\r\n            verticalAlign: 'top',\r\n            layout: 'vertical',\r\n            itemStyle: {\r\n                color: '#ddd'\r\n            }\r\n        },\r\n\r\n        mapView: {\r\n            center: [12, 56.8],\r\n            zoom: 7,\r\n            projection: {\r\n                rotation: [-15]\r\n            }\r\n        },\r\n\r\n        colorAxis: {\r\n            dataClasses: [{\r\n                from: 0,\r\n                to: 0,\r\n                color: 'rgba(255,255,196,1)',\r\n                name: '&lt; 1 min'\r\n            }, {\r\n                from: 1,\r\n                to: 1,\r\n                color: 'rgba(255,196,0,1)',\r\n                name: '1 - 10 min'\r\n            }, {\r\n                from: 2,\r\n                to: 2,\r\n                color: 'rgba(196,128,0,1)',\r\n                name: '10 - 20 min'\r\n            }, {\r\n                from: 3,\r\n                to: 3,\r\n                color: 'rgba(196,64,0,1)',\r\n                name: '20 - 30 min'\r\n            }]\r\n        },\r\n\r\n        series: [{\r\n            name: 'Map',\r\n            nullColor: '#444',\r\n            borderColor: '#666',\r\n            dataLabels: {\r\n                enabled: true,\r\n                nullFormat: '{point.name}',\r\n                style: {\r\n                    color: '#888',\r\n                    textOutline: 'none',\r\n                    fontSize: '16px',\r\n                    fontWeight: 'normal'\r\n                }\r\n            }\r\n        }, {\r\n            name: 'Lightning strike',\r\n            id: 'lightnings',\r\n            type: 'mapbubble',\r\n            animation: false,\r\n            data: getInitialData(currentTime),\r\n            tooltip: {\r\n                pointFormat: '{point.datetime:%Y-%m-%d %H:%M:%S}'\r\n            },\r\n            minSize: 4,\r\n            maxSize: 8,\r\n            marker: {\r\n                lineWidth: 0,\r\n                radius: 3\r\n            },\r\n            colorKey: 'colorValue'\r\n        }]\r\n    });\r\n    displayTime(currentTime);\r\n\r\n    \/\/ Update the colors of the data points\r\n    const updateColors = time =&gt; {\r\n        let redraw = false;\r\n        \/\/ Modify older points\r\n        chart.get('lightnings').points.forEach(p =&gt; {\r\n            let colorValue;\r\n            if (time - p.options.datetime &gt; 30 * 60000) {\r\n                p.remove();\r\n            } else  {\r\n                colorValue = getDataClass(time, p.options.datetime);\r\n            }\r\n\r\n            if (colorValue &amp;&amp; colorValue !== p.options.colorValue) {\r\n                p.update({ colorValue }, false);\r\n                redraw = true;\r\n            }\r\n        });\r\n        return redraw;\r\n    };\r\n\r\n    \/\/ For the strongest lightning strikes, light up the chart with a temporary\r\n    \/\/ flash\r\n    const flash = point =&gt; {\r\n        const pos = chart.mapView.lonLatToPixels(point);\r\n\r\n        chart.renderer.circle(pos.x, pos.y, point.z * 2)\r\n            .attr({\r\n                fill: {\r\n                    radialGradient: { cx: 0.5, cy: 0.5, r: 0.5 },\r\n                    stops: [\r\n                        [0, 'rgba(255, 255, 0, 0.25)'],\r\n                        [0.1, 'rgba(255, 255, 0, 0.125)'],\r\n                        [1, 'rgba(255, 255, 0, 0)']\r\n                    ]\r\n                },\r\n                zIndex: 10\r\n            })\r\n            .add()\r\n            .animate(\r\n                { opacity: 0 },\r\n                { duration: 250 },\r\n                function () {\r\n                    this.destroy();\r\n                }\r\n            );\r\n    };\r\n\r\n    if (updateColors(currentTime)) {\r\n        chart.redraw();\r\n    }\r\n\r\n    \/\/ The remainder of the data after currentTime\r\n    let data = ualf.slice(ualf.findIndex(p =&gt; p.datetime &gt; currentTime));\r\n\r\n    const endTime = data.at(-1).datetime,\r\n        step = 10000,\r\n        series = chart.get('lightnings');\r\n\r\n    let timer;\r\n\r\n    const pause = () =&gt; {\r\n        clearTimeout(timer);\r\n        document.getElementById('play-pause').textContent = '\u25b6\ufe0e';\r\n    };\r\n\r\n    \/\/ Add the lightning strikes for the last n minutes\r\n    const addPoints = time =&gt; {\r\n\r\n        const rangeInput = document.getElementById('date-range');\r\n\r\n        \/\/ Internal Highcharts CI sample verification\r\n        if (!rangeInput) {\r\n            return;\r\n        }\r\n\r\n        currentTime = time;\r\n        let redraw = false;\r\n\r\n        displayTime(time);\r\n        rangeInput.value = time;\r\n\r\n        if (updateColors(time)) {\r\n            redraw = true;\r\n        }\r\n\r\n        \/\/ Add new points\r\n        const points = [];\r\n        while (data[0] &amp;&amp; data[0].datetime &lt;= time) {\r\n            points.push(data.shift());\r\n        }\r\n        points.forEach(point =&gt; {\r\n\r\n            redraw = true;\r\n\r\n            series.addPoint(point, false);\r\n\r\n            if (point.z &gt; 10) {\r\n                flash(point);\r\n            }\r\n        });\r\n\r\n        if (redraw) {\r\n            chart.redraw();\r\n        }\r\n\r\n        if (time + step &lt;= endTime) {\r\n            timer = setTimeout(() =&gt; addPoints(time + step), 25);\r\n        } else {\r\n            pause();\r\n        }\r\n\r\n    };\r\n\r\n    const play = () =&gt; {\r\n        document.getElementById('play-pause').textContent = '\u25ae\u25ae';\r\n        data = ualf.slice(ualf.findIndex(p =&gt; p.datetime &gt; currentTime));\r\n        timer = setTimeout(() =&gt; addPoints(currentTime + step), 25);\r\n    };\r\n\r\n    const setUpInputs = () =&gt; {\r\n        \/\/ Range input\r\n        const input = document.getElementById('date-range');\r\n        input.min = ualf[0].datetime;\r\n        input.max = ualf.at(-1).datetime;\r\n        input.value = currentTime;\r\n\r\n        input.addEventListener('input', () =&gt; {\r\n            pause();\r\n            currentTime = Number(input.value);\r\n            chart.series[1].setData(getInitialData(input.value));\r\n            displayTime(currentTime);\r\n        });\r\n\r\n        \/\/ Play\/pause\r\n        document.getElementById('play-pause').addEventListener(\r\n            'click',\r\n            function () {\r\n                if (this.textContent === '\u25b6\ufe0e') {\r\n                    play();\r\n                } else {\r\n                    pause();\r\n                }\r\n            }\r\n        );\r\n    };\r\n    setUpInputs();\r\n    \/\/ eslint-disable-next-line no-underscore-dangle\r\n    if (!window.__karma__) { \/\/ CI tests\r\n        \/\/ Wait a bit for Visual review tool\r\n        setTimeout(() =&gt; play(), 100);\r\n    }\r\n\r\n})();\r\n<\/code><\/pre>\n<p>&nbsp;<\/p>\n<h2><b>Conclusion and additional resources<\/b><\/h2>\n<p>Creating an interactive lightning map using Highcharts\u00ae Maps offers a powerful way to visualize weather data. From setting up the map and integrating data to customizing the visualization and optimizing performance, Highcharts\u00ae Maps provides all the tools you need to develop a detailed and responsive map.<\/p>\n<p>Ready to take your weather data visualization to the next level? Get started with Highcharts\u00ae Maps today and see how easy it is to create dynamic, interactive lightning maps that can transform your projects.<\/p>\n<p>&nbsp;<\/p>\n<ul>\n<li style=\"margin-left: 20px; margin-bottom: 20px;\"><a href=\"https:\/\/www.highcharts.com\/docs\/maps\/getting-started\">Documentation \u2013 Getting started with Highcharts\u00ae Maps<\/a><\/li>\n<li style=\"margin-left: 20px; margin-bottom: 20px;\"><a href=\"https:\/\/api.highcharts.com\/highmaps\/\">Highcharts\u00ae Maps API Reference<\/a><\/li>\n<li style=\"margin-left: 20px; margin-bottom: 20px;\"><a href=\"https:\/\/www.highcharts.com\/demo#highcharts-maps-demo-general\">Different maps in the demo\/example section<\/a><\/li>\n<li style=\"margin-left: 20px; margin-bottom: 20px;\"><a href=\"https:\/\/www.highcharts.com\/blog\/tutorials\/highcharts-maps-python-basic-tutorial\/\">Basic tutorial \u2013 Using\u00a0 Highcharts\u00ae Maps\u00ae for Python<\/a><\/li>\n<li style=\"margin-left: 20px; margin-bottom: 20px;\"><a href=\"https:\/\/maps-docs.highchartspython.com\/en\/latest\/\">Highcharts\u00ae Maps for Python<\/a><\/li>\n<li style=\"margin-left: 20px; margin-bottom: 20px;\"><a href=\"https:\/\/www.highcharts.com\/blog\/tutorials\/small-multiples-map-with-highcharts-and-react\/\">Small multiples map with Highcharts and React<\/a><\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<h2><strong>Related posts<\/strong><\/h2>\n<ul>\n<li style=\"margin-left: 20px; margin-bottom: 20px;\"><a href=\"https:\/\/www.highcharts.com\/blog\/post\/choropleth-map-examples-using-highcharts\/\">Choropleth map examples using Highcharts<\/a><\/li>\n<li style=\"margin-left: 20px; margin-bottom: 20px;\"><a href=\"https:\/\/www.highcharts.com\/blog\/tutorials\/maps-with-latitude-longitude-using-highcharts\">Maps with latitude &amp; longitude using Highcharts<\/a><\/li>\n<li style=\"margin-left: 20px; margin-bottom: 20px;\"><a href=\"https:\/\/www.highcharts.com\/blog\/post\/heat-map-examples-using-highcharts\">Heat map examples using Highcharts<\/a><\/li>\n<li style=\"margin-left: 20px; margin-bottom: 20px;\"><a href=\"https:\/\/www.highcharts.com\/blog\/tutorials\/visualizing-geospatial-data-with-highcharts-maps\/\">Visualizing geospatial data with Highcharts Maps<\/a><\/li>\n<li style=\"margin-left: 20px; margin-bottom: 20px;\"><a href=\"https:\/\/www.highcharts.com\/blog\/post\/polygon-chart-using-highcharts\">Polygon chart using Highcharts<\/a><\/li>\n<li style=\"margin-left: 20px; margin-bottom: 20px;\"><a href=\"https:\/\/www.highcharts.com\/blog\/inspirations\/javascript-library-by-highcharts\/\">JavaScript library by Highcharts<\/a><\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Globally, lightning strikes about 100 times per second, totaling 8 million strikes daily. These strikes can cause severe damage, including forest fires, power outages, and fatalities. In the U.S., lightning results in 20 to 30 deaths and hundreds of injuries annually, costing billions in damages. Effective lightning data visualization is essential due to these significant [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":25547,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"meta_title":"","meta_description":"","hc_selected_options":[],"footnotes":""},"categories":[210],"tags":[876,1031],"coauthors":[695],"class_list":["post-25535","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-tutorials","tag-highcharts-maps","tag-javascript"],"_links":{"self":[{"href":"https:\/\/www.highcharts.com\/blog\/wp-json\/wp\/v2\/posts\/25535","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.highcharts.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.highcharts.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.highcharts.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.highcharts.com\/blog\/wp-json\/wp\/v2\/comments?post=25535"}],"version-history":[{"count":3,"href":"https:\/\/www.highcharts.com\/blog\/wp-json\/wp\/v2\/posts\/25535\/revisions"}],"predecessor-version":[{"id":25899,"href":"https:\/\/www.highcharts.com\/blog\/wp-json\/wp\/v2\/posts\/25535\/revisions\/25899"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.highcharts.com\/blog\/wp-json\/wp\/v2\/media\/25547"}],"wp:attachment":[{"href":"https:\/\/www.highcharts.com\/blog\/wp-json\/wp\/v2\/media?parent=25535"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.highcharts.com\/blog\/wp-json\/wp\/v2\/categories?post=25535"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.highcharts.com\/blog\/wp-json\/wp\/v2\/tags?post=25535"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.highcharts.com\/blog\/wp-json\/wp\/v2\/coauthors?post=25535"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}