{"id":1357,"date":"2022-09-14T20:19:51","date_gmt":"2022-09-14T19:19:51","guid":{"rendered":"https:\/\/theroamingworkshop.cloud\/b\/?p=1357"},"modified":"2022-10-24T19:58:49","modified_gmt":"2022-10-24T18:58:49","slug":"using-the-open-data-api-aemet-opendata","status":"publish","type":"post","link":"https:\/\/theroamingworkshop.cloud\/b\/en\/1357\/using-the-open-data-api-aemet-opendata\/","title":{"rendered":"Using the open data API AEMET OpenData"},"content":{"rendered":"\n<p>In <a href=\"https:\/\/theroamingworkshop.cloud\/b\/?p=1054&amp;lang=en\" target=\"_blank\" rel=\"noreferrer noopener\">this post<\/a> I explained how to directly add AEMET stations with certain data, using my <strong>leafMET<\/strong> plugin for Leaflet (available on github):<\/p>\n\n\n\n<p><a href=\"https:\/\/github.com\/TheRoam\/leafMET\">https:\/\/github.com\/TheRoam\/leafMET<\/a><\/p>\n\n\n\n<p>Let&#8217;s now pay attention to the detail of the API and how to access all the available data.<\/p>\n\n\n\n<div id=\"menu\" style=\"padding:20px 20px 20px 20px; border-left:2px solid darkgrey;\">\n<p style=\"font-weight:bold;\">Content<\/p>\n<\/div>\n<script>\nvar text;\nvar element;\n\nfunction fillmenu(){\n\nfor (let i=0; i<window.document.getElementsByTagName(\"h2\").length; i++){\nelement = window.document.getElementsByTagName(\"h2\")[i];\ntext = \"\u25b9 \"+element.innerHTML;\nvar newelement = document.createElement(\"a\");\nnewelement.innerHTML=text;\nvar postid=window.document.getElementsByTagName(\"article\")[0].id;\nvar url = \"https:\/\/theroamingworkshop.cloud\/b\/?p=\"+postid.substr(5,postid.length)+\"#\"+element.id;\nnewelement.setAttribute(\"href\", url);\nnewelement.appendChild(document.createElement(\"br\"));\nwindow.document.getElementById(\"menu\").appendChild(newelement);\nconsole.log(text);\n}\n}\nif(window.location.href.includes(\"tag\")){\n\n}else{\nwindow.setTimeout(fillmenu,2000);\n}\n\n<\/script>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"API-access\">API access<\/h2>\n\n\n\n<p>To use the API we need an API key. Go to the <a rel=\"noreferrer noopener\" href=\"https:\/\/opendata.aemet.es\/centrodedescargas\/inicio\" target=\"_blank\">AEMET OpenData<\/a> webpage and click on \"Solicitar\" to request it.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><a href=\"https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/09\/aemet2.png\" target=\"_blank\" rel=\"noreferrer noopener\"><img loading=\"lazy\" decoding=\"async\" width=\"280\" height=\"336\" src=\"https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/09\/aemet2.png\" alt=\"\" class=\"wp-image-1346\" srcset=\"https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/09\/aemet2.png 280w, https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/09\/aemet2-250x300.png 250w\" sizes=\"auto, (max-width: 280px) 100vw, 280px\" \/><\/a><\/figure>\n<\/div>\n\n\n<p>Next we'll be asked for an email address where the key will be sent.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><a href=\"https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/09\/aemet3.png\" target=\"_blank\" rel=\"noreferrer noopener\"><img loading=\"lazy\" decoding=\"async\" width=\"624\" height=\"261\" src=\"https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/09\/aemet3.png\" alt=\"\" class=\"wp-image-1347\" srcset=\"https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/09\/aemet3.png 624w, https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/09\/aemet3-300x125.png 300w\" sizes=\"auto, (max-width: 624px) 100vw, 624px\" \/><\/a><\/figure>\n<\/div>\n\n\n<p>You'll receive a first confirmation email, and then a second email with the access key. Let's copy it and keep moving.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><a href=\"https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/09\/aemet4.png\" target=\"_blank\" rel=\"noreferrer noopener\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"176\" src=\"https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/09\/aemet4-1024x176.png\" alt=\"\" class=\"wp-image-1349\" srcset=\"https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/09\/aemet4-1024x176.png 1024w, https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/09\/aemet4-300x52.png 300w, https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/09\/aemet4-768x132.png 768w, https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/09\/aemet4-676x116.png 676w, https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/09\/aemet4.png 1033w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n<\/div>\n\n\n<h2 class=\"wp-block-heading\" id=\"documentation-and-examples\">Documentation and examples<\/h2>\n\n\n\n<p>Get back to AEMET OpenData and into the developer's section \"Acceso Desarrolladores\".<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><a href=\"https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/09\/aemet5.png\" target=\"_blank\" rel=\"noreferrer noopener\"><img loading=\"lazy\" decoding=\"async\" width=\"274\" height=\"334\" src=\"https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/09\/aemet5.png\" alt=\"\" class=\"wp-image-1350\" srcset=\"https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/09\/aemet5.png 274w, https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/09\/aemet5-246x300.png 246w\" sizes=\"auto, (max-width: 274px) 100vw, 274px\" \/><\/a><\/figure>\n<\/div>\n\n\n<p>We're interested in the dynamic documentation, which shows all the data requests available that we can try live.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><a href=\"https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/09\/aemet6.png\" target=\"_blank\" rel=\"noreferrer noopener\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"180\" src=\"https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/09\/aemet6-1024x180.png\" alt=\"\" class=\"wp-image-1351\" srcset=\"https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/09\/aemet6-1024x180.png 1024w, https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/09\/aemet6-300x53.png 300w, https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/09\/aemet6-768x135.png 768w, https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/09\/aemet6-676x119.png 676w, https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/09\/aemet6.png 1159w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n<\/div>\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><a href=\"https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/09\/aemet7.png\" target=\"_blank\" rel=\"noreferrer noopener\"><img loading=\"lazy\" decoding=\"async\" width=\"984\" height=\"931\" src=\"https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/09\/aemet7.png\" alt=\"\" class=\"wp-image-1352\" srcset=\"https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/09\/aemet7.png 984w, https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/09\/aemet7-300x284.png 300w, https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/09\/aemet7-768x727.png 768w, https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/09\/aemet7-676x640.png 676w\" sizes=\"auto, (max-width: 984px) 100vw, 984px\" \/><\/a><\/figure>\n<\/div>\n\n\n<p>Click on each topic to display the syntax for every data request.<\/p>\n\n\n\n<p>Click on <strong>observaci\u00f3n-convencional<\/strong> and then <code>\/api\/observacion\/convencional\/todas<\/code>.<\/p>\n\n\n\n<p>Now click on the <strong>red<\/strong> sign on the right, where you'll paste and authorize the API key.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><a href=\"https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/09\/aemet8.png\" target=\"_blank\" rel=\"noreferrer noopener\"><img loading=\"lazy\" decoding=\"async\" width=\"976\" height=\"637\" src=\"https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/09\/aemet8.png\" alt=\"\" class=\"wp-image-1353\" srcset=\"https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/09\/aemet8.png 976w, https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/09\/aemet8-300x196.png 300w, https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/09\/aemet8-768x501.png 768w, https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/09\/aemet8-676x441.png 676w\" sizes=\"auto, (max-width: 976px) 100vw, 976px\" \/><\/a><\/figure>\n<\/div>\n\n\n<p>Now press the <code>Try it out!<\/code> button and you'll get:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>a <strong>curl<\/strong> request example<\/li><li>the request <strong>URL<\/strong> <\/li><li>the <strong>body<\/strong>, <strong>code<\/strong> and <strong>headers<\/strong> of the response<\/li><\/ul>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><a href=\"https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/09\/aemet9.png\" target=\"_blank\" rel=\"noreferrer noopener\"><img loading=\"lazy\" decoding=\"async\" width=\"964\" height=\"657\" src=\"https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/09\/aemet9.png\" alt=\"\" class=\"wp-image-1354\" srcset=\"https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/09\/aemet9.png 964w, https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/09\/aemet9-300x204.png 300w, https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/09\/aemet9-768x523.png 768w, https:\/\/theroamingworkshop.cloud\/b\/wp-content\/uploads\/2022\/09\/aemet9-676x461.png 676w\" sizes=\"auto, (max-width: 964px) 100vw, 964px\" \/><\/a><\/figure>\n<\/div>\n\n\n<p>If we open the URL inside the <code>\"datos\"<\/code> field we'll see the full list of data for all the stations. A JSON lot like this:<\/p>\n\n\n\n<p id=\"txt\">Loading...<\/p>\n<iframe style=\"height:150px;width:100%;border:none\" id=\"frame1\" src=\"\"><\/iframe>\n<script>\nsolicitar();\nfunction solicitar(){\nvar AK=\"eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ0aGVyb2FtaW5nd29ya3Nob3BAZ21haWwuY29tIiwianRpIjoiMTRhZGVlNjUtNmQ1ZC00MDI4LWFiYTctYTVhMDgzODY1MTdiIiwiaXNzIjoiQUVNRVQiLCJpYXQiOjE2NjI1Njg3MDEsInVzZXJJZCI6IjE0YWRlZTY1LTZkNWQtNDAyOC1hYmE3LWE1YTA4Mzg2NTE3YiIsInJvbGUiOiIifQ.0fnqmhwdtdu_5lfRFOF8KjVj--nsUDtxyecnHUuz0vU\";\nvar URL1=\"https:\/\/opendata.aemet.es\/opendata\/api\/observacion\/convencional\/todas\";\nvar URL2=\"\";\nconst xhttp1 = new XMLHttpRequest();\nconst xhttp2 = new XMLHttpRequest();\nxhttp1.onload = function() {\n  URL2=JSON.parse(this.responseText);\n  URL2=URL2.datos;  \n  xhttp2.open(\"GET\", URL2);\n  xhttp2.send();\n}\nxhttp2.onload = function() {\n  var datos=this.responseText;\n  document.getElementById(\"txt\").innerHTML=\"\";\n  document.getElementById(\"frame1\").src=URL2;\n}\nxhttp1.open(\"GET\", URL1+\"\/?api_key=\"+AK);\nxhttp1.send();\n}\n<\/script>\n\n\n\n<p>The main <strong>fields<\/strong> are the following:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li><strong>idema<\/strong>: station ID or code.<\/li><li><strong>lat<\/strong> and <strong>lon<\/strong>: latitude and longitude coordinates.<\/li><li><strong>alt<\/strong>: station altitude.<\/li><li><strong>fint<\/strong>: data interval date.<\/li><li><strong>prec<\/strong>: precipitation in this period.<\/li><li><strong>vv<\/strong>: wind speed in the station.<\/li><li><strong>ta<\/strong>: ambience temperature in the station.<\/li><\/ul>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"data-request-javascript\">Data request using javascript<\/h2>\n\n\n\n<h4 class=\"wp-block-heading\">HTML structure<\/h4>\n\n\n\n<p>I'll develop an example to access the data and make use of them.<\/p>\n\n\n\n<p>I'll simply create a .html document with a request <strong>button<\/strong>, a text <strong>line<\/strong> and a request <strong>function<\/strong>:<\/p>\n\n\n\n<body>\n<button id=\"solicitud1\" onclick=\"solicitar1()\">Request<\/button>\n<p id=\"texto1\">Click the button to request data<\/p>\n<\/body>\n<script>\nfunction solicitar1(){\ndocument.getElementById(\"texto1\").innerHTML=\"I didn't program that yet..\";\n}\n<\/script>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;html&gt;\n&lt;body&gt;\n&lt;button id=\"solicitud\" onclick=\"solicitar()\"&gt;Request&lt;\/button&gt;\n&lt;p id=\"texto\"&gt;Click the button to request data&lt;\/p&gt;\n&lt;\/body&gt;\n&lt;script&gt;\nfunction solicitar(){\ndocument.getElementById(\"texto\").innerHTML=\"I didn't program that yet..\";\n}\n&lt;\/script&gt;\n&lt;\/html&gt;<\/code><\/pre>\n\n\n\n<p style=\"border-left:3px solid orange;padding-left:5px;font-size:14px;\"><i><b>TIP! <\/b>Copy and paste the code above in a text document with <b>.html<\/b> extension and open it in your browser.<\/i><\/p>\n\n\n\n<h4 class=\"wp-block-heading\">HTTP request<\/h4>\n\n\n\n<p>We'll do the data request in javascript using the <strong>XMLHttpRequest<\/strong> object. The example from <strong>w3schools<\/strong> is really simple:<\/p>\n\n\n\n<p><a href=\"https:\/\/www.w3schools.com\/js\/js_ajax_http.asp\">https:\/\/www.w3schools.com\/js\/js_ajax_http.asp<\/a><\/p>\n\n\n\n<p>As we saw in the dynamic documentation, after doing the request, we got a link to the data, which is another request, no we need to nest <strong>two requests<\/strong> like this:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;script&gt;\nfunction solicitar(){\n\/\/ Define loading message\ndocument.getElementById(\"texto\").innerHTML=\"Cargando datos...\";\n\/\/ Define API Key\nvar AK=tUApiKey;\n\/\/ Define request URLs\nvar URL1=\"https:\/\/opendata.aemet.es\/opendata\/api\/observacion\/convencional\/todas\";\nvar URL2=\"\";\n\n\/\/ Create XMLHttpRequest objects\nconst xhttp1 = new XMLHttpRequest();\nconst xhttp2 = new XMLHttpRequest();\n\n\/\/ Define response function for the first request:\n\/\/ We want to access te \"datos\" URL\nxhttp1.onload = function() {\n  \/\/ 1\u00ba Parse the response to JSON:\n  URL2=JSON.parse(this.responseText);\n  \/\/ 2\u00ba Get the \"datos\" field:\n  URL2=URL2.datos;  \n  \/\/ 3\u00ba Make the new request:\n  xhttp2.open(\"GET\", URL2);\n  xhttp2.send();\n}\n\n\/\/ Define response function for the second request:\n\/\/ We'll modify the text line with some information in the data\nxhttp2.onload = function() {\n  \/\/ 1\u00ba Parse the response to JSON (much better to work with):\n  var datos=JSON.parse(this.responseText);\n\n  \/\/ 2\u00ba Get the length of the JSON data\n  \/\/ This is equivalent to the individual hourly entries per stations\n  var registros=datos.length;\n\n  \/\/ 3\u00ba Get first entry date.\n  \/\/ We'll format it as it's in ISO standard\n  var fechaini=datos&#91;0].fint;\n  fechaini=new Date(fechaini+\"Z\");\n  fechaini=fechaini.toLocaleDateString()+\" \"+fechaini.toLocaleTimeString();\n\n  \/\/ 4\u00ba Get last entry date.\n  \/\/ We'll format in the same way\n  var fechafin=datos&#91;(datos.length-1)].fint;\n  fechafin=new Date(fechaini+\"Z\");\n  fechafin=fechafin.toLocaleDateString()+\" \"+fechafin.toLocaleTimeString();\n\n  \/\/ 5\u00ba Merge it all and display in the text line\n  document.getElementById(\"texto\").innerHTML=\"Se han descargado &lt;b&gt;\"+registros+\"&lt;\/b&gt; registros desde el &lt;b&gt;\"+fechaini+\"&lt;\/b&gt; hasta el &lt;b&gt;\"+fechafin+\"&lt;\/b&gt;. &lt;a href='\"+URL2+\"' target='_blank'&gt;Ver todos los datos.&lt;\/a&gt;\";\n}\n\n\/\/ Send the first request\nxhttp1.open(\"GET\", URL1+\"\/?api_key=\"+AK);\nxhttp1.send();\n\n}\n&lt;\/script&gt;<\/code><\/pre>\n\n\n\n<p>Let's see the result below:<\/p>\n\n\n\n<body>\n<button id=\"solicitud2\" onclick=\"solicitar2()\">Request<\/button>\n<p id=\"texto2\">Click the button to request data<\/p>\n<\/body>\n<script>\nfunction solicitar2(){\n\/\/ Definir texto de carga\ndocument.getElementById(\"texto2\").innerHTML=\"Loading data...\";\n\/\/ Definir la API Key\nvar AK=\"eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ0aGVyb2FtaW5nd29ya3Nob3BAZ21haWwuY29tIiwianRpIjoiMTRhZGVlNjUtNmQ1ZC00MDI4LWFiYTctYTVhMDgzODY1MTdiIiwiaXNzIjoiQUVNRVQiLCJpYXQiOjE2NjI1Njg3MDEsInVzZXJJZCI6IjE0YWRlZTY1LTZkNWQtNDAyOC1hYmE3LWE1YTA4Mzg2NTE3YiIsInJvbGUiOiIifQ.0fnqmhwdtdu_5lfRFOF8KjVj--nsUDtxyecnHUuz0vU\";\n\/\/ Definir URLs de solicitud\nvar URL1=\"https:\/\/opendata.aemet.es\/opendata\/api\/observacion\/convencional\/todas\";\nvar URL2=\"\";\n\/\/ Crear objetos XMLHttpRequest\nconst xhttp1 = new XMLHttpRequest();\nconst xhttp2 = new XMLHttpRequest();\n\/\/ Definir funci\u00f3n de respuesta a la primera solicitud:\n\/\/ Queremos acceder a la URL del campo \"datos\"\nxhttp1.onload = function() {\n  \/\/ 1\u00ba Pasamos la respuesta a JSON:\n  URL2=JSON.parse(this.responseText);\n  \/\/ 2\u00ba Obtenemos el campo \"datos\":\n  URL2=URL2.datos;  \n  \/\/ 3\u00ba Hacemos la nueva petici\u00f3n:\n  xhttp2.open(\"GET\", URL2);\n  xhttp2.send();\n}\n\/\/ Definir funci\u00f3n de respuesta a la segunda solicitud:\n\/\/ Modificaremos la l\u00ednea de texto de la p\u00e1gina con informaci\u00f3n descargada\nxhttp2.onload = function() {\n  \/\/ 1\u00ba Pasamos la respuesta a JSON (se trabaja mejor as\u00ed):\n  var datos=JSON.parse(this.responseText);\n  \/\/ 2\u00ba Obtenemos la longitud del objeto JSON\n  \/\/ Esto equivale a registros horarios individuales por estaciones\n  var registros=datos.length;\n  \/\/ 3\u00ba Obtenemos la fecha del primer registro.\n  \/\/ Le daremos un formato m\u00e1s legible ya que est\u00e1 en ISO\n  var fechaini=datos[0].fint;\n  fechaini=new Date(fechaini+\"Z\");\n  fechaini=fechaini.toLocaleDateString()+\" \"+fechaini.toLocaleTimeString();\n  \/\/ 4\u00ba Obtenemos la fecha del \u00faltimo registro\n  \/\/ Le damos el mismo formato\n  var fechafin=datos[datos.length-1].fint;\n  fechafin=new Date(fechafin+\"Z\");\n  fechafin=fechafin.toLocaleDateString()+\" \"+fechafin.toLocaleTimeString();\n  \/\/ 5\u00ba Unimos la informaci\u00f3n en la l\u00ednea de texto\n  document.getElementById(\"texto2\").innerHTML=\"Downloaded <b>\"+registros+\"<\/b> entries from <b>\"+fechaini+\"<\/b> to <b>\"+fechafin+\"<\/b>. <a href='\"+URL2+\"' target='_blank'>See the full data.<\/a>\";\n}\n\/\/ Enviar la solicitud\nxhttp1.open(\"GET\", URL1+\"\/?api_key=\"+AK);\nxhttp1.send();\n}\n<\/script>\n\n\n\n<p>And done! This way you can obtain coordinates and values for different metheorological stations from AEMET and drop them in a table or web map <a href=\"https:\/\/theroamingworkshop.cloud\/b\/?p=1054&amp;lang=en\" target=\"_blank\" rel=\"noreferrer noopener\">like we've seen for Leaflet here<\/a>.<\/p>\n\n\n\n<iframe style=\"width:100%;height:300px;border:none;\" src=\"https:\/\/theroamingworkshop.cloud\/leafMET\/\"><\/iframe>\n\n\n\n<p>Leave any comments or queries on Twitter!\ud83d\udc26<\/p>\n\n\n\n<p>\ud83d\udc26 <code><a rel=\"noreferrer noopener\" href=\"https:\/\/twitter.com\/roamingworkshop\" target=\"_blank\">@RoamingWorkshop<\/a><\/code><\/p>\n","protected":false},"excerpt":{"rendered":"<p>In this post I explained how to directly add AEMET stations with certain data, using my leafMET plugin for Leaflet (available on github): https:\/\/github.com\/TheRoam\/leafMET Let&#8217;s now pay attention to the detail of the API and how to access all the available data. API access To use the API we need an API key. Go to [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":1345,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[32],"tags":[],"class_list":["post-1357","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-map-en","post-preview"],"_links":{"self":[{"href":"https:\/\/theroamingworkshop.cloud\/b\/wp-json\/wp\/v2\/posts\/1357","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/theroamingworkshop.cloud\/b\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/theroamingworkshop.cloud\/b\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/theroamingworkshop.cloud\/b\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/theroamingworkshop.cloud\/b\/wp-json\/wp\/v2\/comments?post=1357"}],"version-history":[{"count":5,"href":"https:\/\/theroamingworkshop.cloud\/b\/wp-json\/wp\/v2\/posts\/1357\/revisions"}],"predecessor-version":[{"id":1581,"href":"https:\/\/theroamingworkshop.cloud\/b\/wp-json\/wp\/v2\/posts\/1357\/revisions\/1581"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/theroamingworkshop.cloud\/b\/wp-json\/wp\/v2\/media\/1345"}],"wp:attachment":[{"href":"https:\/\/theroamingworkshop.cloud\/b\/wp-json\/wp\/v2\/media?parent=1357"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/theroamingworkshop.cloud\/b\/wp-json\/wp\/v2\/categories?post=1357"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/theroamingworkshop.cloud\/b\/wp-json\/wp\/v2\/tags?post=1357"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}