{
  "version": "https://jsonfeed.org/version/1.1",
  "title": "One World",
  "home_page_url": "https://dieghernan.github.io/",
  "feed_url": "https://dieghernan.github.io/feed.json",
  "language": "en-US",
  "description": "R packages, spatial data, maps and open-source projects by dieghernan",
  "icon": "https://dieghernan.github.io/assets/img/site/social-preview.jpg",
  "favicon": "https://dieghernan.github.io/assets/img/favicons/android-chrome-72x72.png",
  "authors": [{
    "name": "Diego HH",
    "url": "https://dieghernan.github.io/"
  }],
  "items": [
    {
      "id": "https://dieghernan.github.io/202611_postal-codes/",
      "url": "https://dieghernan.github.io/202611_postal-codes/",
      "title": "Postal codes and tessellations",
      "content_html": "<p>I recently published my project <a href=\"https://dieghernan.github.io/codigospostales/\">Postal codes of\nSpain</a>, with estimated postal\nareas, an interactive map and GeoPackage downloads. But there is something we\nhave not looked at yet: how do those address points become polygons? The answer\nis… <strong>Voronoi polygons</strong>.</p>\n\n<h2 id=\"what-is-a-voronoi-polygon\">What is a Voronoi polygon?</h2>\n\n<p>Imagine a few shops on a flat map. Which one is closest to your house? Ask that\nquestion for every location and give each shop its own color. The result is a\n<strong>Voronoi diagram</strong>, also known as a <strong>Voronoi tessellation</strong>, <strong>Voronoi\ndecomposition</strong>, <strong>Voronoi partition</strong> or <strong>Dirichlet tessellation</strong>. This\ntechnique divides a plane into regions based on the distance to a given set of\npoints.</p>\n\n<p>In our example, each shop is a <strong>site</strong>, or generating point. Its <strong>Voronoi\ncell</strong>, also called a <strong>Thiessen polygon</strong>, contains the locations at least as\nclose to that site as to any other. Along a shared edge, two sites are\nequally close. Where several cells meet, there may be a tie between more sites.\nWith ordinary straight-line distance, the edges follow perpendicular bisectors\nbetween sites. Some cells extend indefinitely, so maps usually show them clipped\nto a study area.</p>\n\n<p>The name honors Georgy Voronoi, who studied these partitions in the early\ntwentieth century. The idea has earlier roots, including Dirichlet’s\nnineteenth-century work (hence the name Dirichlet tessellation). <a href=\"https://doi.org/10.2478/pcr-2018-0009\">Pokojski and\nPokojska (2018)</a> review the history and\ngeographical applications.</p>\n\n<p>These partitions are useful for exploring proximity to shops or public services,\nassigning areas to weather stations and studying spatial patterns. For example,\nThiessen polygons can supply area weights when estimating rainfall from rain\ngauges. The underlying question is always about the chosen distance: the nearest\nhospital in a straight line may not be the quickest one to reach.</p>\n\n<h3 id=\"a-tiny-example-in-r\">A tiny example in <strong>R</strong></h3>\n\n<p>Let’s start with five points in an imaginary square, including one at its\ncenter, using just <strong>sf</strong> and <strong>ggplot2</strong>. The coordinates have arbitrary units\nand no geographical coordinate reference system.</p>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"n\">library</span><span class=\"p\">(</span><span class=\"n\">sf</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">library</span><span class=\"p\">(</span><span class=\"n\">ggplot2</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"c1\"># Define a common theme for the maps.</span><span class=\"w\">\n</span><span class=\"n\">background</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"s2\">\"#faf8f2\"</span><span class=\"w\">\n</span><span class=\"n\">ink</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"s2\">\"#203b47\"</span><span class=\"w\">\n\n</span><span class=\"n\">theme_set</span><span class=\"p\">(</span><span class=\"w\">\n  </span><span class=\"n\">theme_void</span><span class=\"p\">()</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n    </span><span class=\"n\">theme</span><span class=\"p\">(</span><span class=\"w\">\n      </span><span class=\"n\">plot.background</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">element_rect</span><span class=\"p\">(</span><span class=\"n\">fill</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">background</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">colour</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">NA</span><span class=\"p\">),</span><span class=\"w\">\n      </span><span class=\"n\">panel.background</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">element_rect</span><span class=\"p\">(</span><span class=\"n\">fill</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">background</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">colour</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">NA</span><span class=\"p\">),</span><span class=\"w\">\n      </span><span class=\"n\">plot.title</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">element_text</span><span class=\"p\">(</span><span class=\"n\">face</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"bold\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">colour</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">ink</span><span class=\"p\">),</span><span class=\"w\">\n      </span><span class=\"n\">plot.subtitle</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">element_text</span><span class=\"p\">(</span><span class=\"n\">colour</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">ink</span><span class=\"p\">),</span><span class=\"w\">\n      </span><span class=\"n\">plot.caption</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">element_text</span><span class=\"p\">(</span><span class=\"n\">colour</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"grey40\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">hjust</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">0</span><span class=\"p\">),</span><span class=\"w\">\n      </span><span class=\"n\">legend.position</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"bottom\"</span><span class=\"p\">,</span><span class=\"w\">\n      </span><span class=\"n\">plot.margin</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">margin</span><span class=\"p\">(</span><span class=\"m\">10</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">10</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">10</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">10</span><span class=\"p\">)</span><span class=\"w\">\n    </span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"n\">sites</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">data.frame</span><span class=\"p\">(</span><span class=\"w\">\n  </span><span class=\"n\">site</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"s2\">\"A\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"B\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"C\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"D\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"E\"</span><span class=\"p\">),</span><span class=\"w\">\n  </span><span class=\"n\">x</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"m\">2</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">7</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">3</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">8</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">5</span><span class=\"p\">),</span><span class=\"w\">\n  </span><span class=\"n\">y</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"m\">2</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">3</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">8</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">7</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">5</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"n\">toy_points</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">st_as_sf</span><span class=\"p\">(</span><span class=\"n\">sites</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">coords</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"s2\">\"x\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"y\"</span><span class=\"p\">))</span><span class=\"w\">\n\n</span><span class=\"n\">study_area</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">st_as_sfc</span><span class=\"p\">(</span><span class=\"n\">st_bbox</span><span class=\"p\">(</span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"n\">xmin</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">0</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">ymin</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">0</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">xmax</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">10</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">ymax</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">10</span><span class=\"p\">)))</span><span class=\"w\">\n\n</span><span class=\"n\">toy_cells</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">toy_points</span><span class=\"w\"> </span><span class=\"o\">|&gt;</span><span class=\"w\">\n  </span><span class=\"n\">st_union</span><span class=\"p\">()</span><span class=\"w\"> </span><span class=\"o\">|&gt;</span><span class=\"w\">\n  </span><span class=\"n\">st_voronoi</span><span class=\"p\">(</span><span class=\"n\">envelope</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">study_area</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">|&gt;</span><span class=\"w\">\n  </span><span class=\"n\">st_collection_extract</span><span class=\"p\">(</span><span class=\"s2\">\"POLYGON\"</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">|&gt;</span><span class=\"w\">\n  </span><span class=\"n\">st_intersection</span><span class=\"p\">(</span><span class=\"n\">study_area</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"n\">ggplot</span><span class=\"p\">()</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">geom_sf</span><span class=\"p\">(</span><span class=\"w\">\n    </span><span class=\"n\">data</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">toy_cells</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"n\">fill</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"s2\">\"#a8dadc\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"#f4c89a\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"#c6b8df\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"#bfd59b\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"#f2b5c4\"</span><span class=\"p\">),</span><span class=\"w\">\n    </span><span class=\"n\">colour</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"white\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">linewidth</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">1</span><span class=\"w\">\n  </span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">geom_sf</span><span class=\"p\">(</span><span class=\"n\">data</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">toy_points</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">colour</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"#203b47\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">size</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">3</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">geom_text</span><span class=\"p\">(</span><span class=\"w\">\n    </span><span class=\"n\">data</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">sites</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">aes</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">y</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">label</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">site</span><span class=\"p\">),</span><span class=\"w\">\n    </span><span class=\"n\">nudge_y</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">0.5</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">colour</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"#203b47\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">fontface</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"bold\"</span><span class=\"w\">\n  </span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">coord_sf</span><span class=\"p\">(</span><span class=\"n\">datum</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">NA</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">labs</span><span class=\"p\">(</span><span class=\"w\">\n    </span><span class=\"n\">title</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"Five points, five Voronoi cells\"</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"n\">subtitle</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"Each location belongs to the closest site\"</span><span class=\"w\">\n  </span><span class=\"p\">)</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<p><img src=\"https://dieghernan.github.io/assets/img/blog/2026-11-06-postal-codes-voronoi-toy-example-1.webp\" alt=\"Five labeled sites in a square: A and B below, C and D above, and E at the&#10;center, surrounded by its own bounded Voronoi cell.&#10;\" width=\"100%\" /></p>\n\n<p>Five points, five cells. The point E at <code class=\"language-plaintext highlighter-rouge\">(5, 5)</code> has a bounded cell\nsurrounded by the other four. The outer cells extend beyond the square and are\nclipped to its edges. <code class=\"language-plaintext highlighter-rouge\">st_union()</code> collects the points into one geometry,\n<code class=\"language-plaintext highlighter-rouge\">st_voronoi()</code> builds the diagram and <code class=\"language-plaintext highlighter-rouge\">st_intersection()</code> clips it to our\nsquare. The colors help us tell the cells apart. We have not assigned any postal\ncodes yet.</p>\n\n<p>The diagram knows nothing about roads, rivers or administrative boundaries. As\nwe move to postal points, we will need to make our choices about those\nboundaries explicit.</p>\n\n<h2 id=\"before-we-start-what-are-we-estimating\">Before we start: what are we estimating?</h2>\n\n<p>The Spanish project uses CartoCiudad address points with their postal codes. It\nfollows <a href=\"https://doi.org/10.12842/WPIVIE_0322\">Goerlich (2022)</a>, who develops an\nidea presented by <a href=\"https://www.nosolosig.com/articulos/asi-hice-el-mapa-de-los-codigos-postales-de-espana-con-sig-y-datos-abiertos\">Sánchez\n(2020)</a>.\nThe <a href=\"https://www.uv.es/goerlich/Ivie/CodPost.html\">updated online version</a>\ndescribes the method in detail.</p>\n\n<p>For Slovenia, we will use GISCO’s postal points, retrieved with <strong>giscoR</strong>.\nThere is an important difference here: a representative point for a code tells\nus much less than thousands of addresses with that code. Detailed addresses help\nthe partition follow their distribution more closely, although proximity alone\nstill cannot reproduce postal delivery decisions.</p>\n\n<p>We have not established that Slovenian postal areas should follow municipal\nboundaries. Imposing those boundaries is a modeling choice for this exercise,\ninspired by the Spanish workflow, rather than a verified property of the\nSlovenian postal system.</p>\n\n<p class=\"alert alert-warning p-3 mx-2 mb-3\"><i class=\"fa fa-exclamation-triangle\"></i> This post explains the workflow. The\npolygons we create are not official postal boundaries, and this exercise does\nnot validate the GISCO postal data.</p>\n\n<h2 id=\"getting-the-data\">Getting the data</h2>\n\n<p>First, let’s get the municipal boundaries and postal points. We use the 2024\nrelease of both datasets.</p>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"n\">library</span><span class=\"p\">(</span><span class=\"n\">giscoR</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">library</span><span class=\"p\">(</span><span class=\"n\">sf</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">library</span><span class=\"p\">(</span><span class=\"n\">dplyr</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"n\">municipalities</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">gisco_get_lau</span><span class=\"p\">(</span><span class=\"w\">\n  </span><span class=\"n\">year</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">2024</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">country</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"SI\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">epsg</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">3035</span><span class=\"w\">\n</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">|&gt;</span><span class=\"w\">\n  </span><span class=\"n\">select</span><span class=\"p\">(</span><span class=\"n\">GISCO_ID</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">LAU_NAME</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">|&gt;</span><span class=\"w\">\n  </span><span class=\"n\">st_make_valid</span><span class=\"p\">()</span><span class=\"w\">\n\n</span><span class=\"n\">raw_points</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">gisco_get_postalcodes</span><span class=\"p\">(</span><span class=\"w\">\n  </span><span class=\"n\">year</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">2024</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">country</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"SI\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">epsg</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">3035</span><span class=\"w\">\n</span><span class=\"p\">)</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<p>We work in <strong>ETRS89 / LAEA Europe (EPSG:3035)</strong>, a projected coordinate system\nwith coordinates in meters. This makes the 200 m and 50 m margins used later\nmeaningful. Voronoi uses Euclidean distances in this plane, rather than road\ndistances. The projection does not preserve every distance exactly either.</p>\n\n<p>Before we start drawing, what have we actually downloaded?</p>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"n\">postal_points</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">raw_points</span><span class=\"w\"> </span><span class=\"o\">|&gt;</span><span class=\"w\">\n  </span><span class=\"n\">mutate</span><span class=\"p\">(</span><span class=\"n\">POSTCODE</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">trimws</span><span class=\"p\">(</span><span class=\"nf\">as.character</span><span class=\"p\">(</span><span class=\"n\">POSTCODE</span><span class=\"p\">)))</span><span class=\"w\"> </span><span class=\"o\">|&gt;</span><span class=\"w\">\n  </span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"o\">!</span><span class=\"nf\">is.na</span><span class=\"p\">(</span><span class=\"n\">POSTCODE</span><span class=\"p\">),</span><span class=\"w\"> </span><span class=\"n\">POSTCODE</span><span class=\"w\"> </span><span class=\"o\">!=</span><span class=\"w\"> </span><span class=\"s2\">\"\"</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">|&gt;</span><span class=\"w\">\n  </span><span class=\"n\">select</span><span class=\"p\">(</span><span class=\"n\">POSTCODE</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"n\">code_counts</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">postal_points</span><span class=\"w\"> </span><span class=\"o\">|&gt;</span><span class=\"w\">\n  </span><span class=\"n\">st_drop_geometry</span><span class=\"p\">()</span><span class=\"w\"> </span><span class=\"o\">|&gt;</span><span class=\"w\">\n  </span><span class=\"n\">count</span><span class=\"p\">(</span><span class=\"n\">POSTCODE</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">name</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"points_per_code\"</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"n\">knitr</span><span class=\"o\">::</span><span class=\"n\">kable</span><span class=\"p\">(</span><span class=\"n\">data.frame</span><span class=\"p\">(</span><span class=\"w\">\n  </span><span class=\"n\">Indicator</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"w\">\n    </span><span class=\"s2\">\"Municipalities\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"Downloaded points\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"Points with a postal code\"</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"s2\">\"Distinct postal codes\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"Codes represented by one point\"</span><span class=\"w\">\n  </span><span class=\"p\">),</span><span class=\"w\">\n  </span><span class=\"n\">Value</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"w\">\n    </span><span class=\"n\">nrow</span><span class=\"p\">(</span><span class=\"n\">municipalities</span><span class=\"p\">),</span><span class=\"w\"> </span><span class=\"n\">nrow</span><span class=\"p\">(</span><span class=\"n\">raw_points</span><span class=\"p\">),</span><span class=\"w\"> </span><span class=\"n\">nrow</span><span class=\"p\">(</span><span class=\"n\">postal_points</span><span class=\"p\">),</span><span class=\"w\">\n    </span><span class=\"n\">nrow</span><span class=\"p\">(</span><span class=\"n\">code_counts</span><span class=\"p\">),</span><span class=\"w\"> </span><span class=\"nf\">sum</span><span class=\"p\">(</span><span class=\"n\">code_counts</span><span class=\"o\">$</span><span class=\"n\">points_per_code</span><span class=\"w\"> </span><span class=\"o\">==</span><span class=\"w\"> </span><span class=\"m\">1</span><span class=\"p\">)</span><span class=\"w\">\n  </span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"p\">))</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<table>\n  <thead>\n    <tr>\n      <th style=\"text-align: left\">Indicator</th>\n      <th style=\"text-align: right\">Value</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <td style=\"text-align: left\">Municipalities</td>\n      <td style=\"text-align: right\">212</td>\n    </tr>\n    <tr>\n      <td style=\"text-align: left\">Downloaded points</td>\n      <td style=\"text-align: right\">557</td>\n    </tr>\n    <tr>\n      <td style=\"text-align: left\">Points with a postal code</td>\n      <td style=\"text-align: right\">557</td>\n    </tr>\n    <tr>\n      <td style=\"text-align: left\">Distinct postal codes</td>\n      <td style=\"text-align: right\">557</td>\n    </tr>\n    <tr>\n      <td style=\"text-align: left\">Codes represented by one point</td>\n      <td style=\"text-align: right\">557</td>\n    </tr>\n  </tbody>\n</table>\n\n<p>These counts give us a first look at the file, but they are not a quality check.\nThey do not establish whether every code is present or whether the coordinates\nare correct. With one point per code, we will be drawing areas around\nrepresentatives rather than estimating them from individual addresses.</p>\n\n<p>Two points at exactly the same coordinates cannot generate separate Voronoi\ncells. We sort by postal code and keep the first point at each location, as in\nthe original workflow. This is a reproducible tie-breaking rule, not evidence\nthat the retained code is correct. The counts below show how many records we\nremove and how many locations have conflicting codes.</p>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"n\">postal_points</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">postal_points</span><span class=\"w\"> </span><span class=\"o\">|&gt;</span><span class=\"w\"> </span><span class=\"n\">arrange</span><span class=\"p\">(</span><span class=\"n\">POSTCODE</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"n\">conflicts</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">postal_points</span><span class=\"w\"> </span><span class=\"o\">|&gt;</span><span class=\"w\">\n  </span><span class=\"n\">group_by</span><span class=\"p\">(</span><span class=\"n\">geometry</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">|&gt;</span><span class=\"w\">\n  </span><span class=\"n\">summarise</span><span class=\"p\">(</span><span class=\"n\">codes</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">n_distinct</span><span class=\"p\">(</span><span class=\"n\">POSTCODE</span><span class=\"p\">),</span><span class=\"w\"> </span><span class=\"n\">.groups</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"drop\"</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">|&gt;</span><span class=\"w\">\n  </span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">codes</span><span class=\"w\"> </span><span class=\"o\">&gt;</span><span class=\"w\"> </span><span class=\"m\">1</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"n\">duplicates</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">duplicated</span><span class=\"p\">(</span><span class=\"n\">postal_points</span><span class=\"o\">$</span><span class=\"n\">geometry</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"n\">knitr</span><span class=\"o\">::</span><span class=\"n\">kable</span><span class=\"p\">(</span><span class=\"n\">data.frame</span><span class=\"p\">(</span><span class=\"w\">\n  </span><span class=\"n\">Indicator</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"s2\">\"Duplicate locations removed\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"Locations with conflicting codes\"</span><span class=\"p\">),</span><span class=\"w\">\n  </span><span class=\"n\">Value</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"nf\">sum</span><span class=\"p\">(</span><span class=\"n\">duplicates</span><span class=\"p\">),</span><span class=\"w\"> </span><span class=\"n\">nrow</span><span class=\"p\">(</span><span class=\"n\">conflicts</span><span class=\"p\">))</span><span class=\"w\">\n</span><span class=\"p\">))</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<table>\n  <thead>\n    <tr>\n      <th style=\"text-align: left\">Indicator</th>\n      <th style=\"text-align: right\">Value</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <td style=\"text-align: left\">Duplicate locations removed</td>\n      <td style=\"text-align: right\">79</td>\n    </tr>\n    <tr>\n      <td style=\"text-align: left\">Locations with conflicting codes</td>\n      <td style=\"text-align: right\">16</td>\n    </tr>\n  </tbody>\n</table>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"w\">\n</span><span class=\"n\">postal_points</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">postal_points</span><span class=\"p\">[</span><span class=\"o\">!</span><span class=\"n\">duplicates</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"p\">]</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<h2 id=\"starting-with-ljubljana\">Starting with Ljubljana</h2>\n\n<p>Let’s pick Ljubljana and keep the points inside it. We use <code class=\"language-plaintext highlighter-rouge\">st_within()</code> so that\na point exactly on a shared boundary is not assigned to both neighboring\nmunicipalities.</p>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"n\">city</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">municipalities</span><span class=\"w\"> </span><span class=\"o\">|&gt;</span><span class=\"w\"> </span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">LAU_NAME</span><span class=\"w\"> </span><span class=\"o\">==</span><span class=\"w\"> </span><span class=\"s2\">\"Ljubljana\"</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"n\">city_points</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">st_filter</span><span class=\"p\">(</span><span class=\"n\">postal_points</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">city</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">.predicate</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">st_within</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"n\">base_map</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">ggplot</span><span class=\"p\">()</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">geom_sf</span><span class=\"p\">(</span><span class=\"n\">data</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">city</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">fill</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"#e8e4d8\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">colour</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">ink</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">linewidth</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">0.4</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"n\">gisco_attr</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">gisco_attributions</span><span class=\"p\">()</span><span class=\"w\">\n\n</span><span class=\"n\">base_map</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">geom_sf</span><span class=\"p\">(</span><span class=\"n\">data</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">city_points</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">colour</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"#bd5137\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">size</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">2</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">labs</span><span class=\"p\">(</span><span class=\"w\">\n    </span><span class=\"n\">title</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"Ljubljana: the starting point\"</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"n\">subtitle</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"A municipal boundary and points with postal codes\"</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"n\">caption</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">gisco_attr</span><span class=\"w\">\n  </span><span class=\"p\">)</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<p><img src=\"https://dieghernan.github.io/assets/img/blog/2026-11-06-postal-codes-ljubljana-1.webp\" alt=\"Outline of Ljubljana municipality with six postal point locations marked&#10;inside it.&#10;\" width=\"100%\" /></p>\n\n<h3 id=\"building-the-cells\">Building the cells</h3>\n\n<p>Each cell contains locations at least as close to its generating point as to\nany other point. Cell boundaries occur where distances to two points are equal.\nFor this first demonstration, we keep all interior points, without the margins used in\nthe national workflow.</p>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"n\">cells</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">city_points</span><span class=\"w\"> </span><span class=\"o\">|&gt;</span><span class=\"w\">\n  </span><span class=\"n\">st_union</span><span class=\"p\">()</span><span class=\"w\"> </span><span class=\"o\">|&gt;</span><span class=\"w\">\n  </span><span class=\"n\">st_voronoi</span><span class=\"p\">(</span><span class=\"n\">envelope</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">st_as_sfc</span><span class=\"p\">(</span><span class=\"n\">st_bbox</span><span class=\"p\">(</span><span class=\"n\">city</span><span class=\"p\">)))</span><span class=\"w\"> </span><span class=\"o\">|&gt;</span><span class=\"w\">\n  </span><span class=\"n\">st_collection_extract</span><span class=\"p\">(</span><span class=\"s2\">\"POLYGON\"</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">|&gt;</span><span class=\"w\">\n  </span><span class=\"n\">st_sf</span><span class=\"p\">(</span><span class=\"n\">geometry</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"err\">_</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"n\">base_map</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">geom_sf</span><span class=\"p\">(</span><span class=\"n\">data</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">cells</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">fill</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">NA</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">colour</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"#bd5137\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">linewidth</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">0.5</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">geom_sf</span><span class=\"p\">(</span><span class=\"n\">data</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">city_points</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">colour</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">ink</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">size</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">2</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">labs</span><span class=\"p\">(</span><span class=\"w\">\n    </span><span class=\"n\">title</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"An area of proximity for every point\"</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"n\">subtitle</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"Cells still extend beyond the municipal boundary\"</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"n\">caption</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"Own elaboration using data from Eurostat / GISCO, 2024\"</span><span class=\"w\">\n  </span><span class=\"p\">)</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<p><img src=\"https://dieghernan.github.io/assets/img/blog/2026-11-06-postal-codes-voronoi-1.webp\" alt=\"Unclipped Voronoi cells outlined around six postal points, extending beyond&#10;the shaded Ljubljana municipal boundary.&#10;\" width=\"100%\" /></p>\n\n<p><code class=\"language-plaintext highlighter-rouge\">st_union()</code> gathers the points so we build one diagram. One detail to keep in\nmind: <code class=\"language-plaintext highlighter-rouge\">envelope</code> supplies a working extent, but <strong>does not clip</strong> the cells to\nthe municipality. We need an intersection for that.</p>\n\n<h3 id=\"clipping-and-recovering-postal-codes\">Clipping and recovering postal codes</h3>\n\n<p>It would be convenient if cells came out in the same order as the input points,\nbut we should not rely on that. Instead, we recover each cell’s code with a\nspatial relationship before clipping. Each cell must contain exactly one\ngenerating point.</p>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"n\">point_matches</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">st_intersects</span><span class=\"p\">(</span><span class=\"n\">cells</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">city_points</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"n\">cells</span><span class=\"o\">$</span><span class=\"n\">POSTCODE</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">city_points</span><span class=\"o\">$</span><span class=\"n\">POSTCODE</span><span class=\"p\">[</span><span class=\"n\">unlist</span><span class=\"p\">(</span><span class=\"n\">point_matches</span><span class=\"p\">)]</span><span class=\"w\">\n\n</span><span class=\"n\">clipped_geometry</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">st_intersection</span><span class=\"p\">(</span><span class=\"n\">st_geometry</span><span class=\"p\">(</span><span class=\"n\">cells</span><span class=\"p\">),</span><span class=\"w\"> </span><span class=\"n\">st_geometry</span><span class=\"p\">(</span><span class=\"n\">city</span><span class=\"p\">))</span><span class=\"w\">\n\n</span><span class=\"n\">city_cells</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">st_sf</span><span class=\"p\">(</span><span class=\"w\">\n  </span><span class=\"n\">POSTCODE</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">cells</span><span class=\"o\">$</span><span class=\"n\">POSTCODE</span><span class=\"p\">[</span><span class=\"nf\">attr</span><span class=\"p\">(</span><span class=\"n\">clipped_geometry</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"idx\"</span><span class=\"p\">)[,</span><span class=\"w\"> </span><span class=\"m\">1</span><span class=\"p\">]],</span><span class=\"w\">\n  </span><span class=\"n\">geometry</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">clipped_geometry</span><span class=\"w\">\n</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"n\">city_areas</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">city_cells</span><span class=\"w\"> </span><span class=\"o\">|&gt;</span><span class=\"w\">\n  </span><span class=\"n\">group_by</span><span class=\"p\">(</span><span class=\"n\">POSTCODE</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">|&gt;</span><span class=\"w\">\n  </span><span class=\"n\">summarise</span><span class=\"p\">(</span><span class=\"n\">.groups</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"drop\"</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">|&gt;</span><span class=\"w\">\n  </span><span class=\"n\">st_make_valid</span><span class=\"p\">()</span><span class=\"w\">\n\n</span><span class=\"n\">city_colours</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">setNames</span><span class=\"p\">(</span><span class=\"w\">\n  </span><span class=\"n\">hcl.colors</span><span class=\"p\">(</span><span class=\"n\">nrow</span><span class=\"p\">(</span><span class=\"n\">city_areas</span><span class=\"p\">),</span><span class=\"w\"> </span><span class=\"n\">palette</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"Dark 3\"</span><span class=\"p\">),</span><span class=\"w\">\n  </span><span class=\"n\">sort</span><span class=\"p\">(</span><span class=\"n\">city_areas</span><span class=\"o\">$</span><span class=\"n\">POSTCODE</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">city_labels</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">st_sf</span><span class=\"p\">(</span><span class=\"w\">\n  </span><span class=\"n\">POSTCODE</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">city_areas</span><span class=\"o\">$</span><span class=\"n\">POSTCODE</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">geometry</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">st_point_on_surface</span><span class=\"p\">(</span><span class=\"n\">st_geometry</span><span class=\"p\">(</span><span class=\"n\">city_areas</span><span class=\"p\">))</span><span class=\"w\">\n</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"n\">ggplot</span><span class=\"p\">(</span><span class=\"n\">city_areas</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">geom_sf</span><span class=\"p\">(</span><span class=\"n\">aes</span><span class=\"p\">(</span><span class=\"n\">fill</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">POSTCODE</span><span class=\"p\">),</span><span class=\"w\"> </span><span class=\"n\">colour</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">background</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">linewidth</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">0.6</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">geom_sf</span><span class=\"p\">(</span><span class=\"w\">\n    </span><span class=\"n\">data</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">city_points</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">shape</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">21</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">fill</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">ink</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"n\">colour</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">background</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">size</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">2.4</span><span class=\"w\">\n  </span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">geom_sf_text</span><span class=\"p\">(</span><span class=\"w\">\n    </span><span class=\"n\">data</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">city_labels</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"n\">aes</span><span class=\"p\">(</span><span class=\"n\">label</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">POSTCODE</span><span class=\"p\">),</span><span class=\"w\"> </span><span class=\"n\">colour</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">ink</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">fontface</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"bold\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">size</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">3.5</span><span class=\"w\">\n  </span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">scale_fill_manual</span><span class=\"p\">(</span><span class=\"n\">values</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">city_colours</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">guide</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"none\"</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">coord_sf</span><span class=\"p\">(</span><span class=\"n\">datum</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">NA</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">labs</span><span class=\"p\">(</span><span class=\"w\">\n    </span><span class=\"n\">title</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"From points to estimated areas\"</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"n\">subtitle</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"Cells clipped and merged by postal code\"</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"n\">caption</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"Teaching example · Not official postal boundaries\"</span><span class=\"w\">\n  </span><span class=\"p\">)</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<p><img src=\"https://dieghernan.github.io/assets/img/blog/2026-11-06-postal-codes-clip-cells-1.webp\" alt=\"Six colored areas clipped to Ljubljana, labeled 1000, 1210, 1211, 1231, 1260&#10;and 1261, with their generating postal points marked.&#10;\" width=\"100%\" /></p>\n\n<p>We intersect the geometry columns, then use the intersection’s <code class=\"language-plaintext highlighter-rouge\">idx</code> matrix to\nrecover each cell’s postal code. This keeps the attribute assignment explicit.\nLabel positions are also calculated from geometries alone.</p>\n\n<p>Grouping by postal code with <code class=\"language-plaintext highlighter-rouge\">summarise()</code> merges the geometries. With many\naddresses sharing a code, their cells would dissolve into one geometry, possibly\nwith several separate parts.</p>\n\n<h2 id=\"from-one-municipality-to-the-whole-country\">From one municipality to the whole country</h2>\n\n<p>Ljubljana is done. Now let’s repeat the operation for each component of each\nmunicipality. Municipalities can have separate pieces: normalizing to\n<code class=\"language-plaintext highlighter-rouge\">MULTIPOLYGON</code> and then casting to <code class=\"language-plaintext highlighter-rouge\">POLYGON</code> lets us handle them independently,\nwithout automatically extending a code to a piece with no points.</p>\n\n<p>The municipality ID and name apply to every component, so we mark those\nattributes as spatially constant before splitting the geometries.</p>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"n\">components</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">municipalities</span><span class=\"w\"> </span><span class=\"o\">|&gt;</span><span class=\"w\">\n  </span><span class=\"n\">st_set_agr</span><span class=\"p\">(</span><span class=\"s2\">\"constant\"</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">|&gt;</span><span class=\"w\">\n  </span><span class=\"n\">st_cast</span><span class=\"p\">(</span><span class=\"s2\">\"MULTIPOLYGON\"</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">|&gt;</span><span class=\"w\">\n  </span><span class=\"n\">st_cast</span><span class=\"p\">(</span><span class=\"s2\">\"POLYGON\"</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">|&gt;</span><span class=\"w\">\n  </span><span class=\"n\">mutate</span><span class=\"p\">(</span><span class=\"n\">component_id</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">row_number</span><span class=\"p\">())</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<h3 id=\"why-use-an-inward-margin\">Why use an inward margin?</h3>\n\n<p>In the Spanish project, we first select addresses within an inward margin of\n<strong>200 m</strong>. If none are found, we try <strong>50 m</strong>. This reduces the influence of\npoints close to a boundary, where small mismatches between layers may affect\ntheir assignment.</p>\n\n<p>There is no universal rule behind these numbers. Goerlich describes a 20 m\nmargin. The 200 m and 50 m choices come from my implementation. We keep them\nhere to explain that workflow, although sparse postal points make it easier to\nexclude useful information. Comparing other margins would be a useful next step.</p>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"n\">select_points</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"k\">function</span><span class=\"p\">(</span><span class=\"n\">component</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">postal_points</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"p\">{</span><span class=\"w\">\n  </span><span class=\"k\">for</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"n\">margin</span><span class=\"w\"> </span><span class=\"k\">in</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"m\">200</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">50</span><span class=\"p\">))</span><span class=\"w\"> </span><span class=\"p\">{</span><span class=\"w\">\n    </span><span class=\"n\">interior</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">st_buffer</span><span class=\"p\">(</span><span class=\"n\">st_geometry</span><span class=\"p\">(</span><span class=\"n\">component</span><span class=\"p\">),</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"n\">margin</span><span class=\"p\">)</span><span class=\"w\">\n\n    </span><span class=\"k\">if</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"nf\">all</span><span class=\"p\">(</span><span class=\"n\">st_is_empty</span><span class=\"p\">(</span><span class=\"n\">interior</span><span class=\"p\">)))</span><span class=\"w\"> </span><span class=\"k\">next</span><span class=\"w\">\n\n    </span><span class=\"n\">selected_points</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">st_filter</span><span class=\"p\">(</span><span class=\"n\">postal_points</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">interior</span><span class=\"p\">,</span><span class=\"w\">\n      </span><span class=\"n\">.predicate</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">st_within</span><span class=\"w\">\n    </span><span class=\"p\">)</span><span class=\"w\">\n\n    </span><span class=\"k\">if</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"n\">nrow</span><span class=\"p\">(</span><span class=\"n\">selected_points</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">&gt;</span><span class=\"w\"> </span><span class=\"m\">0</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"p\">{</span><span class=\"w\">\n      </span><span class=\"nf\">return</span><span class=\"p\">(</span><span class=\"n\">selected_points</span><span class=\"p\">)</span><span class=\"w\">\n    </span><span class=\"p\">}</span><span class=\"w\">\n  </span><span class=\"p\">}</span><span class=\"w\">\n\n  </span><span class=\"n\">postal_points</span><span class=\"p\">[</span><span class=\"m\">0</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"p\">]</span><span class=\"w\">\n</span><span class=\"p\">}</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<p>The margin only selects points: the resulting areas cover the <strong>original</strong>\ncomponent, not the smaller buffered geometry. If both attempts fail, we leave\nthe component unassigned. We do not borrow the nearest point from outside the\nmunicipality.</p>\n\n<h3 id=\"three-cases-one-function\">Three cases, one function</h3>\n\n<p>There are three cases to handle. With no points, we keep the component and\nassign <code class=\"language-plaintext highlighter-rouge\">NA</code>. If all selected points share a code, we assign it to the whole\ncomponent. We only need Voronoi when several codes are present: no need to split\nan area that already has a single assignment.</p>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"n\">build_areas</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"k\">function</span><span class=\"p\">(</span><span class=\"n\">component</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">postal_points</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"p\">{</span><span class=\"w\">\n  </span><span class=\"n\">selected_points</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">select_points</span><span class=\"p\">(</span><span class=\"n\">component</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">postal_points</span><span class=\"p\">)</span><span class=\"w\">\n\n  </span><span class=\"n\">codes</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">unique</span><span class=\"p\">(</span><span class=\"n\">selected_points</span><span class=\"o\">$</span><span class=\"n\">POSTCODE</span><span class=\"p\">)</span><span class=\"w\">\n\n  </span><span class=\"k\">if</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"nf\">length</span><span class=\"p\">(</span><span class=\"n\">codes</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">&lt;=</span><span class=\"w\"> </span><span class=\"m\">1L</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"p\">{</span><span class=\"w\">\n    </span><span class=\"n\">component</span><span class=\"o\">$</span><span class=\"n\">POSTCODE</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"k\">if</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"nf\">length</span><span class=\"p\">(</span><span class=\"n\">codes</span><span class=\"p\">))</span><span class=\"w\"> </span><span class=\"n\">codes</span><span class=\"w\"> </span><span class=\"k\">else</span><span class=\"w\"> </span><span class=\"kc\">NA_character_</span><span class=\"w\">\n    </span><span class=\"nf\">return</span><span class=\"p\">(</span><span class=\"n\">component</span><span class=\"p\">)</span><span class=\"w\">\n  </span><span class=\"p\">}</span><span class=\"w\">\n\n  </span><span class=\"n\">cells</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">selected_points</span><span class=\"w\"> </span><span class=\"o\">|&gt;</span><span class=\"w\">\n    </span><span class=\"n\">st_union</span><span class=\"p\">()</span><span class=\"w\"> </span><span class=\"o\">|&gt;</span><span class=\"w\">\n    </span><span class=\"n\">st_voronoi</span><span class=\"p\">(</span><span class=\"n\">envelope</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">st_as_sfc</span><span class=\"p\">(</span><span class=\"n\">st_bbox</span><span class=\"p\">(</span><span class=\"n\">component</span><span class=\"p\">)))</span><span class=\"w\"> </span><span class=\"o\">|&gt;</span><span class=\"w\">\n    </span><span class=\"n\">st_collection_extract</span><span class=\"p\">(</span><span class=\"s2\">\"POLYGON\"</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">|&gt;</span><span class=\"w\">\n    </span><span class=\"n\">st_sf</span><span class=\"p\">(</span><span class=\"n\">geometry</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"err\">_</span><span class=\"p\">)</span><span class=\"w\">\n\n  </span><span class=\"n\">point_matches</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">st_intersects</span><span class=\"p\">(</span><span class=\"n\">cells</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">selected_points</span><span class=\"p\">)</span><span class=\"w\">\n\n  </span><span class=\"n\">cells</span><span class=\"o\">$</span><span class=\"n\">POSTCODE</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">selected_points</span><span class=\"o\">$</span><span class=\"n\">POSTCODE</span><span class=\"p\">[</span><span class=\"n\">unlist</span><span class=\"p\">(</span><span class=\"n\">point_matches</span><span class=\"p\">)]</span><span class=\"w\">\n\n  </span><span class=\"n\">clipped_geometry</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">st_intersection</span><span class=\"p\">(</span><span class=\"w\">\n    </span><span class=\"n\">st_geometry</span><span class=\"p\">(</span><span class=\"n\">cells</span><span class=\"p\">),</span><span class=\"w\">\n    </span><span class=\"n\">st_geometry</span><span class=\"p\">(</span><span class=\"n\">component</span><span class=\"p\">)</span><span class=\"w\">\n  </span><span class=\"p\">)</span><span class=\"w\">\n\n  </span><span class=\"n\">result</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">st_sf</span><span class=\"p\">(</span><span class=\"w\">\n    </span><span class=\"n\">POSTCODE</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">cells</span><span class=\"o\">$</span><span class=\"n\">POSTCODE</span><span class=\"p\">[</span><span class=\"nf\">attr</span><span class=\"p\">(</span><span class=\"n\">clipped_geometry</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"idx\"</span><span class=\"p\">)[,</span><span class=\"w\"> </span><span class=\"m\">1</span><span class=\"p\">]],</span><span class=\"w\">\n    </span><span class=\"n\">geometry</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">clipped_geometry</span><span class=\"w\">\n  </span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">|&gt;</span><span class=\"w\">\n    </span><span class=\"n\">group_by</span><span class=\"p\">(</span><span class=\"n\">POSTCODE</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">|&gt;</span><span class=\"w\">\n    </span><span class=\"n\">summarise</span><span class=\"p\">(</span><span class=\"n\">.groups</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"drop\"</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">|&gt;</span><span class=\"w\">\n    </span><span class=\"n\">st_make_valid</span><span class=\"p\">()</span><span class=\"w\">\n\n  </span><span class=\"n\">result</span><span class=\"o\">$</span><span class=\"n\">GISCO_ID</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">component</span><span class=\"o\">$</span><span class=\"n\">GISCO_ID</span><span class=\"w\">\n\n  </span><span class=\"n\">result</span><span class=\"o\">$</span><span class=\"n\">LAU_NAME</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">component</span><span class=\"o\">$</span><span class=\"n\">LAU_NAME</span><span class=\"w\">\n\n  </span><span class=\"n\">result</span><span class=\"o\">$</span><span class=\"n\">component_id</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">component</span><span class=\"o\">$</span><span class=\"n\">component_id</span><span class=\"w\">\n\n  </span><span class=\"n\">result</span><span class=\"w\">\n</span><span class=\"p\">}</span><span class=\"w\">\n\n</span><span class=\"n\">result</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">lapply</span><span class=\"p\">(</span><span class=\"nf\">seq_len</span><span class=\"p\">(</span><span class=\"n\">nrow</span><span class=\"p\">(</span><span class=\"n\">components</span><span class=\"p\">)),</span><span class=\"w\"> </span><span class=\"k\">function</span><span class=\"p\">(</span><span class=\"n\">i</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"p\">{</span><span class=\"w\">\n  </span><span class=\"n\">build_areas</span><span class=\"p\">(</span><span class=\"n\">components</span><span class=\"p\">[</span><span class=\"n\">i</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"p\">],</span><span class=\"w\"> </span><span class=\"n\">postal_points</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"p\">})</span><span class=\"w\"> </span><span class=\"o\">|&gt;</span><span class=\"w\">\n  </span><span class=\"n\">bind_rows</span><span class=\"p\">()</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<h3 id=\"handling-unassigned-areas\">Handling unassigned areas</h3>\n\n<p>Can we fill any of the gaps? A component without points may belong to a\nmunicipality whose other components have information. We recover its code only\nif the municipality has <strong>one distinct recovered code</strong>. This is an imputation\nfrom the available data, not proof that the municipality really has just one\ncode.</p>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"n\">unique_codes</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">result</span><span class=\"w\"> </span><span class=\"o\">|&gt;</span><span class=\"w\">\n  </span><span class=\"n\">st_drop_geometry</span><span class=\"p\">()</span><span class=\"w\"> </span><span class=\"o\">|&gt;</span><span class=\"w\">\n  </span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"o\">!</span><span class=\"nf\">is.na</span><span class=\"p\">(</span><span class=\"n\">POSTCODE</span><span class=\"p\">))</span><span class=\"w\"> </span><span class=\"o\">|&gt;</span><span class=\"w\">\n  </span><span class=\"n\">distinct</span><span class=\"p\">(</span><span class=\"n\">GISCO_ID</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">POSTCODE</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">|&gt;</span><span class=\"w\">\n  </span><span class=\"n\">add_count</span><span class=\"p\">(</span><span class=\"n\">GISCO_ID</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">|&gt;</span><span class=\"w\">\n  </span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">n</span><span class=\"w\"> </span><span class=\"o\">==</span><span class=\"w\"> </span><span class=\"m\">1</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"n\">unassigned_before</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"nf\">sum</span><span class=\"p\">(</span><span class=\"nf\">is.na</span><span class=\"p\">(</span><span class=\"n\">result</span><span class=\"o\">$</span><span class=\"n\">POSTCODE</span><span class=\"p\">))</span><span class=\"w\">\n\n</span><span class=\"n\">index</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">match</span><span class=\"p\">(</span><span class=\"n\">result</span><span class=\"o\">$</span><span class=\"n\">GISCO_ID</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">unique_codes</span><span class=\"o\">$</span><span class=\"n\">GISCO_ID</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"n\">recoverable</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"nf\">is.na</span><span class=\"p\">(</span><span class=\"n\">result</span><span class=\"o\">$</span><span class=\"n\">POSTCODE</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">&amp;</span><span class=\"w\"> </span><span class=\"o\">!</span><span class=\"nf\">is.na</span><span class=\"p\">(</span><span class=\"n\">index</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"n\">result</span><span class=\"o\">$</span><span class=\"n\">POSTCODE</span><span class=\"p\">[</span><span class=\"n\">recoverable</span><span class=\"p\">]</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">unique_codes</span><span class=\"o\">$</span><span class=\"n\">POSTCODE</span><span class=\"p\">[</span><span class=\"n\">index</span><span class=\"p\">[</span><span class=\"n\">recoverable</span><span class=\"p\">]]</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<p>Before drawing the final map, let’s tidy up the geometries and keep only\nsurfaces. Repairs can produce collections containing residual lines or points,\nwhich do not belong in an area layer. Dissolving by postal code also removes\nmunicipal boundaries between areas sharing that code.</p>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"n\">keep_surfaces</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"k\">function</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"p\">{</span><span class=\"w\">\n  </span><span class=\"n\">geometry</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">st_make_valid</span><span class=\"p\">(</span><span class=\"n\">st_geometry</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">))</span><span class=\"w\">\n\n  </span><span class=\"n\">geometry</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">lapply</span><span class=\"p\">(</span><span class=\"n\">geometry</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"k\">function</span><span class=\"p\">(</span><span class=\"n\">part</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"p\">{</span><span class=\"w\">\n    </span><span class=\"k\">if</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"o\">!</span><span class=\"n\">inherits</span><span class=\"p\">(</span><span class=\"n\">part</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"s2\">\"POLYGON\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"MULTIPOLYGON\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"GEOMETRYCOLLECTION\"</span><span class=\"p\">)))</span><span class=\"w\"> </span><span class=\"p\">{</span><span class=\"w\">\n      </span><span class=\"nf\">return</span><span class=\"p\">(</span><span class=\"n\">st_multipolygon</span><span class=\"p\">())</span><span class=\"w\">\n    </span><span class=\"p\">}</span><span class=\"w\">\n\n    </span><span class=\"n\">surfaces</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">suppressWarnings</span><span class=\"p\">(</span><span class=\"n\">st_collection_extract</span><span class=\"p\">(</span><span class=\"n\">st_sfc</span><span class=\"p\">(</span><span class=\"n\">part</span><span class=\"p\">),</span><span class=\"w\"> </span><span class=\"s2\">\"POLYGON\"</span><span class=\"p\">))</span><span class=\"w\">\n\n    </span><span class=\"k\">if</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"nf\">length</span><span class=\"p\">(</span><span class=\"n\">surfaces</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">==</span><span class=\"w\"> </span><span class=\"m\">0L</span><span class=\"w\"> </span><span class=\"o\">||</span><span class=\"w\"> </span><span class=\"nf\">all</span><span class=\"p\">(</span><span class=\"n\">st_is_empty</span><span class=\"p\">(</span><span class=\"n\">surfaces</span><span class=\"p\">)))</span><span class=\"w\"> </span><span class=\"p\">{</span><span class=\"w\">\n      </span><span class=\"nf\">return</span><span class=\"p\">(</span><span class=\"n\">st_multipolygon</span><span class=\"p\">())</span><span class=\"w\">\n    </span><span class=\"p\">}</span><span class=\"w\">\n\n    </span><span class=\"n\">st_cast</span><span class=\"p\">(</span><span class=\"n\">st_union</span><span class=\"p\">(</span><span class=\"n\">surfaces</span><span class=\"p\">),</span><span class=\"w\"> </span><span class=\"s2\">\"MULTIPOLYGON\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">warn</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">FALSE</span><span class=\"p\">)[[</span><span class=\"m\">1</span><span class=\"p\">]]</span><span class=\"w\">\n  </span><span class=\"p\">})</span><span class=\"w\">\n\n  </span><span class=\"n\">st_geometry</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">st_sfc</span><span class=\"p\">(</span><span class=\"n\">geometry</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">crs</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">st_crs</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">))</span><span class=\"w\">\n\n  </span><span class=\"n\">x</span><span class=\"p\">[</span><span class=\"o\">!</span><span class=\"n\">st_is_empty</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">),</span><span class=\"w\"> </span><span class=\"p\">]</span><span class=\"w\">\n</span><span class=\"p\">}</span><span class=\"w\">\n\n</span><span class=\"n\">unassigned</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">result</span><span class=\"w\"> </span><span class=\"o\">|&gt;</span><span class=\"w\">\n  </span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"nf\">is.na</span><span class=\"p\">(</span><span class=\"n\">POSTCODE</span><span class=\"p\">))</span><span class=\"w\"> </span><span class=\"o\">|&gt;</span><span class=\"w\">\n  </span><span class=\"n\">keep_surfaces</span><span class=\"p\">()</span><span class=\"w\">\n\n</span><span class=\"n\">postal_areas</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">result</span><span class=\"w\"> </span><span class=\"o\">|&gt;</span><span class=\"w\">\n  </span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"o\">!</span><span class=\"nf\">is.na</span><span class=\"p\">(</span><span class=\"n\">POSTCODE</span><span class=\"p\">))</span><span class=\"w\"> </span><span class=\"o\">|&gt;</span><span class=\"w\">\n  </span><span class=\"n\">group_by</span><span class=\"p\">(</span><span class=\"n\">POSTCODE</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">|&gt;</span><span class=\"w\">\n  </span><span class=\"n\">summarise</span><span class=\"p\">(</span><span class=\"n\">.groups</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"drop\"</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">|&gt;</span><span class=\"w\">\n  </span><span class=\"n\">keep_surfaces</span><span class=\"p\">()</span><span class=\"w\"> </span><span class=\"o\">|&gt;</span><span class=\"w\">\n  </span><span class=\"n\">st_cast</span><span class=\"p\">(</span><span class=\"s2\">\"MULTIPOLYGON\"</span><span class=\"p\">)</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<h2 id=\"the-complete-map\">The complete map</h2>\n\n<p>For the national overview, let’s color the areas by the first digit of their\ncode. This keeps the map readable, without claiming that we have validated a\nclassification of postal regions. Gray is reserved for unassigned components,\nwith their own legend entry.</p>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"n\">postal_colours</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"w\">\n  </span><span class=\"s2\">\"1\"</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"#007F7F\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"2\"</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"#E87500\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"3\"</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"#3B6FB6\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"4\"</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"#A64E9A\"</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"s2\">\"5\"</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"#649A32\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"6\"</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"#D9AF00\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"8\"</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"#B94350\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"9\"</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"#6255A4\"</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"s2\">\"Unassigned\"</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"#727A80\"</span><span class=\"w\">\n</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"n\">postal_groups</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">sort</span><span class=\"p\">(</span><span class=\"n\">unique</span><span class=\"p\">(</span><span class=\"n\">substr</span><span class=\"p\">(</span><span class=\"n\">postal_areas</span><span class=\"o\">$</span><span class=\"n\">POSTCODE</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">1</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">1</span><span class=\"p\">)))</span><span class=\"w\">\n\n</span><span class=\"n\">ggplot</span><span class=\"p\">()</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">geom_sf</span><span class=\"p\">(</span><span class=\"n\">data</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">municipalities</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">fill</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"#d5d2ca\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">colour</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">NA</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">geom_sf</span><span class=\"p\">(</span><span class=\"w\">\n    </span><span class=\"n\">data</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">postal_areas</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"n\">aes</span><span class=\"p\">(</span><span class=\"n\">fill</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">substr</span><span class=\"p\">(</span><span class=\"n\">POSTCODE</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">1</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">1</span><span class=\"p\">)),</span><span class=\"w\"> </span><span class=\"n\">colour</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">background</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">linewidth</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">0.15</span><span class=\"w\">\n  </span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">geom_sf</span><span class=\"p\">(</span><span class=\"w\">\n    </span><span class=\"n\">data</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">unassigned</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">aes</span><span class=\"p\">(</span><span class=\"n\">fill</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"Unassigned\"</span><span class=\"p\">),</span><span class=\"w\">\n    </span><span class=\"n\">colour</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">background</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">linewidth</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">0.15</span><span class=\"w\">\n  </span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">scale_fill_manual</span><span class=\"p\">(</span><span class=\"w\">\n    </span><span class=\"n\">values</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">postal_colours</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">name</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"Postal code group\"</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"n\">breaks</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"n\">postal_groups</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"Unassigned\"</span><span class=\"p\">),</span><span class=\"w\">\n    </span><span class=\"n\">labels</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"n\">paste0</span><span class=\"p\">(</span><span class=\"n\">postal_groups</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"xxx\"</span><span class=\"p\">),</span><span class=\"w\"> </span><span class=\"s2\">\"Unassigned\"</span><span class=\"p\">)</span><span class=\"w\">\n  </span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">coord_sf</span><span class=\"p\">(</span><span class=\"n\">datum</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">NA</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">labs</span><span class=\"p\">(</span><span class=\"w\">\n    </span><span class=\"n\">title</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"Slovenia, point by point\"</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"n\">subtitle</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"Proximity areas clipped to municipal boundaries\"</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"n\">caption</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">paste</span><span class=\"p\">(</span><span class=\"s2\">\"Eurostat / GISCO, 2024 · Own elaboration\"</span><span class=\"p\">,</span><span class=\"w\">\n      </span><span class=\"s2\">\"Dark grey: unassigned areas · Estimated boundaries, not official\"</span><span class=\"p\">,</span><span class=\"w\">\n      </span><span class=\"n\">sep</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"\\n\"</span><span class=\"w\">\n    </span><span class=\"p\">)</span><span class=\"w\">\n  </span><span class=\"p\">)</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<p><img src=\"https://dieghernan.github.io/assets/img/blog/2026-11-06-postal-codes-slovenia-postal-codes-1.webp\" alt=\"Map of Slovenia with estimated postal areas clipped to municipal boundaries. Colors identify postal code groups and dark gray marks unassigned areas.\" width=\"100%\" /></p>\n\n<h2 id=\"checking-the-result\">Checking the result</h2>\n\n<p>The map is ready, but let’s check the geometry before going further. Are the\npolygons valid? Do assigned and unassigned areas cover the territory? Are there\nany appreciable overlaps? We allow one square meter for numerical differences in\nthe geometry operations.</p>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"n\">territory</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">st_union</span><span class=\"p\">(</span><span class=\"n\">st_geometry</span><span class=\"p\">(</span><span class=\"n\">municipalities</span><span class=\"p\">))</span><span class=\"w\">\n\n</span><span class=\"n\">coverage</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">st_union</span><span class=\"p\">(</span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"n\">st_geometry</span><span class=\"p\">(</span><span class=\"n\">postal_areas</span><span class=\"p\">),</span><span class=\"w\"> </span><span class=\"n\">st_geometry</span><span class=\"p\">(</span><span class=\"n\">unassigned</span><span class=\"p\">)))</span><span class=\"w\">\n\n</span><span class=\"n\">difference_m2</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"nf\">as.numeric</span><span class=\"p\">(</span><span class=\"nf\">sum</span><span class=\"p\">(</span><span class=\"n\">st_area</span><span class=\"p\">(</span><span class=\"n\">st_sym_difference</span><span class=\"p\">(</span><span class=\"n\">territory</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">coverage</span><span class=\"p\">))))</span><span class=\"w\">\n\n</span><span class=\"n\">overlap_m2</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"nf\">as.numeric</span><span class=\"p\">(</span><span class=\"w\">\n  </span><span class=\"nf\">sum</span><span class=\"p\">(</span><span class=\"n\">st_area</span><span class=\"p\">(</span><span class=\"n\">postal_areas</span><span class=\"p\">))</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"nf\">sum</span><span class=\"p\">(</span><span class=\"n\">st_area</span><span class=\"p\">(</span><span class=\"n\">unassigned</span><span class=\"p\">))</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"w\"> </span><span class=\"nf\">sum</span><span class=\"p\">(</span><span class=\"n\">st_area</span><span class=\"p\">(</span><span class=\"n\">coverage</span><span class=\"p\">))</span><span class=\"w\">\n</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"n\">knitr</span><span class=\"o\">::</span><span class=\"n\">kable</span><span class=\"p\">(</span><span class=\"n\">data.frame</span><span class=\"p\">(</span><span class=\"w\">\n  </span><span class=\"n\">Indicator</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"w\">\n    </span><span class=\"s2\">\"Codes with an estimated area\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"Components assigned by municipal recovery\"</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"s2\">\"Unassigned records\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"Unassigned area (km²)\"</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"s2\">\"Coverage difference (m²)\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"Overlap (m²)\"</span><span class=\"w\">\n  </span><span class=\"p\">),</span><span class=\"w\">\n  </span><span class=\"n\">Value</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nf\">round</span><span class=\"p\">(</span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"w\">\n    </span><span class=\"n\">nrow</span><span class=\"p\">(</span><span class=\"n\">postal_areas</span><span class=\"p\">),</span><span class=\"w\"> </span><span class=\"nf\">sum</span><span class=\"p\">(</span><span class=\"n\">recoverable</span><span class=\"p\">),</span><span class=\"w\"> </span><span class=\"n\">nrow</span><span class=\"p\">(</span><span class=\"n\">unassigned</span><span class=\"p\">),</span><span class=\"w\">\n    </span><span class=\"nf\">as.numeric</span><span class=\"p\">(</span><span class=\"nf\">sum</span><span class=\"p\">(</span><span class=\"n\">st_area</span><span class=\"p\">(</span><span class=\"n\">unassigned</span><span class=\"p\">)))</span><span class=\"w\"> </span><span class=\"o\">/</span><span class=\"w\"> </span><span class=\"m\">1e6</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">difference_m2</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"n\">overlap_m2</span><span class=\"w\">\n  </span><span class=\"p\">),</span><span class=\"w\"> </span><span class=\"m\">4</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"p\">))</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<table>\n  <thead>\n    <tr>\n      <th style=\"text-align: left\">Indicator</th>\n      <th style=\"text-align: right\">Value</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <td style=\"text-align: left\">Codes with an estimated area</td>\n      <td style=\"text-align: right\">468.0000</td>\n    </tr>\n    <tr>\n      <td style=\"text-align: left\">Components assigned by municipal recovery</td>\n      <td style=\"text-align: right\">4.0000</td>\n    </tr>\n    <tr>\n      <td style=\"text-align: left\">Unassigned records</td>\n      <td style=\"text-align: right\">6.0000</td>\n    </tr>\n    <tr>\n      <td style=\"text-align: left\">Unassigned area (km²)</td>\n      <td style=\"text-align: right\">150.2033</td>\n    </tr>\n    <tr>\n      <td style=\"text-align: left\">Coverage difference (m²)</td>\n      <td style=\"text-align: right\">0.0000</td>\n    </tr>\n    <tr>\n      <td style=\"text-align: left\">Overlap (m²)</td>\n      <td style=\"text-align: right\">-0.0002</td>\n    </tr>\n  </tbody>\n</table>\n\n<p>These checks verify the geometry, <strong>not postal accuracy</strong>. We could cover an\nentire country with valid polygons and still have a poor approximation of its\ndelivery areas.</p>\n\n<h2 id=\"back-to-spain\">Back to Spain</h2>\n\n<p>We now have the full sequence: points, proximity areas, clipping and merging by\npostal code. The same steps work with much more detailed addresses, such as the\nCartoCiudad data in my <a href=\"https://dieghernan.github.io/projects/postal-codes-spain\">Spanish postal codes\nproject</a>.</p>\n\n<p>The input data matters as much as the algorithm. With one representative point\nper code, Voronoi mainly maps distances between representatives. With address\npoints, it can better approximate where each code’s addresses are concentrated.\nIt still knows nothing about delivery routes, physical barriers or official\nboundaries.</p>\n\n<p>We have not compared these results with an independent postal source for\nSlovenia. Before using them for analysis, we would need to review coverage,\ncoordinates, the relationship with municipalities and sensitivity to the\nmargins. For now, we have a working example that shows how the polygons are\nbuilt, one step at a time.</p>\n\n<p>The title is a nod to Muse’s album <em>Black Holes and Revelations</em>.</p>\n\n<iframe class=\"d-block w-100 border-0 rounded my-3\" title=\"Black Holes and Revelations by Muse on Spotify\" src=\"https://open.spotify.com/embed/album/0lw68yx3MhKflWFqCsGkIs?utm_source=generator&amp;theme=0&amp;si=015f4c7acc5c4f8a\" height=\"352\" loading=\"lazy\" allow=\"autoplay; clipboard-write; encrypted-media; fullscreen; picture-in-picture\" allowfullscreen=\"\">\n</iframe>\n\n<h2 id=\"references\">References</h2>\n\n<ul>\n  <li>Goerlich, F. J. (2022). <em>Elaboración de un mapa de códigos postales de España\ncon recursos libres: Cómo evitar pagar por disponer de información de\nreferencia</em> (Working Paper No. 2022-3). Ivie.\n<a href=\"https://doi.org/10.12842/WPIVIE_0322\">https://doi.org/10.12842/WPIVIE_0322</a>\n(<a href=\"https://www.uv.es/goerlich/Ivie/CodPost.html\">Updated online version</a>)</li>\n  <li>Hernangómez, D. (2026). <em>Códigos postales de España</em> (Version 1.0.0)\n[Data set]. Zenodo. <a href=\"https://doi.org/10.5281/zenodo.23698418\">https://doi.org/10.5281/zenodo.23698418</a>\n(<a href=\"https://dieghernan.github.io/codigospostales/\">Project documentation</a>)</li>\n  <li>Pokojski, W., &amp; Pokojska, P. (2018). Voronoi diagrams – Inventor, method,\napplications. <em>Polish Cartographical Review, 50</em>(3), 141–150.\n<a href=\"https://doi.org/10.2478/pcr-2018-0009\">https://doi.org/10.2478/pcr-2018-0009</a></li>\n  <li>Sánchez, J. I. (2020, November 13). Así hice el mapa de los códigos\npostales de España con SIG y datos abiertos. <em>Nosolosig</em>.\n<a href=\"https://www.nosolosig.com/articulos/asi-hice-el-mapa-de-los-codigos-postales-de-espana-con-sig-y-datos-abiertos\">Article</a></li>\n</ul>\n",
      "date_published": "2026-11-06T00:00:00+01:00",
      "image": "https://dieghernan.github.io/assets/img/blog/2026-11-06-postal-codes-slovenia-postal-codes-1.webp",
      "summary": "From five imaginary points to a map of Slovenia: postal code areas with Voronoi, giscoR and sf.",
      "tags": ["music","r_bloggers","rstats","rspatial","maps","ggplot2","sf","giscoR","dataset"],
      "authors": [{
        "name": "Diego HH",
        "url": "https://dieghernan.github.io/"
      }]
    },
    {
      "id": "https://dieghernan.github.io/projects/postal-codes-spain",
      "url": "https://dieghernan.github.io/projects/postal-codes-spain",
      "title": "Postal codes of Spain",
      "content_html": "<p><a href=\"https://doi.org/10.5281/zenodo.23698418\"><img src=\"https://zenodo.org/badge/DOI/10.5281/zenodo.23698418.svg\" alt=\"DOI\" /></a></p>\n\n<p><strong>Códigos postales de España</strong> provides estimated postal code areas for Spain,\nbuilt from open address data from <a href=\"https://www.cartociudad.es/web/portal/\">CartoCiudad</a>\nand administrative boundaries. Explore the results on interactive maps and\ndownload the data for use in <strong>R</strong>, <strong>Python</strong> or <strong>QGIS</strong>.</p>\n\n<h2 id=\"background\">Background</h2>\n\n<p>Postal code polygons are useful for linking addresses and statistics to areas\non a map. According to <a href=\"https://doi.org/10.12842/WPIVIE_0322\">Goerlich (2022)</a>,\nthe Correos polygons available through CartoCiudad stopped being offered for\ndownload in early 2017. This project explores a reproducible alternative based\non open address data.</p>\n\n<p>An early reference is José Ignacio Sánchez’s\n<a href=\"https://www.nosolosig.com/articulos/asi-hice-el-mapa-de-los-codigos-postales-de-espana-con-sig-y-datos-abiertos\">2020 article in NoSoloSIG</a>,\nwhich describes how to estimate postal areas from CartoCiudad addresses using\nGIS tools. This project applies the approach developed in\n<a href=\"https://www.uv.es/goerlich/Ivie/CodPost.html\">Francisco José Goerlich’s 2022 work</a>,\nwith its own choices for selecting addresses and handling areas without an\nassignment.</p>\n\n<h2 id=\"maps-and-data\">Maps and data</h2>\n\n<p>The <a href=\"https://dieghernan.github.io/codigospostales/\">project website</a> includes\ninteractive maps and two GeoPackage downloads: a full version for spatial\nanalysis and a simplified version for visualization. Both include postal code\nareas and administrative areas pending assignment.</p>\n\n<p>The data is shared under a\n<a href=\"https://creativecommons.org/licenses/by/4.0/\">Creative Commons Attribution 4.0 International license</a>.</p>\n\n<h3 id=\"interactive-map\">Interactive map</h3>\n\n<p>Search for a postal code or address, select a two-digit prefix and compare the\nestimated areas with CartoCiudad. The viewer uses the simplified data and does\nnot display areas pending assignment. Its controls are in Spanish.</p>\n\n<p class=\"d-flex flex-wrap\">\n  <a class=\"btn btn-primary mr-2 mb-2\" href=\"https://dieghernan.github.io/codigospostales/visor/mapa/#prefix=28\">Open the map in a full window</a>\n  <a class=\"btn btn-outline-primary mb-2\" href=\"https://dieghernan.github.io/codigospostales/visor/\">Viewer guide</a>\n</p>\n\n<div class=\"embed-responsive embed-responsive-4by3 my-2 chulapa-rounded-lg border border-primary\">\n  <iframe class=\"embed-responsive-item\" title=\"Interactive map of estimated postal code areas in Spain\" src=\"https://dieghernan.github.io/codigospostales/visor/mapa/#prefix=28\" allowfullscreen=\"\" loading=\"lazy\"></iframe>\n</div>\n\n<h2 id=\"methodology\">Methodology</h2>\n\n<p>Following Goerlich’s approach, the workflow treats each separate component of\nan administrative area independently. When the selected addresses share a\nsingle postal code, it assigns that code to the whole component. When several\ncodes are present, it builds Voronoi polygons around the address locations,\nclips them to the administrative boundary and merges areas with the same code.\nThe final polygons are dissolved by postal code across provinces.</p>\n\n<p>This implementation selects addresses using an inward buffer of 200 m, with a\nsecond attempt at 50 m if none are found, rather than the 20 m described by\nGoerlich. Components without selected addresses remain unassigned unless the\nmunicipality has a single postal code recovered from its other components.\nThe administrative boundaries come from\n<a href=\"https://doi.org/10.5281/zenodo.15345101\">LAU2boundaries4Spain</a>, by Francisco José\nGoerlich and Pedro Pérez Vázquez.</p>\n\n<p>These are estimated areas, not official postal boundaries. Coverage depends on\nthe source addresses and some areas remain unassigned. The\n<a href=\"https://github.com/dieghernan/codigospostales\">repository</a> documents the sources,\nmethodology, limitations and steps to reproduce the data.</p>\n\n<h2 id=\"references\">References</h2>\n\n<ul>\n  <li>Centro Nacional de Información Geográfica. (n.d.). <em>CartoCiudad</em>\n[Data set]. <a href=\"https://www.cartociudad.es/web/portal/\">https://www.cartociudad.es/web/portal/</a></li>\n  <li>Correos. (n.d.). <em>Base de datos de códigos postales y capa cartográfica</em>\n[Product information]. <a href=\"https://www.correos.es/es/es/empresas/marketing/identifica-a-tus-clientes-potenciales/base-de-datos-de-codigos-postales\">Product page</a></li>\n  <li>Goerlich, F. J. (2022). <em>Elaboración de un mapa de códigos postales de España\ncon recursos libres: Cómo evitar pagar por disponer de información de\nreferencia</em> (Working Paper No. 2022-3). Ivie.\n<a href=\"https://doi.org/10.12842/WPIVIE_0322\">https://doi.org/10.12842/WPIVIE_0322</a>\n(<a href=\"https://www.uv.es/goerlich/Ivie/CodPost.html\">Updated online version</a>)</li>\n  <li>Goerlich, F. J., &amp; Pérez Vázquez, P. (2025). <em>Base de datos histórica de\ncontornos municipales de España –LAU2boundaries4Spain–</em> (Version 2)\n[Data set]. Zenodo. <a href=\"https://doi.org/10.5281/zenodo.15345101\">https://doi.org/10.5281/zenodo.15345101</a></li>\n  <li>Hernangómez, D. (2026). <em>Códigos postales de España</em> (Version 1.0.0)\n[Data set]. Zenodo. <a href=\"https://doi.org/10.5281/zenodo.23698418\">https://doi.org/10.5281/zenodo.23698418</a>\n(<a href=\"https://dieghernan.github.io/codigospostales/\">Project documentation</a>)</li>\n  <li>Instituto Geográfico Nacional. (n.d.). <em>Servicios de visualización de\nCartoCiudad: Direcciones y códigos postales</em> [WMS documentation].\n<a href=\"https://www.cartociudad.es/web/portal/directorio-de-servicios/visualizacion\">Service documentation</a></li>\n  <li>Sánchez, J. I. (2020, November 13). Así hice el mapa de los códigos\npostales de España con SIG y datos abiertos. <em>Nosolosig</em>.\n<a href=\"https://www.nosolosig.com/articulos/asi-hice-el-mapa-de-los-codigos-postales-de-espana-con-sig-y-datos-abiertos\">Article</a></li>\n</ul>\n",
      "date_published": "2026-11-03T00:00:00+01:00",
      "image": "https://dieghernan.github.io/assets/img/misc/postal-codes-spain.jpg",
      "summary": "Explore estimated postal code areas for Spain and download GeoPackage files for R, Python and QGIS.",
      "tags": ["project","rstats","rspatial","maps","dataset","sf","gpkg","leaflet"],
      "authors": [{
        "name": "Diego HH",
        "url": "https://dieghernan.github.io/"
      }]
    },
    {
      "id": "https://dieghernan.github.io/projects/gifs/",
      "url": "https://dieghernan.github.io/projects/gifs/",
      "title": "Large forest fires in Spain",
      "content_html": "<p><a href=\"https://doi.org/10.5281/zenodo.23932940\"><img src=\"https://zenodo.org/badge/DOI/10.5281/zenodo.23932940.svg\" alt=\"DOI\" /></a></p>\n\n<p><strong>GIFs</strong> brings together structured data on large forest fires in Spain and\n<strong>R</strong> code for an infographic inspired by\n<a href=\"https://dominicroye.github.io/blog/firefly-maps/\">Dominic Royé’s firefly cartography</a>.\nHere, GIF means <em>gran incendio forestal</em>: a fire with at least 500 hectares\nof forest area burned.</p>\n\n<p>The project combines exports from MITECO’s General Forest Fire Statistics\n(EGIF) with its annual reports and provisional updates. It preserves source\ninformation and reconciliation notes so that users can trace how records\nwere selected, grouped and located.</p>\n\n<p><img src=\"https://dieghernan.github.io/gifs/gif_spain.png\" alt=\"Large forest fires in Spain, 2010–2026. Dark map with orange circles sized by forest area burned.\" /></p>\n\n<h2 id=\"two-related-data-products\">Two related data products</h2>\n\n<p>The collection currently provides two complementary views:</p>\n\n<ul>\n  <li><strong>EGIF reports:</strong> 329 selected reports from 2010–2023. Each row has a unique\n<code class=\"language-plaintext highlighter-rouge\">egif_part_id</code> and includes source fields, burned areas, cause, provenance,\nnotes and coordinates where they can be interpreted.</li>\n  <li><strong>Reconciled fires:</strong> 455 fire records from 2010–2026, used by the\ninfographic. Each fire has a stable <code class=\"language-plaintext highlighter-rouge\">fire_id</code>; a fire may bring together\nseveral EGIF reports.</li>\n</ul>\n\n<p>These are different units of observation. Do not add the two tables’ row\ncounts or burned areas together. The 500-hectare threshold is applied after\nexplicitly documented groupings of reports belonging to the same fire.</p>\n\n<p>EGIF takes priority when a documented match exists. Records without a match\nretain their original MITECO annual report or provisional update. Reports\nawaiting reconciliation keep an empty <code class=\"language-plaintext highlighter-rouge\">fire_id</code> and are not automatically\nadded as new fires, which helps avoid double counting.</p>\n\n<h2 id=\"coverage-and-limitations\">Coverage and limitations</h2>\n\n<p>The fire-level records span February 27, 2010 to September 26, 2026. These\nare the first and last dates in the file, not evidence of complete annual\ncoverage. The project is not a real-time monitoring service.</p>\n\n<p>The documented reconciliation still has nine earlier fire records and eight\nselected EGIF reports awaiting a match. Two additional records retain their\nprovisional source because their province has no reports in the 2023 EGIF\nexport. That export contains no records for seven provinces, so an absence\nfrom these files should not be interpreted as an absence of fires.</p>\n\n<p>The <a href=\"https://github.com/dieghernan/gifs/blob/main/METODOLOGIA.md\">methodology</a>\nexplains source priority, explicit groupings and unresolved cases. The\n<a href=\"https://github.com/dieghernan/gifs/blob/main/data-raw/README.md\">data guide</a>\ndocuments the source exports and processing. The original ZIP files are\npreserved with SHA-256 checksums.</p>\n\n<h2 id=\"coordinates-and-the-infographic\">Coordinates and the infographic</h2>\n\n<p>Geographic coordinates use EPSG:4326, keeping the Canary Islands in their\nactual location. EGIF coordinates are transformed only when their coordinate\nsystem can be interpreted. Missing coordinates or an unknown datum leave the\ngeographic coordinates empty rather than producing an invented point.</p>\n\n<p>The fire-level view uses interpretable EGIF coordinates where available and\nan identified municipal reference location otherwise. <code class=\"language-plaintext highlighter-rouge\">location_method</code>\ndistinguishes these sources. For fires with several reports, the view records\nwhich report supplies its reference point. Declared municipality codes and\nmunicipalities obtained through a spatial join are retained separately.</p>\n\n<p>The points are reference locations, not fire perimeters. Municipal reference\nlocations come from IGN through SIANE and <strong>mapSpain</strong>. The infographic reads\nthe reconciled fire view and uses circle sizes to show forest area burned.</p>\n\n<h2 id=\"downloads-citation-and-reuse\">Downloads, citation and reuse</h2>\n\n<p>Both products are available in <strong>CSV</strong>, <strong>JSON</strong> and <strong>GeoJSON</strong> from the\n<a href=\"https://dieghernan.github.io/gifs/\">project website</a>. Read identifiers and\nmunicipality codes as text to preserve their representation. JSON supplies\nexplicit types and null values; GeoJSON retains records without usable\ncoordinates with <code class=\"language-plaintext highlighter-rouge\">geometry: null</code>.</p>\n\n<p>Machine-readable field descriptions are provided separately in the\n<a href=\"https://dieghernan.github.io/gifs/croissant/parts.json\">EGIF report Croissant metadata</a>\nand the <a href=\"https://dieghernan.github.io/gifs/croissant/fires.json\">fire-level Croissant metadata</a>.</p>\n\n<p>For reproducible analyses, cite the DOI of the version used. The collection’s\n<a href=\"https://doi.org/10.5281/zenodo.23932940\">version 2.0.0 DOI</a> identifies the\narchived release; the <a href=\"https://doi.org/10.5281/zenodo.23929996\">general DOI</a>\ngroups the project’s releases.</p>\n\n<p>Data reuse follows the\n<a href=\"https://www.miteco.gob.es/es/atencion-al-ciudadano/aviso-legal.html\">MITECO legal notice</a>,\nincluding attribution and preservation of the original conditions and metadata.\nThe municipal cartography credits CartoBase ANE 2006–2024, CC BY 4.0, IGN.\nThe repository’s MIT license applies to code and documentation. The project\nis independent and does not imply MITECO participation or endorsement.</p>\n\n<h2 id=\"references\">References</h2>\n\n<ul>\n  <li>Royé, D. (2021, June 1). Firefly cartography. <em>Dr Dominic Royé</em>.\n<a href=\"https://dominicroye.github.io/blog/firefly-maps/\">https://dominicroye.github.io/blog/firefly-maps/</a></li>\n</ul>\n",
      "date_published": "2026-11-03T00:00:00+01:00",
      "image": "https://dieghernan.github.io/assets/img/misc/gifs-social.jpg",
      "summary": "Explore EGIF reports and reconciled records of large forest fires in Spain, with CSV, JSON and GeoJSON downloads and documented methodology.",
      "tags": ["project","rstats","rspatial","maps","dataset","csv","geojson"],
      "authors": [{
        "name": "Diego HH",
        "url": "https://dieghernan.github.io/"
      }]
    },
    {
      "id": "https://dieghernan.github.io/202610_orange-peel/",
      "url": "https://dieghernan.github.io/202610_orange-peel/",
      "title": "Let’s peel the world",
      "content_html": "<p>What would happen if we peeled the Earth like an orange? The\n<a href=\"https://proj.org/en/stable/operations/projections/igh.html\">interrupted Goode homolosine projection</a>\ngives us something close to that! This equal-area projection preserves relative\nareas while splitting the world map into lobes. Add a few shades of orange and\nour world is ready to peel.</p>\n\n<p>Let’s make it with <strong>sf</strong>, <strong>giscoR</strong> and <strong>ggplot2</strong>. First, we get the\ncoastlines and draw the outline, following the cuts between the lobes.</p>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"n\">library</span><span class=\"p\">(</span><span class=\"n\">sf</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">library</span><span class=\"p\">(</span><span class=\"n\">ggplot2</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">library</span><span class=\"p\">(</span><span class=\"n\">giscoR</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">library</span><span class=\"p\">(</span><span class=\"n\">showtext</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"n\">world</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">gisco_get_coastal_lines</span><span class=\"p\">(</span><span class=\"n\">resolution</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">10</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">goode_crs</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"s2\">\"+proj=igh\"</span><span class=\"w\">\n</span><span class=\"n\">lat</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"m\">90</span><span class=\"o\">:</span><span class=\"m\">-90</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"nf\">rep</span><span class=\"p\">(</span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"m\">-90</span><span class=\"o\">:</span><span class=\"m\">0</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">0</span><span class=\"o\">:</span><span class=\"m\">-90</span><span class=\"p\">),</span><span class=\"w\"> </span><span class=\"m\">3</span><span class=\"p\">),</span><span class=\"w\"> </span><span class=\"m\">-90</span><span class=\"o\">:</span><span class=\"m\">90</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">90</span><span class=\"o\">:</span><span class=\"m\">0</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">0</span><span class=\"o\">:</span><span class=\"m\">90</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">90</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">lon</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"w\">\n  </span><span class=\"nf\">rep</span><span class=\"p\">(</span><span class=\"m\">180</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">181</span><span class=\"p\">),</span><span class=\"w\">\n  </span><span class=\"nf\">rep</span><span class=\"p\">(</span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"m\">80.01</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">79.99</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">-19.99</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">-20.01</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">-99.99</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">-100.01</span><span class=\"p\">),</span><span class=\"w\"> </span><span class=\"n\">each</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">91</span><span class=\"p\">),</span><span class=\"w\">\n  </span><span class=\"nf\">rep</span><span class=\"p\">(</span><span class=\"m\">-180</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">181</span><span class=\"p\">),</span><span class=\"w\">\n  </span><span class=\"nf\">rep</span><span class=\"p\">(</span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"m\">-40.01</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">-39.99</span><span class=\"p\">),</span><span class=\"w\"> </span><span class=\"n\">each</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">91</span><span class=\"p\">),</span><span class=\"w\">\n  </span><span class=\"m\">180</span><span class=\"w\">\n</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">outline</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">st_sfc</span><span class=\"p\">(</span><span class=\"n\">st_polygon</span><span class=\"p\">(</span><span class=\"nf\">list</span><span class=\"p\">(</span><span class=\"n\">cbind</span><span class=\"p\">(</span><span class=\"n\">lon</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">lat</span><span class=\"p\">))),</span><span class=\"w\"> </span><span class=\"n\">crs</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">4326</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">|&gt;</span><span class=\"w\">\n  </span><span class=\"n\">st_transform</span><span class=\"p\">(</span><span class=\"n\">goode_crs</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">rectangle</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">st_as_sfc</span><span class=\"p\">(</span><span class=\"n\">st_bbox</span><span class=\"p\">(</span><span class=\"n\">outline</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">*</span><span class=\"w\"> </span><span class=\"m\">1.1</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">mask</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">st_difference</span><span class=\"p\">(</span><span class=\"n\">rectangle</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">outline</span><span class=\"p\">)</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<p>Next, we draw the meridians and parallels within each lobe so that they do not\nconnect across the cuts.</p>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"n\">lobes</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"nf\">list</span><span class=\"p\">(</span><span class=\"w\">\n  </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"m\">-180</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">-40</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">0</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">90</span><span class=\"p\">),</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"m\">-40</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">180</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">0</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">90</span><span class=\"p\">),</span><span class=\"w\">\n  </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"m\">-180</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">-100</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">-90</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">0</span><span class=\"p\">),</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"m\">-100</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">-20</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">-90</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">0</span><span class=\"p\">),</span><span class=\"w\">\n  </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"m\">-20</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">80</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">-90</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">0</span><span class=\"p\">),</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"m\">80</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">180</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">-90</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">0</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">lines</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">lapply</span><span class=\"p\">(</span><span class=\"n\">lobes</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"k\">function</span><span class=\"p\">(</span><span class=\"n\">b</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"p\">{</span><span class=\"w\">\n  </span><span class=\"n\">west</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">b</span><span class=\"p\">[</span><span class=\"m\">1</span><span class=\"p\">]</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"m\">0.01</span><span class=\"w\">\n  </span><span class=\"n\">east</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">b</span><span class=\"p\">[</span><span class=\"m\">2</span><span class=\"p\">]</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"w\"> </span><span class=\"m\">0.01</span><span class=\"w\">\n  </span><span class=\"n\">south</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"nf\">max</span><span class=\"p\">(</span><span class=\"n\">b</span><span class=\"p\">[</span><span class=\"m\">3</span><span class=\"p\">],</span><span class=\"w\"> </span><span class=\"m\">-89.99</span><span class=\"p\">)</span><span class=\"w\">\n  </span><span class=\"n\">north</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"nf\">min</span><span class=\"p\">(</span><span class=\"n\">b</span><span class=\"p\">[</span><span class=\"m\">4</span><span class=\"p\">],</span><span class=\"w\"> </span><span class=\"m\">89.99</span><span class=\"p\">)</span><span class=\"w\">\n  </span><span class=\"n\">meridians</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">seq</span><span class=\"p\">(</span><span class=\"m\">-180</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">180</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">30</span><span class=\"p\">)</span><span class=\"w\">\n  </span><span class=\"n\">meridians</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">meridians</span><span class=\"p\">[</span><span class=\"n\">meridians</span><span class=\"w\"> </span><span class=\"o\">&gt;</span><span class=\"w\"> </span><span class=\"n\">west</span><span class=\"w\"> </span><span class=\"o\">&amp;</span><span class=\"w\"> </span><span class=\"n\">meridians</span><span class=\"w\"> </span><span class=\"o\">&lt;</span><span class=\"w\"> </span><span class=\"n\">east</span><span class=\"p\">]</span><span class=\"w\">\n  </span><span class=\"n\">parallels</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">seq</span><span class=\"p\">(</span><span class=\"m\">-60</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">60</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">30</span><span class=\"p\">)</span><span class=\"w\">\n  </span><span class=\"n\">parallels</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">parallels</span><span class=\"p\">[</span><span class=\"n\">parallels</span><span class=\"w\"> </span><span class=\"o\">&gt;=</span><span class=\"w\"> </span><span class=\"n\">south</span><span class=\"w\"> </span><span class=\"o\">&amp;</span><span class=\"w\"> </span><span class=\"n\">parallels</span><span class=\"w\"> </span><span class=\"o\">&lt;=</span><span class=\"w\"> </span><span class=\"n\">north</span><span class=\"p\">]</span><span class=\"w\">\n  </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"w\">\n    </span><span class=\"n\">lapply</span><span class=\"p\">(</span><span class=\"n\">meridians</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"k\">function</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"p\">{</span><span class=\"w\">\n      </span><span class=\"n\">st_linestring</span><span class=\"p\">(</span><span class=\"n\">cbind</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">seq</span><span class=\"p\">(</span><span class=\"n\">south</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">north</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">length.out</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">181</span><span class=\"p\">)))</span><span class=\"w\">\n    </span><span class=\"p\">}),</span><span class=\"w\">\n    </span><span class=\"n\">lapply</span><span class=\"p\">(</span><span class=\"n\">parallels</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"k\">function</span><span class=\"p\">(</span><span class=\"n\">y</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"p\">{</span><span class=\"w\">\n      </span><span class=\"n\">st_linestring</span><span class=\"p\">(</span><span class=\"n\">cbind</span><span class=\"p\">(</span><span class=\"n\">seq</span><span class=\"p\">(</span><span class=\"n\">west</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">east</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">length.out</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">361</span><span class=\"p\">),</span><span class=\"w\"> </span><span class=\"n\">y</span><span class=\"p\">))</span><span class=\"w\">\n    </span><span class=\"p\">})</span><span class=\"w\">\n  </span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"p\">})</span><span class=\"w\">\n</span><span class=\"n\">grat</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">st_sfc</span><span class=\"p\">(</span><span class=\"n\">do.call</span><span class=\"p\">(</span><span class=\"n\">c</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">lines</span><span class=\"p\">),</span><span class=\"w\"> </span><span class=\"n\">crs</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">4326</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">|&gt;</span><span class=\"w\">\n  </span><span class=\"n\">st_transform</span><span class=\"p\">(</span><span class=\"n\">goode_crs</span><span class=\"p\">)</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<p>Finally, we add the orange palette. The mask hides anything outside the outline\nand keeps the edges of our peel tidy.</p>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"n\">font_add_google</span><span class=\"p\">(</span><span class=\"s2\">\"Coiny\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">family</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"coiny\"</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"n\">showtext_auto</span><span class=\"p\">()</span><span class=\"w\">\n\n</span><span class=\"n\">ggplot</span><span class=\"p\">()</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">geom_sf</span><span class=\"p\">(</span><span class=\"n\">data</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">outline</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">fill</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"#FFF0D9\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">colour</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">NA</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">geom_sf</span><span class=\"p\">(</span><span class=\"n\">data</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">world</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">fill</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"#F9B566\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">colour</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"#B34D08\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">linewidth</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">0.25</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">geom_sf</span><span class=\"p\">(</span><span class=\"n\">data</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">grat</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">fill</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">NA</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">colour</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"#E8A45B\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">linewidth</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">0.25</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">geom_sf</span><span class=\"p\">(</span><span class=\"n\">data</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">mask</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">fill</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"#fcf1e7\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">colour</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">NA</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">geom_sf</span><span class=\"p\">(</span><span class=\"n\">data</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">outline</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">fill</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">NA</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">colour</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"#E87516\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">linewidth</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">0.4</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">coord_sf</span><span class=\"p\">(</span><span class=\"w\">\n    </span><span class=\"n\">crs</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">goode_crs</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"n\">xlim</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">st_bbox</span><span class=\"p\">(</span><span class=\"n\">outline</span><span class=\"p\">)[</span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"s2\">\"xmin\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"xmax\"</span><span class=\"p\">)],</span><span class=\"w\">\n    </span><span class=\"n\">ylim</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">st_bbox</span><span class=\"p\">(</span><span class=\"n\">outline</span><span class=\"p\">)[</span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"s2\">\"ymin\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"ymax\"</span><span class=\"p\">)],</span><span class=\"w\">\n    </span><span class=\"n\">expand</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">FALSE</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"n\">datum</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">NA</span><span class=\"w\">\n  </span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">theme_void</span><span class=\"p\">()</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">theme</span><span class=\"p\">(</span><span class=\"w\">\n    </span><span class=\"n\">text</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">element_text</span><span class=\"p\">(</span><span class=\"n\">family</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"coiny\"</span><span class=\"p\">),</span><span class=\"w\">\n    </span><span class=\"n\">plot.background</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">element_rect</span><span class=\"p\">(</span><span class=\"n\">fill</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"#fcf1e7\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">colour</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">NA</span><span class=\"p\">),</span><span class=\"w\">\n    </span><span class=\"n\">plot.title</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">element_text</span><span class=\"p\">(</span><span class=\"w\">\n      </span><span class=\"n\">color</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"#E87516\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">face</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"bold\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">size</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">rel</span><span class=\"p\">(</span><span class=\"m\">3</span><span class=\"p\">),</span><span class=\"w\">\n      </span><span class=\"n\">margin</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">margin</span><span class=\"p\">(</span><span class=\"n\">b</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">10</span><span class=\"p\">)</span><span class=\"w\">\n    </span><span class=\"p\">),</span><span class=\"w\">\n    </span><span class=\"n\">plot.margin</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">margin</span><span class=\"p\">(</span><span class=\"m\">10</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">10</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">10</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">10</span><span class=\"p\">),</span><span class=\"w\">\n    </span><span class=\"n\">plot.caption</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">element_text</span><span class=\"p\">(</span><span class=\"w\">\n      </span><span class=\"n\">color</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"#E87516\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">size</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">rel</span><span class=\"p\">(</span><span class=\"m\">1.5</span><span class=\"p\">),</span><span class=\"w\">\n      </span><span class=\"n\">margin</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">margin</span><span class=\"p\">(</span><span class=\"n\">t</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">10</span><span class=\"p\">)</span><span class=\"w\">\n    </span><span class=\"p\">)</span><span class=\"w\">\n  </span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">labs</span><span class=\"p\">(</span><span class=\"w\">\n    </span><span class=\"n\">title</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"Let's peel the world\"</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"n\">caption</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"Interrupted Goode homolosine projection\"</span><span class=\"w\">\n  </span><span class=\"p\">)</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<p><img src=\"https://dieghernan.github.io/assets/img/blog/202610_goode-map-1.webp\" alt=\"World map with orange coastlines and graticules in the interrupted Goode homolosine projection, resembling a flattened orange peel.\" width=\"100%\" /></p>\n\n<iframe class=\"d-block w-100 border-0 rounded my-3\" title=\"Heal the World by Michael Jackson on Spotify\" src=\"https://open.spotify.com/embed/track/7woW97CfcWaKtuC6W5BP2K?theme=0\" height=\"152\" loading=\"lazy\" allow=\"autoplay; clipboard-write; encrypted-media; fullscreen; picture-in-picture\" allowfullscreen=\"\">\n</iframe>\n\n<h2 id=\"references\">References</h2>\n\n<ul>\n  <li>Panaïotis, T. (2026, September 29). Projections cartographiques : Le guide\npour ne pas y laisser sa santé mentale. <em>Pyranhia</em>.\n<a href=\"https://pyranhia.eu/posts/202609-carto-proj-avancees/carto-proj-avancees.html\">Article</a></li>\n  <li>Wilke, C. O. (n.d.). <em>Interrupted Goode homolosine</em>. practicalgg.\n<a href=\"https://wilkelab.org/practicalgg/articles/goode.html\">https://wilkelab.org/practicalgg/articles/goode.html</a>\n(Source for the outline and masking approach.)</li>\n</ul>\n",
      "date_published": "2026-10-24T00:00:00+02:00",
      "image": "https://dieghernan.github.io/assets/img/blog/202610_goode-map-1.webp",
      "summary": "Peel the world like an orange with the interrupted Goode homolosine projection and draw it in R.",
      "tags": ["music","r_bloggers","beautiful_maps","rstats","rspatial","maps","ggplot2","sf","giscoR"],
      "authors": [{
        "name": "Diego HH",
        "url": "https://dieghernan.github.io/"
      }]
    },
    {
      "id": "https://dieghernan.github.io/202610_webmentions/",
      "url": "https://dieghernan.github.io/202610_webmentions/",
      "title": "Conversations across the web with Webmentions",
      "content_html": "<p>Conversations about a blog post often happen somewhere else. Someone shares a\nlink, replies on their own site or reacts to a post on social media. I wanted\nto bring some of that activity back here.</p>\n\n<p>This implementation was directly inspired by <strong>Matt Hobbs’s</strong> article,\n<a href=\"https://nooshu.com/blog/2019/11/18/implementing-webmentions/\">Implementing Webmentions on this blog</a>,\npublished on <strong>Nooshu</strong>.</p>\n\n<p>I liked its simple presentation: links to mentions and replies,\nfollowed by small groups of avatars for likes and reposts. So I added a\nsimilar section to this blog, using the typography, colors and buttons from\n<a href=\"https://dieghernan.github.io/chulapa\"><span class=\"chulapa\">Chulapa</span></a>.</p>\n\n<h2 id=\"how-it-works\">How it works</h2>\n\n<p>A <a href=\"https://www.w3.org/TR/webmention/\">Webmention</a> is a notification that one\npage links to another. If you write\nabout one of my posts on your own site, you can send its URL so the link can\nappear below the original article.</p>\n\n<p>This blog already advertised a <a href=\"https://webmention.io/\"><strong>Webmention.io</strong></a>\nendpoint. The missing piece\nwas displaying the mentions it had collected. A small JavaScript file now\nrequests the public mentions for each post’s canonical URL and builds the\nsection automatically when the page opens.</p>\n\n<p>Mentions and replies appear as a numbered list of links and authors. Likes\nand reposts have their own counts and rows of overlapping avatars. The\ncontent stays on its original site. Each link takes you to the conversation.\nThe existing GitHub comments are still available, too.</p>\n\n<h2 id=\"a-small-addition-to-a-static-blog\">A small addition to a static blog</h2>\n\n<p>The implementation uses a Jekyll include, a stylesheet and plain JavaScript.\nThere is no extra Jekyll plugin or change to the deployment workflow.\n<strong>Webmention.io</strong> handles receiving and verifying links, while the browser\nloads the results through its public API.</p>\n\n<p>I tried it with the <a href=\"https://dieghernan.github.io/202602_geobounds/\">geobounds post</a>,\nwhich already had mentions, and with a recent post that had none. Both cases\nmatter: an empty section should still explain how to join in.</p>\n\n<p>Sharing a link on a social network only brings reactions here if a bridge sends\nthem as Webmentions.</p>\n\n<h2 id=\"send-a-link\">Send a link</h2>\n\n<p>Written something that links to this post? Open <strong>Shared your thoughts on this\npost? Drop your link here!</strong> below and submit your page’s URL. The form works\nwithout JavaScript, although displaying existing mentions requires it.</p>\n\n<p>Thanks to <strong>Matt Hobbs</strong> for the inspiration and for sharing his\n<a href=\"https://gist.github.com/Nooshu/121e5bf7f3d5c6528413c57db257894f\">implementation</a>.\nIt is a nice way to let a static blog take part in a wider conversation.</p>\n\n<div class=\"alert alert-info p-3 mx-2 mb-3\" role=\"note\">\n<p><strong>AI assistance:</strong> I wrote this post with help from\n<strong>Codex</strong>, including drafting and editing the text. Codex also\nhelped implement and test the Webmentions section. The header image was\nalso generated with AI.</p>\n</div>\n",
      "date_published": "2026-10-16T00:00:00+02:00",
      "image": "https://dieghernan.github.io/assets/img/blog/202610-webmentions-header.webp",
      "summary": "A small addition to my Jekyll blog, inspired by Matt Hobbs: Webmentions with a Chulapa look.",
      "tags": ["jekyll","html","chulapa","indieweb"],
      "authors": [{
        "name": "Diego HH",
        "url": "https://dieghernan.github.io/"
      }]
    },
    {
      "id": "https://dieghernan.github.io/202610_building-a-documentation-chatbot/",
      "url": "https://dieghernan.github.io/202610_building-a-documentation-chatbot/",
      "title": "Building a documentation chatbot for Chulapa",
      "content_html": "<p>This website uses my <strong>Jekyll</strong> theme,\n<a href=\"https://dieghernan.github.io/chulapa\"><span class=\"chulapa\">Chulapa</span></a>. Some time ago, I\nstarted wondering whether I could add a chatbot to its documentation. The docs\nalready explain the settings, layouts and snippets, but you sometimes need to\nknow what a feature is called before finding it. Could I make that a little\neasier?</p>\n\n<p>The idea was simple: ask a question, get a useful example and follow a link to\nthe original docs. With <a href=\"https://learn.chatgpt.com/learn/codex\"><strong>Codex</strong></a>,\nOpenAI’s coding agent, I had an initial version working on the page in\n<strong>less than an hour</strong>: I could open the widget, send a question and read its\nanswer. That was the prototype, though. Checking its answers and making it\nbehave properly on a phone took quite a few more rounds.</p>\n\n<h2 id=\"start-with-a-prototype-then-decide-where-it-belongs\">Start with a prototype, then decide where it belongs</h2>\n\n<p>I started with references rather than an empty editor. The <a href=\"https://www.freecodecamp.org/news/how-to-build-an-embeddable-ai-chatbot-widget-with-cloudflare-workers/\">freeCodeCamp\ntutorial on an embeddable\nchatbot</a>\nprovided a practical starting point for a browser widget backed by\n<strong>Cloudflare Workers</strong>. I also liked the visual approach in <a href=\"https://www.malte-grosser.com/post/adding-a-free-ai-chatbot/\">Malte Grosser’s chatbot\npost</a>.</p>\n\n<p>I built the implementation with <strong>Codex</strong>. I described what I wanted, supplied\nthose references and asked it to inspect the existing theme and documentation.\nThere were three pieces to work on: the widget visitors use in the browser,\nthe Worker that processes requests on Cloudflare and a context file containing\na summary of the documentation supplied to the model. We worked through them\ntogether. I tested the page, asked the chatbot questions and brought back\nscreenshots when something looked wrong. <strong>Codex</strong> helped turn that feedback\ninto code changes.</p>\n\n<p>Working this way let me spend more time trying the assistant as a visitor\nwould: does this answer help\nme configure my site? Can I read it with the keyboard open? What happens after a\nlong conversation?</p>\n\n<p>At first, I considered adding the chatbot as a theme feature. That quickly felt\nlike too much to ask of someone who just wants a <strong>Jekyll</strong> site. An AI account, a\nseparate backend and a maintained knowledge summary would become part of their\nsetup.</p>\n\n<p>So I kept it as an extension of the theme’s documentation site. The\n<a href=\"https://github.com/dieghernan/chulapa/tree/main/docs/ai-chatbot\">implementation and evaluation\nfiles</a> live\nunder <code class=\"language-plaintext highlighter-rouge\">docs/ai-chatbot/</code> in the theme repository. Someone using the theme does\nnot need to set up a Worker or maintain an AI context. This also gives me room\nto experiment without making every experiment part of the template.</p>\n\n<h2 id=\"a-static-site-with-a-separate-ai-backend\">A static site with a separate AI backend</h2>\n\n<p><strong>Jekyll</strong> builds the static documentation pages. I chose a separate service\nto process the chatbot’s questions. A script loads the chat\nwidget, and a <strong>Cloudflare Worker</strong> serves the widget and handles questions. The\nWorker sends the question, instructions and a reviewed documentation summary to\n<strong>Workers AI</strong>, Cloudflare’s service for running AI models, then returns the\nanswer to the browser.</p>\n\n<p>The model currently configured is <strong>Gemma</strong>, using the identifier\n<code class=\"language-plaintext highlighter-rouge\">@cf/google/gemma-4-26b-a4b-it</code>. The Worker accesses it through an <code class=\"language-plaintext highlighter-rouge\">AI</code> binding:\na connection configured in Cloudflare that lets the Worker call <strong>Workers AI</strong>.\nThat connection stays on the server side, so visitors do not receive an API key.\n<strong>Codex</strong> helped me build and test the implementation. <strong>Gemma</strong> is the model\nthat answers visitors’ questions.</p>\n\n<p>There is no automatic document retrieval in this implementation. The context is\na Markdown file maintained alongside the code. Adding a documentation URL or the\nRSS feed URL gives the model a reference to share. The Worker still relies on\nthe maintained context file for page content and new posts.</p>\n\n<p>That was an intentional starting point. I can inspect exactly which facts the\nassistant receives, and updating it does not require a vector database or a\ndocument indexing pipeline. The tradeoff is that I have to keep that summary\ncurrent.</p>\n\n<p>Making the answers readable was another part of the interface work. They\narrive as Markdown, which <strong>Marked</strong> converts to HTML for lists, code blocks\nand links. <strong>DOMPurify</strong> then removes potentially dangerous HTML before the\nanswer is displayed. Visitors can copy code and follow permitted documentation\nlinks. Mentions of the theme use its <code class=\"language-plaintext highlighter-rouge\">chulapa</code> class, while code and\nconfiguration identifiers retain their original formatting.</p>\n\n<h2 id=\"the-first-answers-exposed-the-missing-context\">The first answers exposed the missing context</h2>\n\n<p>One of my first questions was: “Can I add video here?” The answer did not really\nhelp. I knew the docs explained how to do it, so I asked <strong>Codex</strong> to check what the\nassistant was receiving. The summary needed the video snippet and its options,\nnot just a general mention that videos were supported.</p>\n\n<p>Another exchange made the problem particularly obvious. The theme has built-in\nskins that change the site’s visual appearance. I asked how to change a skin,\nand the assistant explained <code class=\"language-plaintext highlighter-rouge\">chulapa-skin.skin</code>. Then I asked which skins\nwere available. It replied that there were more than 40, but gave no names. That\nwas related to the question, yet it did not help me choose anything.</p>\n\n<p>I added actual skin names and a link to the visual catalog to the context,\nalong with an instruction to give examples when someone asks what is available.\nIn the follow-up tests, the assistant returned skin names and a link to the\ncatalog instead of just repeating the number of choices. That was a useful\nimprovement I could check directly, even though other answers still needed work.\nFor\nconfiguration questions, a small complete example is often more useful than\nanother paragraph. For example, this goes in the site’s <code class=\"language-plaintext highlighter-rouge\">_config.yml</code> to\nselect the <code class=\"language-plaintext highlighter-rouge\">darkly</code> skin:</p>\n\n<div class=\"language-yaml highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"na\">chulapa-skin</span><span class=\"pi\">:</span>\n  <span class=\"na\">skin</span><span class=\"pi\">:</span> <span class=\"s\">darkly</span>\n</code></pre></div></div>\n\n<p>I expanded the summary selectively: installation, configuration, layouts,\nvideos, galleries, navigation, search, comments, SEO and the FAQ. Later passes\nadded Sass variables and Markdown guidance. I tried to include the details that\nlet someone act: exact option names, defaults, a short example and the right\nsource page.</p>\n\n<p>Copying all the docs into the prompt would have been easier to automate. It\nwould also make each request larger and leave plenty of irrelevant information\ncompeting with the answer. The goal was informative help with a manageable\ncontext, rather than the longest possible context.</p>\n\n<h2 id=\"testing-questions-instead-of-counting-successful-requests\">Testing questions instead of counting successful requests</h2>\n\n<p>I asked <strong>Codex</strong> to work through the documentation in batches and send basic and\nadvanced questions to the live assistant. Installation and skin changes were\nonly the beginning. We also checked project-site URLs, favicons, local videos,\ngalleries, highlighting and combinations of settings. I reviewed the results and\nused the weak answers to decide where the context needed more detail.</p>\n\n<p>I also asked <strong>Codex</strong> to look for real user questions in the\n<a href=\"https://github.com/dieghernan/chulapa/issues\">Issues</a> and\n<a href=\"https://github.com/dieghernan/chulapa/discussions\">Discussions</a> of the\n<span class=\"chulapa\">Chulapa</span> repository. These helped us test the\nassistant with the wording people actually use when they get stuck, rather\nthan only questions based on documentation headings. We used those questions\nto prepare evaluation cases and checked the answers against the docs. Feature\nrequests needed particular care: someone asking for an option does not mean\nthe theme already supports it.</p>\n\n<p>We added an evaluation script that sends questions to the live assistant in\nbatches and saves the full responses. That gives me a record to review for\nthe explanation, code and source links. A successful HTTP response only means that the request\nworked. It says nothing about whether the YAML is correct, the answer covers\nevery part of the question or the link points to the right page.</p>\n\n<p>Some failures were subtle: a plausible option in the wrong place, an incomplete\nexample or a source link with an invented anchor. Follow-up tests helped target\nthose weaknesses. I also included unsupported features and unrelated questions\nto check whether the assistant would acknowledge missing information.</p>\n\n<p>This process is sometimes called “training the chatbot,” but I did not train or\nfine-tune the model. I improved the supplied context and instructions, then\ntested the resulting answers. Those changes can help, but they do not guarantee\nthat every future response will be correct.</p>\n\n<h2 id=\"a-chat-history-that-does-not-become-model-memory\">A chat history that does not become model memory</h2>\n\n<p>The widget keeps recent messages in the tab’s session storage, making it easier\nto return to an answer while browsing. Each request to the model is independent,\nhowever: earlier messages are not sent with the next question. This started as\na limitation of the prototype, rather than a deliberate choice to rule out\nconversational memory, and remains a limitation of the version described here.\nKeeping the history visible does not change what the backend sends to the model.</p>\n\n<p>That distinction needed to be visible. A familiar chat interface naturally\ninvites questions such as “And what about that one?” Here, it is better to ask a\ncomplete question. I added that guidance near the input and a clear-chat control\nfor the local history.</p>\n\n<h2 id=\"the-phone-found-problems-the-desktop-missed\">The phone found problems the desktop missed</h2>\n\n<p>The interface took several rounds of testing on a real phone. Opening the\nkeyboard could zoom the page or leave the panel clipped. Rotating the phone made\nthe available space even smaller. A desktop browser resized to a narrow width\nwas useful, but it did not reproduce all of those behaviors.</p>\n\n<p>The input now uses a mobile-friendly text size, and the panel follows the\nspace actually visible on screen when the keyboard opens. That available area\nis called the visual viewport. Using it helps the panel fit above the keyboard.\nOpening the chat on mobile does not automatically focus the input and summon\nthe keyboard.</p>\n\n<p>Long conversations revealed another bug: a second scrollbar appeared on the\nouter panel, followed by a large empty area below the form. Constraining the\nmessage log and clipping its paint overflow kept scrolling inside the history,\nwith the header and question form visible.</p>\n\n<p>The button that opens the chatbot also had to coexist with the theme’s floating\nmenu button and its separate table-of-contents control. After trying different\npositions, I settled on stacking the chatbot button above the menu button on\nsmaller screens, matching its size and right margin, with a gap between them.\nSmall alignment differences were much more\nnoticeable than I expected.</p>\n\n<p>I wanted the launcher to fit the site visually and still be easy to recognize.\nWe tried a robot icon first, then settled on a small sparkle SVG for opening\nthe assistant and a paper-plane icon for sending a question. The SVG uses\n<code class=\"language-plaintext highlighter-rouge\">currentColor</code>, so its color follows the button’s CSS instead of being fixed\ninside the image. That makes it easier to keep the icon consistent with the\nrest of the control.</p>\n\n<h2 id=\"limits-and-maintenance-are-part-of-the-implementation\">Limits and maintenance are part of the implementation</h2>\n\n<p>I wanted to keep the experiment within the Free account’s allowance, including\nthe requests we sent while testing. The Worker has input checks, a bounded\nresponse length and a rate-limit binding\nconfigured for five requests per IP per minute. Live testing eventually produced\na rejection, but it also showed that the cutoff was not exactly the sixth\nrequest. Cloudflare describes this limiter as approximate and local to each\nlocation, meaning a Cloudflare data center, in its <a href=\"https://developers.cloudflare.com/workers/runtime-apis/bindings/rate-limit/\">Rate Limiting API\ndocumentation</a>.\nIt is useful protection, not an exact global usage counter.</p>\n\n<p>The per-IP limit controls how often a visitor can send questions. The account’s\nquota limits total AI usage. I kept the account on the Free plan without\nconfiguring a paid alternative to continue answering when its allowance runs\nout. The current allowances are listed in\n<a href=\"https://developers.cloudflare.com/workers-ai/platform/pricing/\">Cloudflare’s <strong>Workers AI</strong> pricing</a>.</p>\n\n<p>To maintain this implementation, I run these commands from the\n<span class=\"chulapa\">Chulapa</span> repository:</p>\n\n<div class=\"language-sh highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"nb\">cd </span>docs/ai-chatbot\nnpm ci\nnpm run build\nnpm <span class=\"nb\">test\n</span>npx wrangler deploy\n</code></pre></div></div>\n\n<p>These commands build, test and deploy the existing Worker. A new chatbot needs\nadditional setup. A <strong>GitHub Pages</strong> deployment publishes the documentation,\nwhile <code class=\"language-plaintext highlighter-rouge\">wrangler deploy</code> updates the assistant.\nChanges to the context reach the live model only after rebuilding and deploying\nthe Worker.</p>\n\n<p>I also added an <code class=\"language-plaintext highlighter-rouge\">AGENTS.md</code> file with repository instructions for <strong>Codex</strong> and\nother coding agents: when documentation changes, review the assistant’s context\nand relevant evaluation cases. That makes this check part of the work on the\ndocs, instead of something I have to remember afterward.</p>\n\n<h2 id=\"what-i-want-this-assistant-to-do-well\">What I want this assistant to do well</h2>\n\n<p>I want someone to ask a practical question, receive an informative answer and\nleave with a working example or a useful documentation link. There are still\nlimitations: independent questions require enough detail, combined questions can\nlose a part of the answer, and source links need continued checking.</p>\n\n<p>You can try it on the\n<a href=\"https://dieghernan.github.io/chulapa/docs\"><span class=\"chulapa\">Chulapa</span> documentation site</a>. Open the sparkle button and\nask a complete question about your setup. I would love to hear which answers\nhelped and which ones sent you back to the docs!</p>\n\n<p>The most useful part of the process was trying the assistant with questions I\nalready knew how to answer. It made the gaps easy to spot: an answer could sound\nreasonable and still leave me without the setting or example I needed. That is\nwhat I want to keep checking as the documentation grows.</p>\n\n<div class=\"alert alert-info p-3 mx-2 mb-3\" role=\"note\">\n<p><strong>AI assistance:</strong> I wrote this post with help from\n<strong>Codex</strong>, including drafting and editing the text. I reviewed it\nagainst the implementation and my experience building the chatbot. The header\nillustration was also generated with AI.</p>\n</div>\n",
      "date_published": "2026-10-09T00:00:00+02:00",
      "image": "https://dieghernan.github.io/assets/img/blog/202610-chatbot-header.webp",
      "summary": "How I built an AI assistant for my theme’s documentation, and what happened when I started asking it real questions.",
      "tags": ["jekyll","html","chulapa"],
      "authors": [{
        "name": "Diego HH",
        "url": "https://dieghernan.github.io/"
      }]
    },
    {
      "id": "https://dieghernan.github.io/202602_geobounds/",
      "url": "https://dieghernan.github.io/202602_geobounds/",
      "title": "Introducing geobounds",
      "content_html": "<p>If you’ve ever worked with spatial data in <strong>R</strong>, this may ring a bell…</p>\n\n<ul>\n  <li>Search for boundary data</li>\n  <li>Figure out which version is “official”</li>\n  <li>Download a shapefile</li>\n  <li>Unzip it</li>\n  <li>Load it</li>\n  <li>Fix projections</li>\n  <li>Repeat</li>\n</ul>\n\n<p>While searching for new data sources, I found the excellent\n<a href=\"https://www.geoboundaries.org/\">geoBoundaries</a> database. However, accessing the\ndata can be tedious since it’s provided as zipped shapefiles, and as any GIS\nprofessional knows, <a href=\"http://switchfromshapefile.org/\">shapefiles should die!</a></p>\n\n<p>Previously, the <strong>rgeoboundaries</strong> package was on CRAN and allowed access to\nthe geoBoundaries API, but it was archived. So I decided to create my own\nversion, and <strong>geobounds</strong> was born.</p>\n\n<ul>\n  <li>Source code: <a href=\"https://github.com/dieghernan/geobounds\">https://github.com/dieghernan/geobounds</a></li>\n  <li><strong>pkgdown</strong> website: <a href=\"https://dieghernan.github.io/geobounds/\">https://dieghernan.github.io/geobounds/</a></li>\n</ul>\n\n<p>It connects directly to the excellent\n<a href=\"https://www.geoboundaries.org/\">geoBoundaries</a> database and returns clean,\nready-to-use <strong>sf</strong> objects with a single function call. No manual downloads and\nno shapefile handling.</p>\n\n<p>This is how it works.</p>\n\n<h2 id=\"installation\">Installation</h2>\n\n<p><strong>geobounds</strong> was recently accepted on\n<a href=\"https://cran.r-project.org/package=geobounds\">CRAN</a>, so just install it with:</p>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"n\">install.packages</span><span class=\"p\">(</span><span class=\"s2\">\"geobounds\"</span><span class=\"p\">)</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<p>Load the package and other complementary packages:</p>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"n\">library</span><span class=\"p\">(</span><span class=\"n\">geobounds</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">library</span><span class=\"p\">(</span><span class=\"n\">sf</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">library</span><span class=\"p\">(</span><span class=\"n\">ggplot2</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">library</span><span class=\"p\">(</span><span class=\"n\">dplyr</span><span class=\"p\">)</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<h2 id=\"getting-administrative-levels-adm\">Getting administrative levels (ADM)</h2>\n\n<p>Administrative level 0 (ADM0) corresponds to countries:</p>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"c1\"># Panama</span><span class=\"w\">\n\n</span><span class=\"n\">gb_get_adm0</span><span class=\"p\">(</span><span class=\"n\">country</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"Panama\"</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">|&gt;</span><span class=\"w\">\n  </span><span class=\"n\">ggplot</span><span class=\"p\">()</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">geom_sf</span><span class=\"p\">(</span><span class=\"n\">fill</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"#072357\"</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">labs</span><span class=\"p\">(</span><span class=\"n\">caption</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"Source: www.geoboundaries.org\"</span><span class=\"p\">)</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<p><img src=\"https://dieghernan.github.io/assets/img/blog/202602-adm0-1.webp\" alt=\"Map of Panama showing its national boundary and offshore islands.\" width=\"100%\" /></p>\n\n<p>You can also retrieve multiple administrative levels at once. For example:</p>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"c1\"># Simplified files</span><span class=\"w\">\n</span><span class=\"n\">gb_get</span><span class=\"p\">(</span><span class=\"n\">country</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"Panama\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">adm_lvl</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"all\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">simplified</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">TRUE</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">|&gt;</span><span class=\"w\">\n  </span><span class=\"n\">ggplot</span><span class=\"p\">()</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">geom_sf</span><span class=\"p\">(</span><span class=\"n\">aes</span><span class=\"p\">(</span><span class=\"n\">fill</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">shapeType</span><span class=\"p\">),</span><span class=\"w\"> </span><span class=\"n\">color</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"grey50\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">linewidth</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">0.1</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">facet_wrap</span><span class=\"p\">(</span><span class=\"n\">vars</span><span class=\"p\">(</span><span class=\"n\">shapeType</span><span class=\"p\">))</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">scale_fill_viridis_d</span><span class=\"p\">()</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">labs</span><span class=\"p\">(</span><span class=\"w\">\n    </span><span class=\"n\">title</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"Administrative levels of Panama\"</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"n\">fill</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"level\"</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"n\">caption</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"Source: www.geoboundaries.org\"</span><span class=\"w\">\n  </span><span class=\"p\">)</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<p><img src=\"https://dieghernan.github.io/assets/img/blog/202602-all-levs-1.webp\" alt=\"Four maps of Panama comparing national, provincial and finer administrative boundaries at levels ADM0 through ADM3.\" width=\"100%\" /></p>\n\n<h2 id=\"global-composite-boundaries-cgaz\">Global Composite Boundaries (CGAZ)</h2>\n\n<p>When you download individual country files, each country reflects its own view\nof borders. This results in:</p>\n\n<ul>\n  <li>Overlapping boundaries</li>\n  <li>Geographic gaps</li>\n  <li>Disputed territories</li>\n</ul>\n\n<p>For clean global visualizations, geoBoundaries provides a Composite Global\nAdministrative Zones (CGAZ) dataset that can be accessed with <code class=\"language-plaintext highlighter-rouge\">gb_get_world()</code>.</p>\n\n<p>Here’s an example with country-level files:</p>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"c1\"># Using individual (gb_get_adm) shapefiles</span><span class=\"w\">\n</span><span class=\"n\">gb_get_adm0</span><span class=\"p\">(</span><span class=\"n\">country</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"s2\">\"India\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"Pakistan\"</span><span class=\"p\">))</span><span class=\"w\"> </span><span class=\"o\">|&gt;</span><span class=\"w\">\n  </span><span class=\"c1\"># Disputed area: Kashmir</span><span class=\"w\">\n  </span><span class=\"n\">ggplot</span><span class=\"p\">()</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">geom_sf</span><span class=\"p\">(</span><span class=\"n\">aes</span><span class=\"p\">(</span><span class=\"n\">fill</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">shapeName</span><span class=\"p\">),</span><span class=\"w\"> </span><span class=\"n\">alpha</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">0.5</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">scale_fill_manual</span><span class=\"p\">(</span><span class=\"n\">values</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"s2\">\"#FF671F\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"#00401A\"</span><span class=\"p\">))</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">labs</span><span class=\"p\">(</span><span class=\"w\">\n    </span><span class=\"n\">fill</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"Country\"</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"n\">title</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"Map of India &amp; Pakistan\"</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"n\">subtitle</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"Note the overlap in the Kashmir region\"</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"n\">caption</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"Source: www.geoboundaries.org\"</span><span class=\"w\">\n  </span><span class=\"p\">)</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<p><img src=\"https://dieghernan.github.io/assets/img/blog/202602-overlaps-1.webp\" alt=\"Map of India and Pakistan with translucent country fills. Overlapping boundaries in Kashmir reveal conflicting territorial claims.\" width=\"100%\" /></p>\n\n<p>And here’s the same comparison using CGAZ with <code class=\"language-plaintext highlighter-rouge\">gb_get_world()</code>:</p>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"n\">gb_get_world</span><span class=\"p\">(</span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"s2\">\"India\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"Pakistan\"</span><span class=\"p\">))</span><span class=\"w\"> </span><span class=\"o\">|&gt;</span><span class=\"w\">\n  </span><span class=\"n\">ggplot</span><span class=\"p\">()</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">geom_sf</span><span class=\"p\">(</span><span class=\"n\">aes</span><span class=\"p\">(</span><span class=\"n\">fill</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">shapeName</span><span class=\"p\">),</span><span class=\"w\"> </span><span class=\"n\">alpha</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">0.5</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">scale_fill_manual</span><span class=\"p\">(</span><span class=\"n\">values</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"s2\">\"#FF671F\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"#00401A\"</span><span class=\"p\">))</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">labs</span><span class=\"p\">(</span><span class=\"w\">\n    </span><span class=\"n\">fill</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"Country\"</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"n\">title</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"Map of India &amp; Pakistan\"</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"n\">subtitle</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"CGAZ does not overlap\"</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"n\">caption</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"Source: www.geoboundaries.org\"</span><span class=\"w\">\n  </span><span class=\"p\">)</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<p><img src=\"https://dieghernan.github.io/assets/img/blog/202602-cgaz-1.webp\" alt=\"Map of India and Pakistan using harmonized boundaries. The country polygons meet without overlapping in Kashmir.\" width=\"100%\" /></p>\n\n<h2 id=\"understanding-the-data\">Understanding the data</h2>\n\n<p>The geoBoundaries database undergoes rigorous quality assurance, including\nmanual review and hand-digitization of physical maps. This ensures the highest\nlevel of spatial accuracy for scientific and academic research.</p>\n\n<p>This precision comes at a cost: some files can be large and take longer to\ndownload. For visualization and general mapping, we recommend using simplified\ndatasets by setting <code class=\"language-plaintext highlighter-rouge\">simplified = TRUE</code>.</p>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"c1\"># Different resolutions</span><span class=\"w\">\n</span><span class=\"n\">norway</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">gb_get_adm0</span><span class=\"p\">(</span><span class=\"s2\">\"NOR\"</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">|&gt;</span><span class=\"w\">\n  </span><span class=\"n\">mutate</span><span class=\"p\">(</span><span class=\"n\">res</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"Full resolution\"</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">print</span><span class=\"p\">(</span><span class=\"n\">object.size</span><span class=\"p\">(</span><span class=\"n\">norway</span><span class=\"p\">),</span><span class=\"w\"> </span><span class=\"n\">units</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"Mb\"</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"c1\">#&gt; 26.5 Mb</span><span class=\"w\">\n\n</span><span class=\"n\">norway_simp</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">gb_get_adm0</span><span class=\"p\">(</span><span class=\"n\">country</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"NOR\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">simplified</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">TRUE</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">|&gt;</span><span class=\"w\">\n  </span><span class=\"n\">mutate</span><span class=\"p\">(</span><span class=\"n\">res</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"Simplified\"</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">print</span><span class=\"p\">(</span><span class=\"n\">object.size</span><span class=\"p\">(</span><span class=\"n\">norway_simp</span><span class=\"p\">),</span><span class=\"w\"> </span><span class=\"n\">units</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"Mb\"</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"c1\">#&gt; 1.5 Mb</span><span class=\"w\">\n\n</span><span class=\"n\">norway_all</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">bind_rows</span><span class=\"p\">(</span><span class=\"n\">norway</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">norway_simp</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"c1\"># Plot with ggplot2</span><span class=\"w\">\n</span><span class=\"n\">ggplot</span><span class=\"p\">(</span><span class=\"n\">norway_all</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">geom_sf</span><span class=\"p\">(</span><span class=\"n\">fill</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"#BA0C2F\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">color</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"#00205B\"</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">facet_wrap</span><span class=\"p\">(</span><span class=\"n\">vars</span><span class=\"p\">(</span><span class=\"n\">res</span><span class=\"p\">))</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">theme_minimal</span><span class=\"p\">()</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">labs</span><span class=\"p\">(</span><span class=\"n\">caption</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"Source: www.geoboundaries.org\"</span><span class=\"p\">)</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<p><img src=\"https://dieghernan.github.io/assets/img/blog/202602-simpl-1.webp\" alt=\"Two maps of Norway comparing full-resolution and simplified national boundaries. Simplification retains the broad outline while reducing coastline detail.\" width=\"100%\" /></p>\n\n<h2 id=\"caching\">Caching</h2>\n\n<p>Downloaded files are cached locally. That means:</p>\n\n<ul>\n  <li>You download once</li>\n  <li>Re-running your script is fast</li>\n  <li>Your workflow stays reproducible</li>\n</ul>\n\n<p>You can set the cache directory with:</p>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"n\">gb_set_cache_dir</span><span class=\"p\">(</span><span class=\"s2\">\"a/path/to/a/folder\"</span><span class=\"p\">)</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<h2 id=\"when-should-you-use-geobounds\">When should you use <strong>geobounds</strong>?</h2>\n\n<p>Use <strong>geobounds</strong> when:</p>\n\n<ul>\n  <li>You need reliable global administrative boundaries</li>\n  <li>You want reproducible workflows</li>\n  <li>You prefer code over manual downloads</li>\n  <li>You’re building maps, dashboards or spatial analyses</li>\n</ul>\n\n<h2 id=\"related-packages\">Related packages</h2>\n\n<p><strong>geobounds</strong> is not alone in this space. Depending on your needs, you might\nalso want to look at:</p>\n\n<h3 id=\"rnaturalearth\"><strong>rnaturalearth</strong></h3>\n\n<p>A very popular package to access Natural Earth datasets directly from <strong>R</strong>. It’s\nlightweight and great for quick global maps, especially at small scales.</p>\n\n<p>If you need physical layers (rivers, coastlines, elevation) alongside political\nboundaries, this is often a good choice.</p>\n\n<h3 id=\"giscor\"><strong>giscoR</strong></h3>\n\n<p>If your focus is Europe, <strong>giscoR</strong> provides direct access to Eurostat GISCO\ndata. It’s particularly useful for NUTS regions and European statistical\nboundaries.</p>\n\n<h3 id=\"osmdata\"><strong>osmdata</strong></h3>\n\n<p>When administrative boundaries are not enough and you need OpenStreetMap\nfeatures (roads, POIs, land use, etc.), <strong>osmdata</strong> gives you powerful querying\ncapabilities.</p>\n\n<h2 id=\"bottom-line\">Bottom line</h2>\n\n<p>I built <strong>geobounds</strong> to provide direct access to geoBoundaries products. I hope\nthis package will help you in your GIS journey.</p>\n\n<p>Happy mapping!</p>\n",
      "date_published": "2026-02-12T00:00:00+01:00",
      "image": "https://dieghernan.github.io/assets/img/blog/202602-overlaps-1.webp",
      "summary": "Retrieve administrative boundaries as ready-to-use sf objects in R with geobounds.",
      "tags": ["r_bloggers","rstats","rspatial","maps","ggplot2","sf","geobounds","r_package","dataset"],
      "authors": [{
        "name": "Diego HH",
        "url": "https://dieghernan.github.io/"
      }]
    },
    {
      "id": "https://dieghernan.github.io/202510_mapping-antarctica/",
      "url": "https://dieghernan.github.io/202510_mapping-antarctica/",
      "title": "Mapping Antarctica",
      "content_html": "<p>Creating maps with <strong>R</strong> is usually straightforward, but representations that\ncross the <a href=\"https://en.wikipedia.org/wiki/International_Date_Line\">International Date\nLine</a> or that use polar\nprojections can be tricky.</p>\n\n<p>Different spatial-data providers use different conventions: some break\ngeometries at certain longitudes (for example, cutting the Chukchi Peninsula),\nwhile others omit portions of the data. These inconsistencies can produce\nawkward artifacts near the poles.</p>\n\n<p>In this post I fix the <a href=\"https://ec.europa.eu/eurostat/web/gisco\">GISCO (European\nCommission)</a> shapefile for Antarctica\nand produce clean orthographic maps. I walk through the manual corrections and\nthen create a few example maps.</p>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"c1\"># Libraries</span><span class=\"w\">\n</span><span class=\"n\">library</span><span class=\"p\">(</span><span class=\"n\">tidyverse</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">library</span><span class=\"p\">(</span><span class=\"n\">sf</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">library</span><span class=\"p\">(</span><span class=\"n\">giscoR</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">library</span><span class=\"p\">(</span><span class=\"n\">ggrepel</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">library</span><span class=\"p\">(</span><span class=\"n\">rmapshaper</span><span class=\"p\">)</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<h2 id=\"fixing-the-geometry\">Fixing the geometry</h2>\n\n<p>First, we obtain the GISCO Antarctica polygon and transform it to an\northographic projection centered on the South Pole.</p>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"n\">antarct</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">gisco_get_countries</span><span class=\"p\">(</span><span class=\"n\">year</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">2024</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">resolution</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">1</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">country</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"ATA\"</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">%&gt;%</span><span class=\"w\">\n  </span><span class=\"n\">select</span><span class=\"p\">(</span><span class=\"n\">NAME</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">NAME_ENGL</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">|&gt;</span><span class=\"w\">\n  </span><span class=\"c1\"># Orthographic projection centered on the South Pole</span><span class=\"w\">\n  </span><span class=\"n\">st_transform</span><span class=\"p\">(</span><span class=\"n\">crs</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"+proj=ortho +lat_0=-90 +lon_0=0\"</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"n\">ggplot</span><span class=\"p\">(</span><span class=\"n\">antarct</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">geom_sf</span><span class=\"p\">(</span><span class=\"n\">fill</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"lightblue\"</span><span class=\"p\">)</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<p><img src=\"https://dieghernan.github.io/assets/img/blog/202510_init-1.webp\" alt=\"South Pole-centered map of Antarctica with a narrow lollipop-shaped gap extending from the coast toward the pole, caused by a polygon artifact.\" width=\"100%\" /></p>\n\n<p>The shapefile contains a visible “lollipop” cut that looks unnatural in an\northographic projection. I correct it manually with these steps:</p>\n\n<ol>\n  <li>Identify the polygon that represents the main Antarctic landmass.</li>\n  <li>Convert that polygon to a sequence of coordinates (points).</li>\n  <li>Remove the small sequence of points that create the artifact.</li>\n  <li>Rebuild the polygon from the cleaned coordinates and replace the broken\ngeometry with the corrected one.</li>\n</ol>\n\n<p>We convert polygons to point coordinates and inspect them to find the offending\nsequence:</p>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"c1\"># Identify the largest polygon</span><span class=\"w\">\n</span><span class=\"n\">ant_explode</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">antarct</span><span class=\"w\"> </span><span class=\"o\">|&gt;</span><span class=\"w\">\n  </span><span class=\"n\">st_cast</span><span class=\"p\">(</span><span class=\"s2\">\"POLYGON\"</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"n\">nrow</span><span class=\"p\">(</span><span class=\"n\">ant_explode</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"c1\">#&gt; [1] 778</span><span class=\"w\">\n\n</span><span class=\"c1\"># Largest polygon</span><span class=\"w\">\n\n</span><span class=\"n\">ant_max</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">ant_explode</span><span class=\"p\">[</span><span class=\"n\">which.max</span><span class=\"p\">(</span><span class=\"n\">st_area</span><span class=\"p\">(</span><span class=\"n\">ant_explode</span><span class=\"p\">)),</span><span class=\"w\"> </span><span class=\"p\">]</span><span class=\"w\">\n\n</span><span class=\"n\">coords</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">st_coordinates</span><span class=\"p\">(</span><span class=\"n\">ant_max</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">|&gt;</span><span class=\"w\">\n  </span><span class=\"n\">as_tibble</span><span class=\"p\">()</span><span class=\"w\"> </span><span class=\"o\">|&gt;</span><span class=\"w\">\n  </span><span class=\"c1\"># Add an ID for the points</span><span class=\"w\">\n  </span><span class=\"n\">mutate</span><span class=\"p\">(</span><span class=\"n\">np</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">row_number</span><span class=\"p\">())</span><span class=\"w\">\n\n\n</span><span class=\"n\">ggplot</span><span class=\"p\">(</span><span class=\"n\">coords</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">aes</span><span class=\"p\">(</span><span class=\"n\">X</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">Y</span><span class=\"p\">))</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">geom_point</span><span class=\"p\">(</span><span class=\"n\">size</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">0.05</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">color</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"darkblue\"</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">geom_text</span><span class=\"p\">(</span><span class=\"n\">aes</span><span class=\"p\">(</span><span class=\"n\">label</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">np</span><span class=\"p\">),</span><span class=\"w\"> </span><span class=\"n\">check_overlap</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">TRUE</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">coord_equal</span><span class=\"p\">()</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<p><img src=\"https://dieghernan.github.io/assets/img/blog/202510_init_ant-1.webp\" alt=\"Coordinate plot of the Antarctic coastline with numbered vertices. A line and loop extending into the interior identify the polygon artifact.\" width=\"100%\" /></p>\n\n<p>From the plotted indices, we can see the problematic points fall roughly in the\nrange 8200–9200. We inspect that interval in detail to select the exact indices\nto remove.</p>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"n\">test</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">coords</span><span class=\"w\"> </span><span class=\"o\">|&gt;</span><span class=\"w\">\n  </span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">np</span><span class=\"w\"> </span><span class=\"o\">%in%</span><span class=\"w\"> </span><span class=\"n\">seq</span><span class=\"p\">(</span><span class=\"m\">8200</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">9200</span><span class=\"p\">))</span><span class=\"w\">\n\n</span><span class=\"n\">test</span><span class=\"w\"> </span><span class=\"o\">|&gt;</span><span class=\"w\">\n  </span><span class=\"n\">ggplot</span><span class=\"p\">(</span><span class=\"n\">aes</span><span class=\"p\">(</span><span class=\"n\">X</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">Y</span><span class=\"p\">))</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">geom_point</span><span class=\"p\">(</span><span class=\"n\">size</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">0.05</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">color</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"darkblue\"</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">geom_text</span><span class=\"p\">(</span><span class=\"n\">aes</span><span class=\"p\">(</span><span class=\"n\">label</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">np</span><span class=\"p\">),</span><span class=\"w\"> </span><span class=\"n\">check_overlap</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">TRUE</span><span class=\"p\">)</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<p><img src=\"https://dieghernan.github.io/assets/img/blog/202510_test_points-1.webp\" alt=\"Close-up coordinate plot of Antarctic vertices 8200 through 9200. The points form a loop and stem corresponding to the lollipop artifact.\" width=\"100%\" /></p>\n\n<div class=\"alert alert-warning p-3 mx-2 mb-3\">\n\nNote: This cleaning is tailored to this specific shapefile and may need to be\nrepeated for other shapefiles. The approach is straightforward but depends on\nthe particular geometry and projection.\n\n</div>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"c1\"># Final solution after some iterations...</span><span class=\"w\">\n\n</span><span class=\"n\">test</span><span class=\"w\"> </span><span class=\"o\">|&gt;</span><span class=\"w\">\n  </span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">np</span><span class=\"w\"> </span><span class=\"o\">%in%</span><span class=\"w\"> </span><span class=\"n\">seq</span><span class=\"p\">(</span><span class=\"m\">8289</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">9130</span><span class=\"p\">))</span><span class=\"w\"> </span><span class=\"o\">|&gt;</span><span class=\"w\">\n  </span><span class=\"n\">ggplot</span><span class=\"p\">(</span><span class=\"n\">aes</span><span class=\"p\">(</span><span class=\"n\">X</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">Y</span><span class=\"p\">))</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">geom_point</span><span class=\"p\">(</span><span class=\"n\">color</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"darkblue\"</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">labs</span><span class=\"p\">(</span><span class=\"n\">title</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"To remove\"</span><span class=\"p\">)</span><span class=\"w\">\n\n\n</span><span class=\"n\">test</span><span class=\"w\"> </span><span class=\"o\">|&gt;</span><span class=\"w\">\n  </span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"o\">!</span><span class=\"n\">np</span><span class=\"w\"> </span><span class=\"o\">%in%</span><span class=\"w\"> </span><span class=\"n\">seq</span><span class=\"p\">(</span><span class=\"m\">8289</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">9130</span><span class=\"p\">))</span><span class=\"w\"> </span><span class=\"o\">|&gt;</span><span class=\"w\">\n  </span><span class=\"n\">ggplot</span><span class=\"p\">(</span><span class=\"n\">aes</span><span class=\"p\">(</span><span class=\"n\">X</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">Y</span><span class=\"p\">))</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">geom_point</span><span class=\"p\">(</span><span class=\"n\">color</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"darkblue\"</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">labs</span><span class=\"p\">(</span><span class=\"n\">title</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"To keep\"</span><span class=\"p\">)</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<div class=\"figure row no-gutters\">\n<img src=\"https://dieghernan.github.io/assets/img/blog/202510_final_sol-1.webp\" alt=\"Coordinate plot of vertices 8289 through 9130 selected for removal. They form the unwanted loop and stem.\" width=\"50%\" /><img src=\"https://dieghernan.github.io/assets/img/blog/202510_final_sol-2.webp\" alt=\"Coordinate plot of the vertices retained from the inspected interval. They trace a section of the Antarctic coastline.\" width=\"50%\" />\n\nAfter removing the offending points, we rebuild the polygon and reconstitute the\nfull Antarctica shape from the corrected piece plus the remaining polygons.\n\n</div>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"c1\"># From coordinates to polygon</span><span class=\"w\">\n</span><span class=\"n\">newpol</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">coords</span><span class=\"w\"> </span><span class=\"o\">|&gt;</span><span class=\"w\">\n  </span><span class=\"n\">as.data.frame</span><span class=\"p\">()</span><span class=\"w\"> </span><span class=\"o\">|&gt;</span><span class=\"w\">\n  </span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"o\">!</span><span class=\"n\">np</span><span class=\"w\"> </span><span class=\"o\">%in%</span><span class=\"w\"> </span><span class=\"n\">seq</span><span class=\"p\">(</span><span class=\"m\">8289</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">9130</span><span class=\"p\">))</span><span class=\"w\"> </span><span class=\"o\">|&gt;</span><span class=\"w\"> </span><span class=\"c1\"># Removing offending points</span><span class=\"w\">\n  </span><span class=\"n\">select</span><span class=\"p\">(</span><span class=\"n\">X</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">Y</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">|&gt;</span><span class=\"w\">\n  </span><span class=\"n\">as.matrix</span><span class=\"p\">()</span><span class=\"w\"> </span><span class=\"o\">|&gt;</span><span class=\"w\">\n  </span><span class=\"nf\">list</span><span class=\"p\">()</span><span class=\"w\"> </span><span class=\"o\">|&gt;</span><span class=\"w\">\n  </span><span class=\"n\">st_polygon</span><span class=\"p\">()</span><span class=\"w\"> </span><span class=\"o\">|&gt;</span><span class=\"w\">\n  </span><span class=\"n\">st_sfc</span><span class=\"p\">()</span><span class=\"w\"> </span><span class=\"o\">|&gt;</span><span class=\"w\">\n  </span><span class=\"n\">st_set_crs</span><span class=\"p\">(</span><span class=\"n\">st_crs</span><span class=\"p\">(</span><span class=\"n\">ant_max</span><span class=\"p\">))</span><span class=\"w\">\n\n</span><span class=\"n\">ant_max_fixed</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">st_sf</span><span class=\"p\">(</span><span class=\"n\">st_drop_geometry</span><span class=\"p\">(</span><span class=\"n\">ant_max</span><span class=\"p\">),</span><span class=\"w\"> </span><span class=\"n\">geometry</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">newpol</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"c1\"># Regenerate initial shape</span><span class=\"w\">\n</span><span class=\"n\">antarctica_fixed</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">bind_rows</span><span class=\"p\">(</span><span class=\"w\">\n  </span><span class=\"n\">ant_max_fixed</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">ant_explode</span><span class=\"p\">[</span><span class=\"o\">-</span><span class=\"n\">which.max</span><span class=\"p\">(</span><span class=\"n\">st_area</span><span class=\"p\">(</span><span class=\"n\">ant_explode</span><span class=\"p\">)),</span><span class=\"w\"> </span><span class=\"p\">]</span><span class=\"w\">\n</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">|&gt;</span><span class=\"w\">\n  </span><span class=\"n\">group_by</span><span class=\"p\">(</span><span class=\"n\">NAME</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">|&gt;</span><span class=\"w\">\n  </span><span class=\"n\">summarise</span><span class=\"p\">(</span><span class=\"n\">m</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">1</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">|&gt;</span><span class=\"w\">\n  </span><span class=\"n\">select</span><span class=\"p\">(</span><span class=\"o\">-</span><span class=\"n\">m</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">|&gt;</span><span class=\"w\">\n  </span><span class=\"n\">st_make_valid</span><span class=\"p\">()</span><span class=\"w\">\n\n</span><span class=\"n\">antarctica_fixed</span><span class=\"w\">\n</span><span class=\"c1\">#&gt; Simple feature collection with 1 feature and 1 field</span><span class=\"w\">\n</span><span class=\"c1\">#&gt; Geometry type: MULTIPOLYGON</span><span class=\"w\">\n</span><span class=\"c1\">#&gt; Dimension:     XY</span><span class=\"w\">\n</span><span class=\"c1\">#&gt; Bounding box:  xmin: -2583099 ymin: -2458296 xmax: 2690846 ymax: 2233395</span><span class=\"w\">\n</span><span class=\"c1\">#&gt; Projected CRS: +proj=ortho +lat_0=-90 +lon_0=0</span><span class=\"w\">\n</span><span class=\"c1\">#&gt; # A tibble: 1 × 2</span><span class=\"w\">\n</span><span class=\"c1\">#&gt;   NAME                                                                     geometry</span><span class=\"w\">\n</span><span class=\"c1\">#&gt; * &lt;chr&gt;                                                          &lt;MULTIPOLYGON [m]&gt;</span><span class=\"w\">\n</span><span class=\"c1\">#&gt; 1 Antarctica (((-2456385 1179033, -2456141 1178965, -2456464 1178341, -2456563 117…</span><span class=\"w\">\n\n</span><span class=\"n\">ggplot</span><span class=\"p\">(</span><span class=\"n\">antarctica_fixed</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">geom_sf</span><span class=\"p\">(</span><span class=\"n\">fill</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"lightblue\"</span><span class=\"p\">)</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<p><img src=\"https://dieghernan.github.io/assets/img/blog/202510_good_pol-1.webp\" alt=\"South Pole-centered map of Antarctica after removing the polygon artifact. The landmass is continuous across the previously affected area.\" width=\"100%\" /></p>\n\n<h2 id=\"plotting-examples\">Plotting examples</h2>\n\n<p>With the corrected shape we can produce maps. Below are a few examples based on\nproposed Antarctic flag designs.</p>\n\n<h3 id=\"graham-bartrams-proposal-1996\">Graham Bartram’s proposal (1996)</h3>\n\n<p>A simple rendition of Bartram’s original concept:</p>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"n\">bbox</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">st_bbox</span><span class=\"p\">(</span><span class=\"n\">antarctica_fixed</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"c1\"># For limits on the panel</span><span class=\"w\">\n\n</span><span class=\"n\">antarctica_fixed</span><span class=\"w\"> </span><span class=\"o\">|&gt;</span><span class=\"w\">\n  </span><span class=\"n\">ggplot</span><span class=\"p\">()</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">geom_sf</span><span class=\"p\">(</span><span class=\"n\">fill</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"white\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">color</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">NA</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">theme</span><span class=\"p\">(</span><span class=\"w\">\n    </span><span class=\"n\">panel.background</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">element_rect</span><span class=\"p\">(</span><span class=\"n\">fill</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"#009fdc\"</span><span class=\"p\">),</span><span class=\"w\">\n    </span><span class=\"n\">panel.grid</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">element_blank</span><span class=\"p\">(),</span><span class=\"w\">\n    </span><span class=\"n\">axis.text</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">element_blank</span><span class=\"p\">(),</span><span class=\"w\">\n    </span><span class=\"n\">axis.ticks</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">element_blank</span><span class=\"p\">()</span><span class=\"w\">\n  </span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">labs</span><span class=\"p\">(</span><span class=\"n\">title</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"Graham Bartram's proposal\"</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">coord_sf</span><span class=\"p\">(</span><span class=\"w\">\n    </span><span class=\"n\">xlim</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"n\">bbox</span><span class=\"p\">[</span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"m\">1</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">3</span><span class=\"p\">)])</span><span class=\"w\"> </span><span class=\"o\">*</span><span class=\"w\"> </span><span class=\"m\">1.8</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"n\">ylim</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"n\">bbox</span><span class=\"p\">[</span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"m\">2</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">4</span><span class=\"p\">)])</span><span class=\"w\"> </span><span class=\"o\">*</span><span class=\"w\"> </span><span class=\"m\">1.4</span><span class=\"w\">\n  </span><span class=\"p\">)</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<p><img src=\"https://dieghernan.github.io/assets/img/blog/202510_bartram-1.webp\" alt=\"Antarctic flag design with a white silhouette of the continent on a blue background.\" width=\"100%\" /></p>\n\n<h3 id=\"emblem-of-the-antarctic-treaty\">Emblem of the Antarctic Treaty</h3>\n\n<p>This example uses graticules to create a concentric “bullseye” pattern around\nAntarctica. Generating such graticules and merging meridians requires a few\nextra steps to avoid small gaps near the pole.</p>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"c1\"># Need graticules</span><span class=\"w\">\n</span><span class=\"n\">grats</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">giscoR</span><span class=\"o\">::</span><span class=\"n\">gisco_get_countries</span><span class=\"p\">()</span><span class=\"w\"> </span><span class=\"o\">|&gt;</span><span class=\"w\">\n  </span><span class=\"n\">st_transform</span><span class=\"p\">(</span><span class=\"n\">st_crs</span><span class=\"p\">(</span><span class=\"n\">antarctica_fixed</span><span class=\"p\">))</span><span class=\"w\"> </span><span class=\"o\">|&gt;</span><span class=\"w\">\n  </span><span class=\"c1\"># Specify the cuts of the graticules</span><span class=\"w\">\n  </span><span class=\"n\">st_graticule</span><span class=\"p\">(</span><span class=\"w\">\n    </span><span class=\"n\">lat</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"m\">-80</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">-70</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">-60</span><span class=\"p\">),</span><span class=\"w\">\n    </span><span class=\"n\">lon</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">seq</span><span class=\"p\">(</span><span class=\"m\">-180</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">180</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">30</span><span class=\"p\">),</span><span class=\"w\">\n    </span><span class=\"n\">ndiscr</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">10000</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"n\">margin</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">0.000001</span><span class=\"w\">\n  </span><span class=\"p\">)</span><span class=\"w\">\n\n\n</span><span class=\"n\">ggplot</span><span class=\"p\">(</span><span class=\"n\">grats</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">geom_sf</span><span class=\"p\">(</span><span class=\"n\">color</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"darkblue\"</span><span class=\"p\">)</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<p><img src=\"https://dieghernan.github.io/assets/img/blog/202510_treaty1-1.webp\" alt=\"Polar coordinate grid centered on the South Pole, with concentric latitude circles and radial longitude lines.\" width=\"100%\" /></p>\n\n<p>We merge meridians so the area around the South Pole is filled. <code class=\"language-plaintext highlighter-rouge\">st_graticule()</code>\ncan leave a tiny hole at the pole, and we fix this by joining complementary\nmeridians.</p>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"c1\"># Merge meridians</span><span class=\"w\">\n</span><span class=\"n\">merid</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">lapply</span><span class=\"p\">(</span><span class=\"n\">seq</span><span class=\"p\">(</span><span class=\"m\">-180</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">0</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">30</span><span class=\"p\">),</span><span class=\"w\"> </span><span class=\"k\">function</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"p\">{</span><span class=\"w\">\n  </span><span class=\"n\">df</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">grats</span><span class=\"w\"> </span><span class=\"o\">|&gt;</span><span class=\"w\">\n    </span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">type</span><span class=\"w\"> </span><span class=\"o\">==</span><span class=\"w\"> </span><span class=\"s2\">\"E\"</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">|&gt;</span><span class=\"w\">\n    </span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">degree</span><span class=\"w\"> </span><span class=\"o\">%in%</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">x</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"m\">180</span><span class=\"p\">))</span><span class=\"w\">\n\n  </span><span class=\"n\">df2</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">df</span><span class=\"w\"> </span><span class=\"o\">|&gt;</span><span class=\"w\">\n    </span><span class=\"n\">st_geometry</span><span class=\"p\">()</span><span class=\"w\"> </span><span class=\"o\">|&gt;</span><span class=\"w\">\n    </span><span class=\"n\">st_cast</span><span class=\"p\">(</span><span class=\"s2\">\"MULTIPOINT\"</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">|&gt;</span><span class=\"w\">\n    </span><span class=\"n\">st_union</span><span class=\"p\">()</span><span class=\"w\"> </span><span class=\"o\">|&gt;</span><span class=\"w\">\n    </span><span class=\"n\">st_cast</span><span class=\"p\">(</span><span class=\"s2\">\"LINESTRING\"</span><span class=\"p\">)</span><span class=\"w\">\n\n  </span><span class=\"n\">sf_x</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">st_sf</span><span class=\"p\">(</span><span class=\"w\">\n    </span><span class=\"n\">degree</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">x</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"n\">type</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"E\"</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"n\">geometry</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">df2</span><span class=\"w\">\n  </span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"p\">})</span><span class=\"w\"> </span><span class=\"o\">|&gt;</span><span class=\"w\"> </span><span class=\"n\">bind_rows</span><span class=\"p\">()</span><span class=\"w\">\n\n\n</span><span class=\"n\">grats_end</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">merid</span><span class=\"w\"> </span><span class=\"o\">|&gt;</span><span class=\"w\">\n  </span><span class=\"n\">bind_rows</span><span class=\"p\">(</span><span class=\"n\">grats</span><span class=\"w\"> </span><span class=\"o\">|&gt;</span><span class=\"w\">\n    </span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">type</span><span class=\"w\"> </span><span class=\"o\">!=</span><span class=\"w\"> </span><span class=\"s2\">\"E\"</span><span class=\"p\">))</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<p>We then cut and color the resulting graticules so they form the emblem-like\npattern.</p>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"c1\"># Cut since some grats should be colored differently</span><span class=\"w\">\n\n</span><span class=\"n\">antarctica_simp</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">rmapshaper</span><span class=\"o\">::</span><span class=\"n\">ms_simplify</span><span class=\"p\">(</span><span class=\"n\">antarctica_fixed</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">keep</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">0.005</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">grats_yes</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">st_intersection</span><span class=\"p\">(</span><span class=\"n\">grats_end</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">antarctica_simp</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">grats_no</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">st_difference</span><span class=\"p\">(</span><span class=\"n\">grats_end</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">antarctica_simp</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"n\">antarctica_simp</span><span class=\"w\"> </span><span class=\"o\">|&gt;</span><span class=\"w\">\n  </span><span class=\"n\">ggplot</span><span class=\"p\">()</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">geom_sf</span><span class=\"p\">(</span><span class=\"n\">fill</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"white\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">color</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">NA</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">theme</span><span class=\"p\">(</span><span class=\"w\">\n    </span><span class=\"n\">panel.background</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">element_rect</span><span class=\"p\">(</span><span class=\"n\">fill</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"#072b5f\"</span><span class=\"p\">),</span><span class=\"w\">\n    </span><span class=\"n\">panel.grid</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">element_blank</span><span class=\"p\">(),</span><span class=\"w\">\n    </span><span class=\"n\">axis.text</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">element_blank</span><span class=\"p\">(),</span><span class=\"w\">\n    </span><span class=\"n\">axis.ticks</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">element_blank</span><span class=\"p\">()</span><span class=\"w\">\n  </span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">geom_sf</span><span class=\"p\">(</span><span class=\"n\">data</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">grats_yes</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">color</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"#072b5f\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">linewidth</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">1</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">geom_sf</span><span class=\"p\">(</span><span class=\"n\">data</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">grats_no</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">color</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"white\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">linewidth</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">1</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">coord_sf</span><span class=\"p\">(</span><span class=\"w\">\n    </span><span class=\"n\">xlim</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"n\">bbox</span><span class=\"p\">[</span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"m\">1</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">3</span><span class=\"p\">)])</span><span class=\"w\"> </span><span class=\"o\">*</span><span class=\"w\"> </span><span class=\"m\">1.8</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"n\">ylim</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"n\">bbox</span><span class=\"p\">[</span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"m\">2</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">4</span><span class=\"p\">)])</span><span class=\"w\"> </span><span class=\"o\">*</span><span class=\"w\"> </span><span class=\"m\">1.4</span><span class=\"w\">\n  </span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">labs</span><span class=\"p\">(</span><span class=\"n\">title</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"Emblem of the Antarctic Treaty\"</span><span class=\"p\">)</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<p><img src=\"https://dieghernan.github.io/assets/img/blog/202510_treaty2-1.webp\" alt=\"Antarctic Treaty emblem with a white Antarctic silhouette and polar coordinate grid on a dark blue background.\" width=\"100%\" /></p>\n\n<h3 id=\"antarctica-flag-redesigned\">Antarctica flag redesigned</h3>\n\n<p>In 2024, Graham Bartram revealed a new version of his original flag as part of\na global campaign to raise awareness about the growing problem of microplastic\npollution. The new design keeps the familiar white outline of Antarctica but\nswaps the plain blue background for one filled with countless tiny, colorful\ndots. These dots represent the microscopic bits of plastic that have been\ndiscovered even in the planet’s most untouched places, including the Antarctic\nice and its surrounding oceans.</p>\n\n<p><img src=\"https://upload.wikimedia.org/wikipedia/commons/thumb/4/48/Antarctica_Flag_Redesigned_by_Graham_Bartram.png/960px-Antarctica_Flag_Redesigned_by_Graham_Bartram.png\" alt=\"Antarctic flag variation with the white continental silhouette formed by scattered marks on a blue background.\" /></p>\n\n<p>Because the design relies on randomness, we approximate it using the following\nprocedure:</p>\n\n<ol>\n  <li>Sample random points across the Antarctic polygon.</li>\n  <li>Build Voronoi polygons from those points, then apply a small negative buffer\nto create gaps.</li>\n  <li>Randomly sample the resulting polygons to increase visual noise.</li>\n  <li>Color polygons so larger areas remain white while smaller polygons use\nmagenta/pink tones.</li>\n</ol>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"c1\"># Maximum chunk of Antarctica, the one that we fixed</span><span class=\"w\">\n\n</span><span class=\"n\">ant_max_fixed</span><span class=\"w\">\n</span><span class=\"c1\">#&gt; Simple feature collection with 1 feature and 1 field</span><span class=\"w\">\n</span><span class=\"c1\">#&gt; Geometry type: POLYGON</span><span class=\"w\">\n</span><span class=\"c1\">#&gt; Dimension:     XY</span><span class=\"w\">\n</span><span class=\"c1\">#&gt; Bounding box:  xmin: -2447764 ymin: -2125910 xmax: 2690846 ymax: 2233395</span><span class=\"w\">\n</span><span class=\"c1\">#&gt; Projected CRS: +proj=ortho +lat_0=-90 +lon_0=0</span><span class=\"w\">\n</span><span class=\"c1\">#&gt;         NAME                       geometry</span><span class=\"w\">\n</span><span class=\"c1\">#&gt; 1 Antarctica POLYGON ((-2423737 1557908,...</span><span class=\"w\">\n\n</span><span class=\"n\">set.seed</span><span class=\"p\">(</span><span class=\"m\">2024</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"c1\"># Sample, Voronoi and negative buffer</span><span class=\"w\">\n</span><span class=\"n\">plastics</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">st_sample</span><span class=\"p\">(</span><span class=\"n\">ant_max_fixed</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">3000</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">|&gt;</span><span class=\"w\">\n  </span><span class=\"n\">st_union</span><span class=\"p\">()</span><span class=\"w\"> </span><span class=\"o\">|&gt;</span><span class=\"w\">\n  </span><span class=\"n\">st_voronoi</span><span class=\"p\">(</span><span class=\"n\">envelope</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">st_geometry</span><span class=\"p\">(</span><span class=\"n\">ant_max_fixed</span><span class=\"p\">))</span><span class=\"w\"> </span><span class=\"o\">|&gt;</span><span class=\"w\">\n  </span><span class=\"n\">st_collection_extract</span><span class=\"p\">()</span><span class=\"w\"> </span><span class=\"o\">|&gt;</span><span class=\"w\">\n  </span><span class=\"n\">st_buffer</span><span class=\"p\">(</span><span class=\"n\">dist</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">-10000</span><span class=\"p\">)</span><span class=\"w\">\n\n\n</span><span class=\"c1\"># Keep only those properly included in the outline</span><span class=\"w\">\n\n</span><span class=\"n\">toinc</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">st_contains_properly</span><span class=\"p\">(</span><span class=\"n\">ant_max_fixed</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">plastics</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">sparse</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">FALSE</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">|&gt;</span><span class=\"w\">\n  </span><span class=\"n\">as.vector</span><span class=\"p\">()</span><span class=\"w\">\n\n</span><span class=\"c1\"># Select random chunks</span><span class=\"w\">\n</span><span class=\"n\">plastic_end</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">plastics</span><span class=\"p\">[</span><span class=\"n\">toinc</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"p\">]</span><span class=\"w\"> </span><span class=\"o\">|&gt;</span><span class=\"w\">\n  </span><span class=\"n\">st_as_sf</span><span class=\"p\">()</span><span class=\"w\"> </span><span class=\"o\">|&gt;</span><span class=\"w\">\n  </span><span class=\"n\">slice_sample</span><span class=\"p\">(</span><span class=\"n\">prop</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">0.75</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"n\">ggplot</span><span class=\"p\">(</span><span class=\"n\">plastic_end</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">geom_sf</span><span class=\"p\">(</span><span class=\"n\">fill</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"darkblue\"</span><span class=\"p\">)</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<p><img src=\"https://dieghernan.github.io/assets/img/blog/202510_redesign-1.webp\" alt=\"Map of Antarctica filled with randomly distributed blue points inside the continent boundary.\" width=\"100%\" /></p>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"w\">\n\n</span><span class=\"c1\"># Random coloring</span><span class=\"w\">\n\n</span><span class=\"n\">plastic_end</span><span class=\"o\">$</span><span class=\"n\">area</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">st_area</span><span class=\"p\">(</span><span class=\"n\">plastic_end</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">|&gt;</span><span class=\"w\"> </span><span class=\"nf\">as.double</span><span class=\"p\">()</span><span class=\"w\">\n\n</span><span class=\"n\">plastic_end</span><span class=\"o\">$</span><span class=\"n\">fill</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">sample</span><span class=\"p\">(</span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"s2\">\"#ff00ec\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"#9e00ec\"</span><span class=\"p\">),</span><span class=\"w\"> </span><span class=\"n\">nrow</span><span class=\"p\">(</span><span class=\"n\">plastic_end</span><span class=\"p\">),</span><span class=\"w\"> </span><span class=\"n\">replace</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">TRUE</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">plastic_end</span><span class=\"o\">$</span><span class=\"n\">fill</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">ifelse</span><span class=\"p\">(</span><span class=\"n\">plastic_end</span><span class=\"o\">$</span><span class=\"n\">area</span><span class=\"w\"> </span><span class=\"o\">&gt;</span><span class=\"w\"> </span><span class=\"n\">quantile</span><span class=\"p\">(</span><span class=\"n\">plastic_end</span><span class=\"o\">$</span><span class=\"n\">area</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">probs</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">0.4</span><span class=\"p\">),</span><span class=\"w\">\n  </span><span class=\"s2\">\"white\"</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">plastic_end</span><span class=\"o\">$</span><span class=\"n\">fill</span><span class=\"w\">\n</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"n\">bbox2</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">st_bbox</span><span class=\"p\">(</span><span class=\"n\">plastic_end</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">ggplot</span><span class=\"p\">()</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">geom_sf</span><span class=\"p\">(</span><span class=\"n\">data</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">plastic_end</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">aes</span><span class=\"p\">(</span><span class=\"n\">fill</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">fill</span><span class=\"p\">),</span><span class=\"w\"> </span><span class=\"n\">color</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">NA</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">scale_fill_identity</span><span class=\"p\">()</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">theme</span><span class=\"p\">(</span><span class=\"w\">\n    </span><span class=\"n\">panel.background</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">element_rect</span><span class=\"p\">(</span><span class=\"n\">fill</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"#009fdc\"</span><span class=\"p\">),</span><span class=\"w\">\n    </span><span class=\"n\">panel.grid</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">element_blank</span><span class=\"p\">(),</span><span class=\"w\">\n    </span><span class=\"n\">axis.text</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">element_blank</span><span class=\"p\">(),</span><span class=\"w\">\n    </span><span class=\"n\">axis.ticks</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">element_blank</span><span class=\"p\">()</span><span class=\"w\">\n  </span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">labs</span><span class=\"p\">(</span><span class=\"n\">title</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"New redesign\"</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">coord_sf</span><span class=\"p\">(</span><span class=\"w\">\n    </span><span class=\"n\">xlim</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"n\">bbox2</span><span class=\"p\">[</span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"m\">1</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">3</span><span class=\"p\">)]</span><span class=\"w\"> </span><span class=\"o\">*</span><span class=\"w\"> </span><span class=\"m\">1.8</span><span class=\"p\">),</span><span class=\"w\">\n    </span><span class=\"n\">ylim</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"n\">bbox2</span><span class=\"p\">[</span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"m\">2</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">4</span><span class=\"p\">)])</span><span class=\"w\"> </span><span class=\"o\">*</span><span class=\"w\"> </span><span class=\"m\">1.4</span><span class=\"w\">\n  </span><span class=\"p\">)</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<p><img src=\"https://dieghernan.github.io/assets/img/blog/202510_redesign-2.webp\" alt=\"Antarctic flag variation with the continental silhouette formed by scattered white points on a blue background.\" width=\"100%\" /></p>\n\n<iframe class=\"d-block w-100 border-0 rounded my-3\" title=\"Cold Heart (PNAU Remix) by Elton John and Dua Lipa on Spotify\" src=\"https://open.spotify.com/embed/track/5PERfEjDBWImbO3W8m7f0w?theme=0\" height=\"152\" loading=\"lazy\" allow=\"autoplay; clipboard-write; encrypted-media; fullscreen; picture-in-picture\" allowfullscreen=\"\">\n</iframe>\n",
      "date_published": "2025-10-25T00:00:00+02:00",
      "image": "https://dieghernan.github.io/assets/img/blog/202510_good_pol-1.webp",
      "summary": "Fix a polygon artifact in the GISCO data and draw Antarctica from the South Pole in R.",
      "tags": ["music","r_bloggers","beautiful_maps","rstats","rspatial","maps","ggplot2","sf","giscoR"],
      "authors": [{
        "name": "Diego HH",
        "url": "https://dieghernan.github.io/"
      }]
    },
    {
      "id": "https://dieghernan.github.io/202502_liquid-group-by/",
      "url": "https://dieghernan.github.io/202502_liquid-group-by/",
      "title": "Implementing group_by count in Liquid",
      "content_html": "<p><a href=\"https://shopify.github.io/liquid/\">Liquid</a> is a template language used by\n<a href=\"https://jekyllrb.com/\"><strong>Jekyll</strong></a>, the static site generator behind this website\nand my theme, <span class=\"chulapa\">Chulapa</span>\n(<a href=\"https://dieghernan.github.io/chulapa\">link</a>).</p>\n\n<p>Some time ago, <a href=\"https://github.com/cargocultprogramming\">@cargocultprogramming</a>\nreported a broken theme component in\n<a href=\"https://github.com/dieghernan/chulapa/issues/29\">dieghernan/chulapa#29</a>.\nThe problem appeared with Jekyll 4.1.0 and was also reported in\n<a href=\"https://github.com/jekyll/jekyll/issues/8214\">jekyll/jekyll#8214</a>.</p>\n\n<p>The affected code used <code class=\"language-plaintext highlighter-rouge\">group_by</code> to count repeated strings in an array:</p>\n\n<div class=\"language-liquid highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code>\n<span class=\"cp\">{%</span><span class=\"w\"> </span><span class=\"nt\">assign</span><span class=\"w\"> </span><span class=\"nv\">alldocs</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nv\">site</span><span class=\"p\">.</span><span class=\"nv\">exercises</span><span class=\"w\"> </span><span class=\"cp\">%}</span>\n<span class=\"cp\">{%</span><span class=\"w\"> </span><span class=\"nt\">assign</span><span class=\"w\"> </span><span class=\"nv\">grouptag</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nv\">alldocs</span><span class=\"w\"> </span><span class=\"p\">|</span><span class=\"w\"> </span><span class=\"nf\">map</span><span class=\"p\">:</span><span class=\"w\"> </span><span class=\"s1\">'tags'</span><span class=\"w\"> </span><span class=\"p\">|</span><span class=\"w\"> </span><span class=\"nf\">join</span><span class=\"p\">:</span><span class=\"w\"> </span><span class=\"s1\">','</span><span class=\"w\"> </span><span class=\"p\">|</span><span class=\"w\"> </span><span class=\"nf\">split</span><span class=\"p\">:</span><span class=\"w\"> </span><span class=\"s1\">','</span><span class=\"w\"> </span><span class=\"p\">|</span><span class=\"w\"> </span><span class=\"nf\">group_by</span><span class=\"p\">:</span><span class=\"w\"> </span><span class=\"nv\">tag</span><span class=\"w\"> </span><span class=\"cp\">%}</span>\n<span class=\"cp\">{{</span><span class=\"w\"> </span><span class=\"nv\">grouptag</span><span class=\"w\"> </span><span class=\"cp\">}}</span>\n\n</code></pre></div></div>\n\n<p>In that example, <code class=\"language-plaintext highlighter-rouge\">tag</code> is an undefined variable, rather than the name of a\nproperty on each item. Jekyll 4.0.1 produced separate groups for the strings,\nbut 4.1.0 placed them in a single group with an empty name. This specific\nusage changed. Grouping objects by a named property remains supported.</p>\n\n<p>The workaround below counts string occurrences without custom plugins.\nIt uses Liquid templates with Jekyll-specific filters, including <code class=\"language-plaintext highlighter-rouge\">where_exp</code>\nand <code class=\"language-plaintext highlighter-rouge\">push</code>, so it is not portable to every Liquid environment.\n<a href=\"https://jekyllrb.com/docs/liquid/filters/\"><code class=\"language-plaintext highlighter-rouge\">where_exp</code> requires <strong>Jekyll</strong> 3.2.0 or later</a>.\nThe live examples run with the version used to build this site.</p>\n\n<p>The algorithm is implemented in <span class=\"chulapa\">Chulapa</span>.\nThe expandable tables use this site’s documents and change as posts are\nadded. You can also see the tags on the <a href=\"https://dieghernan.github.io/tags\">/tags</a>\npage.</p>\n\n<h2 id=\"counting-tag-occurrences\">Counting tag occurrences</h2>\n\n<p>For a small example, an input array of <code class=\"language-plaintext highlighter-rouge\">['ruby', 'jekyll', 'ruby']</code> gives\nthese two parallel arrays:</p>\n\n<div class=\"language-text highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code>single_tags = ['ruby', 'jekyll']\ncount_tags  = [2, 1]\n</code></pre></div></div>\n\n<p>There are two distinct tags. Each position in <code class=\"language-plaintext highlighter-rouge\">count_tags</code> holds the number\nof occurrences of the tag at the same position in <code class=\"language-plaintext highlighter-rouge\">single_tags</code>.</p>\n\n<p>First, collect the tags from <code class=\"language-plaintext highlighter-rouge\">site.documents</code>. Then keep the unique tags\nand count how often each appears in the full array:</p>\n\n<div class=\"language-liquid highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code>\n<span class=\"cp\">{%</span><span class=\"w\"> </span><span class=\"nt\">assign</span><span class=\"w\"> </span><span class=\"nv\">alldocs</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nv\">site</span><span class=\"p\">.</span><span class=\"nv\">documents</span><span class=\"w\"> </span><span class=\"cp\">%}</span>\n<span class=\"cp\">{%</span><span class=\"w\"> </span><span class=\"nt\">assign</span><span class=\"w\"> </span><span class=\"nv\">alltags</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nv\">alldocs</span><span class=\"w\"> </span><span class=\"p\">|</span><span class=\"w\"> </span><span class=\"nf\">map</span><span class=\"p\">:</span><span class=\"w\"> </span><span class=\"s1\">'tags'</span><span class=\"w\"> </span><span class=\"p\">|</span><span class=\"w\"> </span><span class=\"nf\">join</span><span class=\"p\">:</span><span class=\"w\"> </span><span class=\"s1\">','</span><span class=\"w\"> </span><span class=\"p\">|</span><span class=\"w\"> </span><span class=\"nf\">split</span><span class=\"p\">:</span><span class=\"w\"> </span><span class=\"s1\">','</span><span class=\"w\"> </span><span class=\"cp\">%}</span>\n<span class=\"cp\">{%</span><span class=\"w\"> </span><span class=\"nt\">assign</span><span class=\"w\"> </span><span class=\"nv\">single_tags</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nv\">alltags</span><span class=\"w\"> </span><span class=\"p\">|</span><span class=\"w\"> </span><span class=\"nf\">uniq</span><span class=\"w\"> </span><span class=\"cp\">%}</span>\n<span class=\"cp\">{%</span><span class=\"w\"> </span><span class=\"nt\">assign</span><span class=\"w\"> </span><span class=\"nv\">count_tags</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s1\">''</span><span class=\"w\"> </span><span class=\"p\">|</span><span class=\"w\"> </span><span class=\"nf\">split</span><span class=\"p\">:</span><span class=\"w\"> </span><span class=\"s1\">','</span><span class=\"w\"> </span><span class=\"cp\">%}</span>\n\n<span class=\"cp\">{%</span><span class=\"w\"> </span><span class=\"nt\">for</span><span class=\"w\"> </span><span class=\"nv\">tag</span><span class=\"w\"> </span><span class=\"nt\">in</span><span class=\"w\"> </span><span class=\"nv\">single_tags</span><span class=\"w\"> </span><span class=\"cp\">%}</span>\n  <span class=\"cp\">{%</span><span class=\"w\"> </span><span class=\"nt\">assign</span><span class=\"w\"> </span><span class=\"nv\">count_this_tag</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nv\">alltags</span><span class=\"w\"> </span><span class=\"p\">|</span><span class=\"w\"> </span><span class=\"nf\">where_exp</span><span class=\"p\">:</span><span class=\"w\"> </span><span class=\"s2\">\"item\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"item == tag\"</span><span class=\"w\"> </span><span class=\"p\">|</span><span class=\"w\"> </span><span class=\"nf\">size</span><span class=\"w\"> </span><span class=\"cp\">%}</span>\n  <span class=\"cp\">{%</span><span class=\"w\"> </span><span class=\"nt\">assign</span><span class=\"w\"> </span><span class=\"nv\">count_tags</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nv\">count_tags</span><span class=\"w\"> </span><span class=\"p\">|</span><span class=\"w\"> </span><span class=\"nf\">push</span><span class=\"p\">:</span><span class=\"w\"> </span><span class=\"nv\">count_this_tag</span><span class=\"w\"> </span><span class=\"cp\">%}</span>\n<span class=\"cp\">{%</span><span class=\"w\"> </span><span class=\"nt\">endfor</span><span class=\"w\"> </span><span class=\"cp\">%}</span>\n\n</code></pre></div></div>\n\n<p>The <code class=\"language-plaintext highlighter-rouge\">join</code> and <code class=\"language-plaintext highlighter-rouge\">split</code> filters flatten the tag arrays using a comma as a\nseparator. This assumes that tag names contain no commas. The algorithm\ncounts occurrences, so a repeated tag within one document would be counted\nmore than once. Tag comparisons are case-sensitive.</p>\n\n<p>To display the counts, iterate over the unique tags and use\n<code class=\"language-plaintext highlighter-rouge\">forloop.index0</code> to retrieve the corresponding count. An empty input\nproduces no table rows.</p>\n\n<div class=\"language-liquid highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code>\n&lt;table&gt;\n  &lt;caption&gt;Tag counts on this site&lt;/caption&gt;\n  &lt;thead&gt;\n    &lt;tr&gt;\n      &lt;th scope=\"col\"&gt;Tag&lt;/th&gt;\n      &lt;th scope=\"col\"&gt;Count&lt;/th&gt;\n    &lt;/tr&gt;\n  &lt;/thead&gt;\n  &lt;tbody&gt;\n    <span class=\"cp\">{%</span><span class=\"w\"> </span><span class=\"nt\">for</span><span class=\"w\"> </span><span class=\"nv\">tag</span><span class=\"w\"> </span><span class=\"nt\">in</span><span class=\"w\"> </span><span class=\"nv\">single_tags</span><span class=\"w\"> </span><span class=\"cp\">%}</span>\n      &lt;tr&gt;\n        &lt;td&gt;<span class=\"cp\">{{</span><span class=\"w\"> </span><span class=\"nv\">tag</span><span class=\"w\"> </span><span class=\"p\">|</span><span class=\"w\"> </span><span class=\"nf\">escape</span><span class=\"w\"> </span><span class=\"cp\">}}</span>&lt;/td&gt;\n        &lt;td&gt;<span class=\"cp\">{{</span><span class=\"w\"> </span><span class=\"nv\">count_tags</span><span class=\"p\">[</span><span class=\"nb\">forloop.index0</span><span class=\"p\">]</span><span class=\"w\"> </span><span class=\"cp\">}}</span>&lt;/td&gt;\n      &lt;/tr&gt;\n    <span class=\"cp\">{%</span><span class=\"w\"> </span><span class=\"nt\">endfor</span><span class=\"w\"> </span><span class=\"cp\">%}</span>\n  &lt;/tbody&gt;\n&lt;/table&gt;\n\n</code></pre></div></div>\n\n<details>\n  <summary>See results</summary>\n\n<table>\n  <caption>Tag counts on this site</caption>\n  <thead>\n    <tr>\n      <th scope=\"col\">Tag</th>\n      <th scope=\"col\">Count</th>\n    </tr>\n  </thead>\n  <tbody>\n    \n      <tr>\n        <td>r_bloggers</td>\n        <td>24</td>\n      </tr>\n    \n      <tr>\n        <td>rstats</td>\n        <td>33</td>\n      </tr>\n    \n      <tr>\n        <td>rspatial</td>\n        <td>29</td>\n      </tr>\n    \n      <tr>\n        <td>sf</td>\n        <td>17</td>\n      </tr>\n    \n      <tr>\n        <td>maps</td>\n        <td>31</td>\n      </tr>\n    \n      <tr>\n        <td>rnaturalearth</td>\n        <td>3</td>\n      </tr>\n    \n      <tr>\n        <td>music</td>\n        <td>13</td>\n      </tr>\n    \n      <tr>\n        <td>function</td>\n        <td>4</td>\n      </tr>\n    \n      <tr>\n        <td>leaflet</td>\n        <td>6</td>\n      </tr>\n    \n      <tr>\n        <td>jekyll</td>\n        <td>4</td>\n      </tr>\n    \n      <tr>\n        <td>html</td>\n        <td>4</td>\n      </tr>\n    \n      <tr>\n        <td>beautiful_maps</td>\n        <td>9</td>\n      </tr>\n    \n      <tr>\n        <td>giscoR</td>\n        <td>13</td>\n      </tr>\n    \n      <tr>\n        <td>raster</td>\n        <td>1</td>\n      </tr>\n    \n      <tr>\n        <td>flags</td>\n        <td>4</td>\n      </tr>\n    \n      <tr>\n        <td>mapSpain</td>\n        <td>4</td>\n      </tr>\n    \n      <tr>\n        <td>inset</td>\n        <td>3</td>\n      </tr>\n    \n      <tr>\n        <td>r_package</td>\n        <td>6</td>\n      </tr>\n    \n      <tr>\n        <td>classInt</td>\n        <td>1</td>\n      </tr>\n    \n      <tr>\n        <td>terra</td>\n        <td>6</td>\n      </tr>\n    \n      <tr>\n        <td>rasterpic</td>\n        <td>1</td>\n      </tr>\n    \n      <tr>\n        <td>ggplot2</td>\n        <td>12</td>\n      </tr>\n    \n      <tr>\n        <td>tmap</td>\n        <td>2</td>\n      </tr>\n    \n      <tr>\n        <td>mapsf</td>\n        <td>1</td>\n      </tr>\n    \n      <tr>\n        <td>discontinued</td>\n        <td>8</td>\n      </tr>\n    \n      <tr>\n        <td>project</td>\n        <td>13</td>\n      </tr>\n    \n      <tr>\n        <td>python</td>\n        <td>2</td>\n      </tr>\n    \n      <tr>\n        <td>guest-author</td>\n        <td>1</td>\n      </tr>\n    \n      <tr>\n        <td>COVID19</td>\n        <td>3</td>\n      </tr>\n    \n      <tr>\n        <td>ggridges</td>\n        <td>1</td>\n      </tr>\n    \n      <tr>\n        <td>tidyterra</td>\n        <td>4</td>\n      </tr>\n    \n      <tr>\n        <td>maptiles</td>\n        <td>1</td>\n      </tr>\n    \n      <tr>\n        <td>hillshading</td>\n        <td>2</td>\n      </tr>\n    \n      <tr>\n        <td>s2</td>\n        <td>1</td>\n      </tr>\n    \n      <tr>\n        <td>astronomy</td>\n        <td>2</td>\n      </tr>\n    \n      <tr>\n        <td>celestial</td>\n        <td>2</td>\n      </tr>\n    \n      <tr>\n        <td>geojson</td>\n        <td>3</td>\n      </tr>\n    \n      <tr>\n        <td>gpkg</td>\n        <td>3</td>\n      </tr>\n    \n      <tr>\n        <td>resmush</td>\n        <td>1</td>\n      </tr>\n    \n      <tr>\n        <td>liquid</td>\n        <td>1</td>\n      </tr>\n    \n      <tr>\n        <td>chulapa</td>\n        <td>3</td>\n      </tr>\n    \n      <tr>\n        <td>geobounds</td>\n        <td>1</td>\n      </tr>\n    \n      <tr>\n        <td>dataset</td>\n        <td>6</td>\n      </tr>\n    \n      <tr>\n        <td>indieweb</td>\n        <td>1</td>\n      </tr>\n    \n      <tr>\n        <td>pebble</td>\n        <td>4</td>\n      </tr>\n    \n      <tr>\n        <td>watchface</td>\n        <td>4</td>\n      </tr>\n    \n      <tr>\n        <td>javascript</td>\n        <td>5</td>\n      </tr>\n    \n      <tr>\n        <td>C</td>\n        <td>4</td>\n      </tr>\n    \n      <tr>\n        <td>csv</td>\n        <td>3</td>\n      </tr>\n    \n      <tr>\n        <td>twitter</td>\n        <td>1</td>\n      </tr>\n    \n  </tbody>\n</table>\n\n</details>\n\n<h2 id=\"sorting\">Sorting</h2>\n\n<p>To sort by descending frequency, find the largest count and work down to\none. For each frequency, append the matching tags and their counts to two\nnew arrays. This approach is also used in\n<a href=\"https://github.com/mmistakes/minimal-mistakes/blob/master/_includes/posts-taxonomy.html\">Minimal Mistakes</a>.</p>\n\n<div class=\"language-liquid highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code>\n<span class=\"cp\">{%</span><span class=\"w\"> </span><span class=\"nt\">assign</span><span class=\"w\"> </span><span class=\"nv\">sorted_tags</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s1\">''</span><span class=\"w\"> </span><span class=\"p\">|</span><span class=\"w\"> </span><span class=\"nf\">split</span><span class=\"p\">:</span><span class=\"w\"> </span><span class=\"s1\">','</span><span class=\"w\"> </span><span class=\"cp\">%}</span>\n<span class=\"cp\">{%</span><span class=\"w\"> </span><span class=\"nt\">assign</span><span class=\"w\"> </span><span class=\"nv\">sorted_count_tags</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s1\">''</span><span class=\"w\"> </span><span class=\"p\">|</span><span class=\"w\"> </span><span class=\"nf\">split</span><span class=\"p\">:</span><span class=\"w\"> </span><span class=\"s1\">','</span><span class=\"w\"> </span><span class=\"cp\">%}</span>\n\n<span class=\"cp\">{%</span><span class=\"w\"> </span><span class=\"nt\">if</span><span class=\"w\"> </span><span class=\"nv\">single_tags</span><span class=\"p\">.</span><span class=\"nf\">size</span><span class=\"w\"> </span><span class=\"o\">&gt;</span><span class=\"w\"> </span><span class=\"mi\">0</span><span class=\"w\"> </span><span class=\"cp\">%}</span>\n  <span class=\"cp\">{%</span><span class=\"w\"> </span><span class=\"nt\">assign</span><span class=\"w\"> </span><span class=\"nv\">n_tags</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nv\">single_tags</span><span class=\"w\"> </span><span class=\"p\">|</span><span class=\"w\"> </span><span class=\"nf\">size</span><span class=\"w\"> </span><span class=\"p\">|</span><span class=\"w\"> </span><span class=\"nf\">minus</span><span class=\"p\">:</span><span class=\"w\"> </span><span class=\"mi\">1</span><span class=\"w\"> </span><span class=\"cp\">%}</span>\n  <span class=\"cp\">{%</span><span class=\"w\"> </span><span class=\"nt\">assign</span><span class=\"w\"> </span><span class=\"nv\">items_max</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nv\">count_tags</span><span class=\"w\"> </span><span class=\"p\">|</span><span class=\"w\"> </span><span class=\"nf\">sort</span><span class=\"w\"> </span><span class=\"p\">|</span><span class=\"w\"> </span><span class=\"nf\">last</span><span class=\"w\"> </span><span class=\"cp\">%}</span>\n  <span class=\"cp\">{%</span><span class=\"w\"> </span><span class=\"nt\">for</span><span class=\"w\"> </span><span class=\"nv\">i</span><span class=\"w\"> </span><span class=\"nt\">in</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"mi\">1</span><span class=\"p\">..</span><span class=\"nv\">items_max</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"na\">reversed</span><span class=\"w\"> </span><span class=\"cp\">%}</span>\n    <span class=\"cp\">{%</span><span class=\"w\"> </span><span class=\"nt\">for</span><span class=\"w\"> </span><span class=\"nv\">j</span><span class=\"w\"> </span><span class=\"nt\">in</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"mi\">0</span><span class=\"p\">..</span><span class=\"nv\">n_tags</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"cp\">%}</span>\n      <span class=\"cp\">{%</span><span class=\"w\"> </span><span class=\"nt\">if</span><span class=\"w\"> </span><span class=\"nv\">count_tags</span><span class=\"p\">[</span><span class=\"nv\">j</span><span class=\"p\">]</span><span class=\"w\"> </span><span class=\"o\">==</span><span class=\"w\"> </span><span class=\"nv\">i</span><span class=\"w\"> </span><span class=\"cp\">%}</span>\n        <span class=\"cp\">{%</span><span class=\"w\"> </span><span class=\"nt\">assign</span><span class=\"w\"> </span><span class=\"nv\">sorted_tags</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nv\">sorted_tags</span><span class=\"w\"> </span><span class=\"p\">|</span><span class=\"w\"> </span><span class=\"nf\">push</span><span class=\"p\">:</span><span class=\"w\"> </span><span class=\"nv\">single_tags</span><span class=\"p\">[</span><span class=\"nv\">j</span><span class=\"p\">]</span><span class=\"w\"> </span><span class=\"cp\">%}</span>\n        <span class=\"cp\">{%</span><span class=\"w\"> </span><span class=\"nt\">assign</span><span class=\"w\"> </span><span class=\"nv\">sorted_count_tags</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nv\">sorted_count_tags</span><span class=\"w\"> </span><span class=\"p\">|</span><span class=\"w\"> </span><span class=\"nf\">push</span><span class=\"p\">:</span><span class=\"w\"> </span><span class=\"nv\">i</span><span class=\"w\"> </span><span class=\"cp\">%}</span>\n      <span class=\"cp\">{%</span><span class=\"w\"> </span><span class=\"nt\">endif</span><span class=\"w\"> </span><span class=\"cp\">%}</span>\n    <span class=\"cp\">{%</span><span class=\"w\"> </span><span class=\"nt\">endfor</span><span class=\"w\"> </span><span class=\"cp\">%}</span>\n  <span class=\"cp\">{%</span><span class=\"w\"> </span><span class=\"nt\">endfor</span><span class=\"w\"> </span><span class=\"cp\">%}</span>\n<span class=\"cp\">{%</span><span class=\"w\"> </span><span class=\"nt\">endif</span><span class=\"w\"> </span><span class=\"cp\">%}</span>\n\n</code></pre></div></div>\n\n<p>Tags with equal counts retain their order of first appearance in <code class=\"language-plaintext highlighter-rouge\">alltags</code>.\nThe empty-input check avoids constructing index ranges or finding a maximum\nwhen there are no tags. Each unique tag is appended once, so a final <code class=\"language-plaintext highlighter-rouge\">uniq</code>\nfilter is unnecessary.</p>\n\n<div class=\"language-liquid highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code>\n&lt;table&gt;\n  &lt;caption&gt;Tag counts in descending order&lt;/caption&gt;\n  &lt;thead&gt;\n    &lt;tr&gt;\n      &lt;th scope=\"col\"&gt;Tag&lt;/th&gt;\n      &lt;th scope=\"col\"&gt;Count&lt;/th&gt;\n    &lt;/tr&gt;\n  &lt;/thead&gt;\n  &lt;tbody&gt;\n    <span class=\"cp\">{%</span><span class=\"w\"> </span><span class=\"nt\">for</span><span class=\"w\"> </span><span class=\"nv\">tag</span><span class=\"w\"> </span><span class=\"nt\">in</span><span class=\"w\"> </span><span class=\"nv\">sorted_tags</span><span class=\"w\"> </span><span class=\"cp\">%}</span>\n      &lt;tr&gt;\n        &lt;td&gt;<span class=\"cp\">{{</span><span class=\"w\"> </span><span class=\"nv\">tag</span><span class=\"w\"> </span><span class=\"p\">|</span><span class=\"w\"> </span><span class=\"nf\">escape</span><span class=\"w\"> </span><span class=\"cp\">}}</span>&lt;/td&gt;\n        &lt;td&gt;<span class=\"cp\">{{</span><span class=\"w\"> </span><span class=\"nv\">sorted_count_tags</span><span class=\"p\">[</span><span class=\"nb\">forloop.index0</span><span class=\"p\">]</span><span class=\"w\"> </span><span class=\"cp\">}}</span>&lt;/td&gt;\n      &lt;/tr&gt;\n    <span class=\"cp\">{%</span><span class=\"w\"> </span><span class=\"nt\">endfor</span><span class=\"w\"> </span><span class=\"cp\">%}</span>\n  &lt;/tbody&gt;\n&lt;/table&gt;\n\n</code></pre></div></div>\n\n<details>\n  <summary>See results</summary>\n\n<table>\n  <caption>Tag counts in descending order</caption>\n  <thead>\n    <tr>\n      <th scope=\"col\">Tag</th>\n      <th scope=\"col\">Count</th>\n    </tr>\n  </thead>\n  <tbody>\n    \n      <tr>\n        <td>rstats</td>\n        <td>33</td>\n      </tr>\n    \n      <tr>\n        <td>maps</td>\n        <td>31</td>\n      </tr>\n    \n      <tr>\n        <td>rspatial</td>\n        <td>29</td>\n      </tr>\n    \n      <tr>\n        <td>r_bloggers</td>\n        <td>24</td>\n      </tr>\n    \n      <tr>\n        <td>sf</td>\n        <td>17</td>\n      </tr>\n    \n      <tr>\n        <td>music</td>\n        <td>13</td>\n      </tr>\n    \n      <tr>\n        <td>giscoR</td>\n        <td>13</td>\n      </tr>\n    \n      <tr>\n        <td>project</td>\n        <td>13</td>\n      </tr>\n    \n      <tr>\n        <td>ggplot2</td>\n        <td>12</td>\n      </tr>\n    \n      <tr>\n        <td>beautiful_maps</td>\n        <td>9</td>\n      </tr>\n    \n      <tr>\n        <td>discontinued</td>\n        <td>8</td>\n      </tr>\n    \n      <tr>\n        <td>leaflet</td>\n        <td>6</td>\n      </tr>\n    \n      <tr>\n        <td>r_package</td>\n        <td>6</td>\n      </tr>\n    \n      <tr>\n        <td>terra</td>\n        <td>6</td>\n      </tr>\n    \n      <tr>\n        <td>dataset</td>\n        <td>6</td>\n      </tr>\n    \n      <tr>\n        <td>javascript</td>\n        <td>5</td>\n      </tr>\n    \n      <tr>\n        <td>function</td>\n        <td>4</td>\n      </tr>\n    \n      <tr>\n        <td>jekyll</td>\n        <td>4</td>\n      </tr>\n    \n      <tr>\n        <td>html</td>\n        <td>4</td>\n      </tr>\n    \n      <tr>\n        <td>flags</td>\n        <td>4</td>\n      </tr>\n    \n      <tr>\n        <td>mapSpain</td>\n        <td>4</td>\n      </tr>\n    \n      <tr>\n        <td>tidyterra</td>\n        <td>4</td>\n      </tr>\n    \n      <tr>\n        <td>pebble</td>\n        <td>4</td>\n      </tr>\n    \n      <tr>\n        <td>watchface</td>\n        <td>4</td>\n      </tr>\n    \n      <tr>\n        <td>C</td>\n        <td>4</td>\n      </tr>\n    \n      <tr>\n        <td>rnaturalearth</td>\n        <td>3</td>\n      </tr>\n    \n      <tr>\n        <td>inset</td>\n        <td>3</td>\n      </tr>\n    \n      <tr>\n        <td>COVID19</td>\n        <td>3</td>\n      </tr>\n    \n      <tr>\n        <td>geojson</td>\n        <td>3</td>\n      </tr>\n    \n      <tr>\n        <td>gpkg</td>\n        <td>3</td>\n      </tr>\n    \n      <tr>\n        <td>chulapa</td>\n        <td>3</td>\n      </tr>\n    \n      <tr>\n        <td>csv</td>\n        <td>3</td>\n      </tr>\n    \n      <tr>\n        <td>tmap</td>\n        <td>2</td>\n      </tr>\n    \n      <tr>\n        <td>python</td>\n        <td>2</td>\n      </tr>\n    \n      <tr>\n        <td>hillshading</td>\n        <td>2</td>\n      </tr>\n    \n      <tr>\n        <td>astronomy</td>\n        <td>2</td>\n      </tr>\n    \n      <tr>\n        <td>celestial</td>\n        <td>2</td>\n      </tr>\n    \n      <tr>\n        <td>raster</td>\n        <td>1</td>\n      </tr>\n    \n      <tr>\n        <td>classInt</td>\n        <td>1</td>\n      </tr>\n    \n      <tr>\n        <td>rasterpic</td>\n        <td>1</td>\n      </tr>\n    \n      <tr>\n        <td>mapsf</td>\n        <td>1</td>\n      </tr>\n    \n      <tr>\n        <td>guest-author</td>\n        <td>1</td>\n      </tr>\n    \n      <tr>\n        <td>ggridges</td>\n        <td>1</td>\n      </tr>\n    \n      <tr>\n        <td>maptiles</td>\n        <td>1</td>\n      </tr>\n    \n      <tr>\n        <td>s2</td>\n        <td>1</td>\n      </tr>\n    \n      <tr>\n        <td>resmush</td>\n        <td>1</td>\n      </tr>\n    \n      <tr>\n        <td>liquid</td>\n        <td>1</td>\n      </tr>\n    \n      <tr>\n        <td>geobounds</td>\n        <td>1</td>\n      </tr>\n    \n      <tr>\n        <td>indieweb</td>\n        <td>1</td>\n      </tr>\n    \n      <tr>\n        <td>twitter</td>\n        <td>1</td>\n      </tr>\n    \n  </tbody>\n</table>\n\n</details>\n\n<p>The counting step scans all tag occurrences for each unique tag, requiring\nroughly <code class=\"language-plaintext highlighter-rouge\">O(U * N)</code> comparisons, where <code class=\"language-plaintext highlighter-rouge\">U</code> is the number of unique tags and\n<code class=\"language-plaintext highlighter-rouge\">N</code> is the total number of occurrences. The nested sorting loops perform\n<code class=\"language-plaintext highlighter-rouge\">O(U * M)</code> comparisons, where <code class=\"language-plaintext highlighter-rouge\">M</code> is the largest count. Array copying by\n<code class=\"language-plaintext highlighter-rouge\">push</code> adds overhead. This is practical for small blogs, but large sites\nmay benefit from computing tag counts outside the template.</p>\n\n<h2 id=\"complete-example\">Complete example</h2>\n\n<p>Here is the combined counting and sorting code. The resulting\n<code class=\"language-plaintext highlighter-rouge\">sorted_tags</code> and <code class=\"language-plaintext highlighter-rouge\">sorted_count_tags</code> arrays can be displayed with the table\nabove.</p>\n\n<div class=\"language-liquid highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code>\n<span class=\"cp\">{%</span><span class=\"w\"> </span><span class=\"nt\">assign</span><span class=\"w\"> </span><span class=\"nv\">alldocs</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nv\">site</span><span class=\"p\">.</span><span class=\"nv\">documents</span><span class=\"w\"> </span><span class=\"cp\">%}</span>\n<span class=\"cp\">{%</span><span class=\"w\"> </span><span class=\"nt\">assign</span><span class=\"w\"> </span><span class=\"nv\">alltags</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nv\">alldocs</span><span class=\"w\"> </span><span class=\"p\">|</span><span class=\"w\"> </span><span class=\"nf\">map</span><span class=\"p\">:</span><span class=\"w\"> </span><span class=\"s1\">'tags'</span><span class=\"w\"> </span><span class=\"p\">|</span><span class=\"w\"> </span><span class=\"nf\">join</span><span class=\"p\">:</span><span class=\"w\"> </span><span class=\"s1\">','</span><span class=\"w\"> </span><span class=\"p\">|</span><span class=\"w\"> </span><span class=\"nf\">split</span><span class=\"p\">:</span><span class=\"w\"> </span><span class=\"s1\">','</span><span class=\"w\"> </span><span class=\"cp\">%}</span>\n<span class=\"cp\">{%</span><span class=\"w\"> </span><span class=\"nt\">assign</span><span class=\"w\"> </span><span class=\"nv\">single_tags</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nv\">alltags</span><span class=\"w\"> </span><span class=\"p\">|</span><span class=\"w\"> </span><span class=\"nf\">uniq</span><span class=\"w\"> </span><span class=\"cp\">%}</span>\n<span class=\"cp\">{%</span><span class=\"w\"> </span><span class=\"nt\">assign</span><span class=\"w\"> </span><span class=\"nv\">count_tags</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s1\">''</span><span class=\"w\"> </span><span class=\"p\">|</span><span class=\"w\"> </span><span class=\"nf\">split</span><span class=\"p\">:</span><span class=\"w\"> </span><span class=\"s1\">','</span><span class=\"w\"> </span><span class=\"cp\">%}</span>\n\n<span class=\"cp\">{%</span><span class=\"w\"> </span><span class=\"nt\">for</span><span class=\"w\"> </span><span class=\"nv\">tag</span><span class=\"w\"> </span><span class=\"nt\">in</span><span class=\"w\"> </span><span class=\"nv\">single_tags</span><span class=\"w\"> </span><span class=\"cp\">%}</span>\n  <span class=\"cp\">{%</span><span class=\"w\"> </span><span class=\"nt\">assign</span><span class=\"w\"> </span><span class=\"nv\">count_this_tag</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nv\">alltags</span><span class=\"w\"> </span><span class=\"p\">|</span><span class=\"w\"> </span><span class=\"nf\">where_exp</span><span class=\"p\">:</span><span class=\"w\"> </span><span class=\"s2\">\"item\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"item == tag\"</span><span class=\"w\"> </span><span class=\"p\">|</span><span class=\"w\"> </span><span class=\"nf\">size</span><span class=\"w\"> </span><span class=\"cp\">%}</span>\n  <span class=\"cp\">{%</span><span class=\"w\"> </span><span class=\"nt\">assign</span><span class=\"w\"> </span><span class=\"nv\">count_tags</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nv\">count_tags</span><span class=\"w\"> </span><span class=\"p\">|</span><span class=\"w\"> </span><span class=\"nf\">push</span><span class=\"p\">:</span><span class=\"w\"> </span><span class=\"nv\">count_this_tag</span><span class=\"w\"> </span><span class=\"cp\">%}</span>\n<span class=\"cp\">{%</span><span class=\"w\"> </span><span class=\"nt\">endfor</span><span class=\"w\"> </span><span class=\"cp\">%}</span>\n\n<span class=\"cp\">{%</span><span class=\"w\"> </span><span class=\"nt\">assign</span><span class=\"w\"> </span><span class=\"nv\">sorted_tags</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s1\">''</span><span class=\"w\"> </span><span class=\"p\">|</span><span class=\"w\"> </span><span class=\"nf\">split</span><span class=\"p\">:</span><span class=\"w\"> </span><span class=\"s1\">','</span><span class=\"w\"> </span><span class=\"cp\">%}</span>\n<span class=\"cp\">{%</span><span class=\"w\"> </span><span class=\"nt\">assign</span><span class=\"w\"> </span><span class=\"nv\">sorted_count_tags</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s1\">''</span><span class=\"w\"> </span><span class=\"p\">|</span><span class=\"w\"> </span><span class=\"nf\">split</span><span class=\"p\">:</span><span class=\"w\"> </span><span class=\"s1\">','</span><span class=\"w\"> </span><span class=\"cp\">%}</span>\n\n<span class=\"cp\">{%</span><span class=\"w\"> </span><span class=\"nt\">if</span><span class=\"w\"> </span><span class=\"nv\">single_tags</span><span class=\"p\">.</span><span class=\"nf\">size</span><span class=\"w\"> </span><span class=\"o\">&gt;</span><span class=\"w\"> </span><span class=\"mi\">0</span><span class=\"w\"> </span><span class=\"cp\">%}</span>\n  <span class=\"cp\">{%</span><span class=\"w\"> </span><span class=\"nt\">assign</span><span class=\"w\"> </span><span class=\"nv\">n_tags</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nv\">single_tags</span><span class=\"w\"> </span><span class=\"p\">|</span><span class=\"w\"> </span><span class=\"nf\">size</span><span class=\"w\"> </span><span class=\"p\">|</span><span class=\"w\"> </span><span class=\"nf\">minus</span><span class=\"p\">:</span><span class=\"w\"> </span><span class=\"mi\">1</span><span class=\"w\"> </span><span class=\"cp\">%}</span>\n  <span class=\"cp\">{%</span><span class=\"w\"> </span><span class=\"nt\">assign</span><span class=\"w\"> </span><span class=\"nv\">items_max</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nv\">count_tags</span><span class=\"w\"> </span><span class=\"p\">|</span><span class=\"w\"> </span><span class=\"nf\">sort</span><span class=\"w\"> </span><span class=\"p\">|</span><span class=\"w\"> </span><span class=\"nf\">last</span><span class=\"w\"> </span><span class=\"cp\">%}</span>\n  <span class=\"cp\">{%</span><span class=\"w\"> </span><span class=\"nt\">for</span><span class=\"w\"> </span><span class=\"nv\">i</span><span class=\"w\"> </span><span class=\"nt\">in</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"mi\">1</span><span class=\"p\">..</span><span class=\"nv\">items_max</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"na\">reversed</span><span class=\"w\"> </span><span class=\"cp\">%}</span>\n    <span class=\"cp\">{%</span><span class=\"w\"> </span><span class=\"nt\">for</span><span class=\"w\"> </span><span class=\"nv\">j</span><span class=\"w\"> </span><span class=\"nt\">in</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"mi\">0</span><span class=\"p\">..</span><span class=\"nv\">n_tags</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"cp\">%}</span>\n      <span class=\"cp\">{%</span><span class=\"w\"> </span><span class=\"nt\">if</span><span class=\"w\"> </span><span class=\"nv\">count_tags</span><span class=\"p\">[</span><span class=\"nv\">j</span><span class=\"p\">]</span><span class=\"w\"> </span><span class=\"o\">==</span><span class=\"w\"> </span><span class=\"nv\">i</span><span class=\"w\"> </span><span class=\"cp\">%}</span>\n        <span class=\"cp\">{%</span><span class=\"w\"> </span><span class=\"nt\">assign</span><span class=\"w\"> </span><span class=\"nv\">sorted_tags</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nv\">sorted_tags</span><span class=\"w\"> </span><span class=\"p\">|</span><span class=\"w\"> </span><span class=\"nf\">push</span><span class=\"p\">:</span><span class=\"w\"> </span><span class=\"nv\">single_tags</span><span class=\"p\">[</span><span class=\"nv\">j</span><span class=\"p\">]</span><span class=\"w\"> </span><span class=\"cp\">%}</span>\n        <span class=\"cp\">{%</span><span class=\"w\"> </span><span class=\"nt\">assign</span><span class=\"w\"> </span><span class=\"nv\">sorted_count_tags</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nv\">sorted_count_tags</span><span class=\"w\"> </span><span class=\"p\">|</span><span class=\"w\"> </span><span class=\"nf\">push</span><span class=\"p\">:</span><span class=\"w\"> </span><span class=\"nv\">i</span><span class=\"w\"> </span><span class=\"cp\">%}</span>\n      <span class=\"cp\">{%</span><span class=\"w\"> </span><span class=\"nt\">endif</span><span class=\"w\"> </span><span class=\"cp\">%}</span>\n    <span class=\"cp\">{%</span><span class=\"w\"> </span><span class=\"nt\">endfor</span><span class=\"w\"> </span><span class=\"cp\">%}</span>\n  <span class=\"cp\">{%</span><span class=\"w\"> </span><span class=\"nt\">endfor</span><span class=\"w\"> </span><span class=\"cp\">%}</span>\n<span class=\"cp\">{%</span><span class=\"w\"> </span><span class=\"nt\">endif</span><span class=\"w\"> </span><span class=\"cp\">%}</span>\n\n</code></pre></div></div>\n",
      "date_published": "2025-02-28T00:00:00+01:00",
      "image": "https://dieghernan.github.io/assets/img/blog/og_jekyll.webp",
      "summary": "This post explains implementing group_by count in Liquid for Jekyll, addressing issues with Jekyll 4.1.0 and providing a solution.",
      "tags": ["liquid","jekyll","html","function","chulapa"],
      "authors": [{
        "name": "Diego HH",
        "url": "https://dieghernan.github.io/"
      }]
    },
    {
      "id": "https://dieghernan.github.io/202502_st_valentine/",
      "url": "https://dieghernan.github.io/202502_st_valentine/",
      "title": "Happy Valentine’s Day",
      "content_html": "<p>Do you know the <a href=\"https://en.wikipedia.org/wiki/Bonne_projection\">Bonne\nProjection</a>? This is a very\nspecial one, as it produces this result when used to map the whole world. Happy\nValentine’s Day!</p>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"n\">library</span><span class=\"p\">(</span><span class=\"n\">sf</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">library</span><span class=\"p\">(</span><span class=\"n\">dplyr</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">library</span><span class=\"p\">(</span><span class=\"n\">giscoR</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">library</span><span class=\"p\">(</span><span class=\"n\">ggplot2</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">library</span><span class=\"p\">(</span><span class=\"n\">showtext</span><span class=\"p\">)</span><span class=\"w\">\n\n\n</span><span class=\"n\">world</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">gisco_get_countries</span><span class=\"p\">()</span><span class=\"w\">\n\n</span><span class=\"c1\"># Shaped ocean</span><span class=\"w\">\n\n</span><span class=\"n\">h_earth</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">world</span><span class=\"w\"> </span><span class=\"o\">%&gt;%</span><span class=\"w\">\n  </span><span class=\"c1\"># Fine grid</span><span class=\"w\">\n  </span><span class=\"n\">st_make_grid</span><span class=\"p\">(</span><span class=\"n\">n</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"m\">50</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">50</span><span class=\"p\">))</span><span class=\"w\"> </span><span class=\"o\">%&gt;%</span><span class=\"w\">\n  </span><span class=\"c1\"># Bonne projection</span><span class=\"w\">\n  </span><span class=\"n\">st_transform</span><span class=\"p\">(</span><span class=\"s2\">\"ESRI:54024\"</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">%&gt;%</span><span class=\"w\">\n  </span><span class=\"c1\"># To sf object (data-frame like)</span><span class=\"w\">\n  </span><span class=\"n\">st_sf</span><span class=\"p\">(</span><span class=\"n\">couple</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">2</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">someval</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">1</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">.</span><span class=\"p\">)</span><span class=\"w\">\n\n\n</span><span class=\"c1\"># And finally</span><span class=\"w\">\n\n</span><span class=\"n\">font_add_google</span><span class=\"p\">(</span><span class=\"n\">name</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"Emilys Candy\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">family</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"emilys\"</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"n\">showtext_auto</span><span class=\"p\">()</span><span class=\"w\">\n\n</span><span class=\"n\">ggplot</span><span class=\"p\">()</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">geom_sf</span><span class=\"p\">(</span><span class=\"n\">data</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">h_earth</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">fill</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"#f9b7bb\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">color</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"#f9b7bb\"</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">geom_sf</span><span class=\"p\">(</span><span class=\"n\">data</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">world</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">fill</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"#d24658\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">color</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"#d24658\"</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">theme_void</span><span class=\"p\">()</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">labs</span><span class=\"p\">(</span><span class=\"w\">\n    </span><span class=\"n\">title</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"Happy Valentine's Day\"</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"n\">caption</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"Bonne Projection (ESRI:54024)\"</span><span class=\"w\">\n  </span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">theme</span><span class=\"p\">(</span><span class=\"w\">\n    </span><span class=\"n\">plot.background</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">element_rect</span><span class=\"p\">(</span><span class=\"w\">\n      </span><span class=\"n\">fill</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"#faddcf\"</span><span class=\"p\">,</span><span class=\"w\">\n      </span><span class=\"n\">color</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"transparent\"</span><span class=\"w\">\n    </span><span class=\"p\">),</span><span class=\"w\">\n    </span><span class=\"n\">text</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">element_text</span><span class=\"p\">(</span><span class=\"n\">family</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"emilys\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">colour</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"#d24658\"</span><span class=\"p\">),</span><span class=\"w\">\n    </span><span class=\"n\">plot.title</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">element_text</span><span class=\"p\">(</span><span class=\"n\">hjust</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">0.5</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">size</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">rel</span><span class=\"p\">(</span><span class=\"m\">3</span><span class=\"p\">)),</span><span class=\"w\">\n    </span><span class=\"n\">plot.caption</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">element_text</span><span class=\"p\">(</span><span class=\"n\">hjust</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">0.5</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">size</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">rel</span><span class=\"p\">(</span><span class=\"m\">2</span><span class=\"p\">))</span><span class=\"w\">\n  </span><span class=\"p\">)</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<p><img src=\"https://dieghernan.github.io/assets/img/blog/202402_bonne_proj.webp\" alt=\"World map in a heart-shaped Bonne projection, with a Valentine greeting above it.\" width=\"100%\" /></p>\n\n<iframe class=\"d-block w-100 border-0 rounded my-3\" title=\"Can't Take My Eyes Off You by Frankie Valli on Spotify\" src=\"https://open.spotify.com/embed/track/7o8t2oSKI5eIBDlOHQH99F?theme=0\" height=\"152\" loading=\"lazy\" allow=\"autoplay; clipboard-write; encrypted-media; fullscreen; picture-in-picture\" allowfullscreen=\"\">\n</iframe>\n",
      "date_published": "2025-02-17T00:00:00+01:00",
      "image": "https://dieghernan.github.io/assets/img/blog/202402_bonne_proj.webp",
      "summary": "Give the world a heart shape with the Bonne projection and draw it in R.",
      "tags": ["music","r_bloggers","beautiful_maps","rstats","rspatial","maps","ggplot2","sf","giscoR"],
      "authors": [{
        "name": "Diego HH",
        "url": "https://dieghernan.github.io/"
      }]
    },
    {
      "id": "https://dieghernan.github.io/202402_optimize-images-r/",
      "url": "https://dieghernan.github.io/202402_optimize-images-r/",
      "title": "Optimize your images with R and reSmush.it",
      "content_html": "<p>The <strong>resmush</strong> package has recently been accepted on\n<a href=\"https://cran.r-project.org/package=resmush\">CRAN</a>! This small utility package\nallows for the optimization (i.e., compression) of local and online images\nusing <a href=\"https://resmush.it/\">reSmush.it</a>.</p>\n\n<p>You can install <strong>resmush</strong> from\n<a href=\"https://CRAN.R-project.org/package=resmush\"><strong>CRAN</strong></a> with:</p>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"n\">install.packages</span><span class=\"p\">(</span><span class=\"s2\">\"resmush\"</span><span class=\"p\">)</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<p>This post was featured in <a href=\"https://rweekly.fireside.fm/152?t=705\">episode 152 of R Weekly Highlights</a>.</p>\n\n<iframe src=\"https://player.fireside.fm/v3/87RSVeFz+jIaHRwHf?theme=dark&amp;t=705\" width=\"100%\" height=\"200\" frameborder=\"0\" scrolling=\"no\"></iframe>\n\n<h2 id=\"what-is-resmushit\">What is reSmush.it?</h2>\n\n<p>reSmush.it is a <strong>free online API</strong> that provides image optimization and has\nbeen implemented in WordPress, Drupal and Magento. Some features of reSmush.it\ninclude:</p>\n\n<ul>\n  <li>Free optimization services, no API key required.</li>\n  <li>Optimization of local and online images.</li>\n  <li>Supported image file formats: PNG, JPG/JPEG, GIF, BMP, TIFF, WebP.</li>\n  <li>Maximum image size: 5 MB.</li>\n  <li>Compression using several algorithms:\n    <ul>\n      <li><a href=\"https://pngquant.org/\"><strong>PNGQuant</strong></a>: Strip unneeded chunks from\nPNGs while preserving full alpha transparency.</li>\n      <li><a href=\"https://github.com/tjko/jpegoptim\"><strong>JPEGOptim</strong></a><strong>:</strong> Lossless\noptimization based on optimizing the Huffman tables.</li>\n      <li><a href=\"https://optipng.sourceforge.net/\"><strong>OptiPNG</strong></a>: <code class=\"language-plaintext highlighter-rouge\">png</code> reducer\nused by several online optimizers.</li>\n    </ul>\n  </li>\n</ul>\n\n<h2 id=\"why-the-resmush-package\">Why the <strong>resmush</strong> package?</h2>\n\n<p>One of the main reasons I developed <strong>resmush</strong> is because I usually\ninclude <a href=\"https://ropensci.org/blog/2019/12/08/precompute-vignettes/\">precomputed\nvignettes</a>\nwith my packages (see <a href=\"https://dieghernan.github.io/tidyterra/articles/tidyterra.html\"><strong>tidyterra</strong></a>\nas an example). I found that the plots created on CRAN with the standard\nconfiguration (i.e., not precomputed vignettes but built on CRAN itself) were\nnot very satisfying. In some of the packages I developed, especially those\nrelated to mapping, they didn’t do justice to the actual results when a user\nruns them.</p>\n\n<p>Precomputing vignettes has the drawback of producing higher-quality images at\nthe expense of size. To avoid exceeding <a href=\"https://cran.r-project.org/web/packages/policies.html\">CRAN’s 5 MB maximum size\npolicy</a>, I developed\n<strong>resmush</strong>, which enables me to reduce the size of the images without a\nsignificant loss in quality.</p>\n\n<p>Another use case for <strong>resmush</strong> is optimizing images in the context of web page\ndevelopment and SEO optimization. For example, I optimized all the images on\nthis blog using <code class=\"language-plaintext highlighter-rouge\">resmush_dir()</code>, which is a shorthand for optimizing all files\nin a specific folder.</p>\n\n<p>There are other alternatives that I discuss <a href=\"https://dieghernan.github.io/202402_optimize-images-r/#other-alternatives\">at the end of this\npost</a>, but briefly, the <strong>reSmush.it</strong> API works quickly\nwith minimal configuration for a wide range of formats without needing an API\nkey.</p>\n\n<h2 id=\"using-the-resmush-package\">Using the <strong>resmush</strong> package</h2>\n\n<h3 id=\"with-local-files\">With local files</h3>\n\n<p>Let’s present an example of how a local file can be optimized. First, we create\na large plot with <strong>ggplot2</strong>.</p>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"n\">library</span><span class=\"p\">(</span><span class=\"n\">tidyterra</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">library</span><span class=\"p\">(</span><span class=\"n\">ggplot2</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">library</span><span class=\"p\">(</span><span class=\"n\">terra</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">library</span><span class=\"p\">(</span><span class=\"n\">maptiles</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"n\">cyl</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">vect</span><span class=\"p\">(</span><span class=\"n\">system.file</span><span class=\"p\">(</span><span class=\"s2\">\"extdata/cyl.gpkg\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">package</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"tidyterra\"</span><span class=\"p\">))</span><span class=\"w\"> </span><span class=\"o\">%&gt;%</span><span class=\"w\">\n  </span><span class=\"n\">project</span><span class=\"p\">(</span><span class=\"s2\">\"EPSG:3857\"</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">cyl_img</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">get_tiles</span><span class=\"p\">(</span><span class=\"n\">cyl</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"Esri.WorldImagery\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">zoom</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">8</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">crop</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">TRUE</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">cyl_gg</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">autoplot</span><span class=\"p\">(</span><span class=\"n\">cyl_img</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">maxcell</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">Inf</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">geom_spatvector</span><span class=\"p\">(</span><span class=\"n\">data</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">cyl</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">alpha</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">0.3</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"n\">cyl_gg</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<div class=\"figure\">\n\n<img src=\"https://dieghernan.github.io/assets/img/samples/cyl.png\" alt=\"Satellite map of Castile and Leon with a translucent regional boundary overlay, before image optimization.\" width=\"100%\" />\n<p class=\"caption\">\nOriginal satellite image before optimization.\n</p>\n\n</div>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"w\">\n</span><span class=\"c1\"># And we save it for resmushing</span><span class=\"w\">\n</span><span class=\"n\">ggsave</span><span class=\"p\">(</span><span class=\"s2\">\"cyl.png\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">width</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">5</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">height</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">0.7</span><span class=\"w\"> </span><span class=\"o\">*</span><span class=\"w\"> </span><span class=\"m\">5</span><span class=\"p\">)</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<p>The file has a size of 1.7 MB. We can use <code class=\"language-plaintext highlighter-rouge\">resmush_file()</code> to\nreduce it:</p>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"n\">library</span><span class=\"p\">(</span><span class=\"n\">resmush</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">resmush_file</span><span class=\"p\">(</span><span class=\"s2\">\"cyl.png\"</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"c1\">#&gt; ══ resmush summary ══════════════════════════════════════════</span><span class=\"w\">\n</span><span class=\"c1\">#&gt; ℹ Input: 1 file with size 1.7 Mb</span><span class=\"w\">\n</span><span class=\"c1\">#&gt; ✔ Success for 1 file: Size now is 762.2 Kb (was 1.7 Mb). Saved 948.9 Kb (55.46%).</span><span class=\"w\">\n</span><span class=\"c1\">#&gt; See result in directory '.'.</span><span class=\"w\">\n\n</span><span class=\"c1\"># Check</span><span class=\"w\">\n</span><span class=\"n\">png</span><span class=\"o\">::</span><span class=\"n\">readPNG</span><span class=\"p\">(</span><span class=\"s2\">\"cyl_resmush.png\"</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">%&gt;%</span><span class=\"w\">\n  </span><span class=\"n\">grid</span><span class=\"o\">::</span><span class=\"n\">grid.raster</span><span class=\"p\">()</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<div class=\"figure\">\n\n<img src=\"https://dieghernan.github.io/assets/img/samples/cyl_resmush.png\" alt=\"Satellite map of Castile and Leon with a translucent regional boundary overlay, after image optimization.\" width=\"100%\" />\n<p class=\"caption\">\nSatellite image after optimization with resmush_file().\n</p>\n\n</div>\n\n<p>By default, <code class=\"language-plaintext highlighter-rouge\">resmush_file()</code> and <code class=\"language-plaintext highlighter-rouge\">resmush_dir()</code> do not overwrite the original\nfile, although this behavior may be modified with the <code class=\"language-plaintext highlighter-rouge\">overwrite = TRUE</code>\nparameter. Now, the optimized file (<code class=\"language-plaintext highlighter-rouge\">\"cyl_resmush.png\"</code>) has a size of 762.2 kB.</p>\n\n<p>Let’s compare the results side-by-side:</p>\n\n<div class=\"figure row no-gutters\">\n<a href=\"https://dieghernan.github.io/assets/img/samples/cyl.png\" class=\"col-sm-6 p-1\">\n<img src=\"https://dieghernan.github.io/assets/img/samples/cyl.png\" alt=\"Satellite map of Castile and Leon with a translucent regional boundary overlay, before image optimization.\" />\n</a>\n<a href=\"https://dieghernan.github.io/assets/img/samples/cyl_resmush.png\" class=\"col-sm-6 p-1\">\n<img src=\"https://dieghernan.github.io/assets/img/samples/cyl_resmush.png\" alt=\"Satellite map of Castile and Leon with a translucent regional boundary overlay, after image optimization.\" />\n</a>\n<p class=\"caption\">\nThe original image (left/top) is 1.7 MB. The optimized image (right/bottom) is\n762.2 kB, a 55.46% reduction in file size. Click either image to enlarge.\n</p>\n</div>\n\n<p>We can verify that the image has been compressed without reducing its\ndimensions.</p>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"n\">size_src</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">file.size</span><span class=\"p\">(</span><span class=\"s2\">\"cyl.png\"</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">%&gt;%</span><span class=\"w\">\n  </span><span class=\"n\">`class&lt;-`</span><span class=\"p\">(</span><span class=\"s2\">\"object_size\"</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">%&gt;%</span><span class=\"w\">\n  </span><span class=\"n\">format</span><span class=\"p\">(</span><span class=\"n\">units</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"auto\"</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">size_dest</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">file.size</span><span class=\"p\">(</span><span class=\"s2\">\"cyl_resmush.png\"</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">%&gt;%</span><span class=\"w\">\n  </span><span class=\"n\">`class&lt;-`</span><span class=\"p\">(</span><span class=\"s2\">\"object_size\"</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">%&gt;%</span><span class=\"w\">\n  </span><span class=\"n\">format</span><span class=\"p\">(</span><span class=\"n\">units</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"auto\"</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"n\">dim_src</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"nf\">dim</span><span class=\"p\">(</span><span class=\"n\">png</span><span class=\"o\">::</span><span class=\"n\">readPNG</span><span class=\"p\">(</span><span class=\"s2\">\"cyl.png\"</span><span class=\"p\">))[</span><span class=\"m\">1</span><span class=\"o\">:</span><span class=\"m\">2</span><span class=\"p\">]</span><span class=\"w\"> </span><span class=\"o\">%&gt;%</span><span class=\"w\"> </span><span class=\"n\">paste0</span><span class=\"p\">(</span><span class=\"n\">collapse</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"x\"</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">dim_dest</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"nf\">dim</span><span class=\"p\">(</span><span class=\"n\">png</span><span class=\"o\">::</span><span class=\"n\">readPNG</span><span class=\"p\">(</span><span class=\"s2\">\"cyl_resmush.png\"</span><span class=\"p\">))[</span><span class=\"m\">1</span><span class=\"o\">:</span><span class=\"m\">2</span><span class=\"p\">]</span><span class=\"w\"> </span><span class=\"o\">%&gt;%</span><span class=\"w\"> </span><span class=\"n\">paste0</span><span class=\"p\">(</span><span class=\"n\">collapse</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"x\"</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"n\">data.frame</span><span class=\"p\">(</span><span class=\"w\">\n  </span><span class=\"n\">source</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"s2\">\"original file\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"compressed file\"</span><span class=\"p\">),</span><span class=\"w\">\n  </span><span class=\"n\">size</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"n\">size_src</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">size_dest</span><span class=\"p\">),</span><span class=\"w\">\n  </span><span class=\"n\">dimensions</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"n\">dim_src</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">dim_dest</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">%&gt;%</span><span class=\"w\">\n  </span><span class=\"n\">knitr</span><span class=\"o\">::</span><span class=\"n\">kable</span><span class=\"p\">()</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<table>\n  <thead>\n    <tr>\n      <th style=\"text-align: left\">source</th>\n      <th style=\"text-align: left\">size</th>\n      <th style=\"text-align: left\">dimensions</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <td style=\"text-align: left\">original file</td>\n      <td style=\"text-align: left\">1.7 Mb</td>\n      <td style=\"text-align: left\">1050x1500</td>\n    </tr>\n    <tr>\n      <td style=\"text-align: left\">compressed file</td>\n      <td style=\"text-align: left\">762.2 Kb</td>\n      <td style=\"text-align: left\">1050x1500</td>\n    </tr>\n  </tbody>\n</table>\n\n<h3 id=\"with-online-files\">With online files</h3>\n\n<p>We can also optimize online files with <code class=\"language-plaintext highlighter-rouge\">resmush_url()</code> and download them to\ndisk. In this example, I demonstrate a feature of all the functions in\n<strong>resmush</strong>: they return an invisible data frame with a summary of the process.</p>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"n\">url</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"s2\">\"https://dieghernan.github.io/assets/img/samples/sample_1.3mb.jpg\"</span><span class=\"w\">\n\n</span><span class=\"c1\"># Invisible data frame</span><span class=\"w\">\n</span><span class=\"n\">dm</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">resmush_url</span><span class=\"p\">(</span><span class=\"n\">url</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"sample_optimized.jpg\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">report</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">FALSE</span><span class=\"p\">)</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"n\">knitr</span><span class=\"o\">::</span><span class=\"n\">kable</span><span class=\"p\">(</span><span class=\"n\">dm</span><span class=\"p\">)</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<table>\n  <thead>\n    <tr>\n      <th style=\"text-align: left\">src_img</th>\n      <th style=\"text-align: left\">dest_img</th>\n      <th style=\"text-align: left\">src_size</th>\n      <th style=\"text-align: left\">dest_size</th>\n      <th style=\"text-align: left\">compress_ratio</th>\n      <th style=\"text-align: left\">notes</th>\n      <th style=\"text-align: right\">src_bytes</th>\n      <th style=\"text-align: right\">dest_bytes</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <td style=\"text-align: left\"><a href=\"https://dieghernan.github.io/assets/img/samples/sample_1.3mb.jpg\">https://dieghernan.github.io/assets/img/samples/sample_1.3mb.jpg</a></td>\n      <td style=\"text-align: left\">sample_optimized.jpg</td>\n      <td style=\"text-align: left\">1.3 Mb</td>\n      <td style=\"text-align: left\">985 Kb</td>\n      <td style=\"text-align: left\">26.63%</td>\n      <td style=\"text-align: left\">OK</td>\n      <td style=\"text-align: right\">1374693</td>\n      <td style=\"text-align: right\">1008593</td>\n    </tr>\n  </tbody>\n</table>\n\n<div class=\"figure row no-gutters\">\n<a href=\"https://dieghernan.github.io/assets/img/samples/sample_1.3mb.jpg\" class=\"col-sm-6 p-1\">\n<img src=\"https://dieghernan.github.io/assets/img/samples/sample_1.3mb.jpg\" alt=\"Colorful illustration of sunset over ocean waves and a beach, before image optimization.\" />\n</a>\n\n<a href=\"https://dieghernan.github.io/assets/img/samples/sample_optimized.jpg\" class=\"col-sm-6 p-1\">\n<img src=\"https://dieghernan.github.io/assets/img/samples/sample_optimized.jpg\" alt=\"Colorful illustration of sunset over ocean waves and a beach, after image optimization.\" />\n</a>\n<p class=\"caption\">\n\nThe original image (left/top) is 1.3 MB. The optimized image (right/bottom) is\n985 kB, a 26.63% reduction in file size. Click either image to enlarge.\n\n</p>\n\n</div>\n\n<h2 id=\"other-alternatives\">Other alternatives</h2>\n\n<p>There are other alternatives for optimizing images with <strong>R</strong>, but first…</p>\n\n<div class=\"alert alert-info p-3 mx-2 mb-3\">\n\n<p>\n  <a href=\"https://yihui.org/\">Yihui Xie</a>, one of the most prominent figures\n  in the <strong>R</strong> community, was recently laid off from his position\n  at Posit PBC (formerly RStudio)\n  (<a href=\"https://yihui.org/en/2024/01/bye-rstudio/\">more info here</a>).\n</p>\n<p>\n  Yihui is the developer of <strong>knitr</strong>, <strong>markdown</strong>,\n  <strong>blogdown</strong> and <strong>bookdown</strong>, among others, and he\n  has been one of the key contributors (if not the most important) to the\n  reproducible research space with <strong>R</strong> through his libraries.\n</p>\n<p>\n  If you have ever used and enjoyed his packages, consider sponsoring him on\n  GitHub.\n</p>\n\n<div class=\"text-center my-3\">\n\n      <a class=\"btn btn-light border border-dark\" aria-label=\"Sponsor @yihui\" target=\"_top\" href=\"https://github.com/sponsors/yihui?o=esb\">\n      <i class=\"fa-regular fa-heart fa-lg mr-2\" aria-hidden=\"true\" style=\"color: #bf3989;\"></i><span class=\"font-weight-bold\">Sponsor Yihui Xie</span>\n      </a>\n\n</div>\n\n</div>\n\n<ul>\n  <li>One of the many packages developed by Yihui is\n<a href=\"https://cran.r-project.org/package=xfun\"><strong>xfun</strong></a>, which includes the\nfollowing functions for optimizing image files:\n    <ul>\n      <li><code class=\"language-plaintext highlighter-rouge\">xfun::tinify()</code> is similar to <code class=\"language-plaintext highlighter-rouge\">resmush_file()</code> but uses\n<a href=\"https://tinypng.com/\"><strong>TinyPNG</strong></a>. An API key is required.</li>\n      <li><code class=\"language-plaintext highlighter-rouge\">xfun::optipng()</code> compresses local files with <strong>OptiPNG</strong> (which needs to be\ninstalled locally).</li>\n    </ul>\n  </li>\n  <li><a href=\"https://jmablog.github.io/tinieR/\"><strong>tinieR</strong></a> package by\n<a href=\"https://jmablog.com/\">jmablog</a>. An <strong>R</strong> package that provides a full\ninterface with <a href=\"https://tinypng.com/\"><strong>TinyPNG</strong></a>.</li>\n  <li><a href=\"https://github.com/coolbutuseless/optout\"><strong>optout</strong></a> package by\n<a href=\"https://coolbutuseless.github.io/\">@coolbutuseless</a>. Similar to\n<code class=\"language-plaintext highlighter-rouge\">xfun::optipng()</code> with additional options. Requires additional software to\nbe installed locally.</li>\n</ul>\n\n<table class=\"table table-sm table-striped\">\n    <caption>Table 1: <strong>R</strong> packages: Comparison of alternatives for optimizing\nimages.</caption>\n<thead class=\"text-center\">\n   <tr>\n     <th class=\"align-middle\">tool</th>\n     <th class=\"align-middle\">CRAN</th>\n     <th class=\"align-middle\">Additional software?</th>\n     <th class=\"align-middle\">Online?</th>\n     <th class=\"align-middle\">API Key?</th>\n     <th class=\"align-middle\">Limits?</th>\n   </tr>\n </thead>\n <tbody>\n   <tr>\n     <td><code class=\"language-plaintext highlighter-rouge\">xfun::tinify()</code></td>\n     <td>Yes</td>\n     <td>No</td>\n     <td>Yes</td>\n     <td>Yes</td>\n     <td>500 files/month (Free tier)</td>\n   </tr>\n   <tr>\n     <td><code class=\"language-plaintext highlighter-rouge\">xfun::optipng()</code></td>\n     <td>Yes</td>\n     <td>Yes</td>\n     <td>No</td>\n     <td>No</td>\n     <td>No</td>\n   </tr>\n   <tr>\n     <td><strong>tinieR</strong></td>\n     <td>No</td>\n     <td>No</td>\n     <td>Yes</td>\n     <td>Yes</td>\n     <td>500 files/month (Free tier)</td>\n   </tr>\n   <tr>\n     <td><strong>optout</strong></td>\n     <td>No</td>\n     <td>Yes</td>\n     <td>No</td>\n     <td>No</td>\n     <td>No</td>\n   </tr>\n   <tr>\n     <td><strong>resmush</strong></td>\n     <td>Yes</td>\n     <td>No</td>\n     <td>Yes</td>\n     <td>No</td>\n     <td>Max size 5Mb</td>\n   </tr>\n </tbody>\n</table>\n\n<table class=\"table table-striped\">\n<caption>Table 2: <strong>R</strong> packages: Supported formats.</caption>\n    <thead>\n   <tr>\n     <th class=\"align-middle\">tool</th>\n     <th class=\"align-middle\">png</th>\n     <th class=\"align-middle\">jpg</th>\n     <th class=\"align-middle\">gif</th>\n     <th class=\"align-middle\">bmp</th>\n     <th class=\"align-middle\">tiff</th>\n     <th class=\"align-middle\">webp</th>\n     <th class=\"align-middle\">pdf</th>\n   </tr>\n </thead>\n <tbody>\n   <tr>\n     <td><code class=\"language-plaintext highlighter-rouge\">xfun::tinify()</code></td>\n     <td>✅</td>\n     <td>✅</td>\n     <td>❌</td>\n     <td>❌</td>\n     <td>❌</td>\n     <td>✅</td>\n     <td>❌</td>\n   </tr>\n   <tr>\n     <td><code class=\"language-plaintext highlighter-rouge\">xfun::optipng()</code></td>\n     <td>✅</td>\n     <td>❌</td>\n     <td>❌</td>\n     <td>❌</td>\n     <td>❌</td>\n     <td>❌</td>\n     <td>❌</td>\n   </tr>\n   <tr>\n     <td><strong>tinieR</strong></td>\n     <td>✅</td>\n     <td>✅</td>\n     <td>❌</td>\n     <td>❌</td>\n     <td>❌</td>\n     <td>✅</td>\n     <td>❌</td>\n   </tr>\n   <tr>\n     <td><strong>optout</strong></td>\n     <td>✅</td>\n     <td>✅</td>\n     <td>❌</td>\n     <td>❌</td>\n     <td>❌</td>\n     <td>❌</td>\n     <td>✅</td>\n   </tr>\n   <tr>\n     <td><strong>resmush</strong></td>\n     <td>✅</td>\n     <td>✅</td>\n     <td>✅</td>\n     <td>✅</td>\n     <td>✅</td>\n     <td>✅</td>\n     <td>❌</td>\n   </tr>\n </tbody>\n</table>\n\n<p>Additionally, if you host your projects on GitHub, you can try\n<a href=\"https://imgbot.net/\">Imgbot</a>, which is free for open-source projects. Imgbot\nprovides automatic optimization for files in your repositories, and the\noptimized files will be included in specific pull requests before merging into\nyour work.</p>\n",
      "date_published": "2024-02-05T00:00:00+01:00",
      "image": "https://dieghernan.github.io/assets/img/misc/compress-img.png",
      "summary": "Compress the size of your images with R, resmush and reSmush.it",
      "tags": ["r_bloggers","r_package","resmush","rstats"],
      "authors": [{
        "name": "Diego HH",
        "url": "https://dieghernan.github.io/"
      }]
    },
    {
      "id": "https://dieghernan.github.io/202312_bertin_dots/",
      "url": "https://dieghernan.github.io/202312_bertin_dots/",
      "title": "Beautiful maps with R (V): Point densities",
      "content_html": "<p>Recently, the <a href=\"https://r-graph-gallery.com/\">R Graph Gallery</a> published a new post by <a href=\"https://twitter.com/BjnNowak\">Benjamin Nowak</a> showing how to create a map inspired by the work of French cartographer <a href=\"https://en.wikipedia.org/wiki/Jacques_Bertin\">Jacques Bertin</a> (1918–2010), particularly his <em>Sémiologie graphique</em> (Bertin, 1967):</p>\n\n<p><img src=\"https://dieghernan.github.io/assets/img/misc/bertin.png\" alt=\"Dot map of France from Jacques Bertin's Semiologie graphique. Dots of different sizes depict population concentrations.\" /></p>\n\n<p>In this post, I create a similar map for Iberia using graduated symbols to\nrepresent population density. Unlike conventional dot density maps, where dots\nrepresent a fixed number of individuals, symbol sizes here indicate density\nclasses.\nI also explore a variation using a hexagonal grid instead of a rectangular one.\nThis is the fifth issue of the series\n<a href=\"https://dieghernan.github.io/tags#beautiful_maps\">Beautiful Maps with <strong>R</strong></a>.</p>\n\n<h2 id=\"libraries\">Libraries</h2>\n\n<p>I will use the following libraries for loading, manipulating and plotting\nspatial data (both raster and vector):</p>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"c1\"># Base spatial packages</span><span class=\"w\">\n</span><span class=\"n\">library</span><span class=\"p\">(</span><span class=\"n\">terra</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">library</span><span class=\"p\">(</span><span class=\"n\">sf</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"c1\"># Spatial data</span><span class=\"w\">\n</span><span class=\"n\">library</span><span class=\"p\">(</span><span class=\"n\">giscoR</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"c1\"># Wrangling and plotting</span><span class=\"w\">\n</span><span class=\"n\">library</span><span class=\"p\">(</span><span class=\"n\">tidyverse</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">library</span><span class=\"p\">(</span><span class=\"n\">tidyterra</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">library</span><span class=\"p\">(</span><span class=\"n\">ggtext</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"c1\"># Additional for hex grids</span><span class=\"w\">\n</span><span class=\"c1\"># Supporting for units and bridge raster to polygon</span><span class=\"w\">\n</span><span class=\"n\">library</span><span class=\"p\">(</span><span class=\"n\">units</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">library</span><span class=\"p\">(</span><span class=\"n\">exactextractr</span><span class=\"p\">)</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<h2 id=\"get-the-data\">Get the data</h2>\n\n<p>The first step is always to get the data we need. My final map uses a circular\nlayout with Iberia in the middle (that is our observation window), so we can get\nthe corresponding shapes and create a buffer around it.</p>\n\n<p>After that, we extract the population spatial distribution from <a href=\"https://ghsl.jrc.ec.europa.eu/download.php\">GHSL -\nGlobal Human Settlement Layer</a>. We\nuse the global file with a resolution of 1 km in the Mollweide projection\n(ESRI:54009).</p>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"c1\"># Create observation window based on the Iberian Peninsula and surroundings</span><span class=\"w\">\n</span><span class=\"c1\"># We create a buffered circle</span><span class=\"w\">\n</span><span class=\"n\">owin</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">gisco_get_countries</span><span class=\"p\">(</span><span class=\"w\">\n  </span><span class=\"n\">country</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"s2\">\"ES\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"PT\"</span><span class=\"p\">),</span><span class=\"w\">\n  </span><span class=\"c1\"># We buffer in 3035 since I want my final map on this projection</span><span class=\"w\">\n  </span><span class=\"n\">epsg</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">3035</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">resolution</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">60</span><span class=\"w\">\n</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">%&gt;%</span><span class=\"w\">\n  </span><span class=\"n\">st_geometry</span><span class=\"p\">()</span><span class=\"w\"> </span><span class=\"o\">%&gt;%</span><span class=\"w\">\n  </span><span class=\"n\">st_union</span><span class=\"p\">()</span><span class=\"w\"> </span><span class=\"o\">%&gt;%</span><span class=\"w\">\n  </span><span class=\"n\">st_centroid</span><span class=\"p\">(</span><span class=\"n\">of_largest_polygon</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">TRUE</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">%&gt;%</span><span class=\"w\">\n  </span><span class=\"n\">st_buffer</span><span class=\"p\">(</span><span class=\"m\">750000</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">%&gt;%</span><span class=\"w\">\n  </span><span class=\"c1\"># But for extracting raster data we need this in Mollweide so far</span><span class=\"w\">\n  </span><span class=\"n\">st_transform</span><span class=\"p\">(</span><span class=\"n\">crs</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"ESRI:54009\"</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"c1\"># Get additional shapes and cut them to the owin</span><span class=\"w\">\n</span><span class=\"n\">regions</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">gisco_get_nuts</span><span class=\"p\">(</span><span class=\"n\">resolution</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">3</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">nuts_level</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">2</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">%&gt;%</span><span class=\"w\">\n  </span><span class=\"n\">st_transform</span><span class=\"p\">(</span><span class=\"n\">st_crs</span><span class=\"p\">(</span><span class=\"n\">owin</span><span class=\"p\">))</span><span class=\"w\"> </span><span class=\"o\">%&gt;%</span><span class=\"w\">\n  </span><span class=\"n\">st_intersection</span><span class=\"p\">(</span><span class=\"n\">owin</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"n\">countries</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">gisco_get_countries</span><span class=\"p\">(</span><span class=\"n\">resolution</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">3</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">%&gt;%</span><span class=\"w\">\n  </span><span class=\"n\">st_transform</span><span class=\"p\">(</span><span class=\"n\">st_crs</span><span class=\"p\">(</span><span class=\"n\">owin</span><span class=\"p\">))</span><span class=\"w\"> </span><span class=\"o\">%&gt;%</span><span class=\"w\">\n  </span><span class=\"n\">st_intersection</span><span class=\"p\">(</span><span class=\"n\">owin</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"c1\"># Base map</span><span class=\"w\">\n</span><span class=\"n\">base_gg</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">ggplot</span><span class=\"p\">()</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">geom_sf</span><span class=\"p\">(</span><span class=\"n\">data</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">regions</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">fill</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">NA</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">color</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"black\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">linewidth</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">0.1</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">geom_sf</span><span class=\"p\">(</span><span class=\"n\">data</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">countries</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">fill</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">NA</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">linewidth</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">0.5</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">color</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"black\"</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">geom_sf</span><span class=\"p\">(</span><span class=\"n\">data</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">owin</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">fill</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">NA</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">linewidth</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">0.75</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">color</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"black\"</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"n\">base_gg</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<p><img src=\"https://dieghernan.github.io/assets/img/blog/202312_basemap-1.webp\" alt=\"Base map of the Iberian Peninsula with country and regional boundaries inside a circular plotting window.\" /></p>\n\n<p>That is our base map. Now we download the GHSL data programmatically and check\nthat everything is correct. At this point, it is interesting to\nuse the <code class=\"language-plaintext highlighter-rouge\">win</code> argument when reading the raster with <code class=\"language-plaintext highlighter-rouge\">terra::rast()</code>, as this\nallows us to load only the desired area with the subsequent improvement in\nterms of performance.</p>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"c1\"># Download data</span><span class=\"w\">\n</span><span class=\"c1\"># We need the following file (download 305Mb)</span><span class=\"w\">\n</span><span class=\"n\">url</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"s2\">\"https://jeodpp.jrc.ec.europa.eu/ftp/jrc-opendata/GHSL/GHS_POP_GLOBE_R2023A/GHS_POP_E2030_GLOBE_R2023A_54009_1000/V1-0/GHS_POP_E2030_GLOBE_R2023A_54009_1000_V1_0.zip\"</span><span class=\"w\">\n\n</span><span class=\"c1\"># This is where I store the file, you need to modify the folder</span><span class=\"w\">\n</span><span class=\"n\">fname</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">file.path</span><span class=\"p\">(</span><span class=\"s2\">\"~/R/mapslib/GHS\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">basename</span><span class=\"p\">(</span><span class=\"n\">url</span><span class=\"p\">))</span><span class=\"w\">\n</span><span class=\"k\">if</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"o\">!</span><span class=\"n\">file.exists</span><span class=\"p\">(</span><span class=\"n\">fname</span><span class=\"p\">))</span><span class=\"w\"> </span><span class=\"p\">{</span><span class=\"w\">\n  </span><span class=\"n\">download.file</span><span class=\"p\">(</span><span class=\"n\">url</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">fname</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"p\">}</span><span class=\"w\">\n</span><span class=\"n\">zip_content</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">unzip</span><span class=\"p\">(</span><span class=\"n\">fname</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">list</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">TRUE</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">zip_content</span><span class=\"w\">\n</span><span class=\"c1\">#&gt;                                                 Name    Length                Date</span><span class=\"w\">\n</span><span class=\"c1\">#&gt; 1     GHS_POP_E2030_GLOBE_R2023A_54009_1000_V1_0.tif 263188307 2023-04-28 21:11:00</span><span class=\"w\">\n</span><span class=\"c1\">#&gt; 2 GHS_POP_E2030_GLOBE_R2023A_54009_1000_V1_0.tif.ovr  88461532 2023-04-28 21:11:00</span><span class=\"w\">\n</span><span class=\"c1\">#&gt; 3                         GHSL_Data_Package_2023.pdf   9761851 2023-10-27 14:30:00</span><span class=\"w\">\n</span><span class=\"c1\">#&gt; 4           GHS_POP_GLOBE_R2023A_input_metadata.xlsx    137963 2023-04-30 10:42:00</span><span class=\"w\">\n\n</span><span class=\"c1\"># Unzip</span><span class=\"w\">\n</span><span class=\"n\">unzip</span><span class=\"p\">(</span><span class=\"n\">fname</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">exdir</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"~/R/mapslib/GHS\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">junkpaths</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">TRUE</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">overwrite</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">FALSE</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"c1\"># Create the path to the file</span><span class=\"w\">\n</span><span class=\"n\">global_tiff</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">zip_content</span><span class=\"o\">$</span><span class=\"n\">Name</span><span class=\"p\">[</span><span class=\"n\">grepl</span><span class=\"p\">(</span><span class=\"s2\">\"tif$\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">zip_content</span><span class=\"o\">$</span><span class=\"n\">Name</span><span class=\"p\">)]</span><span class=\"w\">\n</span><span class=\"n\">global_tiff_path</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">file.path</span><span class=\"p\">(</span><span class=\"s2\">\"~/R/mapslib/GHS\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">global_tiff</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"c1\"># And read cropping to our owin</span><span class=\"w\">\n</span><span class=\"n\">pop_init</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">rast</span><span class=\"p\">(</span><span class=\"n\">global_tiff_path</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">win</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">as_spatvector</span><span class=\"p\">(</span><span class=\"n\">owin</span><span class=\"p\">))</span><span class=\"w\">\n\n</span><span class=\"c1\"># Consistent naming of the layer</span><span class=\"w\">\n</span><span class=\"nf\">names</span><span class=\"p\">(</span><span class=\"n\">pop_init</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"s2\">\"population\"</span><span class=\"w\">\n\n</span><span class=\"n\">ncell</span><span class=\"p\">(</span><span class=\"n\">pop_init</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"c1\">#&gt; [1] 2255923</span><span class=\"w\">\n\n</span><span class=\"c1\"># And check with tidyterra</span><span class=\"w\">\n</span><span class=\"n\">base_gg</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">geom_spatraster</span><span class=\"p\">(</span><span class=\"n\">data</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">pop_init</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">maxcell</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">50000</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">scale_fill_viridis_c</span><span class=\"p\">(</span><span class=\"n\">na.value</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"transparent\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">alpha</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">0.3</span><span class=\"p\">)</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<p><img src=\"https://dieghernan.github.io/assets/img/blog/202312_base_raster-1.webp\" alt=\"Population raster over the Iberian Peninsula with country and regional boundaries. Color represents population per raster cell.\" /></p>\n\n<h2 id=\"data-wrangling\">Data wrangling</h2>\n\n<p>The GHSL information contains the estimated population in each cell. However, the\nfile has a high resolution (more than 2 million cells), so for plotting\npurposes we are going to reduce (i.e. aggregate) the number of cells so we can\nhave a better dot visualization. Once we aggregate, we compute the\narea of each new aggregated cell and compute the corresponding population\ndensity.</p>\n\n<p>Instead of using the numeric range of densities, we use categories for the final\nmap, so we classify the density into different groups:</p>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"c1\"># Reduce resolution for visualization</span><span class=\"w\">\n</span><span class=\"c1\"># Compute factor to reduce raster to (aprox) 100 rows:</span><span class=\"w\">\n</span><span class=\"n\">nrow</span><span class=\"p\">(</span><span class=\"n\">pop_init</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"c1\">#&gt; [1] 1511</span><span class=\"w\">\n</span><span class=\"n\">factor</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"nf\">round</span><span class=\"p\">(</span><span class=\"n\">nrow</span><span class=\"p\">(</span><span class=\"n\">pop_init</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">/</span><span class=\"w\"> </span><span class=\"m\">100</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"c1\"># Each new cell contains the sum of population of the aggregated cells</span><span class=\"w\">\n</span><span class=\"n\">pop_agg</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">terra</span><span class=\"o\">::</span><span class=\"n\">aggregate</span><span class=\"p\">(</span><span class=\"n\">pop_init</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">fact</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">factor</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">fun</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"sum\"</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">na.rm</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">TRUE</span><span class=\"w\">\n</span><span class=\"p\">)</span><span class=\"w\">\n\n\n</span><span class=\"c1\"># Compute area of each new cell</span><span class=\"w\">\n</span><span class=\"n\">pop_agg</span><span class=\"o\">$</span><span class=\"n\">area_km2</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">cellSize</span><span class=\"p\">(</span><span class=\"n\">pop_agg</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">unit</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"km\"</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"c1\"># Compute densities, mask to owin, convert to points and create categories</span><span class=\"w\">\n</span><span class=\"n\">pop_points</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">pop_agg</span><span class=\"w\"> </span><span class=\"o\">%&gt;%</span><span class=\"w\">\n  </span><span class=\"c1\"># Compute density by cell</span><span class=\"w\">\n  </span><span class=\"n\">mutate</span><span class=\"p\">(</span><span class=\"n\">dens</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">population</span><span class=\"w\"> </span><span class=\"o\">/</span><span class=\"w\"> </span><span class=\"n\">area_km2</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">%&gt;%</span><span class=\"w\">\n  </span><span class=\"n\">select</span><span class=\"p\">(</span><span class=\"n\">dens</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">%&gt;%</span><span class=\"w\">\n  </span><span class=\"c1\"># Mask to the countries shapes</span><span class=\"w\">\n  </span><span class=\"n\">mask</span><span class=\"p\">(</span><span class=\"n\">as_spatvector</span><span class=\"p\">(</span><span class=\"n\">countries</span><span class=\"p\">),</span><span class=\"w\"> </span><span class=\"n\">touches</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">FALSE</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">%&gt;%</span><span class=\"w\">\n  </span><span class=\"c1\"># SpatVector as points</span><span class=\"w\">\n  </span><span class=\"n\">as.points</span><span class=\"p\">()</span><span class=\"w\"> </span><span class=\"o\">%&gt;%</span><span class=\"w\">\n  </span><span class=\"c1\"># Categorize</span><span class=\"w\">\n  </span><span class=\"n\">mutate</span><span class=\"p\">(</span><span class=\"n\">cat</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">case_when</span><span class=\"p\">(</span><span class=\"w\">\n    </span><span class=\"n\">dens</span><span class=\"w\"> </span><span class=\"o\">&lt;</span><span class=\"w\"> </span><span class=\"m\">25</span><span class=\"w\"> </span><span class=\"o\">~</span><span class=\"w\"> </span><span class=\"s2\">\"A\"</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"n\">dens</span><span class=\"w\"> </span><span class=\"o\">&lt;</span><span class=\"w\"> </span><span class=\"m\">50</span><span class=\"w\"> </span><span class=\"o\">~</span><span class=\"w\"> </span><span class=\"s2\">\"B\"</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"n\">dens</span><span class=\"w\"> </span><span class=\"o\">&lt;</span><span class=\"w\"> </span><span class=\"m\">100</span><span class=\"w\"> </span><span class=\"o\">~</span><span class=\"w\"> </span><span class=\"s2\">\"C\"</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"n\">dens</span><span class=\"w\"> </span><span class=\"o\">&lt;</span><span class=\"w\"> </span><span class=\"m\">250</span><span class=\"w\"> </span><span class=\"o\">~</span><span class=\"w\"> </span><span class=\"s2\">\"D\"</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"n\">dens</span><span class=\"w\"> </span><span class=\"o\">&lt;</span><span class=\"w\"> </span><span class=\"m\">500</span><span class=\"w\"> </span><span class=\"o\">~</span><span class=\"w\"> </span><span class=\"s2\">\"E\"</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"n\">dens</span><span class=\"w\"> </span><span class=\"o\">&lt;</span><span class=\"w\"> </span><span class=\"m\">1500</span><span class=\"w\"> </span><span class=\"o\">~</span><span class=\"w\"> </span><span class=\"s2\">\"F\"</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"kc\">TRUE</span><span class=\"w\"> </span><span class=\"o\">~</span><span class=\"w\"> </span><span class=\"s2\">\"G\"</span><span class=\"w\">\n  </span><span class=\"p\">))</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<h2 id=\"final-plot\">Final plot</h2>\n\n<p>And finally, the map. In this case, I save it as a high-resolution square\nmap.</p>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"c1\"># Final plot</span><span class=\"w\">\n</span><span class=\"n\">final_plot</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">base_gg</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"c1\"># Layer, this object is a SpatVector instead of sf object</span><span class=\"w\">\n  </span><span class=\"n\">geom_spatvector</span><span class=\"p\">(</span><span class=\"w\">\n    </span><span class=\"n\">pop_points</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"n\">mapping</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">aes</span><span class=\"p\">(</span><span class=\"n\">size</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">cat</span><span class=\"p\">),</span><span class=\"w\">\n    </span><span class=\"c1\"># Use a point with a border AND a fill</span><span class=\"w\">\n    </span><span class=\"n\">pch</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">21</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">color</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"white\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">fill</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"black\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">linewidth</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">0.05</span><span class=\"w\">\n  </span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">scale_size_manual</span><span class=\"p\">(</span><span class=\"w\">\n    </span><span class=\"n\">values</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"m\">0.3</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">1</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">1.25</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">1.5</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">2</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">2.5</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">3.5</span><span class=\"p\">),</span><span class=\"w\">\n    </span><span class=\"n\">labels</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"w\">\n      </span><span class=\"s2\">\"&lt; 25\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"[25, 50)\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"[50, 100)\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"[100, 250)\"</span><span class=\"p\">,</span><span class=\"w\">\n      </span><span class=\"s2\">\"[250, 500)\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"[500, 1500)\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"≥ 1500\"</span><span class=\"w\">\n    </span><span class=\"p\">),</span><span class=\"w\">\n    </span><span class=\"n\">guide</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">guide_legend</span><span class=\"p\">(</span><span class=\"w\">\n      </span><span class=\"n\">nrow</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">1</span><span class=\"p\">,</span><span class=\"w\">\n      </span><span class=\"n\">title.position</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"top\"</span><span class=\"p\">,</span><span class=\"w\">\n      </span><span class=\"n\">keywidth</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">1</span><span class=\"p\">,</span><span class=\"w\">\n      </span><span class=\"n\">label.position</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"bottom\"</span><span class=\"w\">\n    </span><span class=\"p\">)</span><span class=\"w\">\n  </span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">labs</span><span class=\"p\">(</span><span class=\"w\">\n    </span><span class=\"n\">title</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"**Population density in Iberia**\"</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"n\">subtitle</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"in the way of Jacques Bertin\"</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"n\">size</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"&lt;span style='color:grey'&gt;Inhabitants per km&lt;sup&gt;2&lt;/sup&gt;&lt;/span&gt;\"</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"n\">caption</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"**Data** GHSL **| Plot** @dhernangomez based on @BjnNowak\"</span><span class=\"w\">\n  </span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">theme_void</span><span class=\"p\">()</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"c1\"># This CRS for representation only</span><span class=\"w\">\n  </span><span class=\"n\">coord_sf</span><span class=\"p\">(</span><span class=\"n\">expand</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">TRUE</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">crs</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">3035</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">theme</span><span class=\"p\">(</span><span class=\"w\">\n    </span><span class=\"c1\"># plot.margin = margin(20,0,20,0,\"cm\"),</span><span class=\"w\">\n    </span><span class=\"n\">plot.background</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">element_rect</span><span class=\"p\">(</span><span class=\"n\">fill</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"white\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">color</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">NA</span><span class=\"p\">),</span><span class=\"w\">\n    </span><span class=\"n\">legend.position</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"bottom\"</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"n\">legend.margin</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">margin</span><span class=\"p\">(</span><span class=\"n\">r</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">20</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">unit</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"pt\"</span><span class=\"p\">),</span><span class=\"w\">\n    </span><span class=\"n\">legend.title</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">element_markdown</span><span class=\"p\">(),</span><span class=\"w\">\n    </span><span class=\"n\">legend.key.width</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">unit</span><span class=\"p\">(</span><span class=\"m\">50</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"pt\"</span><span class=\"p\">),</span><span class=\"w\">\n    </span><span class=\"n\">plot.title</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">element_markdown</span><span class=\"p\">(</span><span class=\"n\">hjust</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">0.5</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">size</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">20</span><span class=\"p\">),</span><span class=\"w\">\n    </span><span class=\"n\">plot.subtitle</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">element_text</span><span class=\"p\">(</span><span class=\"n\">hjust</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">0.5</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">color</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"grey40\"</span><span class=\"p\">),</span><span class=\"w\">\n    </span><span class=\"n\">plot.caption</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">element_markdown</span><span class=\"p\">(</span><span class=\"w\">\n      </span><span class=\"n\">color</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"grey20\"</span><span class=\"p\">,</span><span class=\"w\">\n      </span><span class=\"n\">margin</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">margin</span><span class=\"p\">(</span><span class=\"n\">t</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">20</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">b</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">5</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">unit</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"pt\"</span><span class=\"p\">),</span><span class=\"w\">\n      </span><span class=\"n\">hjust</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">.5</span><span class=\"w\">\n    </span><span class=\"p\">)</span><span class=\"w\">\n  </span><span class=\"p\">)</span><span class=\"w\">\n\n\n\n</span><span class=\"n\">ggsave</span><span class=\"p\">(</span><span class=\"s2\">\"202312_finalmap.png\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">dpi</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">300</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">width</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">8</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">height</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">8</span><span class=\"p\">)</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<p><img src=\"https://dieghernan.github.io/assets/img/blog/202312_finalmap.webp\" alt=\"Dot density map of the Iberian Peninsula. Larger dots represent higher population density, revealing dense urban clusters and sparsely populated interiors.\" /></p>\n\n<h2 id=\"alternative-hexagonal-grid\">Alternative hexagonal grid</h2>\n\n<p>The previous plot is based on the centroids of each cell of the raster, which is,\nby definition, a rectangular grid. I would also like to experiment with\nhexagonal grids (i.e. a grid of hexagons) since I have the feeling that they\nlook more “natural” than the rectangular ones, which present a regularity\nhardly seen in\nthe wild.</p>\n\n<p>The issue here is that <strong>terra</strong> does not produce this type of grid. However, it\nis possible to create them with <code class=\"language-plaintext highlighter-rouge\">sf::st_make_grid()</code>, so the workflow for this\nalternative is:</p>\n\n<ol>\n  <li>Create a hexagonal grid, where each hexagon represents a similar area to\neach cell in the aggregated raster.</li>\n  <li>Extract the values of the raster to the new grid.</li>\n  <li>Finally, follow the same data wrangling and plotting steps.</li>\n</ol>\n\n<p>When working with <code class=\"language-plaintext highlighter-rouge\">sf::st_make_grid(square = FALSE)</code>, the parameter <code class=\"language-plaintext highlighter-rouge\">cellsize</code>\nshould be the “diameter” of the hexagon instead of the area. Luckily, we can\ninfer this value since the area of a hexagon is</p>\n\n<p>[A = \\frac{\\sqrt{3}}{2}d^{2}]</p>\n\n<p>So we can extract \\(d\\) from the previous expression knowing the area \\(A\\) of\nthe aggregated cells:</p>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"c1\"># Hex grid with sf ----</span><span class=\"w\">\n\n</span><span class=\"c1\"># Avg size of the cells on the aggregated grid</span><span class=\"w\">\n</span><span class=\"n\">target_area</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">cellSize</span><span class=\"p\">(</span><span class=\"n\">pop_agg</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">unit</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"km\"</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">%&gt;%</span><span class=\"w\">\n  </span><span class=\"n\">pull</span><span class=\"p\">()</span><span class=\"w\"> </span><span class=\"o\">%&gt;%</span><span class=\"w\">\n  </span><span class=\"n\">mean</span><span class=\"p\">()</span><span class=\"w\"> </span><span class=\"o\">%&gt;%</span><span class=\"w\">\n  </span><span class=\"n\">as_units</span><span class=\"p\">(</span><span class=\"s2\">\"km^2\"</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"n\">target_area</span><span class=\"w\">\n</span><span class=\"c1\">#&gt; 224.7461 [km^2]</span><span class=\"w\">\n\n</span><span class=\"c1\"># Infer diam hex</span><span class=\"w\">\n</span><span class=\"n\">diam_hex</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"nf\">sqrt</span><span class=\"p\">(</span><span class=\"m\">2</span><span class=\"w\"> </span><span class=\"o\">*</span><span class=\"w\"> </span><span class=\"n\">target_area</span><span class=\"w\"> </span><span class=\"o\">/</span><span class=\"w\"> </span><span class=\"nf\">sqrt</span><span class=\"p\">(</span><span class=\"m\">3</span><span class=\"p\">))</span><span class=\"w\">\n</span><span class=\"c1\"># Create hexagonal grid</span><span class=\"w\">\n</span><span class=\"n\">pop_agg_sf</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">st_make_grid</span><span class=\"p\">(</span><span class=\"n\">owin</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">cellsize</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">diam_hex</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">square</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">FALSE</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"nf\">length</span><span class=\"p\">(</span><span class=\"n\">pop_agg_sf</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"c1\">#&gt; [1] 10340</span><span class=\"w\">\n</span><span class=\"n\">ncell</span><span class=\"p\">(</span><span class=\"n\">pop_agg</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"c1\">#&gt; [1] 10100</span><span class=\"w\">\n\n</span><span class=\"n\">area_km2</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">st_area</span><span class=\"p\">(</span><span class=\"n\">pop_agg_sf</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">%&gt;%</span><span class=\"w\">\n  </span><span class=\"n\">set_units</span><span class=\"p\">(</span><span class=\"s2\">\"km^2\"</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">%&gt;%</span><span class=\"w\">\n  </span><span class=\"nf\">as.double</span><span class=\"p\">()</span><span class=\"w\">\n\n</span><span class=\"n\">pop_agg_sf</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">st_sf</span><span class=\"p\">(</span><span class=\"n\">area_km2</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">area_km2</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">geom</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">pop_agg_sf</span><span class=\"p\">)</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<p>Now, we use <code class=\"language-plaintext highlighter-rouge\">exact_extract()</code> to extract the population in each hexagonal cell.</p>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"c1\"># Extract aggregated population by hex cell</span><span class=\"w\">\n</span><span class=\"n\">pop_agg_sf</span><span class=\"o\">$</span><span class=\"n\">population</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">exact_extract</span><span class=\"p\">(</span><span class=\"n\">pop_init</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">y</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">pop_agg_sf</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">progress</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">FALSE</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">fun</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"sum\"</span><span class=\"w\">\n</span><span class=\"p\">)</span><span class=\"w\">\n\n\n</span><span class=\"n\">base_gg</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">geom_sf</span><span class=\"p\">(</span><span class=\"w\">\n    </span><span class=\"n\">data</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">pop_agg_sf</span><span class=\"w\"> </span><span class=\"o\">%&gt;%</span><span class=\"w\"> </span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">population</span><span class=\"w\"> </span><span class=\"o\">&gt;</span><span class=\"w\"> </span><span class=\"m\">0</span><span class=\"p\">),</span><span class=\"w\">\n    </span><span class=\"n\">aes</span><span class=\"p\">(</span><span class=\"n\">fill</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">population</span><span class=\"p\">),</span><span class=\"w\"> </span><span class=\"n\">color</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">NA</span><span class=\"w\">\n  </span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">scale_fill_viridis_c</span><span class=\"p\">(</span><span class=\"n\">na.value</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"transparent\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">alpha</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">0.3</span><span class=\"p\">)</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<p><img src=\"https://dieghernan.github.io/assets/img/blog/202312_hexgrid_base-1.webp\" alt=\"Map of the Iberian Peninsula with population totals aggregated into hexagonal cells. Color represents the population in each cell.\" /></p>\n\n<p>Finally, we compute densities, create categories and produce the map:</p>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"c1\"># Mask and categorize</span><span class=\"w\">\n</span><span class=\"n\">pop_sf_points</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">pop_agg_sf</span><span class=\"w\"> </span><span class=\"o\">%&gt;%</span><span class=\"w\">\n  </span><span class=\"c1\"># Compute density by cell</span><span class=\"w\">\n  </span><span class=\"n\">mutate</span><span class=\"p\">(</span><span class=\"n\">dens</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">population</span><span class=\"w\"> </span><span class=\"o\">/</span><span class=\"w\"> </span><span class=\"n\">area_km2</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">%&gt;%</span><span class=\"w\">\n  </span><span class=\"n\">select</span><span class=\"p\">(</span><span class=\"n\">dens</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">%&gt;%</span><span class=\"w\">\n  </span><span class=\"c1\"># To points and filter to country shape</span><span class=\"w\">\n  </span><span class=\"n\">st_centroid</span><span class=\"p\">(</span><span class=\"n\">of_largest_polygon</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">TRUE</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">%&gt;%</span><span class=\"w\">\n  </span><span class=\"n\">st_filter</span><span class=\"p\">(</span><span class=\"n\">countries</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">%&gt;%</span><span class=\"w\">\n  </span><span class=\"c1\"># Categorize</span><span class=\"w\">\n  </span><span class=\"n\">mutate</span><span class=\"p\">(</span><span class=\"n\">cat</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">case_when</span><span class=\"p\">(</span><span class=\"w\">\n    </span><span class=\"n\">dens</span><span class=\"w\"> </span><span class=\"o\">&lt;</span><span class=\"w\"> </span><span class=\"m\">25</span><span class=\"w\"> </span><span class=\"o\">~</span><span class=\"w\"> </span><span class=\"s2\">\"A\"</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"n\">dens</span><span class=\"w\"> </span><span class=\"o\">&lt;</span><span class=\"w\"> </span><span class=\"m\">50</span><span class=\"w\"> </span><span class=\"o\">~</span><span class=\"w\"> </span><span class=\"s2\">\"B\"</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"n\">dens</span><span class=\"w\"> </span><span class=\"o\">&lt;</span><span class=\"w\"> </span><span class=\"m\">100</span><span class=\"w\"> </span><span class=\"o\">~</span><span class=\"w\"> </span><span class=\"s2\">\"C\"</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"n\">dens</span><span class=\"w\"> </span><span class=\"o\">&lt;</span><span class=\"w\"> </span><span class=\"m\">250</span><span class=\"w\"> </span><span class=\"o\">~</span><span class=\"w\"> </span><span class=\"s2\">\"D\"</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"n\">dens</span><span class=\"w\"> </span><span class=\"o\">&lt;</span><span class=\"w\"> </span><span class=\"m\">500</span><span class=\"w\"> </span><span class=\"o\">~</span><span class=\"w\"> </span><span class=\"s2\">\"E\"</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"n\">dens</span><span class=\"w\"> </span><span class=\"o\">&lt;</span><span class=\"w\"> </span><span class=\"m\">1500</span><span class=\"w\"> </span><span class=\"o\">~</span><span class=\"w\"> </span><span class=\"s2\">\"F\"</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"kc\">TRUE</span><span class=\"w\"> </span><span class=\"o\">~</span><span class=\"w\"> </span><span class=\"s2\">\"G\"</span><span class=\"w\">\n  </span><span class=\"p\">))</span><span class=\"w\">\n\n</span><span class=\"c1\"># Final plot</span><span class=\"w\">\n</span><span class=\"n\">final_plot_hex</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">base_gg</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"c1\"># Layer, this object is a sf object</span><span class=\"w\">\n  </span><span class=\"n\">geom_sf</span><span class=\"p\">(</span><span class=\"w\">\n    </span><span class=\"n\">pop_sf_points</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"n\">mapping</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">aes</span><span class=\"p\">(</span><span class=\"n\">size</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">cat</span><span class=\"p\">),</span><span class=\"w\">\n    </span><span class=\"c1\"># Use a point with a border AND a fill</span><span class=\"w\">\n    </span><span class=\"n\">pch</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">21</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">color</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"white\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">fill</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"black\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">linewidth</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">0.05</span><span class=\"w\">\n  </span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">scale_size_manual</span><span class=\"p\">(</span><span class=\"w\">\n    </span><span class=\"n\">values</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"m\">0.3</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">1</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">1.25</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">1.5</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">2</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">2.5</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">3.5</span><span class=\"p\">),</span><span class=\"w\">\n    </span><span class=\"n\">labels</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"w\">\n      </span><span class=\"s2\">\"&lt; 25\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"[25, 50)\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"[50, 100)\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"[100, 250)\"</span><span class=\"p\">,</span><span class=\"w\">\n      </span><span class=\"s2\">\"[250, 500)\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"[500, 1500)\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"≥ 1500\"</span><span class=\"w\">\n    </span><span class=\"p\">),</span><span class=\"w\">\n    </span><span class=\"n\">guide</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">guide_legend</span><span class=\"p\">(</span><span class=\"w\">\n      </span><span class=\"n\">nrow</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">1</span><span class=\"p\">,</span><span class=\"w\">\n      </span><span class=\"n\">title.position</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"top\"</span><span class=\"p\">,</span><span class=\"w\">\n      </span><span class=\"n\">keywidth</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">1</span><span class=\"p\">,</span><span class=\"w\">\n      </span><span class=\"n\">label.position</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"bottom\"</span><span class=\"w\">\n    </span><span class=\"p\">)</span><span class=\"w\">\n  </span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">labs</span><span class=\"p\">(</span><span class=\"w\">\n    </span><span class=\"n\">title</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"**Population density in Iberia**\"</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"n\">subtitle</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"in the way of Jacques Bertin\"</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"n\">size</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"&lt;span style='color:grey'&gt;Inhabitants per km&lt;sup&gt;2&lt;/sup&gt;&lt;/span&gt;\"</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"n\">caption</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"**Data** GHSL **| Plot** @dhernangomez based on @BjnNowak\"</span><span class=\"w\">\n  </span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">theme_void</span><span class=\"p\">()</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"c1\"># This CRS for representation only</span><span class=\"w\">\n  </span><span class=\"n\">coord_sf</span><span class=\"p\">(</span><span class=\"n\">expand</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">TRUE</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">crs</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">3035</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">theme</span><span class=\"p\">(</span><span class=\"w\">\n    </span><span class=\"c1\"># plot.margin = margin(20,0,20,0,\"cm\"),</span><span class=\"w\">\n    </span><span class=\"n\">plot.background</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">element_rect</span><span class=\"p\">(</span><span class=\"n\">fill</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"white\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">color</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">NA</span><span class=\"p\">),</span><span class=\"w\">\n    </span><span class=\"n\">legend.position</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"bottom\"</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"n\">legend.margin</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">margin</span><span class=\"p\">(</span><span class=\"n\">r</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">20</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">unit</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"pt\"</span><span class=\"p\">),</span><span class=\"w\">\n    </span><span class=\"n\">legend.title</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">element_markdown</span><span class=\"p\">(),</span><span class=\"w\">\n    </span><span class=\"n\">legend.key.width</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">unit</span><span class=\"p\">(</span><span class=\"m\">50</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"pt\"</span><span class=\"p\">),</span><span class=\"w\">\n    </span><span class=\"n\">plot.title</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">element_markdown</span><span class=\"p\">(</span><span class=\"n\">hjust</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">0.5</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">size</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">20</span><span class=\"p\">),</span><span class=\"w\">\n    </span><span class=\"n\">plot.subtitle</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">element_text</span><span class=\"p\">(</span><span class=\"n\">hjust</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">0.5</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">color</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"grey40\"</span><span class=\"p\">),</span><span class=\"w\">\n    </span><span class=\"n\">plot.caption</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">element_markdown</span><span class=\"p\">(</span><span class=\"w\">\n      </span><span class=\"n\">color</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"grey20\"</span><span class=\"p\">,</span><span class=\"w\">\n      </span><span class=\"n\">margin</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">margin</span><span class=\"p\">(</span><span class=\"n\">t</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">20</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">b</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">5</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">unit</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"pt\"</span><span class=\"p\">),</span><span class=\"w\">\n      </span><span class=\"n\">hjust</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">.5</span><span class=\"w\">\n    </span><span class=\"p\">)</span><span class=\"w\">\n  </span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"n\">ggsave</span><span class=\"p\">(</span><span class=\"s2\">\"202312_finalmap_hex.png\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">dpi</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">300</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">width</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">8</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">height</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">8</span><span class=\"p\">)</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<p><img src=\"https://dieghernan.github.io/assets/img/blog/202312_finalmap_hex.webp\" alt=\"Dot density map of the Iberian Peninsula based on a hexagonal grid. Larger dots represent higher population density, highlighting urban clusters.\" /></p>\n\n<p>And that’s it! Which one do you like the most? Let me know in the comments.</p>\n\n<h2 id=\"references\">References</h2>\n\n<ul>\n  <li>Bertin, J. (1967). <em>Sémiologie graphique : Les diagrammes, les réseaux, les\ncartes</em>. Mouton; Gauthier-Villars.\n<a href=\"https://catalogue.bnf.fr/ark:/12148/cb41605817s\">https://catalogue.bnf.fr/ark:/12148/cb41605817s</a></li>\n  <li>Hernangómez, D. (2023). Using the tidyverse with terra objects: The tidyterra\npackage. <em>Journal of Open Source Software, 8</em>(91), Article 5751.\n<a href=\"https://doi.org/10.21105/joss.05751\">https://doi.org/10.21105/joss.05751</a></li>\n  <li>Pesaresi, M., &amp; Politis, P. (2023). <em>GHS-BUILT-C R2023A – GHS settlement\ncharacteristics, derived from Sentinel2 composite (2018) and other GHS R2023A\ndata</em> [Data set]. European Commission, Joint Research Centre.\n<a href=\"https://doi.org/10.2905/3C60DDF6-0586-4190-854B-F6AA0EDC2A30\">DOI</a></li>\n  <li>Schiavina, M., Melchiorri, M., Pesaresi, M., Politis, P., Carneiro Freire,\nS. M., Maffenini, L., Florio, P., Ehrlich, D., Goch, K., Carioli, A.,\nUhl, J., Tommasi, P., &amp; Kemper, T. (2023). <em>GHSL data package 2023</em>\n(JRC133256). Publications Office of the European Union.\n<a href=\"https://doi.org/10.2760/098587\">https://doi.org/10.2760/098587</a></li>\n</ul>\n",
      "date_published": "2023-12-16T00:00:00+01:00",
      "image": "https://dieghernan.github.io/assets/img/blog/202312_finalmap.webp",
      "summary": "Another way to represent demographics on a map.",
      "tags": ["r_bloggers","beautiful_maps","rstats","rspatial","maps","ggplot2","sf","terra","tidyterra","giscoR"],
      "authors": [{
        "name": "Diego HH",
        "url": "https://dieghernan.github.io/"
      }]
    },
    {
      "id": "https://dieghernan.github.io/202301_star-map-R/",
      "url": "https://dieghernan.github.io/202301_star-map-R/",
      "title": "Star map with R",
      "content_html": "<p>A couple of weeks ago I was doing my daily check on\n<a href=\"https://stackoverflow.com/questions/tagged/sf\">Stack Overflow</a> when I found a\nquestion by <a href=\"https://bensstats.wordpress.com/\">Benjamin Smith</a> that blew my\nmind: <a href=\"https://stackoverflow.com/questions/75064069/creating-star-map-visualizations-based-on-location-and-date\">Creating Star Map Visualizations Based on Location and\nDate</a>\n!!</p>\n\n<p>Oh my! Can we do this with <strong>R</strong>? The answer is: Of course! In fact, <a href=\"https://kimnewzealand.github.io/\">Kim\nFitter</a> already worked on this two years earlier,\nsee his <a href=\"https://kimnewzealand.github.io/2019/02/21/celestial-maps/\">Celestial\nMaps</a>. So I decided\nto put some work into this.</p>\n\n<p>Since then, I have also learned that Benjamin and I have been working in parallel\non the same topic. He is preparing an <strong>R</strong> package named\n<a href=\"https://github.com/benyamindsmith/starBliss\"><strong>starBliss</strong></a> and hopefully this\npost will be of some help.</p>\n\n<p class=\"alert alert-info p-3 mx-2 mb-3\">I have very little knowledge of this topic, so if you find errors or\nhave any suggestions, please let me know in the comments section below.</p>\n\n<h2 id=\"first-things-first-the-data\">First things first: the data</h2>\n\n<p>The initial data source for all these projects (Kim’s, Benjamin’s and mine) is the\nsame, and it is provided by the D3 plugin\n<a href=\"https://github.com/ofrohn/d3-celestial/tree/master/data\">d3-celestial</a> by <a href=\"http://armchairastronautics.blogspot.com/\">Olaf\nFrohn</a>. As Kim Fitter pointed out in\n<a href=\"https://kimnewzealand.github.io/2019/02/21/celestial-maps/\">his post</a>, these\ndata files present the problem (experienced by <a href=\"https://stackoverflow.com/search?q=%5Bsf%5D+dateline\">almost any <strong>sf</strong>\nuser</a>) of lines crossing\nthe international date line (longitude 180°). I also found that some files are\nnot valid as per <code class=\"language-plaintext highlighter-rouge\">sf::st_make_valid()</code>.</p>\n\n<p>Solution? I processed and fixed almost every file, including the files\ncorresponding to the Milky Way and the lines for Chinese constellations, manually,\nto provide a set of files. That is the origin of my project <a href=\"https://dieghernan.github.io/celestial_data/\">Celestial\nData</a>, which provides all these\nfiles in several spatial formats. Please <a href=\"https://github.com/dieghernan/celestial_data\">check out the\nrepo</a> to learn more about it.</p>\n\n<h2 id=\"creating-a-star-map-with-r\">Creating a star map with R</h2>\n\n<p>The first step is to load libraries that will help us with this cosmic\ntask:</p>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"c1\"># Spatial manipulation</span><span class=\"w\">\n</span><span class=\"n\">library</span><span class=\"p\">(</span><span class=\"n\">sf</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">library</span><span class=\"p\">(</span><span class=\"n\">s2</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">library</span><span class=\"p\">(</span><span class=\"n\">nominatimlite</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"c1\">## Wrangling data and dates</span><span class=\"w\">\n</span><span class=\"n\">library</span><span class=\"p\">(</span><span class=\"n\">dplyr</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">library</span><span class=\"p\">(</span><span class=\"n\">lubridate</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">library</span><span class=\"p\">(</span><span class=\"n\">lutz</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"c1\">## Visualization</span><span class=\"w\">\n</span><span class=\"n\">library</span><span class=\"p\">(</span><span class=\"n\">ggplot2</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">library</span><span class=\"p\">(</span><span class=\"n\">ggfx</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">library</span><span class=\"p\">(</span><span class=\"n\">ggshadow</span><span class=\"p\">)</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<h3 id=\"helper-functions\">Helper functions</h3>\n\n<p>Now we prepare some helper functions:</p>\n\n<ul>\n  <li>\n    <p><code class=\"language-plaintext highlighter-rouge\">load_celestial()</code> just downloads the corresponding <code class=\"language-plaintext highlighter-rouge\">.geojson</code> from the\n<a href=\"https://github.com/dieghernan/celestial_data/tree/main/data\">Celestial Data\nrepo</a><sup id=\"fnref:1\"><a href=\"#fn:1\" class=\"footnote\" rel=\"footnote\" role=\"doc-noteref\">1</a></sup> to a\nspecific directory <code class=\"language-plaintext highlighter-rouge\">cachedir</code> and loads it with <code class=\"language-plaintext highlighter-rouge\">sf::st_read()</code>.</p>\n  </li>\n  <li>\n    <p><code class=\"language-plaintext highlighter-rouge\">pretty_lonlat()</code> is a labeler that returns a decimal longitude or latitude\ncoordinate in the format degrees/minutes/seconds (e.g., a <strong>latitude of\n34.72782</strong> would be converted into <strong>34° 43’ 40.15” N</strong>).</p>\n  </li>\n</ul>\n\n<details class=\"my-4\">\n\n  <summary>Show <code>load_celestial</code> and\n<code>pretty_lonlat()</code></summary>\n\n  <div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"n\">load_celestial</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"k\">function</span><span class=\"p\">(</span><span class=\"n\">filename</span><span class=\"p\">,</span><span class=\"w\">\n                           </span><span class=\"n\">url</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"https://cdn.jsdelivr.net/gh/dieghernan/celestial_data@main/data/\"</span><span class=\"p\">,</span><span class=\"w\">\n                           </span><span class=\"n\">cachedir</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">tempdir</span><span class=\"p\">())</span><span class=\"w\"> </span><span class=\"p\">{</span><span class=\"w\">\n  </span><span class=\"k\">if</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"o\">!</span><span class=\"n\">dir.exists</span><span class=\"p\">(</span><span class=\"n\">cachedir</span><span class=\"p\">))</span><span class=\"w\"> </span><span class=\"p\">{</span><span class=\"w\">\n    </span><span class=\"n\">stop</span><span class=\"p\">(</span><span class=\"w\">\n      </span><span class=\"s2\">\"Please create \"</span><span class=\"p\">,</span><span class=\"w\">\n      </span><span class=\"n\">path.expand</span><span class=\"p\">(</span><span class=\"n\">cachedir</span><span class=\"p\">),</span><span class=\"w\">\n      </span><span class=\"s2\">\" directory\"</span><span class=\"p\">,</span><span class=\"w\">\n      </span><span class=\"s2\">\"first\"</span><span class=\"w\">\n    </span><span class=\"p\">)</span><span class=\"w\">\n  </span><span class=\"p\">}</span><span class=\"w\">\n\n  </span><span class=\"n\">url</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">file.path</span><span class=\"p\">(</span><span class=\"n\">url</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">filename</span><span class=\"p\">)</span><span class=\"w\">\n  </span><span class=\"n\">local_path</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">file.path</span><span class=\"p\">(</span><span class=\"n\">cachedir</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">filename</span><span class=\"p\">)</span><span class=\"w\">\n\n\n  </span><span class=\"k\">if</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"o\">!</span><span class=\"n\">file.exists</span><span class=\"p\">(</span><span class=\"n\">local_path</span><span class=\"p\">))</span><span class=\"w\"> </span><span class=\"p\">{</span><span class=\"w\">\n    </span><span class=\"n\">download.file</span><span class=\"p\">(</span><span class=\"n\">url</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">local_path</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">mode</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"wb\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">quiet</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">TRUE</span><span class=\"p\">)</span><span class=\"w\">\n  </span><span class=\"p\">}</span><span class=\"w\">\n\n  </span><span class=\"n\">celestial</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">sf</span><span class=\"o\">::</span><span class=\"n\">st_read</span><span class=\"p\">(</span><span class=\"n\">local_path</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">quiet</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">TRUE</span><span class=\"p\">)</span><span class=\"w\">\n\n  </span><span class=\"nf\">return</span><span class=\"p\">(</span><span class=\"n\">celestial</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"p\">}</span><span class=\"w\">\n\n</span><span class=\"n\">pretty_lonlat</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"k\">function</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">type</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">accuracy</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">2</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"p\">{</span><span class=\"w\">\n  </span><span class=\"n\">positive</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">x</span><span class=\"w\"> </span><span class=\"o\">&gt;=</span><span class=\"w\"> </span><span class=\"m\">0</span><span class=\"w\">\n\n  </span><span class=\"c1\"># Decompose</span><span class=\"w\">\n  </span><span class=\"n\">x</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"nf\">abs</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">)</span><span class=\"w\">\n  </span><span class=\"n\">D</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"nf\">as.integer</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">)</span><span class=\"w\">\n  </span><span class=\"n\">m</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"w\"> </span><span class=\"n\">D</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">*</span><span class=\"w\"> </span><span class=\"m\">60</span><span class=\"w\">\n  </span><span class=\"n\">M</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"nf\">as.integer</span><span class=\"p\">(</span><span class=\"n\">m</span><span class=\"p\">)</span><span class=\"w\">\n  </span><span class=\"n\">S</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"nf\">round</span><span class=\"p\">((</span><span class=\"n\">m</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"w\"> </span><span class=\"n\">M</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">*</span><span class=\"w\"> </span><span class=\"m\">60</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">accuracy</span><span class=\"p\">)</span><span class=\"w\">\n\n  </span><span class=\"c1\"># Get label</span><span class=\"w\">\n  </span><span class=\"k\">if</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"n\">type</span><span class=\"w\"> </span><span class=\"o\">==</span><span class=\"w\"> </span><span class=\"s2\">\"lon\"</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"p\">{</span><span class=\"w\">\n    </span><span class=\"n\">lab</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">ifelse</span><span class=\"p\">(</span><span class=\"n\">positive</span><span class=\"w\"> </span><span class=\"o\">&gt;</span><span class=\"w\"> </span><span class=\"m\">0</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"E\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"W\"</span><span class=\"p\">)</span><span class=\"w\">\n  </span><span class=\"p\">}</span><span class=\"w\"> </span><span class=\"k\">else</span><span class=\"w\"> </span><span class=\"p\">{</span><span class=\"w\">\n    </span><span class=\"n\">lab</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">ifelse</span><span class=\"p\">(</span><span class=\"n\">positive</span><span class=\"w\"> </span><span class=\"o\">&gt;</span><span class=\"w\"> </span><span class=\"m\">0</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"N\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"S\"</span><span class=\"p\">)</span><span class=\"w\">\n  </span><span class=\"p\">}</span><span class=\"w\">\n\n\n  </span><span class=\"c1\"># Compose</span><span class=\"w\">\n  </span><span class=\"n\">label</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">paste0</span><span class=\"p\">(</span><span class=\"n\">D</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"\\u00b0 \"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">M</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"' \"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">S</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s1\">'\\\" '</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">lab</span><span class=\"p\">)</span><span class=\"w\">\n  </span><span class=\"nf\">return</span><span class=\"p\">(</span><span class=\"n\">label</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"p\">}</span><span class=\"w\">\n</span></code></pre></div>  </div>\n\n</details>\n\n<p>Additionally, you may notice that on this <a href=\"https://ofrohn.github.io/celestial-demo/location.html\">d3-celestial\ndemo</a> there is some\ndegree of rotation depending on the location and the time. I found how this is\ndone on the <strong>d3-celestial plugin</strong> and I found the function\n<a href=\"https://github.com/ofrohn/d3-celestial/blob/7e720a3de062059d4c5400a379146a601d9010e0/celestial.js#L1215-L1250\"><code class=\"language-plaintext highlighter-rouge\">getMST(dt, lng)</code></a>,\nwhich I ported to <strong>R</strong> (<code class=\"language-plaintext highlighter-rouge\">get_mst()</code>). The function uses Meeus’s (1998) formula\nfor Greenwich mean sidereal time, adds the observer’s east-positive longitude\nand wraps the result to the interval [0°, 360°). This gives local mean sidereal\ntime in degrees. For more detail, see <a href=\"https://squarewidget.com/astronomical-calculations-sidereal-time/\">this\npost</a> by\n<a href=\"https://squarewidget.com/\">James Still</a>.</p>\n\n<p>The inputs are a <code class=\"language-plaintext highlighter-rouge\">POSIXct</code> date-time and the observer’s longitude in degrees.\nThe example uses the returned angle to rotate the star map’s projection.</p>\n\n<details class=\"my-4\">\n\n  <summary>Show <code>get_mst()</code></summary>\n\n  <div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"c1\"># Derive rotation degrees of the projection given a date and a longitude</span><span class=\"w\">\n</span><span class=\"n\">get_mst</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"k\">function</span><span class=\"p\">(</span><span class=\"n\">dt</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">lng</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"p\">{</span><span class=\"w\">\n  </span><span class=\"n\">desired_date_utc</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">lubridate</span><span class=\"o\">::</span><span class=\"n\">with_tz</span><span class=\"p\">(</span><span class=\"n\">dt</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"UTC\"</span><span class=\"p\">)</span><span class=\"w\">\n\n\n  </span><span class=\"n\">yr</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">lubridate</span><span class=\"o\">::</span><span class=\"n\">year</span><span class=\"p\">(</span><span class=\"n\">desired_date_utc</span><span class=\"p\">)</span><span class=\"w\">\n  </span><span class=\"n\">mo</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">lubridate</span><span class=\"o\">::</span><span class=\"n\">month</span><span class=\"p\">(</span><span class=\"n\">desired_date_utc</span><span class=\"p\">)</span><span class=\"w\">\n  </span><span class=\"n\">dy</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">lubridate</span><span class=\"o\">::</span><span class=\"n\">day</span><span class=\"p\">(</span><span class=\"n\">desired_date_utc</span><span class=\"p\">)</span><span class=\"w\">\n  </span><span class=\"n\">h</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">lubridate</span><span class=\"o\">::</span><span class=\"n\">hour</span><span class=\"p\">(</span><span class=\"n\">desired_date_utc</span><span class=\"p\">)</span><span class=\"w\">\n  </span><span class=\"n\">m</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">lubridate</span><span class=\"o\">::</span><span class=\"n\">minute</span><span class=\"p\">(</span><span class=\"n\">desired_date_utc</span><span class=\"p\">)</span><span class=\"w\">\n  </span><span class=\"n\">s</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">lubridate</span><span class=\"o\">::</span><span class=\"n\">second</span><span class=\"p\">(</span><span class=\"n\">desired_date_utc</span><span class=\"p\">)</span><span class=\"w\">\n\n  </span><span class=\"k\">if</span><span class=\"w\"> </span><span class=\"p\">((</span><span class=\"n\">mo</span><span class=\"w\"> </span><span class=\"o\">==</span><span class=\"w\"> </span><span class=\"m\">1</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">||</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"n\">mo</span><span class=\"w\"> </span><span class=\"o\">==</span><span class=\"w\"> </span><span class=\"m\">2</span><span class=\"p\">))</span><span class=\"w\"> </span><span class=\"p\">{</span><span class=\"w\">\n    </span><span class=\"n\">yr</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">yr</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"w\"> </span><span class=\"m\">1</span><span class=\"w\">\n    </span><span class=\"n\">mo</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">mo</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"m\">12</span><span class=\"w\">\n  </span><span class=\"p\">}</span><span class=\"w\">\n\n  </span><span class=\"c1\"># Adjust times before Gregorian Calendar</span><span class=\"w\">\n  </span><span class=\"c1\"># See https://squarewidget.com/julian-day/</span><span class=\"w\">\n  </span><span class=\"k\">if</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"n\">lubridate</span><span class=\"o\">::</span><span class=\"n\">as_date</span><span class=\"p\">(</span><span class=\"n\">dt</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">&gt;</span><span class=\"w\"> </span><span class=\"n\">as.Date</span><span class=\"p\">(</span><span class=\"s2\">\"1582-10-14\"</span><span class=\"p\">))</span><span class=\"w\"> </span><span class=\"p\">{</span><span class=\"w\">\n    </span><span class=\"n\">a</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"nf\">floor</span><span class=\"p\">(</span><span class=\"n\">yr</span><span class=\"w\"> </span><span class=\"o\">/</span><span class=\"w\"> </span><span class=\"m\">100</span><span class=\"p\">)</span><span class=\"w\">\n    </span><span class=\"n\">b</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"m\">2</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"w\"> </span><span class=\"n\">a</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"nf\">floor</span><span class=\"p\">(</span><span class=\"n\">a</span><span class=\"w\"> </span><span class=\"o\">/</span><span class=\"w\"> </span><span class=\"m\">4</span><span class=\"p\">)</span><span class=\"w\">\n  </span><span class=\"p\">}</span><span class=\"w\"> </span><span class=\"k\">else</span><span class=\"w\"> </span><span class=\"p\">{</span><span class=\"w\">\n    </span><span class=\"n\">b</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"m\">0</span><span class=\"w\">\n  </span><span class=\"p\">}</span><span class=\"w\">\n  </span><span class=\"n\">c</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"nf\">floor</span><span class=\"p\">(</span><span class=\"m\">365.25</span><span class=\"w\"> </span><span class=\"o\">*</span><span class=\"w\"> </span><span class=\"n\">yr</span><span class=\"p\">)</span><span class=\"w\">\n  </span><span class=\"n\">d</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"nf\">floor</span><span class=\"p\">(</span><span class=\"m\">30.6001</span><span class=\"w\"> </span><span class=\"o\">*</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"n\">mo</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"m\">1</span><span class=\"p\">))</span><span class=\"w\">\n\n  </span><span class=\"c1\"># days since J2000.0</span><span class=\"w\">\n  </span><span class=\"n\">jd</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">b</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"n\">c</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"n\">d</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"w\"> </span><span class=\"m\">730550.5</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"n\">dy</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"n\">h</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"n\">m</span><span class=\"w\"> </span><span class=\"o\">/</span><span class=\"w\"> </span><span class=\"m\">60</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"n\">s</span><span class=\"w\"> </span><span class=\"o\">/</span><span class=\"w\"> </span><span class=\"m\">3600</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">/</span><span class=\"w\"> </span><span class=\"m\">24</span><span class=\"w\">\n  </span><span class=\"n\">jt</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">jd</span><span class=\"w\"> </span><span class=\"o\">/</span><span class=\"w\"> </span><span class=\"m\">36525</span><span class=\"w\">\n\n  </span><span class=\"c1\"># Rotation</span><span class=\"w\">\n  </span><span class=\"n\">mst</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"m\">280.46061837</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"m\">360.98564736629</span><span class=\"w\"> </span><span class=\"o\">*</span><span class=\"w\"> </span><span class=\"n\">jd</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n    </span><span class=\"m\">0.000387933</span><span class=\"w\"> </span><span class=\"o\">*</span><span class=\"w\"> </span><span class=\"n\">jt</span><span class=\"o\">^</span><span class=\"m\">2</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"w\"> </span><span class=\"n\">jt</span><span class=\"o\">^</span><span class=\"m\">3</span><span class=\"w\"> </span><span class=\"o\">/</span><span class=\"w\"> </span><span class=\"m\">38710000.0</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"n\">lng</span><span class=\"w\">\n\n  </span><span class=\"c1\"># Modulo 360 degrees</span><span class=\"w\">\n  </span><span class=\"n\">mst</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">mst</span><span class=\"w\"> </span><span class=\"o\">%%</span><span class=\"w\"> </span><span class=\"m\">360</span><span class=\"w\">\n\n  </span><span class=\"nf\">return</span><span class=\"p\">(</span><span class=\"n\">mst</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"p\">}</span><span class=\"w\">\n</span></code></pre></div>  </div>\n\n</details>\n\n<p>The final result would have a spherical outline. That means that we would need\nto perform a spherical cut. Did you know that <a href=\"https://r-spatial.org/r/2020/06/17/s2.html\">in r-spatial the Earth is no\nlonger flat</a>? Thanks to <strong>s2</strong> we can\novercome this issue. Additionally, we would get rid of <a href=\"https://stackoverflow.com/questions/75205747/how-to-remove-random-diagonal-lines-from-star-map-vizualizations-produced-by-geo/75212722#75212722\">artifacts derived from\nthe changes on the\nprojection</a>.\nThis also includes some refinements to avoid empty/non-valid geometries as well\nas <code class=\"language-plaintext highlighter-rouge\">GEOMETRYCOLLECTION</code> handling. The function <code class=\"language-plaintext highlighter-rouge\">sf_spherical_cut()</code> would do\nthat for us.</p>\n\n<details class=\"my-4\">\n\n  <summary>Show <code>sf_spherical_cut()</code></summary>\n\n  <div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"c1\"># Cut a sf object with a buffer using spherical s2 geoms</span><span class=\"w\">\n</span><span class=\"c1\"># Optionally, project and flip</span><span class=\"w\">\n\n</span><span class=\"n\">sf_spherical_cut</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"k\">function</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">the_buff</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">the_crs</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">sf</span><span class=\"o\">::</span><span class=\"n\">st_crs</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">),</span><span class=\"w\"> </span><span class=\"n\">flip</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">NULL</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"p\">{</span><span class=\"w\">\n  </span><span class=\"c1\"># Get geometry type</span><span class=\"w\">\n  </span><span class=\"n\">geomtype</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">unique</span><span class=\"p\">(</span><span class=\"n\">gsub</span><span class=\"p\">(</span><span class=\"s2\">\"MULTI\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">sf</span><span class=\"o\">::</span><span class=\"n\">st_geometry_type</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">)))[</span><span class=\"m\">1</span><span class=\"p\">]</span><span class=\"w\">\n\n  </span><span class=\"c1\"># Keep the data frame, s2 drops it</span><span class=\"w\">\n  </span><span class=\"n\">the_df</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">sf</span><span class=\"o\">::</span><span class=\"n\">st_drop_geometry</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">)</span><span class=\"w\">\n  </span><span class=\"n\">the_geom</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">sf</span><span class=\"o\">::</span><span class=\"n\">st_geometry</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">)</span><span class=\"w\">\n  </span><span class=\"c1\"># Convert to s2 if needed</span><span class=\"w\">\n  </span><span class=\"k\">if</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"o\">!</span><span class=\"n\">inherits</span><span class=\"p\">(</span><span class=\"n\">the_buff</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"s2_geography\"</span><span class=\"p\">))</span><span class=\"w\"> </span><span class=\"p\">{</span><span class=\"w\">\n    </span><span class=\"n\">the_buff</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">sf</span><span class=\"o\">::</span><span class=\"n\">st_as_s2</span><span class=\"p\">(</span><span class=\"n\">the_buff</span><span class=\"p\">)</span><span class=\"w\">\n  </span><span class=\"p\">}</span><span class=\"w\">\n\n  </span><span class=\"n\">the_cut</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">the_geom</span><span class=\"w\"> </span><span class=\"o\">%&gt;%</span><span class=\"w\">\n    </span><span class=\"c1\"># Cut with s2</span><span class=\"w\">\n    </span><span class=\"n\">sf</span><span class=\"o\">::</span><span class=\"n\">st_as_s2</span><span class=\"p\">()</span><span class=\"w\"> </span><span class=\"o\">%&gt;%</span><span class=\"w\">\n    </span><span class=\"n\">s2</span><span class=\"o\">::</span><span class=\"n\">s2_intersection</span><span class=\"p\">(</span><span class=\"n\">the_buff</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">%&gt;%</span><span class=\"w\">\n    </span><span class=\"c1\"># Back to sf and add the df</span><span class=\"w\">\n    </span><span class=\"n\">sf</span><span class=\"o\">::</span><span class=\"n\">st_as_sfc</span><span class=\"p\">()</span><span class=\"w\"> </span><span class=\"o\">%&gt;%</span><span class=\"w\">\n    </span><span class=\"n\">sf</span><span class=\"o\">::</span><span class=\"n\">st_sf</span><span class=\"p\">(</span><span class=\"n\">the_df</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">geometry</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">.</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">%&gt;%</span><span class=\"w\">\n    </span><span class=\"n\">dplyr</span><span class=\"o\">::</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"o\">!</span><span class=\"n\">sf</span><span class=\"o\">::</span><span class=\"n\">st_is_empty</span><span class=\"p\">(</span><span class=\"n\">.</span><span class=\"p\">))</span><span class=\"w\"> </span><span class=\"o\">%&gt;%</span><span class=\"w\">\n    </span><span class=\"n\">sf</span><span class=\"o\">::</span><span class=\"n\">st_transform</span><span class=\"p\">(</span><span class=\"n\">crs</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">the_crs</span><span class=\"p\">)</span><span class=\"w\">\n\n  </span><span class=\"c1\"># If it is not POINT filter by valid and non-empty</span><span class=\"w\">\n  </span><span class=\"c1\"># This is for performance</span><span class=\"w\">\n  </span><span class=\"k\">if</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"o\">!</span><span class=\"n\">geomtype</span><span class=\"w\"> </span><span class=\"o\">==</span><span class=\"w\"> </span><span class=\"s2\">\"POINT\"</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"p\">{</span><span class=\"w\">\n    </span><span class=\"c1\"># If any is GEOMETRYCOLLECTION extract the right value</span><span class=\"w\">\n    </span><span class=\"k\">if</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"nf\">any</span><span class=\"p\">(</span><span class=\"n\">sf</span><span class=\"o\">::</span><span class=\"n\">st_geometry_type</span><span class=\"p\">(</span><span class=\"n\">the_cut</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">==</span><span class=\"w\"> </span><span class=\"s2\">\"GEOMETRYCOLLECTION\"</span><span class=\"p\">))</span><span class=\"w\"> </span><span class=\"p\">{</span><span class=\"w\">\n      </span><span class=\"n\">the_cut</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">the_cut</span><span class=\"w\"> </span><span class=\"o\">%&gt;%</span><span class=\"w\">\n        </span><span class=\"n\">sf</span><span class=\"o\">::</span><span class=\"n\">st_collection_extract</span><span class=\"p\">(</span><span class=\"n\">type</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">geomtype</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">warn</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">FALSE</span><span class=\"p\">)</span><span class=\"w\">\n    </span><span class=\"p\">}</span><span class=\"w\">\n\n    </span><span class=\"n\">the_cut</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">the_cut</span><span class=\"w\"> </span><span class=\"o\">%&gt;%</span><span class=\"w\">\n      </span><span class=\"n\">dplyr</span><span class=\"o\">::</span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"o\">!</span><span class=\"nf\">is.na</span><span class=\"p\">(</span><span class=\"n\">sf</span><span class=\"o\">::</span><span class=\"n\">st_is_valid</span><span class=\"p\">(</span><span class=\"n\">.</span><span class=\"p\">)))</span><span class=\"w\">\n  </span><span class=\"p\">}</span><span class=\"w\">\n\n  </span><span class=\"k\">if</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"o\">!</span><span class=\"nf\">is.null</span><span class=\"p\">(</span><span class=\"n\">flip</span><span class=\"p\">))</span><span class=\"w\"> </span><span class=\"p\">{</span><span class=\"w\">\n    </span><span class=\"n\">the_cut</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">the_cut</span><span class=\"w\"> </span><span class=\"o\">%&gt;%</span><span class=\"w\">\n      </span><span class=\"n\">dplyr</span><span class=\"o\">::</span><span class=\"n\">mutate</span><span class=\"p\">(</span><span class=\"n\">geometry</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">geometry</span><span class=\"w\"> </span><span class=\"o\">*</span><span class=\"w\"> </span><span class=\"n\">flip</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">%&gt;%</span><span class=\"w\">\n      </span><span class=\"n\">sf</span><span class=\"o\">::</span><span class=\"n\">st_set_crs</span><span class=\"p\">(</span><span class=\"n\">the_crs</span><span class=\"p\">)</span><span class=\"w\">\n  </span><span class=\"p\">}</span><span class=\"w\">\n\n  </span><span class=\"nf\">return</span><span class=\"p\">(</span><span class=\"n\">the_cut</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"p\">}</span><span class=\"w\">\n</span></code></pre></div>  </div>\n\n</details>\n\n<h3 id=\"inputs\">Inputs</h3>\n\n<p>Now we are ready to start creating our visualization. We need only two inputs:</p>\n\n<ul>\n  <li>\n    <p>A desired location, which we will geocode with <strong>nominatimlite</strong>.</p>\n  </li>\n  <li>\n    <p>A specific moment in time.</p>\n  </li>\n</ul>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"c1\"># Inputs</span><span class=\"w\">\n</span><span class=\"n\">desired_place</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"s2\">\"Madrid, Spain\"</span><span class=\"w\">\n\n</span><span class=\"c1\"># We are not using yet the timezone</span><span class=\"w\">\n</span><span class=\"n\">desired_date</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">make_datetime</span><span class=\"p\">(</span><span class=\"w\">\n  </span><span class=\"n\">year</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">2015</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">month</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">9</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">day</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">22</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">hour</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">3</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">min</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">45</span><span class=\"w\">\n</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"c1\"># Geocode place with nominatimlite</span><span class=\"w\">\n</span><span class=\"n\">desired_place_geo</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">geo_lite</span><span class=\"p\">(</span><span class=\"n\">desired_place</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">full_results</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">TRUE</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"n\">desired_place_geo</span><span class=\"w\"> </span><span class=\"o\">%&gt;%</span><span class=\"w\">\n  </span><span class=\"n\">select</span><span class=\"p\">(</span><span class=\"n\">address</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">lat</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">lon</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"c1\">#&gt; # A tibble: 1 × 3</span><span class=\"w\">\n</span><span class=\"c1\">#&gt;   address                                                                                    lat   lon</span><span class=\"w\">\n</span><span class=\"c1\">#&gt;   &lt;chr&gt;                                                                                    &lt;dbl&gt; &lt;dbl&gt;</span><span class=\"w\">\n</span><span class=\"c1\">#&gt; 1 Madrid, Área metropolitana de Madrid y Corredor del Henares, Comunidad de Madrid, España  40.4 -3.70</span><span class=\"w\">\n\n</span><span class=\"c1\"># And get the coordinates</span><span class=\"w\">\n</span><span class=\"n\">desired_loc</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">desired_place_geo</span><span class=\"w\"> </span><span class=\"o\">%&gt;%</span><span class=\"w\">\n  </span><span class=\"n\">select</span><span class=\"p\">(</span><span class=\"n\">lat</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">lon</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">%&gt;%</span><span class=\"w\">\n  </span><span class=\"n\">unlist</span><span class=\"p\">()</span><span class=\"w\">\n\n</span><span class=\"n\">desired_loc</span><span class=\"w\">\n</span><span class=\"c1\">#&gt;       lat       lon</span><span class=\"w\">\n</span><span class=\"c1\">#&gt; 40.416705 -3.703582</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<p>With respect to our object <code class=\"language-plaintext highlighter-rouge\">desired_date</code>, it is quite relevant for accurate\nplotting to specify the correct time zone. Since we already know the latitude and\nlongitude of our desired location, we can easily get that with the <strong>lutz</strong>\npackage:</p>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"n\">desired_date</span><span class=\"w\">\n</span><span class=\"c1\">#&gt; [1] \"2015-09-22 03:45:00 UTC\"</span><span class=\"w\">\n\n</span><span class=\"c1\"># Get tz</span><span class=\"w\">\n</span><span class=\"n\">get_tz</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">tz_lookup_coords</span><span class=\"p\">(</span><span class=\"n\">desired_loc</span><span class=\"p\">[</span><span class=\"m\">1</span><span class=\"p\">],</span><span class=\"w\"> </span><span class=\"n\">desired_loc</span><span class=\"p\">[</span><span class=\"m\">2</span><span class=\"p\">],</span><span class=\"w\"> </span><span class=\"n\">warn</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">FALSE</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"n\">get_tz</span><span class=\"w\">\n</span><span class=\"c1\">#&gt; [1] \"Europe/Madrid\"</span><span class=\"w\">\n\n</span><span class=\"c1\"># Force it to be local time</span><span class=\"w\">\n</span><span class=\"n\">desired_date_tz</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">force_tz</span><span class=\"p\">(</span><span class=\"n\">desired_date</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">get_tz</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"n\">desired_date_tz</span><span class=\"w\">\n</span><span class=\"c1\">#&gt; [1] \"2015-09-22 03:45:00 CEST\"</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<h4 id=\"about-time-zones\">About time zones</h4>\n\n<p>Some online shops that create this kind of map (I won’t post links) include\nthis script:</p>\n\n<div class=\"language-plaintext highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code>...\n\n'selectedHour': '22',\n'selectedMinute': '00',\n\n...\n</code></pre></div></div>\n\n<p>This means that those shops are really creating the map at\n<code class=\"language-plaintext highlighter-rouge\">YYYY-MM-DD 22:00:00 UTC</code>. If you want to replicate that exactly (even though\nthe resulting night sky is not accurate—for example, in New Zealand the local\ntime at that moment would be 10:00, so no stars would be visible), you would\nneed to adjust <code class=\"language-plaintext highlighter-rouge\">desired_date_tz</code> as follows:</p>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"n\">as_datetime</span><span class=\"p\">(</span><span class=\"n\">paste</span><span class=\"p\">(</span><span class=\"n\">as.Date</span><span class=\"p\">(</span><span class=\"n\">desired_date_tz</span><span class=\"p\">),</span><span class=\"w\"> </span><span class=\"s2\">\"22:00:00\"</span><span class=\"p\">),</span><span class=\"w\"> </span><span class=\"n\">tz</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"UTC\"</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"c1\">#&gt; [1] \"2015-09-22 22:00:00 UTC\"</span><span class=\"w\">\n\n</span><span class=\"c1\"># That would really correspond to 10:00</span><span class=\"w\">\n</span><span class=\"n\">as_datetime</span><span class=\"p\">(</span><span class=\"n\">paste</span><span class=\"p\">(</span><span class=\"n\">as.Date</span><span class=\"p\">(</span><span class=\"n\">desired_date_tz</span><span class=\"p\">),</span><span class=\"w\"> </span><span class=\"s2\">\"22:00:00\"</span><span class=\"p\">),</span><span class=\"w\"> </span><span class=\"n\">tz</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"UTC\"</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">%&gt;%</span><span class=\"w\">\n  </span><span class=\"n\">with_tz</span><span class=\"p\">(</span><span class=\"s2\">\"Pacific/Auckland\"</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"c1\">#&gt; [1] \"2015-09-23 10:00:00 NZST\"</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<h3 id=\"setup\">Setup</h3>\n\n<p>Now we can start creating our buffers and projections, which will help us to\ncrop the celestial data objects.</p>\n\n<p>I also noticed that the <a href=\"https://ofrohn.github.io/celestial-demo/location.html\">location\ndemo</a> of\n<strong>d3-celestial.js</strong> uses <a href=\"https://github.com/ofrohn/d3-celestial/blob/7e720a3de062059d4c5400a379146a601d9010e0/demo/location.html#L17-L22\">Airy\nprojection</a>,\nso we are going to replicate that as well:</p>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"c1\"># Get the rotation and prepare buffer and projection</span><span class=\"w\">\n\n</span><span class=\"c1\"># Get right degrees</span><span class=\"w\">\n</span><span class=\"n\">lon_prj</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">get_mst</span><span class=\"p\">(</span><span class=\"n\">desired_date_tz</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">desired_loc</span><span class=\"p\">[</span><span class=\"m\">2</span><span class=\"p\">])</span><span class=\"w\">\n</span><span class=\"n\">lat_prj</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">desired_loc</span><span class=\"p\">[</span><span class=\"m\">1</span><span class=\"p\">]</span><span class=\"w\">\n\n</span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"n\">lon_prj</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">lat_prj</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"c1\">#&gt;      lon      lat</span><span class=\"w\">\n</span><span class=\"c1\">#&gt; 23.15892 40.41670</span><span class=\"w\">\n\n</span><span class=\"c1\"># Create proj4string w/ Airy projection</span><span class=\"w\">\n\n</span><span class=\"n\">target_crs</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">paste0</span><span class=\"p\">(</span><span class=\"s2\">\"+proj=airy +x_0=0 +y_0=0 +lon_0=\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">lon_prj</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\" +lat_0=\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">lat_prj</span><span class=\"p\">)</span><span class=\"w\">\n\n\n</span><span class=\"n\">target_crs</span><span class=\"w\">\n</span><span class=\"c1\">#&gt; [1] \"+proj=airy +x_0=0 +y_0=0 +lon_0=23.1589164999314 +lat_0=40.4167047\"</span><span class=\"w\">\n\n</span><span class=\"c1\"># Flip celestial objects to give the impression of viewing the sky from Earth,</span><span class=\"w\">\n</span><span class=\"c1\"># rather than viewing the Earth from the sky.</span><span class=\"w\">\n</span><span class=\"c1\"># https://stackoverflow.com/a/75064359/7877917</span><span class=\"w\">\n</span><span class=\"c1\"># Flip matrix for affine transformation</span><span class=\"w\">\n\n</span><span class=\"n\">flip_matrix</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">matrix</span><span class=\"p\">(</span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"m\">-1</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">0</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">0</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">1</span><span class=\"p\">),</span><span class=\"w\"> </span><span class=\"m\">2</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">2</span><span class=\"p\">)</span><span class=\"w\">\n\n\n</span><span class=\"c1\"># And create an s2 buffer of the visible hemisphere at the given location</span><span class=\"w\">\n</span><span class=\"n\">hemisphere_s2</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">s2_buffer_cells</span><span class=\"p\">(</span><span class=\"w\">\n  </span><span class=\"n\">as_s2_geography</span><span class=\"p\">(</span><span class=\"w\">\n    </span><span class=\"n\">paste0</span><span class=\"p\">(</span><span class=\"s2\">\"POINT(\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">lon_prj</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\" \"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">lat_prj</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\")\"</span><span class=\"p\">)</span><span class=\"w\">\n  </span><span class=\"p\">),</span><span class=\"w\">\n  </span><span class=\"m\">9800000</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">max_cells</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">5000</span><span class=\"w\">\n</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"c1\"># This one is for plotting</span><span class=\"w\">\n</span><span class=\"n\">hemisphere_sf</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">hemisphere_s2</span><span class=\"w\"> </span><span class=\"o\">%&gt;%</span><span class=\"w\">\n  </span><span class=\"n\">st_as_sf</span><span class=\"p\">()</span><span class=\"w\"> </span><span class=\"o\">%&gt;%</span><span class=\"w\">\n  </span><span class=\"n\">st_transform</span><span class=\"p\">(</span><span class=\"n\">crs</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">target_crs</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">%&gt;%</span><span class=\"w\">\n  </span><span class=\"n\">st_make_valid</span><span class=\"p\">()</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<h3 id=\"celestial-data\">Celestial data</h3>\n\n<p>Now, we can load the data of our choice. In this case, I have chosen to\nrepresent the Milky Way, constellation lines and stars.</p>\n\n<p>We also add some additional variables that would help us to improve the\nvisualization.</p>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"n\">mw</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">load_celestial</span><span class=\"p\">(</span><span class=\"s2\">\"mw.min.geojson\"</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"c1\"># Add colors to MW to use on fill</span><span class=\"w\">\n</span><span class=\"n\">cols</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">colorRampPalette</span><span class=\"p\">(</span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"s2\">\"white\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"yellow\"</span><span class=\"p\">))(</span><span class=\"m\">5</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">mw</span><span class=\"o\">$</span><span class=\"n\">fill</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">factor</span><span class=\"p\">(</span><span class=\"n\">cols</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">levels</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">cols</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"n\">ggplot</span><span class=\"p\">(</span><span class=\"n\">mw</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">geom_sf</span><span class=\"p\">(</span><span class=\"n\">aes</span><span class=\"p\">(</span><span class=\"n\">fill</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">fill</span><span class=\"p\">))</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">scale_fill_identity</span><span class=\"p\">()</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<p><img src=\"https://dieghernan.github.io/assets/img/blog/20230125_mw-1.webp\" alt=\"Full-sky map of the Milky Way in longitude and latitude coordinates. Filled bands trace its curved extent across the sky.\" width=\"100%\" /></p>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"w\">\n</span><span class=\"c1\"># And process it</span><span class=\"w\">\n\n</span><span class=\"c1\"># Cut to buffer</span><span class=\"w\">\n</span><span class=\"n\">mw_end</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">sf_spherical_cut</span><span class=\"p\">(</span><span class=\"n\">mw</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">the_buff</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">hemisphere_s2</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"c1\"># Change the crs</span><span class=\"w\">\n  </span><span class=\"n\">the_crs</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">target_crs</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">flip</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">flip_matrix</span><span class=\"w\">\n</span><span class=\"p\">)</span><span class=\"w\">\n\n\n</span><span class=\"n\">ggplot</span><span class=\"p\">(</span><span class=\"n\">mw_end</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">geom_sf</span><span class=\"p\">(</span><span class=\"n\">aes</span><span class=\"p\">(</span><span class=\"n\">fill</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">fill</span><span class=\"p\">))</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">scale_fill_identity</span><span class=\"p\">()</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<p><img src=\"https://dieghernan.github.io/assets/img/blog/20230125_mw-2.webp\" alt=\"Milky Way bands clipped and projected to the selected viewing hemisphere.\" width=\"100%\" /></p>\n\n<p>Now it is the turn of the constellations:</p>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"n\">const</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">load_celestial</span><span class=\"p\">(</span><span class=\"s2\">\"constellations.lines.min.geojson\"</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"n\">ggplot</span><span class=\"p\">(</span><span class=\"n\">const</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">geom_sf</span><span class=\"p\">()</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">coord_sf</span><span class=\"p\">(</span><span class=\"n\">expand</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">FALSE</span><span class=\"p\">)</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<p><img src=\"https://dieghernan.github.io/assets/img/blog/20230125_const-1.webp\" alt=\"Full-sky map of constellation lines in longitude and latitude coordinates, with line segments connecting stars into constellation outlines.\" width=\"100%\" /></p>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"w\">\n</span><span class=\"c1\"># Cut to buffer</span><span class=\"w\">\n\n</span><span class=\"n\">const_end</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">sf_spherical_cut</span><span class=\"p\">(</span><span class=\"n\">const</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">the_buff</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">hemisphere_s2</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"c1\"># Change the crs</span><span class=\"w\">\n  </span><span class=\"n\">the_crs</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">target_crs</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">flip</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">flip_matrix</span><span class=\"w\">\n</span><span class=\"p\">)</span><span class=\"w\">\n\n\n</span><span class=\"n\">ggplot</span><span class=\"p\">(</span><span class=\"n\">const_end</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">geom_sf</span><span class=\"p\">()</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">coord_sf</span><span class=\"p\">(</span><span class=\"n\">expand</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">FALSE</span><span class=\"p\">)</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<p><img src=\"https://dieghernan.github.io/assets/img/blog/20230125_const-2.webp\" alt=\"Constellation lines clipped and projected to the selected circular viewing hemisphere.\" width=\"100%\" /></p>\n\n<p>And finally the stars:</p>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"n\">stars</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">load_celestial</span><span class=\"p\">(</span><span class=\"s2\">\"stars.6.min.geojson\"</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"n\">ggplot</span><span class=\"p\">(</span><span class=\"n\">stars</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"c1\"># We use relative brightness (br) as aes</span><span class=\"w\">\n  </span><span class=\"n\">geom_sf</span><span class=\"p\">(</span><span class=\"n\">aes</span><span class=\"p\">(</span><span class=\"n\">size</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">br</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">alpha</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">br</span><span class=\"p\">),</span><span class=\"w\"> </span><span class=\"n\">shape</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">16</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">scale_size_continuous</span><span class=\"p\">(</span><span class=\"n\">range</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"m\">0.5</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">6</span><span class=\"p\">))</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">scale_alpha_continuous</span><span class=\"p\">(</span><span class=\"n\">range</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"m\">0.1</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">0.8</span><span class=\"p\">))</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">coord_sf</span><span class=\"p\">(</span><span class=\"n\">expand</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">FALSE</span><span class=\"p\">)</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<p><img src=\"https://dieghernan.github.io/assets/img/blog/20230125_stars-1.webp\" alt=\"Full-sky map of stars in longitude and latitude coordinates. Larger and more opaque points represent brighter stars.\" width=\"100%\" /></p>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"w\">\n</span><span class=\"c1\"># Cut to buffer</span><span class=\"w\">\n\n</span><span class=\"n\">stars_end</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">sf_spherical_cut</span><span class=\"p\">(</span><span class=\"n\">stars</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">the_buff</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">hemisphere_s2</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"c1\"># Change the crs</span><span class=\"w\">\n  </span><span class=\"n\">the_crs</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">target_crs</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">flip</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">flip_matrix</span><span class=\"w\">\n</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"n\">ggplot</span><span class=\"p\">(</span><span class=\"n\">stars_end</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"c1\"># We use relative brightness (br) as aes</span><span class=\"w\">\n  </span><span class=\"n\">geom_sf</span><span class=\"p\">(</span><span class=\"n\">aes</span><span class=\"p\">(</span><span class=\"n\">size</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">br</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">alpha</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">br</span><span class=\"p\">),</span><span class=\"w\"> </span><span class=\"n\">shape</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">16</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">scale_size_continuous</span><span class=\"p\">(</span><span class=\"n\">range</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"m\">0.5</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">6</span><span class=\"p\">))</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">scale_alpha_continuous</span><span class=\"p\">(</span><span class=\"n\">range</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"m\">0.1</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">0.8</span><span class=\"p\">))</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<p><img src=\"https://dieghernan.github.io/assets/img/blog/20230125_stars-2.webp\" alt=\"Star map clipped and projected to the selected circular viewing hemisphere. Larger and more opaque points represent brighter stars.\" width=\"100%\" /></p>\n\n<h3 id=\"graticules\">Graticules</h3>\n\n<p>We are also going to include graticules, so the Earth’s poles can be quickly\nspotted. In this case we don’t apply any affine transformation, so the <code class=\"language-plaintext highlighter-rouge\">flip</code>\nparameter of <code class=\"language-plaintext highlighter-rouge\">sf_spherical_cut()</code> needs to be set as <code class=\"language-plaintext highlighter-rouge\">NULL</code>.</p>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"n\">grat</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">st_graticule</span><span class=\"p\">(</span><span class=\"w\">\n  </span><span class=\"n\">ndiscr</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">5000</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">lat</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">seq</span><span class=\"p\">(</span><span class=\"m\">-90</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">90</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">10</span><span class=\"p\">),</span><span class=\"w\">\n  </span><span class=\"n\">lon</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">seq</span><span class=\"p\">(</span><span class=\"m\">-180</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">180</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">30</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"n\">ggplot</span><span class=\"p\">(</span><span class=\"n\">grat</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">geom_sf</span><span class=\"p\">()</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">coord_sf</span><span class=\"p\">(</span><span class=\"n\">expand</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">FALSE</span><span class=\"p\">)</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<p><img src=\"https://dieghernan.github.io/assets/img/blog/20230125_grat-1.webp\" alt=\"Rectangular coordinate grid with latitude lines every 10 degrees and longitude lines every 30 degrees.\" width=\"100%\" /></p>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"w\">\n</span><span class=\"c1\"># Cut to buffer; we don't flip this one (it is not an object of the space)</span><span class=\"w\">\n</span><span class=\"n\">grat_end</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">sf_spherical_cut</span><span class=\"p\">(</span><span class=\"w\">\n  </span><span class=\"n\">x</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">grat</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">the_buff</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">hemisphere_s2</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"c1\"># Change the crs</span><span class=\"w\">\n  </span><span class=\"n\">the_crs</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">target_crs</span><span class=\"w\">\n</span><span class=\"p\">)</span><span class=\"w\">\n\n\n</span><span class=\"n\">ggplot</span><span class=\"p\">(</span><span class=\"n\">grat_end</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">geom_sf</span><span class=\"p\">()</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">coord_sf</span><span class=\"p\">(</span><span class=\"n\">expand</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">FALSE</span><span class=\"p\">)</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<p><img src=\"https://dieghernan.github.io/assets/img/blog/20230125_grat-2.webp\" alt=\"Coordinate grid projected to the selected hemisphere. Curved latitude lines and converging longitude lines reveal the pole.\" width=\"100%\" /></p>\n\n<h2 id=\"visualization-with-ggplot2\">Visualization with <strong>ggplot2</strong></h2>\n\n<p>We are almost set! For preparing the final map, first we are going to create the\ncorresponding labels, which will be included as <code class=\"language-plaintext highlighter-rouge\">caption</code> on the <strong>ggplot2</strong> map:</p>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"n\">lat_lab</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">pretty_lonlat</span><span class=\"p\">(</span><span class=\"n\">desired_loc</span><span class=\"p\">[</span><span class=\"m\">1</span><span class=\"p\">],</span><span class=\"w\"> </span><span class=\"n\">type</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"lat\"</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">lon_lab</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">pretty_lonlat</span><span class=\"p\">(</span><span class=\"n\">desired_loc</span><span class=\"p\">[</span><span class=\"m\">2</span><span class=\"p\">],</span><span class=\"w\"> </span><span class=\"n\">type</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"lon\"</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"n\">pretty_labs</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">paste</span><span class=\"p\">(</span><span class=\"n\">lat_lab</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"/\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">lon_lab</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"n\">cat</span><span class=\"p\">(</span><span class=\"n\">pretty_labs</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"c1\">#&gt; 40° 25' 0.14\" N / 3° 42' 12.9\" W</span><span class=\"w\">\n\n</span><span class=\"c1\"># Create final caption to put on bottom</span><span class=\"w\">\n\n</span><span class=\"n\">pretty_time</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">paste</span><span class=\"p\">(</span><span class=\"w\">\n  </span><span class=\"c1\"># Pretty Day</span><span class=\"w\">\n  </span><span class=\"n\">scales</span><span class=\"o\">::</span><span class=\"n\">label_date</span><span class=\"p\">(</span><span class=\"w\">\n    </span><span class=\"n\">format</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"%d %b %Y\"</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"n\">locale</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"en\"</span><span class=\"w\">\n  </span><span class=\"p\">)(</span><span class=\"n\">desired_date_tz</span><span class=\"p\">),</span><span class=\"w\">\n  </span><span class=\"c1\"># Pretty Hour</span><span class=\"w\">\n  </span><span class=\"n\">format</span><span class=\"p\">(</span><span class=\"n\">desired_date_tz</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">format</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"%H:%M\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">usetz</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">TRUE</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"n\">cat</span><span class=\"p\">(</span><span class=\"n\">pretty_time</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"c1\">#&gt; 22 Sep 2015 03:45 CEST</span><span class=\"w\">\n\n</span><span class=\"c1\"># Our final caption</span><span class=\"w\">\n</span><span class=\"n\">caption</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">toupper</span><span class=\"p\">(</span><span class=\"n\">paste0</span><span class=\"p\">(</span><span class=\"w\">\n  </span><span class=\"s2\">\"Star Map\\n\"</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">desired_place</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"\\n\"</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">pretty_time</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"\\n\"</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">pretty_labs</span><span class=\"w\">\n</span><span class=\"p\">))</span><span class=\"w\">\n\n\n</span><span class=\"n\">cat</span><span class=\"p\">(</span><span class=\"n\">caption</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"c1\">#&gt; STAR MAP</span><span class=\"w\">\n</span><span class=\"c1\">#&gt; MADRID, SPAIN</span><span class=\"w\">\n</span><span class=\"c1\">#&gt; 22 SEP 2015 03:45 CEST</span><span class=\"w\">\n</span><span class=\"c1\">#&gt; 40° 25' 0.14\" N / 3° 42' 12.9\" W</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<p>We can enhance the visualization by applying some interesting effects:</p>\n\n<ul>\n  <li>\n    <p>We want the Milky Way to appear a bit blurry instead of as a Well-Known\ngeometry. With this effect we can mimic how we really see it from the Earth.\nSo we can use <code class=\"language-plaintext highlighter-rouge\">ggfx::with_blur()</code> to get this effect.</p>\n  </li>\n  <li>\n    <p>We can also add a glowing effect to our stars and constellations (have a\nlook at Dominic Royé’s post <a href=\"https://dominicroye.github.io/blog/firefly-maps/index.html\">Firefly\nCartography</a> to\nknow more about this). The only drawback is that I was not able to use\n<strong>ggshadow</strong> with <code class=\"language-plaintext highlighter-rouge\">LINESTRING</code> (Dominic shows how to do it with <code class=\"language-plaintext highlighter-rouge\">POINT</code>), so\ninstead I converted my lines (the constellations) to coordinates and applied\n<code class=\"language-plaintext highlighter-rouge\">ggshadow::geom_glowpath()</code>.</p>\n  </li>\n</ul>\n\n<p>So we are ready now to create the final visualization:</p>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"c1\"># Prepare MULTILINESTRING</span><span class=\"w\">\n\n</span><span class=\"n\">const_end_lines</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">const_end</span><span class=\"w\"> </span><span class=\"o\">%&gt;%</span><span class=\"w\">\n  </span><span class=\"n\">st_cast</span><span class=\"p\">(</span><span class=\"s2\">\"MULTILINESTRING\"</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">%&gt;%</span><span class=\"w\">\n  </span><span class=\"n\">st_coordinates</span><span class=\"p\">()</span><span class=\"w\"> </span><span class=\"o\">%&gt;%</span><span class=\"w\">\n  </span><span class=\"n\">as.data.frame</span><span class=\"p\">()</span><span class=\"w\">\n\n\n</span><span class=\"n\">ggplot</span><span class=\"p\">()</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"c1\"># Graticules</span><span class=\"w\">\n  </span><span class=\"n\">geom_sf</span><span class=\"p\">(</span><span class=\"n\">data</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">grat_end</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">color</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"grey60\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">linewidth</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">0.25</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">alpha</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">0.3</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"c1\"># A blurry Milky Way</span><span class=\"w\">\n  </span><span class=\"n\">with_blur</span><span class=\"p\">(</span><span class=\"w\">\n    </span><span class=\"n\">geom_sf</span><span class=\"p\">(</span><span class=\"w\">\n      </span><span class=\"n\">data</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">mw_end</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">aes</span><span class=\"p\">(</span><span class=\"n\">fill</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">fill</span><span class=\"p\">),</span><span class=\"w\"> </span><span class=\"n\">alpha</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">0.1</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">color</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">NA</span><span class=\"p\">,</span><span class=\"w\">\n      </span><span class=\"n\">show.legend</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">FALSE</span><span class=\"w\">\n    </span><span class=\"p\">),</span><span class=\"w\">\n    </span><span class=\"n\">sigma</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">8</span><span class=\"w\">\n  </span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">scale_fill_identity</span><span class=\"p\">()</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"c1\"># Glowing stars</span><span class=\"w\">\n  </span><span class=\"n\">geom_glowpoint</span><span class=\"p\">(</span><span class=\"w\">\n    </span><span class=\"n\">data</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">stars_end</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">aes</span><span class=\"p\">(</span><span class=\"w\">\n      </span><span class=\"n\">alpha</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">br</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">size</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\">\n        </span><span class=\"n\">br</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">geometry</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">geometry</span><span class=\"w\">\n    </span><span class=\"p\">),</span><span class=\"w\">\n    </span><span class=\"n\">color</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"white\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">show.legend</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">FALSE</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">stat</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"sf_coordinates\"</span><span class=\"w\">\n  </span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">scale_size_continuous</span><span class=\"p\">(</span><span class=\"n\">range</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"m\">0.05</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">0.75</span><span class=\"p\">))</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">scale_alpha_continuous</span><span class=\"p\">(</span><span class=\"n\">range</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"m\">0.1</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">0.5</span><span class=\"p\">))</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"c1\"># Glowing constellations</span><span class=\"w\">\n  </span><span class=\"n\">geom_glowpath</span><span class=\"p\">(</span><span class=\"w\">\n    </span><span class=\"n\">data</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">const_end_lines</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">aes</span><span class=\"p\">(</span><span class=\"n\">X</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">Y</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">group</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">interaction</span><span class=\"p\">(</span><span class=\"n\">L1</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">L2</span><span class=\"p\">)),</span><span class=\"w\">\n    </span><span class=\"n\">color</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"white\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">size</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">0.5</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">alpha</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">0.8</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">shadowsize</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">0.4</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">shadowalpha</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">0.01</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"n\">shadowcolor</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"white\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">linejoin</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"round\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">lineend</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"round\"</span><span class=\"w\">\n  </span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"c1\"># Border of the sphere</span><span class=\"w\">\n  </span><span class=\"n\">geom_sf</span><span class=\"p\">(</span><span class=\"n\">data</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">hemisphere_sf</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">fill</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">NA</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">color</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"white\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">linewidth</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">1.25</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"c1\"># Caption</span><span class=\"w\">\n  </span><span class=\"n\">labs</span><span class=\"p\">(</span><span class=\"n\">caption</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">caption</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"c1\"># And end with theming</span><span class=\"w\">\n  </span><span class=\"n\">theme_void</span><span class=\"p\">()</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">theme</span><span class=\"p\">(</span><span class=\"w\">\n    </span><span class=\"n\">text</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">element_text</span><span class=\"p\">(</span><span class=\"n\">colour</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"white\"</span><span class=\"p\">),</span><span class=\"w\">\n    </span><span class=\"n\">panel.border</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">element_blank</span><span class=\"p\">(),</span><span class=\"w\">\n    </span><span class=\"n\">plot.background</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">element_rect</span><span class=\"p\">(</span><span class=\"n\">fill</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"#191d29\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">color</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"#191d29\"</span><span class=\"p\">),</span><span class=\"w\">\n    </span><span class=\"n\">plot.margin</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">margin</span><span class=\"p\">(</span><span class=\"m\">20</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">20</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">20</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">20</span><span class=\"p\">),</span><span class=\"w\">\n    </span><span class=\"n\">plot.caption</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">element_text</span><span class=\"p\">(</span><span class=\"w\">\n      </span><span class=\"n\">hjust</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">0.5</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">face</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"bold\"</span><span class=\"p\">,</span><span class=\"w\">\n      </span><span class=\"n\">size</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">rel</span><span class=\"p\">(</span><span class=\"m\">1</span><span class=\"p\">),</span><span class=\"w\">\n      </span><span class=\"n\">lineheight</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">rel</span><span class=\"p\">(</span><span class=\"m\">1.2</span><span class=\"p\">),</span><span class=\"w\">\n      </span><span class=\"n\">margin</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">margin</span><span class=\"p\">(</span><span class=\"n\">t</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">40</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">b</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">20</span><span class=\"p\">)</span><span class=\"w\">\n    </span><span class=\"p\">)</span><span class=\"w\">\n  </span><span class=\"p\">)</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<p><img src=\"https://dieghernan.github.io/assets/img/blog/20230125_celestial_map-1.webp\" alt=\"Circular star map for Madrid with constellation lines, stars sized by brightness and the Milky Way on a dark background.\" width=\"100%\" /></p>\n\n<p>Voilà! I checked the results several times against those provided by\nd3-celestial.js on the <a href=\"https://ofrohn.github.io/celestial-demo/location.html\">location\ndemo</a> and the underlying\ncalculations in JavaScript, and everything seems to be up and running.</p>\n\n<iframe class=\"d-block w-100 border-0 rounded my-3\" title=\"Starman by David Bowie on Spotify\" src=\"https://open.spotify.com/embed/track/0dcyQZdcWhJjE7sUXiXoon?theme=0\" height=\"152\" loading=\"lazy\" allow=\"autoplay; clipboard-write; encrypted-media; fullscreen; picture-in-picture\" allowfullscreen=\"\">\n</iframe>\n\n<h2 id=\"extra-chinese-constellations\">Extra: Chinese constellations</h2>\n\n<p><a href=\"https://dieghernan.github.io/celestial_data/\">Celestial Data</a> also provides\ndata for traditional Chinese constellations, so we can create a similar map with\nthis entirely different set of geometries:</p>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"n\">const_cn</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">load_celestial</span><span class=\"p\">(</span><span class=\"s2\">\"constellations.lines.cn.min.geojson\"</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"c1\"># Cut and prepare for geom_glowpath() on a single step</span><span class=\"w\">\n</span><span class=\"n\">const_cn_end_lines</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">sf_spherical_cut</span><span class=\"p\">(</span><span class=\"n\">const_cn</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">the_buff</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">hemisphere_s2</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"c1\"># Change the crs</span><span class=\"w\">\n  </span><span class=\"n\">the_crs</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">target_crs</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">flip</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">flip_matrix</span><span class=\"w\">\n</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">%&gt;%</span><span class=\"w\">\n  </span><span class=\"c1\"># To paths</span><span class=\"w\">\n  </span><span class=\"n\">st_cast</span><span class=\"p\">(</span><span class=\"s2\">\"MULTILINESTRING\"</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">%&gt;%</span><span class=\"w\">\n  </span><span class=\"n\">st_coordinates</span><span class=\"p\">()</span><span class=\"w\"> </span><span class=\"o\">%&gt;%</span><span class=\"w\">\n  </span><span class=\"n\">as.data.frame</span><span class=\"p\">()</span><span class=\"w\">\n\n\n</span><span class=\"n\">ggplot</span><span class=\"p\">()</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"c1\"># Graticules</span><span class=\"w\">\n  </span><span class=\"n\">geom_sf</span><span class=\"p\">(</span><span class=\"n\">data</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">grat_end</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">color</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"grey60\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">linewidth</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">0.25</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">alpha</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">0.3</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"c1\"># A blurry Milky Way</span><span class=\"w\">\n  </span><span class=\"n\">with_blur</span><span class=\"p\">(</span><span class=\"w\">\n    </span><span class=\"n\">geom_sf</span><span class=\"p\">(</span><span class=\"w\">\n      </span><span class=\"n\">data</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">mw_end</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">aes</span><span class=\"p\">(</span><span class=\"n\">fill</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">fill</span><span class=\"p\">),</span><span class=\"w\"> </span><span class=\"n\">alpha</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">0.1</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">color</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">NA</span><span class=\"p\">,</span><span class=\"w\">\n      </span><span class=\"n\">show.legend</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">FALSE</span><span class=\"w\">\n    </span><span class=\"p\">),</span><span class=\"w\">\n    </span><span class=\"n\">sigma</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">8</span><span class=\"w\">\n  </span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">scale_fill_identity</span><span class=\"p\">()</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"c1\"># Glowing stars</span><span class=\"w\">\n  </span><span class=\"n\">geom_glowpoint</span><span class=\"p\">(</span><span class=\"w\">\n    </span><span class=\"n\">data</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">stars_end</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">aes</span><span class=\"p\">(</span><span class=\"w\">\n      </span><span class=\"n\">alpha</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">br</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">size</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\">\n        </span><span class=\"n\">br</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">geometry</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">geometry</span><span class=\"w\">\n    </span><span class=\"p\">),</span><span class=\"w\">\n    </span><span class=\"n\">color</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"white\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">show.legend</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">FALSE</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">stat</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"sf_coordinates\"</span><span class=\"w\">\n  </span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">scale_size_continuous</span><span class=\"p\">(</span><span class=\"n\">range</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"m\">0.05</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">0.75</span><span class=\"p\">))</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">scale_alpha_continuous</span><span class=\"p\">(</span><span class=\"n\">range</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"m\">0.1</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">0.5</span><span class=\"p\">))</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"c1\"># Glowing constellations</span><span class=\"w\">\n  </span><span class=\"n\">geom_glowpath</span><span class=\"p\">(</span><span class=\"w\">\n    </span><span class=\"n\">data</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">const_cn_end_lines</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">aes</span><span class=\"p\">(</span><span class=\"n\">X</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">Y</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">group</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">interaction</span><span class=\"p\">(</span><span class=\"n\">L1</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">L2</span><span class=\"p\">)),</span><span class=\"w\">\n    </span><span class=\"n\">color</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"white\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">size</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">0.5</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">alpha</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">0.8</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">shadowsize</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">0.4</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">shadowalpha</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">0.01</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"n\">shadowcolor</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"white\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">linejoin</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"round\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">lineend</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"round\"</span><span class=\"w\">\n  </span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"c1\"># Border of the sphere</span><span class=\"w\">\n  </span><span class=\"n\">geom_sf</span><span class=\"p\">(</span><span class=\"n\">data</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">hemisphere_sf</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">fill</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">NA</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">color</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"white\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">linewidth</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">1.25</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"c1\"># Caption</span><span class=\"w\">\n  </span><span class=\"n\">labs</span><span class=\"p\">(</span><span class=\"n\">caption</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">caption</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"c1\"># And end with theming</span><span class=\"w\">\n  </span><span class=\"n\">theme_void</span><span class=\"p\">()</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">theme</span><span class=\"p\">(</span><span class=\"w\">\n    </span><span class=\"n\">text</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">element_text</span><span class=\"p\">(</span><span class=\"n\">colour</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"white\"</span><span class=\"p\">),</span><span class=\"w\">\n    </span><span class=\"n\">panel.border</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">element_blank</span><span class=\"p\">(),</span><span class=\"w\">\n    </span><span class=\"n\">plot.background</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">element_rect</span><span class=\"p\">(</span><span class=\"n\">fill</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"#191d29\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">color</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"#191d29\"</span><span class=\"p\">),</span><span class=\"w\">\n    </span><span class=\"n\">plot.margin</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">margin</span><span class=\"p\">(</span><span class=\"m\">20</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">20</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">20</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">20</span><span class=\"p\">),</span><span class=\"w\">\n    </span><span class=\"n\">plot.caption</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">element_text</span><span class=\"p\">(</span><span class=\"w\">\n      </span><span class=\"n\">hjust</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">0.5</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">face</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"bold\"</span><span class=\"p\">,</span><span class=\"w\">\n      </span><span class=\"n\">size</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">rel</span><span class=\"p\">(</span><span class=\"m\">1</span><span class=\"p\">),</span><span class=\"w\">\n      </span><span class=\"n\">lineheight</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">rel</span><span class=\"p\">(</span><span class=\"m\">1.2</span><span class=\"p\">),</span><span class=\"w\">\n      </span><span class=\"n\">margin</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">margin</span><span class=\"p\">(</span><span class=\"n\">t</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">40</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">b</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">20</span><span class=\"p\">)</span><span class=\"w\">\n    </span><span class=\"p\">)</span><span class=\"w\">\n  </span><span class=\"p\">)</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<p><img src=\"https://dieghernan.github.io/assets/img/blog/20230125_celestial_map_cn-1.webp\" alt=\"Circular star map for Madrid using Chinese constellation lines, with stars sized by brightness and the Milky Way on a dark background.\" width=\"100%\" /></p>\n\n<h2 id=\"references\">References</h2>\n\n<ul>\n  <li>Fitter, K. (2019, February 21). Celestial maps. <em>Kim Fitter</em>.\n<a href=\"https://kimnewzealand.github.io/2019/02/21/celestial-maps/\">https://kimnewzealand.github.io/2019/02/21/celestial-maps/</a></li>\n  <li>Frohn, O. (2015). <em>d3-celestial</em> [Computer software]. GitHub.\n<a href=\"https://github.com/ofrohn/d3-celestial/\">https://github.com/ofrohn/d3-celestial/</a></li>\n  <li>Frohn, O., &amp; Hernangómez, D. (2023). <em>Celestial data</em> (Version 1.0.1)\n[Data set]. Zenodo. <a href=\"https://doi.org/10.5281/zenodo.7561601\">https://doi.org/10.5281/zenodo.7561601</a>\n(<a href=\"https://dieghernan.github.io/celestial_data/\">Project documentation</a>)</li>\n  <li>Meeus, J. (1998). <em>Astronomical algorithms</em> (2nd ed.). Willmann-Bell.</li>\n  <li>Pebesma, E., &amp; Dunnington, D. (2020, June 17). In r-spatial, the Earth is\nno longer flat. <em>r-spatial</em>. <a href=\"https://r-spatial.org/r/2020/06/17/s2.html\">https://r-spatial.org/r/2020/06/17/s2.html</a></li>\n  <li>Royé, D. (2021, June 1). Firefly cartography. <em>Dr Dominic Royé</em>.\n<a href=\"https://dominicroye.github.io/blog/firefly-maps/\">https://dominicroye.github.io/blog/firefly-maps/</a></li>\n  <li>Still, J. (2020, March 22). Astronomical calculations: Sidereal time.\n<em>James Still</em>. <a href=\"https://squarewidget.com/astronomical-calculations-sidereal-time/\">https://squarewidget.com/astronomical-calculations-sidereal-time/</a></li>\n</ul>\n<div class=\"footnotes\" role=\"doc-endnotes\">\n  <ol>\n    <li id=\"fn:1\">\n\n      <p>In fact, the download is performed via\n<a href=\"https://www.jsdelivr.com/\">jsDelivr</a>, which distributes files hosted on\n<a href=\"https://www.jsdelivr.com/github\">GitHub via CDN.</a> This is supposed to\nimprove performance, but in any case the underlying data source is the GitHub\nrepo. <a href=\"#fnref:1\" class=\"reversefootnote\" role=\"doc-backlink\">&uarr;</a></p>\n    </li>\n  </ol>\n</div>\n",
      "date_published": "2023-01-25T00:00:00+01:00",
      "image": "https://dieghernan.github.io/celestial_data/assets/img/ogimage.webp",
      "summary": "Make a star map in R for a place and date of your choice.",
      "tags": ["music","r_bloggers","rstats","rspatial","maps","ggplot2","sf","s2","astronomy","celestial","geojson","gpkg"],
      "authors": [{
        "name": "Diego HH",
        "url": "https://dieghernan.github.io/"
      }]
    },
    {
      "id": "https://dieghernan.github.io/projects/celestial-data/",
      "url": "https://dieghernan.github.io/projects/celestial-data/",
      "title": "Celestial data",
      "content_html": "<p><a href=\"https://doi.org/10.5281/zenodo.7561601\"><img src=\"https://zenodo.org/badge/DOI/10.5281/zenodo.7561601.svg\" alt=\"DOI\" /></a></p>\n\n<p>This project provides several datasets of celestial objects as of the J2000\nepoch in GeoJSON and GeoPackage formats.</p>\n\n<p>The original files were provided by the\n<a href=\"https://github.com/ofrohn/d3-celestial/\">d3-celestial plugin</a>\n(<a href=\"https://dieghernan.github.io/projects/celestial-data/#ref-frohn2015\">Frohn 2015</a>) under\n<a href=\"https://opensource.org/licenses/BSD-3-Clause\">BSD 3-Clause</a>. The datasets\nproduced by this project consist of the same data provided by the\n<a href=\"https://github.com/ofrohn/d3-celestial/\">d3-celestial plugin</a> processed with\nthe <strong>R</strong> package <strong>sf</strong> (<a href=\"https://dieghernan.github.io/projects/celestial-data/#ref-pebesma2018\">Pebesma 2018</a>) to ensure its\nvalidity:</p>\n\n<ul>\n  <li>\n    <p>The spatial data objects are bounded by \\([-180, -90, 180, 90]\\).</p>\n  </li>\n  <li>\n    <p>The coordinates represent J2000 celestial directions in degrees.\n<a href=\"https://epsg.io/4326\">EPSG:4326</a> is assigned for compatibility with GIS\nsoftware. The angles are right ascension and declination.</p>\n  </li>\n  <li>\n    <p>All geometries are valid as per\n<a href=\"https://postgis.net/docs/ST_IsValid.html\">ST_IsValid</a> (GEOS <strong>3.9.3</strong>).</p>\n  </li>\n</ul>\n\n<h2 id=\"distribution\">Distribution</h2>\n\n<p>These URLs serve the same minified GeoJSON file from the main branch.</p>\n\n<div class=\"language-html highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"c\">&lt;!-- From GitHub --&gt;</span>\nhttps://raw.githubusercontent.com/dieghernan/celestial_data/main/data/mw.min.geojson\n\n<span class=\"c\">&lt;!-- From the website --&gt;</span>\nhttps://dieghernan.github.io/celestial_data/data/mw.min.geojson\n\n<span class=\"c\">&lt;!-- From jsDelivr --&gt;</span>\nhttps://cdn.jsdelivr.net/gh/dieghernan/celestial_data@main/data/mw.min.geojson\n</code></pre></div></div>\n\n<h2 id=\"data\">Data</h2>\n\n<p>Data are provided in GeoJSON (<code class=\"language-plaintext highlighter-rouge\">*.geojson</code>) and GeoPackage (<code class=\"language-plaintext highlighter-rouge\">*.gpkg</code>) formats.\nAdditionally, for GeoJSON files a minified version (<code class=\"language-plaintext highlighter-rouge\">*.min.geojson</code>) is\nalso provided.</p>\n\n<p>The data source can be found in the corresponding\n<a href=\"https://github.com/dieghernan/celestial_data/tree/main/data\">GitHub repo</a>.</p>\n\n<details class=\"my-2\">\n  <summary>\nList of files provided:\n</summary>\n\n  <ul>\n    <li><code class=\"language-plaintext highlighter-rouge\">asterisms.geojson</code></li>\n    <li><code class=\"language-plaintext highlighter-rouge\">asterisms.gpkg</code></li>\n    <li><code class=\"language-plaintext highlighter-rouge\">asterisms.min.geojson</code></li>\n    <li><code class=\"language-plaintext highlighter-rouge\">constellations.borders.cn.geojson</code></li>\n    <li><code class=\"language-plaintext highlighter-rouge\">constellations.borders.cn.gpkg</code></li>\n    <li><code class=\"language-plaintext highlighter-rouge\">constellations.borders.cn.min.geojson</code></li>\n    <li><code class=\"language-plaintext highlighter-rouge\">constellations.borders.geojson</code></li>\n    <li><code class=\"language-plaintext highlighter-rouge\">constellations.borders.gpkg</code></li>\n    <li><code class=\"language-plaintext highlighter-rouge\">constellations.borders.min.geojson</code></li>\n    <li><code class=\"language-plaintext highlighter-rouge\">constellations.borders.min.min.geojson</code></li>\n    <li><code class=\"language-plaintext highlighter-rouge\">constellations.bounds.cn.geojson</code></li>\n    <li><code class=\"language-plaintext highlighter-rouge\">constellations.bounds.cn.gpkg</code></li>\n    <li><code class=\"language-plaintext highlighter-rouge\">constellations.bounds.cn.min.geojson</code></li>\n    <li><code class=\"language-plaintext highlighter-rouge\">constellations.bounds.geojson</code></li>\n    <li><code class=\"language-plaintext highlighter-rouge\">constellations.bounds.gpkg</code></li>\n    <li><code class=\"language-plaintext highlighter-rouge\">constellations.bounds.min.geojson</code></li>\n    <li><code class=\"language-plaintext highlighter-rouge\">constellations.cn.csv</code></li>\n    <li><code class=\"language-plaintext highlighter-rouge\">constellations.cn.geojson</code></li>\n    <li><code class=\"language-plaintext highlighter-rouge\">constellations.cn.gpkg</code></li>\n    <li><code class=\"language-plaintext highlighter-rouge\">constellations.cn.min.geojson</code></li>\n    <li><code class=\"language-plaintext highlighter-rouge\">constellations.csv</code></li>\n    <li><code class=\"language-plaintext highlighter-rouge\">constellations.geojson</code></li>\n    <li><code class=\"language-plaintext highlighter-rouge\">constellations.gpkg</code></li>\n    <li><code class=\"language-plaintext highlighter-rouge\">constellations.lines.cn.geojson</code></li>\n    <li><code class=\"language-plaintext highlighter-rouge\">constellations.lines.cn.gpkg</code></li>\n    <li><code class=\"language-plaintext highlighter-rouge\">constellations.lines.cn.min.geojson</code></li>\n    <li><code class=\"language-plaintext highlighter-rouge\">constellations.lines.geojson</code></li>\n    <li><code class=\"language-plaintext highlighter-rouge\">constellations.lines.gpkg</code></li>\n    <li><code class=\"language-plaintext highlighter-rouge\">constellations.lines.min.geojson</code></li>\n    <li><code class=\"language-plaintext highlighter-rouge\">constellations.min.geojson</code></li>\n    <li><code class=\"language-plaintext highlighter-rouge\">dsonames.cn.csv</code></li>\n    <li><code class=\"language-plaintext highlighter-rouge\">dsonames.csv</code></li>\n    <li><code class=\"language-plaintext highlighter-rouge\">dsos.14.geojson</code></li>\n    <li><code class=\"language-plaintext highlighter-rouge\">dsos.14.gpkg</code></li>\n    <li><code class=\"language-plaintext highlighter-rouge\">dsos.14.min.geojson</code></li>\n    <li><code class=\"language-plaintext highlighter-rouge\">dsos.20.geojson</code></li>\n    <li><code class=\"language-plaintext highlighter-rouge\">dsos.20.gpkg</code></li>\n    <li><code class=\"language-plaintext highlighter-rouge\">dsos.20.min.geojson</code></li>\n    <li><code class=\"language-plaintext highlighter-rouge\">dsos.6.geojson</code></li>\n    <li><code class=\"language-plaintext highlighter-rouge\">dsos.6.gpkg</code></li>\n    <li><code class=\"language-plaintext highlighter-rouge\">dsos.6.min.geojson</code></li>\n    <li><code class=\"language-plaintext highlighter-rouge\">dsos.bright.geojson</code></li>\n    <li><code class=\"language-plaintext highlighter-rouge\">dsos.bright.gpkg</code></li>\n    <li><code class=\"language-plaintext highlighter-rouge\">dsos.bright.min.geojson</code></li>\n    <li><code class=\"language-plaintext highlighter-rouge\">lg.geojson</code></li>\n    <li><code class=\"language-plaintext highlighter-rouge\">lg.gpkg</code></li>\n    <li><code class=\"language-plaintext highlighter-rouge\">lg.min.geojson</code></li>\n    <li><code class=\"language-plaintext highlighter-rouge\">messier.geojson</code></li>\n    <li><code class=\"language-plaintext highlighter-rouge\">messier.gpkg</code></li>\n    <li><code class=\"language-plaintext highlighter-rouge\">messier.min.geojson</code></li>\n    <li><code class=\"language-plaintext highlighter-rouge\">mw.geojson</code></li>\n    <li><code class=\"language-plaintext highlighter-rouge\">mw.gpkg</code></li>\n    <li><code class=\"language-plaintext highlighter-rouge\">mw.min.geojson</code></li>\n    <li><code class=\"language-plaintext highlighter-rouge\">starnames.cn.csv</code></li>\n    <li><code class=\"language-plaintext highlighter-rouge\">starnames.csv</code></li>\n    <li><code class=\"language-plaintext highlighter-rouge\">stars.14.geojson</code></li>\n    <li><code class=\"language-plaintext highlighter-rouge\">stars.14.gpkg</code></li>\n    <li><code class=\"language-plaintext highlighter-rouge\">stars.14.min.geojson</code></li>\n    <li><code class=\"language-plaintext highlighter-rouge\">stars.6.geojson</code></li>\n    <li><code class=\"language-plaintext highlighter-rouge\">stars.6.gpkg</code></li>\n    <li><code class=\"language-plaintext highlighter-rouge\">stars.6.min.geojson</code></li>\n    <li><code class=\"language-plaintext highlighter-rouge\">stars.8.geojson</code></li>\n    <li><code class=\"language-plaintext highlighter-rouge\">stars.8.gpkg</code></li>\n    <li><code class=\"language-plaintext highlighter-rouge\">stars.8.min.geojson</code></li>\n  </ul>\n\n</details>\n\n<p>See additional details in the\n<a href=\"https://dieghernan.github.io/celestial_data/data\">data description</a>.</p>\n\n<h2 id=\"citation\">Citation</h2>\n\n<p>Please cite these datasets as:</p>\n\n<p>Frohn, O., &amp; Hernangómez, D. (2023). Celestial Data [Data set].\n<a href=\"https://doi.org/10.5281/zenodo.7561601\">https://doi.org/10.5281/zenodo.7561601</a></p>\n\n<p>A BibTeX entry:</p>\n\n<div class=\"language-bibtex highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code>\n<span class=\"nc\">@misc</span><span class=\"p\">{</span><span class=\"nl\">frohnhernangomez:2023</span><span class=\"p\">,</span>\n    <span class=\"na\">title</span>        <span class=\"p\">=</span> <span class=\"s\">{Celestial Data}</span><span class=\"p\">,</span>\n    <span class=\"na\">author</span>       <span class=\"p\">=</span> <span class=\"s\">{Olaf Frohn and Diego Hernangómez}</span><span class=\"p\">,</span>\n    <span class=\"na\">year</span>         <span class=\"p\">=</span> <span class=\"m\">2023</span><span class=\"p\">,</span>\n    <span class=\"na\">doi</span>          <span class=\"p\">=</span> <span class=\"s\">{10.5281/zenodo.7561601}</span><span class=\"p\">,</span>\n    <span class=\"na\">url</span>          <span class=\"p\">=</span> <span class=\"s\">{https://dieghernan.github.io/celestial_data/}</span><span class=\"p\">,</span>\n<span class=\"p\">}</span>\n\n</code></pre></div></div>\n\n<h2 id=\"references\">References</h2>\n\n<ul>\n  <li><span id=\"ref-frohn2015\"></span> Frohn, O. (2015). <em>d3-celestial</em> [Computer software]. GitHub.\n<a href=\"https://github.com/ofrohn/d3-celestial/\">https://github.com/ofrohn/d3-celestial/</a></li>\n  <li><span id=\"ref-pebesma2018\"></span> Pebesma, E. (2018). Simple features\nfor R: Standardized support for spatial vector data. <em>The R Journal, 10</em>(1),\n439–446. <a href=\"https://doi.org/10.32614/RJ-2018-009\">https://doi.org/10.32614/RJ-2018-009</a></li>\n</ul>\n",
      "date_published": "2023-01-23T00:00:00+01:00",
      "image": "https://dieghernan.github.io/celestial_data/assets/img/ogimage.webp",
      "summary": "This project provides several datasets of celestial objects as of the J2000 epoch in GeoJSON and GeoPackage formats.",
      "tags": ["project","maps","astronomy","celestial","dataset","csv","geojson","gpkg"],
      "authors": [{
        "name": "Diego HH",
        "url": "https://dieghernan.github.io/"
      }]
    },
    {
      "id": "https://dieghernan.github.io/202212_tidyterra-hillshade-2/",
      "url": "https://dieghernan.github.io/202212_tidyterra-hillshade-2/",
      "title": "Hillshade, colors and marginal plots with tidyterra (II)",
      "content_html": "<p class=\"alert alert-info p-3 mx-2 mb-3\"><strong>Updated on October 25, 2026:</strong> The elevation and precipitation maps now use\n<strong>ggblend</strong> to multiply their colors with the hillshade, following\n<a href=\"https://barney.fly.dev/2026/01/27/ggplot2-blending-adventure/\">Barney Harris’s blending adventure</a>.\nThe map and marginal profiles now share the same precipitation palette and limits.\nDominic Royé also demonstrates how to use <strong>ggblend</strong> in\n<a href=\"https://dominicroye.github.io/blog/hillshade-effect/\">Hillshade effects</a>.</p>\n\n<p><em>This is the second post of the series “Hillshade, colors and\nmarginal plots with <strong>tidyterra</strong>”. In this post, I explore an approach for\nannotating marginal plots on a <strong>ggplot2</strong> map of a SpatRaster, including\ninformation about the values by longitude and latitude. See the first post of the\nseries <a href=\"https://dieghernan.github.io/202210_tidyterra-hillshade/\">here</a>.</em></p>\n\n<p>If you love watching classic movies, especially from Hollywood’s Golden Age,\nyou may recognize the following lyrics:</p>\n\n<blockquote>\n  <p>The rain in Spain stays mainly in the plain!</p>\n\n  <p>By George, she’s got it! By George, she’s got it!</p>\n\n  <p>Now, once again where does it rain? On the plain! On the plain!</p>\n\n  <p>And where’s that soggy plain? In Spain! In Spain!</p>\n\n  <p>The rain in Spain stays mainly in the plain!</p>\n\n  <p>The rain in Spain stays mainly in the plain!</p>\n</blockquote>\n\n<!-- Thanks to alfurka,groupboard -->\n<!-- Based on https://github.com/alfurka/jekyll-embed-youtube-lazy-load -->\n<div itemscope=\"\" itemtype=\"https://schema.org/VideoObject\" itemid=\"https://www.youtube-nocookie.com/embed/uVmU3iANbgk#video\">\n<meta itemprop=\"name\" content=\"My Fair Lady - The Rain In Spain\" /><meta itemprop=\"description\" content=\"The Rain in Spain musical scene from My Fair Lady (1964), featuring Audrey Hepburn, Rex Harrison and Stanley Holloway.\" /><meta itemprop=\"duration\" content=\"PT2M36S\" /><meta itemprop=\"uploadDate\" content=\"2008-08-06T02:46:17-07:00\" /><link itemprop=\"thumbnailUrl\" href=\"https://i.ytimg.com/vi/uVmU3iANbgk/hqdefault.jpg\" />\n<script type=\"application/ld+json\">\n{\n  \"@context\": \"https://schema.org\",\n  \"@type\": \"VideoObject\",\n  \"@id\": \"https://www.youtube-nocookie.com/embed/uVmU3iANbgk#video\",\n  \"isPartOf\": {\"@type\": \"WebPage\", \"@id\": \"https://dieghernan.github.io/202212_tidyterra-hillshade-2/\"},\n  \n  \n    \n    \n  \"name\": \"My Fair Lady - The Rain In Spain\",\n    \n  \n    \n    \n  \"description\": \"The Rain in Spain musical scene from My Fair Lady (1964), featuring Audrey Hepburn, Rex Harrison and Stanley Holloway.\",\n    \n  \n    \n    \n  \"duration\": \"PT2M36S\",\n    \n  \n    \n    \n  \"uploadDate\": \"2008-08-06T02:46:17-07:00\",\n    \n  \n  \n  \"thumbnailUrl\": \"https://i.ytimg.com/vi/uVmU3iANbgk/hqdefault.jpg\",\n  \n  \"embedUrl\": \"https://www.youtube-nocookie.com/embed/uVmU3iANbgk\"\n}\n</script><link itemprop=\"embedUrl\" href=\"https://www.youtube-nocookie.com/embed/uVmU3iANbgk\" />\n<div data-src=\"uVmU3iANbgk\" data-title=\"My Fair Lady - The Rain In Spain\" class=\"ch_ytdefer embed-responsive embed-responsive-16by9 my-2 chulapa-rounded-lg\" style=\"background-image: url(https://img.youtube.com/vi/uVmU3iANbgk/hqdefault.jpg); background-position: center; background-size: cover;\">\n\t<button type=\"button\" class=\"ch_ytdefer_btn\" aria-label=\"Play My Fair Lady - The Rain In Spain\" style=\"background-image: url(&quot;data:image/svg+xml;base64,PHN2ZyBoZWlnaHQ9IjEwMCUiIHZlcnNpb249IjEuMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgdmlld0JveD0iMCAwIDY4IDQ4IiB3aWR0aD0iMTAwJSI+PHBhdGggY2xhc3M9Inl0cC1sYXJnZS1wbGF5LWJ1dHRvbi1iZyIgZD0iTTY2LjUyLDcuNzRjLTAuNzgtMi45My0yLjQ5LTUuNDEtNS40Mi02LjE5QzU1Ljc5LC4xMywzNCwwLDM0LDBTMTIuMjEsLjEzLDYuOSwxLjU1IEMzLjk3LDIuMzMsMi4yNyw0LjgxLDEuNDgsNy43NEMwLjA2LDEzLjA1LDAsMjQsMCwyNHMwLjA2LDEwLjk1LDEuNDgsMTYuMjZjMC43OCwyLjkzLDIuNDksNS40MSw1LjQyLDYuMTkgQzEyLjIxLDQ3Ljg3LDM0LDQ4LDM0LDQ4czIxLjc5LTAuMTMsMjcuMS0xLjU1YzIuOTMtMC43OCw0LjY0LTMuMjYsNS40Mi02LjE5QzY3Ljk0LDM0Ljk1LDY4LDI0LDY4LDI0UzY3Ljk0LDEzLjA1LDY2LjUyLDcuNzR6IiBmaWxsPSIjMjEyMTIxIiBmaWxsLW9wYWNpdHk9IjAuOCI+PC9wYXRoPjxwYXRoIGQ9Ik0gNDUsMjQgMjcsMTQgMjcsMzQiIGZpbGw9IiNmZmYiPjwvcGF0aD48L3N2Zz4=&quot;); position: absolute; border: 0px; background-color: transparent; left: calc(50% - 73px/2); top: calc(50% - 52px/2); width: 73px; height: 52px; pointer-events: none;\"></button>\n</div>\n</div>\n<noscript><a href=\"https://www.youtube.com/watch?v=uVmU3iANbgk\">Watch this video on YouTube</a></noscript>\n<!-- Load script only if needed -->\n<script>\n(function () {\n  if (document.getElementById(\"ch_ytdeferScript\")) return;\n  var script = document.createElement(\"script\");\n  script.src =\"https://dieghernan.github.io/assets/js/ch_ytdefer/ch_ytdefer.js\";\n  script.id = \"ch_ytdeferScript\";\n  document.body.appendChild(script);\n})();\n</script>\n\n<p>This emphatic statement is made in <a href=\"https://en.wikipedia.org/wiki/My_Fair_Lady_(film)\"><em>My Fair Lady\n(1964)</em></a> by Audrey Hepburn,\nRex Harrison and Stanley Holloway. But as a Spaniard, I can tell you it is\n<strong>completely false</strong>.</p>\n\n<p>The rain in Spain stays mainly in the north, most notably in Galicia. And I can\nprove it!</p>\n\n<p>In this post, I overlay a SpatRaster showing mean precipitation data\nwith an extra set of plots on the margin to identify where the rain in Spain\nstays (mainly).</p>\n\n<h2 id=\"libraries\">Libraries</h2>\n\n<p>In this post, we will use the following libraries:</p>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"c1\">## Libraries</span><span class=\"w\">\n\n</span><span class=\"c1\"># Data manipulation</span><span class=\"w\">\n</span><span class=\"n\">library</span><span class=\"p\">(</span><span class=\"n\">terra</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">library</span><span class=\"p\">(</span><span class=\"n\">tidyterra</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">library</span><span class=\"p\">(</span><span class=\"n\">dplyr</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"c1\"># Get the data</span><span class=\"w\">\n</span><span class=\"n\">library</span><span class=\"p\">(</span><span class=\"n\">geodata</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">library</span><span class=\"p\">(</span><span class=\"n\">mapSpain</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"c1\"># Plotting</span><span class=\"w\">\n</span><span class=\"n\">library</span><span class=\"p\">(</span><span class=\"n\">ggplot2</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">library</span><span class=\"p\">(</span><span class=\"n\">scales</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">library</span><span class=\"p\">(</span><span class=\"n\">cowplot</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">library</span><span class=\"p\">(</span><span class=\"n\">colorspace</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">library</span><span class=\"p\">(</span><span class=\"n\">ggblend</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"c1\"># Define a common theme for the maps.</span><span class=\"w\">\n</span><span class=\"n\">background</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"s2\">\"#f8f8ff\"</span><span class=\"w\">\n</span><span class=\"n\">ink</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"s2\">\"grey10\"</span><span class=\"w\">\n\n</span><span class=\"n\">theme_set</span><span class=\"p\">(</span><span class=\"w\">\n  </span><span class=\"n\">theme</span><span class=\"p\">(</span><span class=\"w\">\n    </span><span class=\"n\">plot.background</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">element_rect</span><span class=\"p\">(</span><span class=\"n\">fill</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">background</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">colour</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">NA</span><span class=\"p\">),</span><span class=\"w\">\n    </span><span class=\"n\">panel.background</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">element_rect</span><span class=\"p\">(</span><span class=\"n\">fill</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">background</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">colour</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">NA</span><span class=\"p\">),</span><span class=\"w\">\n    </span><span class=\"n\">plot.title</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">element_text</span><span class=\"p\">(</span><span class=\"n\">face</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"bold\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">colour</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">ink</span><span class=\"p\">),</span><span class=\"w\">\n    </span><span class=\"n\">plot.subtitle</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">element_text</span><span class=\"p\">(</span><span class=\"n\">colour</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">ink</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">margin</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">margin</span><span class=\"p\">(</span><span class=\"n\">t</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">5</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">b</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">5</span><span class=\"p\">)),</span><span class=\"w\">\n    </span><span class=\"n\">plot.caption</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">element_text</span><span class=\"p\">(</span><span class=\"n\">colour</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"grey40\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">hjust</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">0</span><span class=\"p\">),</span><span class=\"w\">\n    </span><span class=\"n\">plot.margin</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">margin</span><span class=\"p\">(</span><span class=\"m\">10</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">10</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">10</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">10</span><span class=\"p\">),</span><span class=\"w\">\n    </span><span class=\"n\">legend.background</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">element_blank</span><span class=\"p\">()</span><span class=\"w\">\n  </span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"p\">)</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<h2 id=\"the-plain-in-spain\">The plain in Spain</h2>\n\n<p>The plain (or as we call it, <em>La Meseta Central</em>) covers a large area of\ninland Spain, with an mean altitude of 650 meters above sea level.</p>\n\n<p>I didn’t find any accurate spatial data file with the bounds of the plain, so\nfor this case I would approximate it using a mixture of political borders\n(historically the <em>Meseta</em> is associated with Castile and Madrid) and elevation\ndata to get a rough shape.</p>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"c1\"># Using mapSpain</span><span class=\"w\">\n</span><span class=\"n\">the_plain</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">esp_get_prov</span><span class=\"p\">(</span><span class=\"w\">\n  </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"w\">\n    </span><span class=\"s2\">\"Madrid\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"Castilla-La Mancha\"</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"s2\">\"Extremadura\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"Castilla y Leon\"</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"s2\">\"Teruel\"</span><span class=\"w\">\n  </span><span class=\"p\">),</span><span class=\"w\">\n  </span><span class=\"n\">epsg</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">4326</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">resolution</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">1</span><span class=\"w\">\n</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">|&gt;</span><span class=\"w\">\n  </span><span class=\"n\">mutate</span><span class=\"p\">(</span><span class=\"n\">the_plain</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">TRUE</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">|&gt;</span><span class=\"w\">\n  </span><span class=\"n\">group_by</span><span class=\"p\">(</span><span class=\"n\">the_plain</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">|&gt;</span><span class=\"w\">\n  </span><span class=\"c1\"># Combine</span><span class=\"w\">\n  </span><span class=\"n\">summarise</span><span class=\"p\">()</span><span class=\"w\"> </span><span class=\"o\">|&gt;</span><span class=\"w\">\n  </span><span class=\"c1\"># To terra, until this step was sf</span><span class=\"w\">\n  </span><span class=\"n\">vect</span><span class=\"p\">()</span><span class=\"w\">\n\n</span><span class=\"c1\"># Get altitude</span><span class=\"w\">\n\n</span><span class=\"c1\"># I use here a local directory to cache downloaded files on my PC.</span><span class=\"w\">\n</span><span class=\"c1\"># Modify this to your likes, e.g. using</span><span class=\"w\">\n</span><span class=\"c1\"># mydir &lt;- tempdir()</span><span class=\"w\">\n\n</span><span class=\"n\">mydir</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"s2\">\"~/R/mapslib/misc\"</span><span class=\"w\">\n\n</span><span class=\"n\">r_init</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">elevation_30s</span><span class=\"p\">(</span><span class=\"s2\">\"ESP\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">path</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">mydir</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"c1\"># For better handling we set here the names</span><span class=\"w\">\n</span><span class=\"nf\">names</span><span class=\"p\">(</span><span class=\"n\">r_init</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"s2\">\"alt\"</span><span class=\"w\">\n\n</span><span class=\"c1\"># We don't want values lower than 0 on the raster</span><span class=\"w\">\n</span><span class=\"n\">r</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">r_init</span><span class=\"w\"> </span><span class=\"o\">|&gt;</span><span class=\"w\">\n  </span><span class=\"n\">mutate</span><span class=\"p\">(</span><span class=\"n\">alt</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">pmax</span><span class=\"p\">(</span><span class=\"m\">0</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">alt</span><span class=\"p\">))</span><span class=\"w\">\n\n</span><span class=\"c1\"># Now intersect the raster and the vector and filter by range</span><span class=\"w\">\n\n</span><span class=\"n\">exploded</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">r</span><span class=\"w\"> </span><span class=\"o\">|&gt;</span><span class=\"w\">\n  </span><span class=\"n\">crop</span><span class=\"p\">(</span><span class=\"n\">the_plain</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">mask</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">TRUE</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">|&gt;</span><span class=\"w\">\n  </span><span class=\"c1\"># Let's define here a range of elevations</span><span class=\"w\">\n  </span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">alt</span><span class=\"w\"> </span><span class=\"o\">&gt;</span><span class=\"w\"> </span><span class=\"m\">600</span><span class=\"w\"> </span><span class=\"o\">&amp;</span><span class=\"w\"> </span><span class=\"n\">alt</span><span class=\"w\"> </span><span class=\"o\">&lt;</span><span class=\"w\"> </span><span class=\"m\">1100</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">|&gt;</span><span class=\"w\">\n  </span><span class=\"n\">drop_na</span><span class=\"p\">()</span><span class=\"w\"> </span><span class=\"o\">|&gt;</span><span class=\"w\">\n  </span><span class=\"n\">as.polygons</span><span class=\"p\">(</span><span class=\"n\">dissolve</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">TRUE</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">na.rm</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">TRUE</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">|&gt;</span><span class=\"w\">\n  </span><span class=\"c1\"># Aggregate first</span><span class=\"w\">\n  </span><span class=\"n\">aggregate</span><span class=\"p\">()</span><span class=\"w\"> </span><span class=\"o\">|&gt;</span><span class=\"w\">\n  </span><span class=\"c1\"># Explode vectors</span><span class=\"w\">\n  </span><span class=\"n\">disagg</span><span class=\"p\">()</span><span class=\"w\"> </span><span class=\"o\">|&gt;</span><span class=\"w\">\n  </span><span class=\"c1\"># And fill holes</span><span class=\"w\">\n  </span><span class=\"n\">fillHoles</span><span class=\"p\">()</span><span class=\"w\">\n\n</span><span class=\"c1\"># Select biggest polygons (area bigger than 50 kms 2)</span><span class=\"w\">\n</span><span class=\"n\">r_plain</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">exploded</span><span class=\"w\">\n</span><span class=\"c1\"># Add an attribute before filtering polygons without an attribute table</span><span class=\"w\">\n</span><span class=\"n\">r_plain</span><span class=\"o\">$</span><span class=\"n\">area</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">expanse</span><span class=\"p\">(</span><span class=\"n\">r_plain</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">r_plain</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">r_plain</span><span class=\"w\"> </span><span class=\"o\">|&gt;</span><span class=\"w\">\n  </span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">area</span><span class=\"w\"> </span><span class=\"o\">&gt;</span><span class=\"w\"> </span><span class=\"m\">50000</span><span class=\"o\">**</span><span class=\"m\">2</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">|&gt;</span><span class=\"w\">\n  </span><span class=\"c1\"># And convert to lines</span><span class=\"w\">\n  </span><span class=\"n\">as.lines</span><span class=\"p\">()</span><span class=\"w\">\n\n</span><span class=\"n\">ggplot</span><span class=\"p\">(</span><span class=\"n\">r_plain</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">geom_spatvector</span><span class=\"p\">(</span><span class=\"n\">color</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"red\"</span><span class=\"p\">)</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<p><img src=\"https://dieghernan.github.io/assets/img/blog/20221212_plan_alt-1.webp\" alt=\"Map of plateau outlines in Spain, extracted from terrain between 600 and 1,100 meters above sea level.\" width=\"100%\" /></p>\n\n<p>We can create a new plot similar to the one produced in the <a href=\"https://dieghernan.github.io/202210_tidyterra-hillshade/\">previous\npost</a> to identify the\nplain. First, I create a base layer with a representation of the\nhillshade, which we will reuse later:</p>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"c1\"># Creating hillshade</span><span class=\"w\">\n\n</span><span class=\"n\">slope</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">terrain</span><span class=\"p\">(</span><span class=\"n\">r</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"slope\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">unit</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"radians\"</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">aspect</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">terrain</span><span class=\"p\">(</span><span class=\"n\">r</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"aspect\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">unit</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"radians\"</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"c1\"># Multi-shadow</span><span class=\"w\">\n</span><span class=\"n\">hill</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">shade</span><span class=\"p\">(</span><span class=\"n\">slope</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">aspect</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">45</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">direction</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"m\">225</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">270</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">315</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">360</span><span class=\"p\">))</span><span class=\"w\"> </span><span class=\"o\">|&gt;</span><span class=\"w\"> </span><span class=\"n\">mean</span><span class=\"p\">()</span><span class=\"w\">\n\n</span><span class=\"c1\"># Stretching</span><span class=\"w\">\n</span><span class=\"n\">q</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"nf\">as.numeric</span><span class=\"p\">(</span><span class=\"n\">quantile</span><span class=\"p\">(</span><span class=\"n\">values</span><span class=\"p\">(</span><span class=\"n\">hill</span><span class=\"p\">),</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"m\">0.05</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">0.95</span><span class=\"p\">),</span><span class=\"w\"> </span><span class=\"n\">na.rm</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">TRUE</span><span class=\"p\">))</span><span class=\"w\">\n\n</span><span class=\"n\">hill</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">clamp</span><span class=\"p\">((</span><span class=\"n\">hill</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"w\"> </span><span class=\"n\">q</span><span class=\"p\">[</span><span class=\"m\">1</span><span class=\"p\">])</span><span class=\"w\"> </span><span class=\"o\">/</span><span class=\"w\"> </span><span class=\"n\">diff</span><span class=\"p\">(</span><span class=\"n\">q</span><span class=\"p\">),</span><span class=\"w\"> </span><span class=\"m\">0</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">1</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"c1\"># normalize names</span><span class=\"w\">\n</span><span class=\"nf\">names</span><span class=\"p\">(</span><span class=\"n\">hill</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"s2\">\"shades\"</span><span class=\"w\">\n\n</span><span class=\"c1\"># Hillshading palette</span><span class=\"w\">\n</span><span class=\"n\">pal_greys</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">hcl.colors</span><span class=\"p\">(</span><span class=\"m\">1000</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"Grays\"</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"c1\"># Index of color by cell</span><span class=\"w\">\n</span><span class=\"n\">index</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">hill</span><span class=\"w\"> </span><span class=\"o\">|&gt;</span><span class=\"w\">\n  </span><span class=\"n\">mutate</span><span class=\"p\">(</span><span class=\"n\">index_col</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">rescale</span><span class=\"p\">(</span><span class=\"n\">shades</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">to</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"m\">1</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"nf\">length</span><span class=\"p\">(</span><span class=\"n\">pal_greys</span><span class=\"p\">))))</span><span class=\"w\"> </span><span class=\"o\">|&gt;</span><span class=\"w\">\n  </span><span class=\"n\">mutate</span><span class=\"p\">(</span><span class=\"n\">index_col</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nf\">round</span><span class=\"p\">(</span><span class=\"n\">index_col</span><span class=\"p\">))</span><span class=\"w\"> </span><span class=\"o\">|&gt;</span><span class=\"w\">\n  </span><span class=\"n\">pull</span><span class=\"p\">(</span><span class=\"n\">index_col</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"c1\"># Get cols</span><span class=\"w\">\n</span><span class=\"n\">vector_cols</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">pal_greys</span><span class=\"p\">[</span><span class=\"n\">index</span><span class=\"p\">]</span><span class=\"w\">\n\n</span><span class=\"c1\"># Need to avoid resampling</span><span class=\"w\">\n</span><span class=\"c1\"># and don't use aes</span><span class=\"w\">\n\n</span><span class=\"c1\"># Base hill plot</span><span class=\"w\">\n</span><span class=\"n\">hill_plot</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">ggplot</span><span class=\"p\">()</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">geom_spatraster</span><span class=\"p\">(</span><span class=\"w\">\n    </span><span class=\"n\">data</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">hill</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">fill</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">vector_cols</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">maxcell</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">Inf</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"n\">alpha</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">1</span><span class=\"w\">\n  </span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"n\">hill_plot</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<p><img src=\"https://dieghernan.github.io/assets/img/blog/20221212_hill-1.webp\" alt=\"Grayscale hillshade map of mainland Spain and the Balearic Islands, showing mountain ranges through light and shadow.\" width=\"100%\" /></p>\n\n<p>As in the updated first post, we resolve the thematic raster’s colors before\ncombining it with the hillshade. This helper keeps the original scale underneath\nthe blend to generate the legend. The opaque thematic layer inside the blend\ncovers it, and the hillshade adds texture. The legend\nshows the palette before shading. We use <strong>ragg</strong> to render these compositing\ngroups.</p>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"c1\"># Blend a thematic raster with the fixed hillshade colors</span><span class=\"w\">\n</span><span class=\"n\">blend_hillshade</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"k\">function</span><span class=\"p\">(</span><span class=\"n\">data</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">fill_scale</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"p\">{</span><span class=\"w\">\n  </span><span class=\"n\">stopifnot</span><span class=\"p\">(</span><span class=\"n\">compareGeom</span><span class=\"p\">(</span><span class=\"n\">data</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">hill</span><span class=\"p\">))</span><span class=\"w\">\n  </span><span class=\"n\">thematic_plot</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">ggplot</span><span class=\"p\">()</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n    </span><span class=\"n\">geom_spatraster</span><span class=\"p\">(</span><span class=\"n\">data</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">data</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">maxcell</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">Inf</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n    </span><span class=\"n\">fill_scale</span><span class=\"w\">\n  </span><span class=\"n\">thematic_fill</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">ggplot_build</span><span class=\"p\">(</span><span class=\"n\">thematic_plot</span><span class=\"p\">)</span><span class=\"o\">$</span><span class=\"n\">data</span><span class=\"p\">[[</span><span class=\"m\">1</span><span class=\"p\">]]</span><span class=\"o\">$</span><span class=\"n\">fill</span><span class=\"w\">\n  </span><span class=\"n\">stopifnot</span><span class=\"p\">(</span><span class=\"w\">\n    </span><span class=\"nf\">length</span><span class=\"p\">(</span><span class=\"n\">thematic_fill</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">==</span><span class=\"w\"> </span><span class=\"n\">ncell</span><span class=\"p\">(</span><span class=\"n\">data</span><span class=\"p\">),</span><span class=\"w\">\n    </span><span class=\"nf\">length</span><span class=\"p\">(</span><span class=\"n\">vector_cols</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">==</span><span class=\"w\"> </span><span class=\"n\">ncell</span><span class=\"p\">(</span><span class=\"n\">hill</span><span class=\"p\">)</span><span class=\"w\">\n  </span><span class=\"p\">)</span><span class=\"w\">\n\n  </span><span class=\"c1\"># The layer underneath supplies the scale and legend</span><span class=\"w\">\n  </span><span class=\"n\">thematic_plot</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n    </span><span class=\"p\">(</span><span class=\"nf\">list</span><span class=\"p\">(</span><span class=\"w\">\n      </span><span class=\"n\">geom_spatraster</span><span class=\"p\">(</span><span class=\"n\">data</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">data</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">fill</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">thematic_fill</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">maxcell</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">Inf</span><span class=\"p\">),</span><span class=\"w\">\n      </span><span class=\"n\">geom_spatraster</span><span class=\"p\">(</span><span class=\"w\">\n        </span><span class=\"n\">data</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">hill</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">fill</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">vector_cols</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">maxcell</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">Inf</span><span class=\"w\">\n      </span><span class=\"p\">)</span><span class=\"w\">\n    </span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">|&gt;</span><span class=\"w\">\n      </span><span class=\"n\">ggblend</span><span class=\"o\">::</span><span class=\"n\">blend</span><span class=\"p\">(</span><span class=\"s2\">\"multiply\"</span><span class=\"p\">))</span><span class=\"w\">\n</span><span class=\"p\">}</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<p>And finally we blend the altitude with the hillshade. The plain should be quite\nvisible even without plotting the outline.</p>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"c1\"># Overlaying and theming</span><span class=\"w\">\n\n</span><span class=\"c1\"># Aware of limits of the raster</span><span class=\"w\">\n\n</span><span class=\"n\">alt_limits</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">minmax</span><span class=\"p\">(</span><span class=\"n\">r</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">|&gt;</span><span class=\"w\"> </span><span class=\"n\">as.vector</span><span class=\"p\">()</span><span class=\"w\">\n</span><span class=\"c1\"># Round to lower and higher 500 integer with a min of 0</span><span class=\"w\">\n</span><span class=\"n\">alt_limits</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">pmax</span><span class=\"p\">(</span><span class=\"w\">\n  </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"nf\">floor</span><span class=\"p\">(</span><span class=\"n\">alt_limits</span><span class=\"p\">[</span><span class=\"m\">1</span><span class=\"p\">]</span><span class=\"w\"> </span><span class=\"o\">/</span><span class=\"w\"> </span><span class=\"m\">500</span><span class=\"p\">),</span><span class=\"w\"> </span><span class=\"nf\">ceiling</span><span class=\"p\">(</span><span class=\"n\">alt_limits</span><span class=\"p\">[</span><span class=\"m\">2</span><span class=\"p\">]</span><span class=\"w\"> </span><span class=\"o\">/</span><span class=\"w\"> </span><span class=\"m\">500</span><span class=\"p\">))</span><span class=\"w\"> </span><span class=\"o\">*</span><span class=\"w\"> </span><span class=\"m\">500</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"m\">0</span><span class=\"w\">\n</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"n\">alt_limits</span><span class=\"w\">\n</span><span class=\"c1\">#&gt; [1]    0 3500</span><span class=\"w\">\n\n</span><span class=\"n\">base_text_size</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"m\">9</span><span class=\"w\">\n\n</span><span class=\"n\">alt_palette</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">subset</span><span class=\"p\">(</span><span class=\"n\">hypsometric_tints_db</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">pal</span><span class=\"w\"> </span><span class=\"o\">==</span><span class=\"w\"> </span><span class=\"s2\">\"wiki-schwarzwald-cont\"</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">alt_scale</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">scale_fill_hypso_tint_c</span><span class=\"p\">(</span><span class=\"w\">\n  </span><span class=\"n\">palette</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"wiki-schwarzwald-cont\"</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">limits</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">alt_limits</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">values</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">rescale</span><span class=\"p\">(</span><span class=\"n\">alt_palette</span><span class=\"o\">$</span><span class=\"n\">limit</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">to</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">alt_limits</span><span class=\"p\">),</span><span class=\"w\">\n  </span><span class=\"n\">na.value</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">NA</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">breaks</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">seq</span><span class=\"p\">(</span><span class=\"m\">0</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">3500</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">250</span><span class=\"p\">),</span><span class=\"w\">\n  </span><span class=\"n\">labels</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">label_comma</span><span class=\"p\">()</span><span class=\"w\">\n</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"n\">plot_esp</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">blend_hillshade</span><span class=\"p\">(</span><span class=\"n\">r</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">alt_scale</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">guides</span><span class=\"p\">(</span><span class=\"n\">fill</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">guide_legend</span><span class=\"p\">(</span><span class=\"w\">\n    </span><span class=\"n\">title</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"   m.\"</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"n\">title.position</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"top\"</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"n\">keywidth</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">.5</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"n\">reverse</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">TRUE</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"n\">override.aes</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nf\">list</span><span class=\"p\">(</span><span class=\"n\">alpha</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">1</span><span class=\"p\">)</span><span class=\"w\">\n  </span><span class=\"p\">))</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">labs</span><span class=\"p\">(</span><span class=\"w\">\n    </span><span class=\"n\">title</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"Elevation of Spain\"</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"n\">subtitle</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"The plain in green\"</span><span class=\"w\">\n  </span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">theme</span><span class=\"p\">(</span><span class=\"w\">\n    </span><span class=\"n\">text</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">element_text</span><span class=\"p\">(</span><span class=\"n\">family</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"serif\"</span><span class=\"p\">),</span><span class=\"w\">\n    </span><span class=\"n\">plot.title</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">element_text</span><span class=\"p\">(</span><span class=\"w\">\n      </span><span class=\"n\">face</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"bold\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">size</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">base_text_size</span><span class=\"w\"> </span><span class=\"o\">*</span><span class=\"w\"> </span><span class=\"m\">1.5</span><span class=\"p\">,</span><span class=\"w\">\n      </span><span class=\"n\">hjust</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">0.5</span><span class=\"w\">\n    </span><span class=\"p\">),</span><span class=\"w\">\n    </span><span class=\"n\">plot.subtitle</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">element_text</span><span class=\"p\">(</span><span class=\"w\">\n      </span><span class=\"n\">size</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">base_text_size</span><span class=\"w\"> </span><span class=\"o\">*</span><span class=\"w\"> </span><span class=\"m\">0.9</span><span class=\"p\">,</span><span class=\"w\">\n      </span><span class=\"n\">hjust</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">0.5</span><span class=\"w\">\n    </span><span class=\"p\">),</span><span class=\"w\">\n    </span><span class=\"n\">plot.caption</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">element_text</span><span class=\"p\">(</span><span class=\"w\">\n      </span><span class=\"n\">margin</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">margin</span><span class=\"p\">(</span><span class=\"n\">t</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">base_text_size</span><span class=\"w\"> </span><span class=\"o\">*</span><span class=\"w\"> </span><span class=\"m\">3</span><span class=\"p\">),</span><span class=\"w\">\n      </span><span class=\"n\">face</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"italic\"</span><span class=\"w\">\n    </span><span class=\"p\">),</span><span class=\"w\">\n    </span><span class=\"n\">axis.line</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">element_blank</span><span class=\"p\">(),</span><span class=\"w\">\n    </span><span class=\"n\">axis.ticks</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">element_blank</span><span class=\"p\">(),</span><span class=\"w\">\n    </span><span class=\"n\">axis.text</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">element_blank</span><span class=\"p\">(),</span><span class=\"w\">\n    </span><span class=\"n\">panel.grid</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">element_blank</span><span class=\"p\">(),</span><span class=\"w\">\n    </span><span class=\"n\">legend.key</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">element_rect</span><span class=\"p\">(</span><span class=\"s2\">\"grey50\"</span><span class=\"p\">),</span><span class=\"w\">\n    </span><span class=\"n\">legend.text</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">element_text</span><span class=\"p\">(</span><span class=\"n\">hjust</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">0</span><span class=\"p\">),</span><span class=\"w\">\n    </span><span class=\"n\">legend.position</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"left\"</span><span class=\"w\">\n  </span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"n\">plot_esp</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<p><img src=\"https://dieghernan.github.io/assets/img/blog/20221212_hill_overlay-1.webp\" alt=\"Relief map of Spain combining hillshade with elevation colors to distinguish mountain ranges from lower terrain.\" width=\"100%\" /></p>\n\n<h2 id=\"the-rain-in-spain\">The rain in Spain</h2>\n\n<p>Let’s check now whether the rain falls mainly in the plain or not. We use here\n<code class=\"language-plaintext highlighter-rouge\">geodata::worldclim_country()</code> to get the mean monthly precipitation by from\n<a href=\"https://www.worldclim.org/\">WorldClim</a>:</p>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"c1\"># Precipitation of Spain</span><span class=\"w\">\n\n</span><span class=\"c1\"># Get precip data</span><span class=\"w\">\n</span><span class=\"n\">precip</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">geodata</span><span class=\"o\">::</span><span class=\"n\">worldclim_country</span><span class=\"p\">(</span><span class=\"s2\">\"ESP\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"prec\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">mydir</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"n\">precip</span><span class=\"w\">\n</span><span class=\"c1\">#&gt; class       : SpatRaster</span><span class=\"w\">\n</span><span class=\"c1\">#&gt; size        : 1980, 2760, 12  (nrow, ncol, nlyr)</span><span class=\"w\">\n</span><span class=\"c1\">#&gt; resolution  : 0.008333333, 0.008333333  (x, y)</span><span class=\"w\">\n</span><span class=\"c1\">#&gt; extent      : -18.5, 4.5, 27.5, 44  (xmin, xmax, ymin, ymax)</span><span class=\"w\">\n</span><span class=\"c1\">#&gt; coord. ref. : lon/lat WGS 84 (EPSG:4326)</span><span class=\"w\">\n</span><span class=\"c1\">#&gt; source      : ESP_wc2.1_30s_prec.tif</span><span class=\"w\">\n</span><span class=\"c1\">#&gt; names       : ESP_w~rec_1, ESP_w~rec_2, ESP_w~rec_3, ESP_w~rec_4, ESP_w~rec_5, ESP_w~rec_6, ...</span><span class=\"w\">\n</span><span class=\"c1\">#&gt; min values  :           0,           1,           1,           0,           0,           0, ...</span><span class=\"w\">\n</span><span class=\"c1\">#&gt; max values  :         296,         255,         199,         166,         181,         140, ...</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<p>We have now a SpatRaster with 12 layers representing the value of each month. So\nwe now just add the values by cell to get the annual mean. Note that we also\nneed to normalize the SpatRaster to the projection, extent and resolution of our\n<code class=\"language-plaintext highlighter-rouge\">hill</code> object:</p>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"c1\"># Sum all layers</span><span class=\"w\">\n</span><span class=\"n\">precip_avg</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"nf\">sum</span><span class=\"p\">(</span><span class=\"n\">precip</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"n\">precip_avg</span><span class=\"w\">\n</span><span class=\"c1\">#&gt; class       : SpatRaster</span><span class=\"w\">\n</span><span class=\"c1\">#&gt; size        : 1980, 2760, 1  (nrow, ncol, nlyr)</span><span class=\"w\">\n</span><span class=\"c1\">#&gt; resolution  : 0.008333333, 0.008333333  (x, y)</span><span class=\"w\">\n</span><span class=\"c1\">#&gt; extent      : -18.5, 4.5, 27.5, 44  (xmin, xmax, ymin, ymax)</span><span class=\"w\">\n</span><span class=\"c1\">#&gt; coord. ref. : lon/lat WGS 84 (EPSG:4326)</span><span class=\"w\">\n</span><span class=\"c1\">#&gt; source(s)   : memory</span><span class=\"w\">\n</span><span class=\"c1\">#&gt; name        :  sum</span><span class=\"w\">\n</span><span class=\"c1\">#&gt; min value   :    8</span><span class=\"w\">\n</span><span class=\"c1\">#&gt; max value   : 2055</span><span class=\"w\">\n\n</span><span class=\"n\">compare_spatrasters</span><span class=\"p\">(</span><span class=\"n\">precip_avg</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">hill</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"c1\"># Align raster using hill</span><span class=\"w\">\n\n</span><span class=\"n\">precip_avg_mask</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">precip_avg</span><span class=\"w\"> </span><span class=\"o\">|&gt;</span><span class=\"w\">\n  </span><span class=\"n\">project</span><span class=\"p\">(</span><span class=\"n\">hill</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">|&gt;</span><span class=\"w\">\n  </span><span class=\"n\">crop</span><span class=\"p\">(</span><span class=\"n\">hill</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">|&gt;</span><span class=\"w\">\n  </span><span class=\"n\">mask</span><span class=\"p\">(</span><span class=\"n\">hill</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"c1\"># Normalize</span><span class=\"w\">\n</span><span class=\"nf\">names</span><span class=\"p\">(</span><span class=\"n\">precip_avg_mask</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"s2\">\"prec\"</span><span class=\"w\">\n\n</span><span class=\"n\">compare_spatrasters</span><span class=\"p\">(</span><span class=\"n\">precip_avg_mask</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">hill</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"n\">autoplot</span><span class=\"p\">(</span><span class=\"n\">precip_avg_mask</span><span class=\"p\">)</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<p><img src=\"https://dieghernan.github.io/assets/img/blog/20221212_prepare_precip-1.webp\" alt=\"Map of mean annual precipitation in mainland Spain and the Balearic Islands. Higher values occur along the northern coast and lower values in the southeast.\" width=\"100%\" /></p>\n\n<h3 id=\"creating-a-modified-palette\">Creating a modified palette</h3>\n\n<p>We can now start representing our precipitation map. I chose here to create a\ncustom palette with <strong>colorspace</strong> to better highlight the differences:</p>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"n\">mypal</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">sequential_hcl</span><span class=\"p\">(</span><span class=\"w\">\n  </span><span class=\"n\">n</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">16</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">h</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"m\">320</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">80</span><span class=\"p\">),</span><span class=\"w\">\n  </span><span class=\"n\">c</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"m\">60</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">65</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">20</span><span class=\"p\">),</span><span class=\"w\">\n  </span><span class=\"n\">l</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"m\">30</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">95</span><span class=\"p\">),</span><span class=\"w\"> </span><span class=\"n\">power</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"m\">0.7</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">1.3</span><span class=\"p\">),</span><span class=\"w\">\n  </span><span class=\"n\">rev</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">TRUE</span><span class=\"w\">\n</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"n\">show_col</span><span class=\"p\">(</span><span class=\"n\">mypal</span><span class=\"p\">)</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<p><img src=\"https://dieghernan.github.io/assets/img/blog/20221212_mypal-1.webp\" alt=\"Grid of 16 color swatches with hexadecimal labels, forming a precipitation palette from pale yellow through green and blue to purple.\" width=\"100%\" /></p>\n\n<p>And now we can create the final map showing if <em>the rain in Spain stays mainly\nin the plain</em>:</p>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"c1\"># Precipitation limits, rounded to 100</span><span class=\"w\">\n</span><span class=\"n\">prec_limits</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"nf\">floor</span><span class=\"p\">(</span><span class=\"n\">as.vector</span><span class=\"p\">(</span><span class=\"n\">minmax</span><span class=\"p\">(</span><span class=\"n\">precip_avg_mask</span><span class=\"p\">))</span><span class=\"w\"> </span><span class=\"o\">/</span><span class=\"w\"> </span><span class=\"m\">100</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">*</span><span class=\"w\"> </span><span class=\"m\">100</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"m\">0</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">100</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"c1\"># Reuse this scale for the map and both marginal profiles</span><span class=\"w\">\n</span><span class=\"n\">precip_scale</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">scale_fill_gradientn</span><span class=\"p\">(</span><span class=\"w\">\n  </span><span class=\"n\">colours</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">mypal</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">limits</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">prec_limits</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">na.value</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">NA</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">labels</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">label_comma</span><span class=\"p\">(),</span><span class=\"w\">\n  </span><span class=\"n\">breaks</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">seq</span><span class=\"p\">(</span><span class=\"m\">0</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">prec_limits</span><span class=\"p\">[</span><span class=\"m\">2</span><span class=\"p\">],</span><span class=\"w\"> </span><span class=\"m\">250</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"n\">meteo_plot</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">blend_hillshade</span><span class=\"p\">(</span><span class=\"n\">precip_avg_mask</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">precip_scale</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">geom_spatvector</span><span class=\"p\">(</span><span class=\"w\">\n    </span><span class=\"n\">data</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">r_plain</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">color</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">alpha</span><span class=\"p\">(</span><span class=\"s2\">\"black\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">0.7</span><span class=\"p\">),</span><span class=\"w\">\n    </span><span class=\"n\">linewidth</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">.1</span><span class=\"w\">\n  </span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">guides</span><span class=\"p\">(</span><span class=\"n\">fill</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">guide_legend</span><span class=\"p\">(</span><span class=\"w\">\n    </span><span class=\"n\">direction</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"horizontal\"</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"n\">keyheight</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">.5</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"n\">keywidth</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">unit</span><span class=\"p\">(</span><span class=\"m\">0.4</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"in\"</span><span class=\"p\">),</span><span class=\"w\">\n    </span><span class=\"n\">theme</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">theme</span><span class=\"p\">(</span><span class=\"w\">\n      </span><span class=\"n\">legend.title.position</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"right\"</span><span class=\"p\">,</span><span class=\"w\">\n      </span><span class=\"n\">legend.text.position</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"bottom\"</span><span class=\"w\">\n    </span><span class=\"p\">),</span><span class=\"w\">\n    </span><span class=\"n\">nrow</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">1</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"n\">title</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\" mm.\"</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"n\">override.aes</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nf\">list</span><span class=\"p\">(</span><span class=\"n\">alpha</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">1</span><span class=\"p\">)</span><span class=\"w\">\n  </span><span class=\"p\">))</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">labs</span><span class=\"p\">(</span><span class=\"w\">\n    </span><span class=\"n\">title</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"Mean annual precipitation of Spain\"</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"n\">subtitle</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"The rain in Spain does not stay mainly in the plain\"</span><span class=\"w\">\n  </span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">theme</span><span class=\"p\">(</span><span class=\"w\">\n    </span><span class=\"n\">text</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">element_text</span><span class=\"p\">(</span><span class=\"n\">family</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"serif\"</span><span class=\"p\">),</span><span class=\"w\">\n    </span><span class=\"n\">plot.title</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">element_text</span><span class=\"p\">(</span><span class=\"w\">\n      </span><span class=\"n\">face</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"bold\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">size</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">base_text_size</span><span class=\"w\"> </span><span class=\"o\">*</span><span class=\"w\"> </span><span class=\"m\">1.5</span><span class=\"p\">,</span><span class=\"w\">\n      </span><span class=\"n\">hjust</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">0.5</span><span class=\"w\">\n    </span><span class=\"p\">),</span><span class=\"w\">\n    </span><span class=\"n\">plot.subtitle</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">element_text</span><span class=\"p\">(</span><span class=\"w\">\n      </span><span class=\"n\">size</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">base_text_size</span><span class=\"p\">,</span><span class=\"w\">\n      </span><span class=\"n\">hjust</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">0.5</span><span class=\"w\">\n    </span><span class=\"p\">),</span><span class=\"w\">\n    </span><span class=\"n\">axis.text</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">element_text</span><span class=\"p\">(</span><span class=\"n\">size</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">base_text_size</span><span class=\"w\"> </span><span class=\"o\">*</span><span class=\"w\"> </span><span class=\"m\">0.7</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">face</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"italic\"</span><span class=\"p\">),</span><span class=\"w\">\n    </span><span class=\"n\">legend.key</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">element_rect</span><span class=\"p\">(</span><span class=\"s2\">\"grey50\"</span><span class=\"p\">),</span><span class=\"w\">\n    </span><span class=\"n\">legend.position</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"bottom\"</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"n\">legend.title</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">element_text</span><span class=\"p\">(</span><span class=\"n\">size</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">base_text_size</span><span class=\"w\"> </span><span class=\"o\">*</span><span class=\"w\"> </span><span class=\"m\">.7</span><span class=\"p\">),</span><span class=\"w\">\n    </span><span class=\"n\">legend.text</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">element_text</span><span class=\"p\">(</span><span class=\"n\">size</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">base_text_size</span><span class=\"w\"> </span><span class=\"o\">*</span><span class=\"w\"> </span><span class=\"m\">.7</span><span class=\"p\">),</span><span class=\"w\">\n    </span><span class=\"n\">legend.key.spacing.x</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">unit</span><span class=\"p\">(</span><span class=\"m\">0</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"pt\"</span><span class=\"p\">)</span><span class=\"w\">\n  </span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"n\">meteo_plot</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<p><img src=\"https://dieghernan.github.io/assets/img/blog/20221212_precip_end-1.webp\" alt=\"Map of mean annual precipitation in Spain with hillshade beneath the color layer. Wetter northern and northwestern areas contrast with the drier southeast.\" width=\"100%\" /></p>\n\n<p>We can now see that the rain in Spain falls mainly on the Atlantic coast\n(northern Spain) and specifically in Galicia. That’s why in Spanish the lyrics\n<em>The rain in Spain stays mainly in the plain</em> were translated into:</p>\n\n<blockquote>\n  <p>La lluvia en Sevilla es una pura maravilla.</p>\n</blockquote>\n\n<p>That can be translated as <em>“The rain in Seville is a true marvel”</em>. And it is,\nindeed. Seville (located in the south on the <a href=\"https://goo.gl/maps/V8ZrDjrA74CTknYb7\">Guadalquivir\nValley</a>) has circa 50 rainy days per year,\nfeaturing very hot and dry summers.</p>\n\n<iframe class=\"d-block w-100 border-0 rounded my-3\" title=\"The Rain in Spain from My Fair Lady on Spotify\" src=\"https://open.spotify.com/embed/track/6E5hMCINTY7eAQdcMzCTgY?utm_source=generator&amp;theme=0&amp;si=20cfedcfe6d74ee0\" height=\"152\" loading=\"lazy\" allow=\"autoplay; clipboard-write; encrypted-media; fullscreen; picture-in-picture\" allowfullscreen=\"\">\n</iframe>\n\n<h2 id=\"marginal-plots-finally\">Marginal plots (finally)</h2>\n\n<p>We can now start profiling our final plot. The idea is to create two bar charts,\nrepresenting the value to be plotted (in this case, mean annual\nprecipitation) by longitude and latitude.</p>\n\n<p>The map and both profiles use <code class=\"language-plaintext highlighter-rouge\">precip_scale</code>, with the same opaque colors and\nexplicit limits. Hillshade changes the map’s brightness, while the profiles\nshow the unshaded palette. The means are calculated from the precipitation\nvalues, before any color mapping or blending.</p>\n\n<p>But first we add some additional margins and axis titles to the main plot, so we\ncan insert those marginal plots easily on our main plot:</p>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"c1\"># Now we can add titles on the secondary axis</span><span class=\"w\">\n\n</span><span class=\"n\">plot_main</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">meteo_plot</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">xlab</span><span class=\"p\">(</span><span class=\"s2\">\"\"</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">ylab</span><span class=\"p\">(</span><span class=\"s2\">\"\"</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"c1\"># titles on secondary axis, for later</span><span class=\"w\">\n  </span><span class=\"n\">scale_x_continuous</span><span class=\"p\">(</span><span class=\"n\">sec.axis</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">dup_axis</span><span class=\"p\">(</span><span class=\"w\">\n    </span><span class=\"n\">name</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"avg. precipitation by longitude\"</span><span class=\"w\">\n  </span><span class=\"p\">))</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">scale_y_continuous</span><span class=\"p\">(</span><span class=\"n\">sec.axis</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">dup_axis</span><span class=\"p\">(</span><span class=\"w\">\n    </span><span class=\"n\">name</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"avg. precipitation by latitude\"</span><span class=\"w\">\n  </span><span class=\"p\">))</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">theme</span><span class=\"p\">(</span><span class=\"w\">\n    </span><span class=\"n\">axis.title.x</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">element_text</span><span class=\"p\">(</span><span class=\"w\">\n      </span><span class=\"n\">margin</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">margin</span><span class=\"p\">(</span><span class=\"n\">t</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">base_text_size</span><span class=\"p\">),</span><span class=\"w\">\n      </span><span class=\"n\">size</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">base_text_size</span><span class=\"w\"> </span><span class=\"o\">*</span><span class=\"w\"> </span><span class=\"m\">1.2</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">face</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"italic\"</span><span class=\"w\">\n    </span><span class=\"p\">),</span><span class=\"w\">\n    </span><span class=\"n\">axis.title.y</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">element_text</span><span class=\"p\">(</span><span class=\"w\">\n      </span><span class=\"n\">angle</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">270</span><span class=\"p\">,</span><span class=\"w\">\n      </span><span class=\"n\">margin</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">margin</span><span class=\"p\">(</span><span class=\"w\">\n        </span><span class=\"n\">l</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">base_text_size</span><span class=\"p\">,</span><span class=\"w\">\n        </span><span class=\"n\">t</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">base_text_size</span><span class=\"w\">\n      </span><span class=\"p\">),</span><span class=\"w\">\n      </span><span class=\"n\">size</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">base_text_size</span><span class=\"w\"> </span><span class=\"o\">*</span><span class=\"w\"> </span><span class=\"m\">1.2</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">face</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"italic\"</span><span class=\"w\">\n    </span><span class=\"p\">)</span><span class=\"w\">\n  </span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"n\">plot_main</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<p><img src=\"https://dieghernan.github.io/assets/img/blog/20221212_precip_for_margin-1.webp\" alt=\"Map of mean annual precipitation in Spain prepared for adding marginal profiles. Colors distinguish the wetter north from the drier southeast.\" width=\"100%\" /></p>\n\n<h3 id=\"profiling-marginal-plots\">Profiling marginal plots</h3>\n\n<p>In the following code, I am drafting what the marginal plots would look\nlike, so we can have a preview of the final result:</p>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"c1\"># Profiling marginal plots</span><span class=\"w\">\n\n</span><span class=\"c1\"># Getting averages by x,y</span><span class=\"w\">\n</span><span class=\"n\">marg_x</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">precip_avg_mask</span><span class=\"w\"> </span><span class=\"o\">|&gt;</span><span class=\"w\">\n  </span><span class=\"n\">as_tibble</span><span class=\"p\">(</span><span class=\"n\">xy</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">TRUE</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">|&gt;</span><span class=\"w\">\n  </span><span class=\"n\">drop_na</span><span class=\"p\">()</span><span class=\"w\"> </span><span class=\"o\">|&gt;</span><span class=\"w\">\n  </span><span class=\"n\">group_by</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">|&gt;</span><span class=\"w\">\n  </span><span class=\"n\">summarise</span><span class=\"p\">(</span><span class=\"n\">avg</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">mean</span><span class=\"p\">(</span><span class=\"n\">prec</span><span class=\"p\">))</span><span class=\"w\">\n\n</span><span class=\"n\">marg_y</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">precip_avg_mask</span><span class=\"w\"> </span><span class=\"o\">|&gt;</span><span class=\"w\">\n  </span><span class=\"n\">as_tibble</span><span class=\"p\">(</span><span class=\"n\">xy</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">TRUE</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">|&gt;</span><span class=\"w\">\n  </span><span class=\"n\">drop_na</span><span class=\"p\">()</span><span class=\"w\"> </span><span class=\"o\">|&gt;</span><span class=\"w\">\n  </span><span class=\"n\">group_by</span><span class=\"p\">(</span><span class=\"n\">y</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">|&gt;</span><span class=\"w\">\n  </span><span class=\"n\">summarise</span><span class=\"p\">(</span><span class=\"n\">avg</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">mean</span><span class=\"p\">(</span><span class=\"n\">prec</span><span class=\"p\">))</span><span class=\"w\">\n\n</span><span class=\"c1\"># Cowplot would delete axis, we create an axis at 1000 and 2000</span><span class=\"w\">\n</span><span class=\"n\">br_4marginal</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"m\">1000</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">2000</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"n\">labs</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">data.frame</span><span class=\"p\">(</span><span class=\"n\">labs</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">paste</span><span class=\"p\">(</span><span class=\"w\">\n  </span><span class=\"n\">prettyNum</span><span class=\"p\">(</span><span class=\"n\">br_4marginal</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">big.mark</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\" \"</span><span class=\"p\">),</span><span class=\"w\">\n  </span><span class=\"s2\">\"mm.\"</span><span class=\"w\">\n</span><span class=\"p\">))</span><span class=\"w\">\n\n</span><span class=\"n\">labs</span><span class=\"o\">$</span><span class=\"n\">for_x</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"nf\">max</span><span class=\"p\">(</span><span class=\"n\">marg_x</span><span class=\"o\">$</span><span class=\"n\">x</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"w\"> </span><span class=\"n\">diff</span><span class=\"p\">(</span><span class=\"nf\">range</span><span class=\"p\">(</span><span class=\"n\">marg_x</span><span class=\"o\">$</span><span class=\"n\">x</span><span class=\"p\">))</span><span class=\"w\"> </span><span class=\"o\">*</span><span class=\"w\"> </span><span class=\"m\">0.05</span><span class=\"w\">\n</span><span class=\"n\">labs</span><span class=\"o\">$</span><span class=\"n\">for_y</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"nf\">min</span><span class=\"p\">(</span><span class=\"n\">marg_y</span><span class=\"o\">$</span><span class=\"n\">y</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"n\">diff</span><span class=\"p\">(</span><span class=\"nf\">range</span><span class=\"p\">(</span><span class=\"n\">marg_y</span><span class=\"o\">$</span><span class=\"n\">y</span><span class=\"p\">))</span><span class=\"w\"> </span><span class=\"o\">*</span><span class=\"w\"> </span><span class=\"m\">0.05</span><span class=\"w\">\n</span><span class=\"n\">labs</span><span class=\"o\">$</span><span class=\"n\">y</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">br_4marginal</span><span class=\"w\">\n\n</span><span class=\"c1\"># Profiling</span><span class=\"w\">\n</span><span class=\"n\">ggplot</span><span class=\"p\">()</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">geom_col</span><span class=\"p\">(</span><span class=\"w\">\n    </span><span class=\"n\">data</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">marg_x</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"n\">aes</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">avg</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">fill</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">avg</span><span class=\"p\">),</span><span class=\"w\">\n    </span><span class=\"n\">color</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">NA</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"n\">show.legend</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">FALSE</span><span class=\"w\">\n  </span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">geom_text</span><span class=\"p\">(</span><span class=\"w\">\n    </span><span class=\"n\">data</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">labs</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">aes</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">for_x</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">y</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">y</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">label</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">labs</span><span class=\"p\">),</span><span class=\"w\">\n    </span><span class=\"n\">nudge_y</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">100</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"n\">size</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">3</span><span class=\"w\">\n  </span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">precip_scale</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">scale_y_continuous</span><span class=\"p\">(</span><span class=\"w\">\n    </span><span class=\"n\">breaks</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">br_4marginal</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"n\">limits</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"m\">0</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"nf\">max</span><span class=\"p\">(</span><span class=\"n\">br_4marginal</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">*</span><span class=\"w\"> </span><span class=\"m\">1.5</span><span class=\"p\">)</span><span class=\"w\">\n  </span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">theme_void</span><span class=\"p\">()</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">theme</span><span class=\"p\">(</span><span class=\"n\">panel.grid.major.y</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">element_line</span><span class=\"p\">(</span><span class=\"w\">\n    </span><span class=\"n\">colour</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"grey50\"</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"n\">linetype</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"dashed\"</span><span class=\"w\">\n  </span><span class=\"p\">))</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<p><img src=\"https://dieghernan.github.io/assets/img/blog/20221212_profile_marg-1.webp\" alt=\"Bar profile of mean annual precipitation by east-west position in Spain. Bar height and color encode rainfall in millimeters, with the highest averages toward the west.\" width=\"100%\" /></p>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"w\">\n</span><span class=\"n\">ggplot</span><span class=\"p\">()</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">geom_col</span><span class=\"p\">(</span><span class=\"w\">\n    </span><span class=\"n\">data</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">marg_y</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"n\">aes</span><span class=\"p\">(</span><span class=\"n\">y</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">avg</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">fill</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">avg</span><span class=\"p\">),</span><span class=\"w\">\n    </span><span class=\"n\">color</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">NA</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"n\">show.legend</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">FALSE</span><span class=\"w\">\n  </span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">geom_text</span><span class=\"p\">(</span><span class=\"w\">\n    </span><span class=\"n\">data</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">labs</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">aes</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">for_y</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">y</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">y</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">label</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">labs</span><span class=\"p\">),</span><span class=\"w\">\n    </span><span class=\"n\">nudge_y</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">100</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"n\">angle</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">270</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"n\">size</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">3</span><span class=\"w\">\n  </span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">precip_scale</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">scale_y_continuous</span><span class=\"p\">(</span><span class=\"w\">\n    </span><span class=\"n\">breaks</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">br_4marginal</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"n\">limits</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"m\">0</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"nf\">max</span><span class=\"p\">(</span><span class=\"n\">br_4marginal</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">*</span><span class=\"w\"> </span><span class=\"m\">1.2</span><span class=\"p\">)</span><span class=\"w\">\n  </span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">coord_flip</span><span class=\"p\">()</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">theme_void</span><span class=\"p\">()</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">theme</span><span class=\"p\">(</span><span class=\"n\">panel.grid.major.x</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">element_line</span><span class=\"p\">(</span><span class=\"w\">\n    </span><span class=\"n\">colour</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"grey50\"</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"n\">linetype</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"dashed\"</span><span class=\"w\">\n  </span><span class=\"p\">))</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<p><img src=\"https://dieghernan.github.io/assets/img/blog/20221212_profile_marg-2.webp\" alt=\"Horizontal bar profile of mean annual precipitation by north-south position in Spain. Bar length and color encode rainfall in millimeters, with higher averages in the north.\" width=\"100%\" /></p>\n\n<h3 id=\"putting-all-the-pieces-together\">Putting all the pieces together</h3>\n\n<p>Finally, we use <code class=\"language-plaintext highlighter-rouge\">cowplot::axis_canvas()</code> to create the marginal plots as\nwe want:</p>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"c1\"># Last step: We combine plots</span><span class=\"w\">\n\n</span><span class=\"c1\"># Marginal plots</span><span class=\"w\">\n</span><span class=\"n\">plot_x</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">axis_canvas</span><span class=\"p\">(</span><span class=\"n\">plot_main</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">axis</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"x\"</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">geom_col</span><span class=\"p\">(</span><span class=\"w\">\n    </span><span class=\"n\">data</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">marg_x</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"n\">aes</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">avg</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">fill</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">avg</span><span class=\"p\">),</span><span class=\"w\">\n    </span><span class=\"n\">color</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">NA</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"n\">show.legend</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">FALSE</span><span class=\"w\">\n  </span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">geom_text</span><span class=\"p\">(</span><span class=\"w\">\n    </span><span class=\"n\">data</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">labs</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">aes</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">for_x</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">y</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">y</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">label</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">labs</span><span class=\"p\">),</span><span class=\"w\">\n    </span><span class=\"c1\"># Adjust the position of the labels</span><span class=\"w\">\n    </span><span class=\"n\">nudge_y</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">300</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"n\">family</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"serif\"</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"n\">fontface</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"italic\"</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"n\">size</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">base_text_size</span><span class=\"w\"> </span><span class=\"o\">*</span><span class=\"w\"> </span><span class=\"m\">0.2</span><span class=\"w\">\n  </span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">precip_scale</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">scale_y_continuous</span><span class=\"p\">(</span><span class=\"w\">\n    </span><span class=\"n\">breaks</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">br_4marginal</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"n\">limits</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"m\">0</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"nf\">max</span><span class=\"p\">(</span><span class=\"n\">br_4marginal</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">*</span><span class=\"w\"> </span><span class=\"m\">1.5</span><span class=\"p\">)</span><span class=\"w\">\n  </span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">theme_void</span><span class=\"p\">()</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">theme</span><span class=\"p\">(</span><span class=\"n\">panel.grid.major.y</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">element_line</span><span class=\"p\">(</span><span class=\"w\">\n    </span><span class=\"n\">colour</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"grey50\"</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"n\">linetype</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"dashed\"</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"n\">linewidth</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">0.1</span><span class=\"w\">\n  </span><span class=\"p\">))</span><span class=\"w\">\n\n</span><span class=\"n\">plot_x</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<p><img src=\"https://dieghernan.github.io/assets/img/blog/20221212_prepare_axis-1.webp\" alt=\"Bar profile of mean annual precipitation from west to east in Spain, formatted for placement above the map. Height and color encode rainfall in millimeters.\" width=\"100%\" /></p>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"w\">\n</span><span class=\"n\">plot_y</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">axis_canvas</span><span class=\"p\">(</span><span class=\"n\">plot_main</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">axis</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"y\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">coord_flip</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">TRUE</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">geom_col</span><span class=\"p\">(</span><span class=\"w\">\n    </span><span class=\"n\">data</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">marg_y</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"n\">aes</span><span class=\"p\">(</span><span class=\"n\">y</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">avg</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">fill</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">avg</span><span class=\"p\">),</span><span class=\"w\">\n    </span><span class=\"n\">color</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">NA</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"n\">show.legend</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">FALSE</span><span class=\"w\">\n  </span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">geom_text</span><span class=\"p\">(</span><span class=\"w\">\n    </span><span class=\"n\">data</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">labs</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">aes</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">for_y</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">y</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">y</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">label</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">labs</span><span class=\"p\">),</span><span class=\"w\">\n    </span><span class=\"c1\"># Adjust the position of the labels</span><span class=\"w\">\n    </span><span class=\"n\">nudge_y</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">300</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"n\">angle</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">270</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"n\">family</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"serif\"</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"n\">fontface</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"italic\"</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"n\">size</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">base_text_size</span><span class=\"w\"> </span><span class=\"o\">*</span><span class=\"w\"> </span><span class=\"m\">0.2</span><span class=\"w\">\n  </span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">precip_scale</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">scale_y_continuous</span><span class=\"p\">(</span><span class=\"w\">\n    </span><span class=\"n\">breaks</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">br_4marginal</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"n\">limits</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"m\">0</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"nf\">max</span><span class=\"p\">(</span><span class=\"n\">br_4marginal</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">*</span><span class=\"w\"> </span><span class=\"m\">1.5</span><span class=\"p\">)</span><span class=\"w\">\n  </span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">coord_flip</span><span class=\"p\">()</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">theme_void</span><span class=\"p\">()</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">theme</span><span class=\"p\">(</span><span class=\"n\">panel.grid.major.x</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">element_line</span><span class=\"p\">(</span><span class=\"w\">\n    </span><span class=\"n\">colour</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"grey50\"</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"n\">linetype</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"dashed\"</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"n\">linewidth</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">0.1</span><span class=\"w\">\n  </span><span class=\"p\">))</span><span class=\"w\">\n</span><span class=\"n\">plot_y</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<p><img src=\"https://dieghernan.github.io/assets/img/blog/20221212_prepare_axis-2.webp\" alt=\"Horizontal bar profile of mean annual precipitation from south to north in Spain, formatted for placement beside the map. Length and color encode rainfall in millimeters.\" width=\"100%\" /></p>\n\n<p>And insert everything in the main plot. See the final result:</p>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"c1\"># Combine all plots into one</span><span class=\"w\">\n</span><span class=\"n\">sizes_axis</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">grid</span><span class=\"o\">::</span><span class=\"n\">unit</span><span class=\"p\">(</span><span class=\"m\">.3</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"null\"</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"n\">plot_final</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">insert_xaxis_grob</span><span class=\"p\">(</span><span class=\"n\">plot_main</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">plot_x</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">position</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"top\"</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">height</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">sizes_axis</span><span class=\"w\">\n</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">plot_final</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">insert_yaxis_grob</span><span class=\"p\">(</span><span class=\"n\">plot_final</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">plot_y</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">position</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"right\"</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">width</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">sizes_axis</span><span class=\"w\"> </span><span class=\"o\">*</span><span class=\"w\"> </span><span class=\"m\">1.25</span><span class=\"w\">\n</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"n\">gg_final</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">ggdraw</span><span class=\"p\">(</span><span class=\"n\">plot_final</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">gg_final</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<p><img src=\"https://dieghernan.github.io/assets/img/blog/20221212_finalplot-1.webp\" alt=\"Map of mean annual precipitation in Spain with hillshade and marginal bar profiles above and to the right. Colors encode rainfall; the profiles summarize east-west and north-south averages.\" width=\"100%\" /></p>\n\n<p>And with a bit of effort we got it.</p>\n\n<h2 id=\"recap\">Recap</h2>\n\n<p>Much of the code we have created relates to the theming and labels of the\nplot. Here you can find a simplified version:</p>\n\n<details>\n  <summary>Simplified version</summary>\n\n  <div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"c1\"># Libraries</span><span class=\"w\">\n</span><span class=\"c1\"># Data manipulation</span><span class=\"w\">\n</span><span class=\"n\">library</span><span class=\"p\">(</span><span class=\"n\">terra</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">library</span><span class=\"p\">(</span><span class=\"n\">tidyterra</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">library</span><span class=\"p\">(</span><span class=\"n\">dplyr</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"c1\"># Get the data</span><span class=\"w\">\n</span><span class=\"n\">library</span><span class=\"p\">(</span><span class=\"n\">geodata</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"c1\"># Plotting</span><span class=\"w\">\n</span><span class=\"n\">library</span><span class=\"p\">(</span><span class=\"n\">ggplot2</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">library</span><span class=\"p\">(</span><span class=\"n\">scales</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">library</span><span class=\"p\">(</span><span class=\"n\">cowplot</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">library</span><span class=\"p\">(</span><span class=\"n\">colorspace</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"c1\"># Get the data</span><span class=\"w\">\n</span><span class=\"n\">mydir</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"s2\">\"~/R/mapslib/misc\"</span><span class=\"w\">\n\n</span><span class=\"n\">r</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">elevation_30s</span><span class=\"p\">(</span><span class=\"s2\">\"ESP\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">path</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">mydir</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">|&gt;</span><span class=\"w\">\n  </span><span class=\"n\">rename</span><span class=\"p\">(</span><span class=\"n\">alt</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">1</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">|&gt;</span><span class=\"w\">\n  </span><span class=\"n\">mutate</span><span class=\"p\">(</span><span class=\"n\">alt</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">pmax</span><span class=\"p\">(</span><span class=\"m\">0</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">alt</span><span class=\"p\">))</span><span class=\"w\">\n\n</span><span class=\"c1\"># Creating hillshade</span><span class=\"w\">\n\n</span><span class=\"n\">slope</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">terrain</span><span class=\"p\">(</span><span class=\"n\">r</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"slope\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">unit</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"radians\"</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">aspect</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">terrain</span><span class=\"p\">(</span><span class=\"n\">r</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"aspect\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">unit</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"radians\"</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">hill</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">shade</span><span class=\"p\">(</span><span class=\"n\">slope</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">aspect</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">30</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">45</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"c1\"># normalize names</span><span class=\"w\">\n</span><span class=\"nf\">names</span><span class=\"p\">(</span><span class=\"n\">hill</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"s2\">\"shades\"</span><span class=\"w\">\n\n</span><span class=\"c1\"># Hillshading palette</span><span class=\"w\">\n</span><span class=\"n\">pal_greys</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">hcl.colors</span><span class=\"p\">(</span><span class=\"m\">1000</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"Grays\"</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"c1\"># Index of color by cell</span><span class=\"w\">\n</span><span class=\"n\">index</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">hill</span><span class=\"w\"> </span><span class=\"o\">|&gt;</span><span class=\"w\">\n  </span><span class=\"n\">mutate</span><span class=\"p\">(</span><span class=\"n\">index_col</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">rescale</span><span class=\"p\">(</span><span class=\"n\">shades</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">to</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"m\">1</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"nf\">length</span><span class=\"p\">(</span><span class=\"n\">pal_greys</span><span class=\"p\">))))</span><span class=\"w\"> </span><span class=\"o\">|&gt;</span><span class=\"w\">\n  </span><span class=\"n\">mutate</span><span class=\"p\">(</span><span class=\"n\">index_col</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nf\">round</span><span class=\"p\">(</span><span class=\"n\">index_col</span><span class=\"p\">))</span><span class=\"w\"> </span><span class=\"o\">|&gt;</span><span class=\"w\">\n  </span><span class=\"n\">pull</span><span class=\"p\">(</span><span class=\"n\">index_col</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"c1\"># Get cols</span><span class=\"w\">\n</span><span class=\"n\">vector_cols</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">pal_greys</span><span class=\"p\">[</span><span class=\"n\">index</span><span class=\"p\">]</span><span class=\"w\">\n\n</span><span class=\"c1\"># Base hill plot</span><span class=\"w\">\n</span><span class=\"n\">hill_plot</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">ggplot</span><span class=\"p\">()</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">geom_spatraster</span><span class=\"p\">(</span><span class=\"w\">\n    </span><span class=\"n\">data</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">hill</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">fill</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">vector_cols</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">maxcell</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">Inf</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"n\">alpha</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">1</span><span class=\"w\">\n  </span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">theme_minimal</span><span class=\"p\">()</span><span class=\"w\">\n\n</span><span class=\"c1\"># Blend a thematic raster with the fixed hillshade colors</span><span class=\"w\">\n</span><span class=\"n\">blend_hillshade</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"k\">function</span><span class=\"p\">(</span><span class=\"n\">data</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">fill_scale</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"p\">{</span><span class=\"w\">\n  </span><span class=\"n\">stopifnot</span><span class=\"p\">(</span><span class=\"n\">compareGeom</span><span class=\"p\">(</span><span class=\"n\">data</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">hill</span><span class=\"p\">))</span><span class=\"w\">\n  </span><span class=\"n\">thematic_plot</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">ggplot</span><span class=\"p\">()</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n    </span><span class=\"n\">geom_spatraster</span><span class=\"p\">(</span><span class=\"n\">data</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">data</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">maxcell</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">Inf</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n    </span><span class=\"n\">fill_scale</span><span class=\"w\">\n  </span><span class=\"n\">thematic_fill</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">ggplot_build</span><span class=\"p\">(</span><span class=\"n\">thematic_plot</span><span class=\"p\">)</span><span class=\"o\">$</span><span class=\"n\">data</span><span class=\"p\">[[</span><span class=\"m\">1</span><span class=\"p\">]]</span><span class=\"o\">$</span><span class=\"n\">fill</span><span class=\"w\">\n  </span><span class=\"n\">stopifnot</span><span class=\"p\">(</span><span class=\"w\">\n    </span><span class=\"nf\">length</span><span class=\"p\">(</span><span class=\"n\">thematic_fill</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">==</span><span class=\"w\"> </span><span class=\"n\">ncell</span><span class=\"p\">(</span><span class=\"n\">data</span><span class=\"p\">),</span><span class=\"w\">\n    </span><span class=\"nf\">length</span><span class=\"p\">(</span><span class=\"n\">vector_cols</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">==</span><span class=\"w\"> </span><span class=\"n\">ncell</span><span class=\"p\">(</span><span class=\"n\">hill</span><span class=\"p\">)</span><span class=\"w\">\n  </span><span class=\"p\">)</span><span class=\"w\">\n\n  </span><span class=\"c1\"># The layer underneath supplies the scale and legend</span><span class=\"w\">\n  </span><span class=\"n\">thematic_plot</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n    </span><span class=\"p\">(</span><span class=\"nf\">list</span><span class=\"p\">(</span><span class=\"w\">\n      </span><span class=\"n\">geom_spatraster</span><span class=\"p\">(</span><span class=\"n\">data</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">data</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">fill</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">thematic_fill</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">maxcell</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">Inf</span><span class=\"p\">),</span><span class=\"w\">\n      </span><span class=\"n\">geom_spatraster</span><span class=\"p\">(</span><span class=\"w\">\n        </span><span class=\"n\">data</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">hill</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">fill</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">vector_cols</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">maxcell</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">Inf</span><span class=\"w\">\n      </span><span class=\"p\">)</span><span class=\"w\">\n    </span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">|&gt;</span><span class=\"w\">\n      </span><span class=\"n\">ggblend</span><span class=\"o\">::</span><span class=\"n\">blend</span><span class=\"p\">(</span><span class=\"s2\">\"multiply\"</span><span class=\"p\">))</span><span class=\"w\">\n</span><span class=\"p\">}</span><span class=\"w\">\n\n</span><span class=\"c1\"># Overlay</span><span class=\"w\">\n</span><span class=\"n\">precip</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">geodata</span><span class=\"o\">::</span><span class=\"n\">worldclim_country</span><span class=\"p\">(</span><span class=\"s2\">\"ESP\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"prec\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">mydir</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">precip_end</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"nf\">sum</span><span class=\"p\">(</span><span class=\"n\">precip</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">|&gt;</span><span class=\"w\">\n  </span><span class=\"n\">project</span><span class=\"p\">(</span><span class=\"n\">hill</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">|&gt;</span><span class=\"w\">\n  </span><span class=\"n\">crop</span><span class=\"p\">(</span><span class=\"n\">hill</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">|&gt;</span><span class=\"w\">\n  </span><span class=\"n\">mask</span><span class=\"p\">(</span><span class=\"n\">hill</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">|&gt;</span><span class=\"w\">\n  </span><span class=\"n\">rename</span><span class=\"p\">(</span><span class=\"n\">prec</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">1</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"n\">p_range</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">as.vector</span><span class=\"p\">(</span><span class=\"n\">minmax</span><span class=\"p\">(</span><span class=\"n\">precip_end</span><span class=\"p\">))</span><span class=\"w\">\n\n</span><span class=\"n\">mypal</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">sequential_hcl</span><span class=\"p\">(</span><span class=\"w\">\n  </span><span class=\"n\">n</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">16</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">h</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"m\">320</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">80</span><span class=\"p\">),</span><span class=\"w\">\n  </span><span class=\"n\">c</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"m\">60</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">65</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">20</span><span class=\"p\">),</span><span class=\"w\">\n  </span><span class=\"n\">l</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"m\">30</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">95</span><span class=\"p\">),</span><span class=\"w\"> </span><span class=\"n\">power</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"m\">0.7</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">1.3</span><span class=\"p\">),</span><span class=\"w\">\n  </span><span class=\"n\">rev</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">TRUE</span><span class=\"w\">\n</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"n\">precip_scale</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">scale_fill_gradientn</span><span class=\"p\">(</span><span class=\"w\">\n  </span><span class=\"n\">colours</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">mypal</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">na.value</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">NA</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">limits</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">p_range</span><span class=\"w\">\n</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">base_plot</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">blend_hillshade</span><span class=\"p\">(</span><span class=\"n\">precip_end</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">precip_scale</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">theme_minimal</span><span class=\"p\">()</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">theme</span><span class=\"p\">(</span><span class=\"n\">plot.background</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">element_rect</span><span class=\"p\">(</span><span class=\"n\">fill</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"#F0FFFF\"</span><span class=\"p\">))</span><span class=\"w\">\n\n</span><span class=\"c1\"># Marginal plots</span><span class=\"w\">\n</span><span class=\"c1\"># Data</span><span class=\"w\">\n</span><span class=\"n\">marg_x</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">precip_end</span><span class=\"w\"> </span><span class=\"o\">|&gt;</span><span class=\"w\">\n  </span><span class=\"n\">as_tibble</span><span class=\"p\">(</span><span class=\"n\">xy</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">TRUE</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">|&gt;</span><span class=\"w\">\n  </span><span class=\"n\">drop_na</span><span class=\"p\">()</span><span class=\"w\"> </span><span class=\"o\">|&gt;</span><span class=\"w\">\n  </span><span class=\"n\">group_by</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">|&gt;</span><span class=\"w\">\n  </span><span class=\"n\">summarise</span><span class=\"p\">(</span><span class=\"n\">avg</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">mean</span><span class=\"p\">(</span><span class=\"n\">prec</span><span class=\"p\">))</span><span class=\"w\">\n\n</span><span class=\"n\">marg_y</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">precip_end</span><span class=\"w\"> </span><span class=\"o\">|&gt;</span><span class=\"w\">\n  </span><span class=\"n\">as_tibble</span><span class=\"p\">(</span><span class=\"n\">xy</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">TRUE</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">|&gt;</span><span class=\"w\">\n  </span><span class=\"n\">drop_na</span><span class=\"p\">()</span><span class=\"w\"> </span><span class=\"o\">|&gt;</span><span class=\"w\">\n  </span><span class=\"n\">group_by</span><span class=\"p\">(</span><span class=\"n\">y</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">|&gt;</span><span class=\"w\">\n  </span><span class=\"n\">summarise</span><span class=\"p\">(</span><span class=\"n\">avg</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">mean</span><span class=\"p\">(</span><span class=\"n\">prec</span><span class=\"p\">))</span><span class=\"w\">\n\n</span><span class=\"c1\"># Adding marginal plots</span><span class=\"w\">\n\n</span><span class=\"n\">plot_x</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">axis_canvas</span><span class=\"p\">(</span><span class=\"n\">base_plot</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">axis</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"x\"</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">geom_col</span><span class=\"p\">(</span><span class=\"w\">\n    </span><span class=\"n\">data</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">marg_x</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"n\">aes</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">avg</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">fill</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">avg</span><span class=\"p\">),</span><span class=\"w\">\n    </span><span class=\"n\">color</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">NA</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"n\">show.legend</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">FALSE</span><span class=\"w\">\n  </span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">precip_scale</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">theme_void</span><span class=\"p\">()</span><span class=\"w\">\n\n</span><span class=\"n\">plot_y</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">axis_canvas</span><span class=\"p\">(</span><span class=\"n\">base_plot</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">axis</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"y\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">coord_flip</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">TRUE</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">geom_col</span><span class=\"p\">(</span><span class=\"w\">\n    </span><span class=\"n\">data</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">marg_y</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"n\">aes</span><span class=\"p\">(</span><span class=\"n\">y</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">avg</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">fill</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">avg</span><span class=\"p\">),</span><span class=\"w\">\n    </span><span class=\"n\">color</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">NA</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"n\">show.legend</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">FALSE</span><span class=\"w\">\n  </span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">precip_scale</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">theme_void</span><span class=\"p\">()</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">coord_flip</span><span class=\"p\">()</span><span class=\"w\">\n\n</span><span class=\"c1\"># All pieces together</span><span class=\"w\">\n</span><span class=\"n\">sizes_axis</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">grid</span><span class=\"o\">::</span><span class=\"n\">unit</span><span class=\"p\">(</span><span class=\"m\">.3</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"null\"</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"n\">plot_final_simp</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">insert_xaxis_grob</span><span class=\"p\">(</span><span class=\"n\">base_plot</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">plot_x</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">position</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"top\"</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">height</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">sizes_axis</span><span class=\"w\">\n</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">plot_final_simp</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">insert_yaxis_grob</span><span class=\"p\">(</span><span class=\"n\">plot_final_simp</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">plot_y</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">position</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"right\"</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">width</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">sizes_axis</span><span class=\"w\"> </span><span class=\"o\">*</span><span class=\"w\"> </span><span class=\"m\">1.25</span><span class=\"w\">\n</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"n\">gg_final_simp</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">ggdraw</span><span class=\"p\">(</span><span class=\"n\">plot_final_simp</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">gg_final_simp</span><span class=\"w\">\n</span></code></pre></div>  </div>\n\n  <p><img src=\"https://dieghernan.github.io/assets/img/blog/20221212_simplified-1.webp\" alt=\"Simplified precipitation map of Spain with marginal bar profiles above and to the right. Colors encode rainfall, with higher averages in the north and west.\" width=\"100%\" /></p>\n\n</details>\n",
      "date_published": "2022-12-12T00:00:00+01:00",
      "date_modified": "2026-10-25T00:00:00+02:00",
      "image": "https://dieghernan.github.io/assets/img/blog/20221212_finalplot-1.webp",
      "summary": "Add marginal plots to a SpatRaster map on ggplot2",
      "tags": ["music","r_bloggers","rstats","rspatial","maps","hillshading","ggplot2","tidyterra","terra","inset","mapSpain"],
      "authors": [{
        "name": "Diego HH",
        "url": "https://dieghernan.github.io/"
      }]
    },
    {
      "id": "https://dieghernan.github.io/202210_tidyterra-hillshade/",
      "url": "https://dieghernan.github.io/202210_tidyterra-hillshade/",
      "title": "Hillshade, colors and marginal plots with tidyterra (I)",
      "content_html": "<p class=\"alert alert-info p-3 mx-2 mb-3\"><strong>Updated on October 25, 2026:</strong> This post now uses <strong>ggblend</strong> to combine\nhillshade and elevation colors with a multiply blend, following <a href=\"https://barney.fly.dev/2026/01/27/ggplot2-blending-adventure/\">Barney Harris’s\nblending\nadventure</a>. The\nfinal map replaces the original overlay with reduced opacity. Dominic Royé also\ndemonstrates how to use <strong>ggblend</strong> in <a href=\"https://dominicroye.github.io/blog/hillshade-effect/\">Hillshade\neffects</a>.</p>\n\n<p><em>This is the first post of a series of two, showing how to overlay a SpatRaster\non top of a hillshade background. The next post shows how to add marginal plots\nincluding information about the values of the raster by longitude and latitude.\nSee the second post\n<a href=\"https://dieghernan.github.io/202212_tidyterra-hillshade-2/\">here</a>.</em></p>\n\n<p>Using shadow effects on relief maps is a very common technique that helps\nproduce informative yet beautiful maps. If you are interested in this topic and\nyou work with <strong>R</strong>, you have probably seen this map:</p>\n\n<p><img src=\"https://timogrossenbacher.ch/content/images/size/w2000/2023/07/bm-thematic-bivariate-map-with-legend-1-2.png\" alt=\"Map of Swiss municipalities over shaded relief. A nine-color legend combines average income and income inequality, measured by the Gini coefficient.\" /></p>\n\n<p>The production of this map by <a href=\"https://timogrossenbacher.ch/bivariate-maps-with-ggplot2-and-sf/\">Timo\nGrossenbacher</a>\nhas been a reference for years. However, recent developments in the <strong>R</strong>\npackage ecosystem (<strong>terra</strong>, <strong>sf</strong> and support of both classes on <strong>ggplot2</strong>,\ndevelopment of <strong>ggnewscale</strong>, etc.) can make it even easier to produce these\ntypes of maps.</p>\n\n<p>In fact, Dominic Royé recently wrote a very detailed\n<a href=\"https://dominicroye.github.io/blog/hillshade-effect/\">post</a> on creating shadow\neffects on map reliefs. In this first post of the series, I replicate that\ntechnique with a slight variation (e.g. not making use of <strong>ggnewscale</strong>) and\ndiscuss the potential choice of a color palette for this kind of map.</p>\n\n<h2 id=\"libraries\">Libraries</h2>\n\n<p>I will use the following libraries:</p>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"c1\">## Libraries</span><span class=\"w\">\n\n</span><span class=\"n\">library</span><span class=\"p\">(</span><span class=\"n\">terra</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">library</span><span class=\"p\">(</span><span class=\"n\">tidyterra</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">library</span><span class=\"p\">(</span><span class=\"n\">ggplot2</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">library</span><span class=\"p\">(</span><span class=\"n\">dplyr</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">library</span><span class=\"p\">(</span><span class=\"n\">scales</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"c1\"># Get the data</span><span class=\"w\">\n</span><span class=\"n\">library</span><span class=\"p\">(</span><span class=\"n\">geodata</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"c1\"># Define a common theme for the maps.</span><span class=\"w\">\n</span><span class=\"n\">background</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"s2\">\"#faf8f2\"</span><span class=\"w\">\n</span><span class=\"n\">ink</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"s2\">\"#203b47\"</span><span class=\"w\">\n\n</span><span class=\"n\">theme_set</span><span class=\"p\">(</span><span class=\"w\">\n  </span><span class=\"n\">theme_void</span><span class=\"p\">()</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n    </span><span class=\"n\">theme</span><span class=\"p\">(</span><span class=\"w\">\n      </span><span class=\"n\">plot.background</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">element_rect</span><span class=\"p\">(</span><span class=\"n\">fill</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">background</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">colour</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">NA</span><span class=\"p\">),</span><span class=\"w\">\n      </span><span class=\"n\">panel.background</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">element_rect</span><span class=\"p\">(</span><span class=\"n\">fill</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">background</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">colour</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">NA</span><span class=\"p\">),</span><span class=\"w\">\n      </span><span class=\"n\">plot.title</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">element_text</span><span class=\"p\">(</span><span class=\"n\">face</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"bold\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">colour</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">ink</span><span class=\"p\">),</span><span class=\"w\">\n      </span><span class=\"n\">plot.subtitle</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">element_text</span><span class=\"p\">(</span><span class=\"n\">colour</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">ink</span><span class=\"p\">),</span><span class=\"w\">\n      </span><span class=\"n\">plot.caption</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">element_text</span><span class=\"p\">(</span><span class=\"n\">colour</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"grey40\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">hjust</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">0</span><span class=\"p\">),</span><span class=\"w\">\n      </span><span class=\"n\">plot.margin</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">margin</span><span class=\"p\">(</span><span class=\"m\">10</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">10</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">10</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">10</span><span class=\"p\">)</span><span class=\"w\">\n    </span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"p\">)</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<h2 id=\"get-the-data\">Get the data</h2>\n\n<p>The first step is to get the altitude data. I use the <strong>geodata</strong> package for\nsimplicity, but you can also use <strong>elevatr</strong>, which is much more comprehensive.\nHowever, <strong>elevatr</strong> produces the result as a <code class=\"language-plaintext highlighter-rouge\">RasterLayer</code>, so you would need\nto convert the object to <code class=\"language-plaintext highlighter-rouge\">SpatRaster</code> with <code class=\"language-plaintext highlighter-rouge\">terra::rast()</code>.</p>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"c1\"># Cache map data</span><span class=\"w\">\n</span><span class=\"n\">mydir</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"s2\">\"~/R/mapslib/misc\"</span><span class=\"w\">\n\n</span><span class=\"n\">r_init</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">elevation_30s</span><span class=\"p\">(</span><span class=\"s2\">\"ROU\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">path</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">mydir</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"n\">r_init</span><span class=\"w\">\n</span><span class=\"c1\">#&gt; class       : SpatRaster</span><span class=\"w\">\n</span><span class=\"c1\">#&gt; size        : 588, 1176, 1  (nrow, ncol, nlyr)</span><span class=\"w\">\n</span><span class=\"c1\">#&gt; resolution  : 0.008333333, 0.008333333  (x, y)</span><span class=\"w\">\n</span><span class=\"c1\">#&gt; extent      : 20.1, 29.9, 43.5, 48.4  (xmin, xmax, ymin, ymax)</span><span class=\"w\">\n</span><span class=\"c1\">#&gt; coord. ref. : lon/lat WGS 84 (EPSG:4326)</span><span class=\"w\">\n</span><span class=\"c1\">#&gt; source      : ROU_elv_msk.tif</span><span class=\"w\">\n</span><span class=\"c1\">#&gt; name        : ROU_elv_msk</span><span class=\"w\">\n</span><span class=\"c1\">#&gt; min value   :          -4</span><span class=\"w\">\n</span><span class=\"c1\">#&gt; max value   :        2481</span><span class=\"w\">\n\n</span><span class=\"c1\"># For better handling we set here the names</span><span class=\"w\">\n</span><span class=\"nf\">names</span><span class=\"p\">(</span><span class=\"n\">r_init</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"s2\">\"alt\"</span><span class=\"w\">\n\n</span><span class=\"c1\"># We don't want values lower than 0</span><span class=\"w\">\n</span><span class=\"n\">r</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">r_init</span><span class=\"w\"> </span><span class=\"o\">|&gt;</span><span class=\"w\">\n  </span><span class=\"n\">mutate</span><span class=\"p\">(</span><span class=\"n\">alt</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">pmax</span><span class=\"p\">(</span><span class=\"m\">0</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">alt</span><span class=\"p\">))</span><span class=\"w\">\n\n</span><span class=\"n\">r</span><span class=\"w\">\n</span><span class=\"c1\">#&gt; class       : SpatRaster</span><span class=\"w\">\n</span><span class=\"c1\">#&gt; size        : 588, 1176, 1  (nrow, ncol, nlyr)</span><span class=\"w\">\n</span><span class=\"c1\">#&gt; resolution  : 0.008333333, 0.008333333  (x, y)</span><span class=\"w\">\n</span><span class=\"c1\">#&gt; extent      : 20.1, 29.9, 43.5, 48.4  (xmin, xmax, ymin, ymax)</span><span class=\"w\">\n</span><span class=\"c1\">#&gt; coord. ref. : lon/lat WGS 84 (EPSG:4326)</span><span class=\"w\">\n</span><span class=\"c1\">#&gt; source(s)   : memory</span><span class=\"w\">\n</span><span class=\"c1\">#&gt; name        :  alt</span><span class=\"w\">\n</span><span class=\"c1\">#&gt; min value   :    0</span><span class=\"w\">\n</span><span class=\"c1\">#&gt; max value   : 2481</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<p>We can now have a quick look at the plot with <code class=\"language-plaintext highlighter-rouge\">tidyterra::autoplot()</code>:</p>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"c1\"># Quick look</span><span class=\"w\">\n</span><span class=\"n\">autoplot</span><span class=\"p\">(</span><span class=\"n\">r</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">scale_fill_terrain_c</span><span class=\"p\">(</span><span class=\"n\">na.value</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">NA</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">facet_wrap</span><span class=\"p\">(</span><span class=\"n\">vars</span><span class=\"p\">(</span><span class=\"n\">lyr</span><span class=\"p\">))</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">theme_minimal</span><span class=\"p\">()</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<p><img src=\"https://dieghernan.github.io/assets/img/blog/20221017-1-autoplot-1.webp\" alt=\"Elevation map of Romania. Colors represent altitude and highlight the arc of the Carpathian Mountains.\" width=\"100%\" /></p>\n\n<h2 id=\"hillshading\">Hillshading</h2>\n\n<p>The next step is to calculate the hillshade. Royé has a very detailed discussion\n<a href=\"https://dominicroye.github.io/blog/hillshade-effect/#calculate-the-hillshade\">here</a>,\nso I would not go into details. Basically what we want to create is a layer that\napproximates the potential “texture” of the surface based on the elevation and\nthe sun’s position. This is straightforward with the <code class=\"language-plaintext highlighter-rouge\">terra::terrain()</code> and\n<code class=\"language-plaintext highlighter-rouge\">terra::shade()</code> functions.</p>\n\n<p>The resulting hillshade may have a relatively narrow range of intensity values,\nproducing a rather flat appearance when combined with elevation colors. To\nenhance terrain details, we apply a <strong>percentile-based contrast stretch</strong>,\nmapping the 5th and 95th percentiles to 0 and 1, respectively, and clipping\nvalues outside this range. This expands the tonal range and makes subtle terrain\nfeatures more visible without changing the underlying elevation data. Note that\nthis is purely a visual adjustment that produces a more <em>“dramatic”</em> map: it\ndoes not add terrain information or modify the hillshading algorithm.</p>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"c1\">## Create hillshade effect</span><span class=\"w\">\n\n</span><span class=\"n\">slope</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">terrain</span><span class=\"p\">(</span><span class=\"n\">r</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"slope\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">unit</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"radians\"</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">aspect</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">terrain</span><span class=\"p\">(</span><span class=\"n\">r</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"aspect\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">unit</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"radians\"</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"c1\"># Multi-shadow</span><span class=\"w\">\n</span><span class=\"n\">hill</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">shade</span><span class=\"p\">(</span><span class=\"n\">slope</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">aspect</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">45</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">direction</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"m\">225</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">270</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">315</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">360</span><span class=\"p\">))</span><span class=\"w\"> </span><span class=\"o\">|&gt;</span><span class=\"w\"> </span><span class=\"n\">mean</span><span class=\"p\">()</span><span class=\"w\">\n\n</span><span class=\"c1\"># Stretching</span><span class=\"w\">\n</span><span class=\"n\">q</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"nf\">as.numeric</span><span class=\"p\">(</span><span class=\"n\">quantile</span><span class=\"p\">(</span><span class=\"n\">values</span><span class=\"p\">(</span><span class=\"n\">hill</span><span class=\"p\">),</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"m\">0.05</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">0.95</span><span class=\"p\">),</span><span class=\"w\"> </span><span class=\"n\">na.rm</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">TRUE</span><span class=\"p\">))</span><span class=\"w\">\n\n</span><span class=\"n\">hill</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">clamp</span><span class=\"p\">((</span><span class=\"n\">hill</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"w\"> </span><span class=\"n\">q</span><span class=\"p\">[</span><span class=\"m\">1</span><span class=\"p\">])</span><span class=\"w\"> </span><span class=\"o\">/</span><span class=\"w\"> </span><span class=\"n\">diff</span><span class=\"p\">(</span><span class=\"n\">q</span><span class=\"p\">),</span><span class=\"w\"> </span><span class=\"m\">0</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">1</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"c1\"># Normalize names</span><span class=\"w\">\n</span><span class=\"nf\">names</span><span class=\"p\">(</span><span class=\"n\">hill</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"s2\">\"shades\"</span><span class=\"w\">\n\n</span><span class=\"c1\"># Hillshading, but we need a palette</span><span class=\"w\">\n</span><span class=\"n\">pal_greys</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">hcl.colors</span><span class=\"p\">(</span><span class=\"m\">1000</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"Grays\"</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"n\">ggplot</span><span class=\"p\">()</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">geom_spatraster</span><span class=\"p\">(</span><span class=\"n\">data</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">hill</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">scale_fill_gradientn</span><span class=\"p\">(</span><span class=\"n\">colors</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">pal_greys</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">na.value</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">NA</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"c1\">#&gt; &lt;SpatRaster&gt; resampled to 501501 cells.</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<p><img src=\"https://dieghernan.github.io/assets/img/blog/20221017-2-hillroye-1.webp\" alt=\"Grayscale hillshade map of Romania, revealing the Carpathian mountain arc through simulated light and shadow.\" width=\"100%\" /></p>\n\n<p>We can also do the following hack to avoid the use of a <code class=\"language-plaintext highlighter-rouge\">scale_fill_*</code> (via\n<strong>ggplot2</strong> or via <code class=\"language-plaintext highlighter-rouge\">ggnewscale::new_scale_fill()</code>):</p>\n\n<ul>\n  <li>Select a vector of colors (in this post <code class=\"language-plaintext highlighter-rouge\">pal_greys</code>).</li>\n  <li>Extract the values of the raster and rescale them to the length of the palette\n(<code class=\"language-plaintext highlighter-rouge\">c(1, 1000)</code>).</li>\n  <li>Round those rescaled values to the nearest integer. So we would have an index\nindicating which value of <code class=\"language-plaintext highlighter-rouge\">pal_greys</code> should be mapped to each cell.</li>\n  <li>Now use the parameter <code class=\"language-plaintext highlighter-rouge\">fill</code> on the <code class=\"language-plaintext highlighter-rouge\">geom_</code> instead of using the scale.</li>\n</ul>\n\n<p>An additional note is that <code class=\"language-plaintext highlighter-rouge\">geom_spatraster()</code> has a parameter <code class=\"language-plaintext highlighter-rouge\">maxcell</code> that\nwould perform a spatial resampling if the raster has more cells than <code class=\"language-plaintext highlighter-rouge\">maxcell</code>.\nThis is for optimization (note that <code class=\"language-plaintext highlighter-rouge\">terra::plot()</code> has the same setup and that\nusers often forget about it), but we can force all cells to be plotted by using\n<code class=\"language-plaintext highlighter-rouge\">maxcell = Inf</code>. In this approach using <code class=\"language-plaintext highlighter-rouge\">fill</code>, the value of <code class=\"language-plaintext highlighter-rouge\">maxcell</code> needs to\nbe effectively set to <code class=\"language-plaintext highlighter-rouge\">Inf</code> to ensure that the number of color values and the\nnumber of cells are the same.</p>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"c1\"># Use a vector of colors</span><span class=\"w\">\n\n</span><span class=\"n\">index</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">hill</span><span class=\"w\"> </span><span class=\"o\">|&gt;</span><span class=\"w\">\n  </span><span class=\"n\">mutate</span><span class=\"p\">(</span><span class=\"n\">index_col</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">rescale</span><span class=\"p\">(</span><span class=\"n\">shades</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">to</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"m\">1</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"nf\">length</span><span class=\"p\">(</span><span class=\"n\">pal_greys</span><span class=\"p\">))))</span><span class=\"w\"> </span><span class=\"o\">|&gt;</span><span class=\"w\">\n  </span><span class=\"n\">mutate</span><span class=\"p\">(</span><span class=\"n\">index_col</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nf\">round</span><span class=\"p\">(</span><span class=\"n\">index_col</span><span class=\"p\">))</span><span class=\"w\"> </span><span class=\"o\">|&gt;</span><span class=\"w\">\n  </span><span class=\"n\">pull</span><span class=\"p\">(</span><span class=\"n\">index_col</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"c1\"># Get cols</span><span class=\"w\">\n</span><span class=\"n\">vector_cols</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">pal_greys</span><span class=\"p\">[</span><span class=\"n\">index</span><span class=\"p\">]</span><span class=\"w\">\n\n</span><span class=\"c1\"># Need to avoid resampling</span><span class=\"w\">\n</span><span class=\"c1\"># and don't use aes</span><span class=\"w\">\n\n</span><span class=\"n\">hill_plot</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">ggplot</span><span class=\"p\">()</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">geom_spatraster</span><span class=\"p\">(</span><span class=\"w\">\n    </span><span class=\"n\">data</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">hill</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">fill</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">vector_cols</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">maxcell</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">Inf</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"n\">alpha</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">1</span><span class=\"w\">\n  </span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"n\">hill_plot</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<p><img src=\"https://dieghernan.github.io/assets/img/blog/20221017-3-hillalt-1.webp\" alt=\"Alternative grayscale hillshade map of Romania, showing terrain relief with a different shading calculation.\" width=\"100%\" /></p>\n\n<h2 id=\"selecting-colors\">Selecting colors</h2>\n\n<p>The selection of colors for elevation maps is a key aspect when designing this\nkind of visualization since colors can be confused with environmental phenomena\n(Patterson and Jenny, 2011). For example, by convention green colors are\nassociated with low elevations, while orange, browns and whites are associated\nwith high elevations on some of the most common elevation palettes (aka\nhypsometric tints). See for example the <a href=\"https://en.wikipedia.org/wiki/Wikipedia:WikiProject_Maps/Conventions/Topographic_maps\">Wikipedia Topographic maps\nconventions</a>.</p>\n\n<p>This is not ideal, since greens can be confused with forests, for example, so an\nelevation map of desert areas would not be appropriate with a green-brown-white\ncolor scheme.</p>\n\n<p>There is an additional point to take into account when designing color palettes\nfor maps. A regular gradient would just interpolate colors assuming that the\ndistance among colors is the same:</p>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"c1\"># Regular gradient</span><span class=\"w\">\n</span><span class=\"n\">grad</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">hypso.colors</span><span class=\"p\">(</span><span class=\"m\">10</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"dem_poster\"</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"n\">autoplot</span><span class=\"p\">(</span><span class=\"n\">r</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">facet_wrap</span><span class=\"p\">(</span><span class=\"n\">vars</span><span class=\"p\">(</span><span class=\"n\">lyr</span><span class=\"p\">))</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">scale_fill_gradientn</span><span class=\"p\">(</span><span class=\"n\">colours</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">grad</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">na.value</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">NA</span><span class=\"p\">)</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<p><img src=\"https://dieghernan.github.io/assets/img/blog/20221017-regular-gradient-1.webp\" alt=\"Elevation map of Romania using a regular color gradient. Green lowlands surround the higher Carpathian Mountains.\" width=\"100%\" /></p>\n\n<p>For that reason, <strong>tidyterra</strong> provides additional gradients whose colors are\nplaced unevenly with the goal of providing a better understanding of the maps:</p>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"c1\"># Hypso gradient</span><span class=\"w\">\n</span><span class=\"n\">grad_hypso</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">hypso.colors2</span><span class=\"p\">(</span><span class=\"m\">10</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"dem_poster\"</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"n\">autoplot</span><span class=\"p\">(</span><span class=\"n\">r</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">facet_wrap</span><span class=\"p\">(</span><span class=\"n\">vars</span><span class=\"p\">(</span><span class=\"n\">lyr</span><span class=\"p\">))</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">scale_fill_gradientn</span><span class=\"p\">(</span><span class=\"n\">colours</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">grad_hypso</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">na.value</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">NA</span><span class=\"p\">)</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<p><img src=\"https://dieghernan.github.io/assets/img/blog/20221017-hypso-gradient-1.webp\" alt=\"Elevation map of Romania using a hypsometric color gradient to distinguish lowlands, uplands and mountain peaks.\" width=\"100%\" /></p>\n\n<p>Can you notice the difference? In the first map greens are the dominant color.\nHowever greens are representing a wide range of elevations (0-750 meters) that\ncorrespond with most of the territory. In terms of perception, we won’t be\nclearly spotting elevation differences in the center of the country, while with\nthe uneven gradient greens only correspond to the range (0 - 250 meters) and the\noverall perception of elevation improves. Note that the only difference between\nplots is exclusively the color palette.</p>\n\n<p>For producing our map we are going to assess visually the result of a selection\nof palettes provided by <strong>tidyterra</strong>. We use here the version\n<code class=\"language-plaintext highlighter-rouge\">tidyterra::scale_fill_hypso_tint_c()</code> instead of\n<code class=\"language-plaintext highlighter-rouge\">tidyterra::scale_fill_hypso_c()</code> for taking advantage of the uneven color\ngradients.</p>\n\n<p>A downside of using these scales is that we also need to adjust the <code class=\"language-plaintext highlighter-rouge\">limits</code>\nargument of the functions to make <strong>ggplot2</strong> aware of the limits of the value\nof the raster. This is easily achieved with <code class=\"language-plaintext highlighter-rouge\">terra::minmax()</code> but I added an\nextra touch rounding up and down the range of values to the nearest 500.</p>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"c1\"># Try some options, but we need to be aware of the values of our raster</span><span class=\"w\">\n\n</span><span class=\"n\">r_limits</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">minmax</span><span class=\"p\">(</span><span class=\"n\">r</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">|&gt;</span><span class=\"w\"> </span><span class=\"n\">as.vector</span><span class=\"p\">()</span><span class=\"w\">\n\n</span><span class=\"c1\"># Rounded to lower and upper 500</span><span class=\"w\">\n</span><span class=\"n\">r_limits</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"nf\">floor</span><span class=\"p\">(</span><span class=\"n\">r_limits</span><span class=\"p\">[</span><span class=\"m\">1</span><span class=\"p\">]</span><span class=\"w\"> </span><span class=\"o\">/</span><span class=\"w\"> </span><span class=\"m\">500</span><span class=\"p\">),</span><span class=\"w\"> </span><span class=\"nf\">ceiling</span><span class=\"p\">(</span><span class=\"n\">r_limits</span><span class=\"p\">[</span><span class=\"m\">2</span><span class=\"p\">]</span><span class=\"w\"> </span><span class=\"o\">/</span><span class=\"w\"> </span><span class=\"m\">500</span><span class=\"p\">))</span><span class=\"w\"> </span><span class=\"o\">*</span><span class=\"w\"> </span><span class=\"m\">500</span><span class=\"w\">\n\n</span><span class=\"c1\"># And making min value to 0.</span><span class=\"w\">\n</span><span class=\"n\">r_limits</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">pmax</span><span class=\"p\">(</span><span class=\"n\">r_limits</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">0</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"c1\"># Compare</span><span class=\"w\">\n</span><span class=\"n\">minmax</span><span class=\"p\">(</span><span class=\"n\">r</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">|&gt;</span><span class=\"w\"> </span><span class=\"n\">as.vector</span><span class=\"p\">()</span><span class=\"w\">\n</span><span class=\"c1\">#&gt; [1]    0 2481</span><span class=\"w\">\n</span><span class=\"n\">r_limits</span><span class=\"w\">\n</span><span class=\"c1\">#&gt; [1]    0 2500</span><span class=\"w\">\n\n</span><span class=\"c1\"># Now let's have some fun with scales from tidyterra</span><span class=\"w\">\n\n</span><span class=\"n\">elevt_test</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">ggplot</span><span class=\"p\">()</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">geom_spatraster</span><span class=\"p\">(</span><span class=\"n\">data</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">r</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"c1\"># Create a helper function</span><span class=\"w\">\n\n</span><span class=\"n\">plot_pal_test</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"k\">function</span><span class=\"p\">(</span><span class=\"n\">pal</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"p\">{</span><span class=\"w\">\n  </span><span class=\"n\">palette_stops</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">hypsometric_tints_db</span><span class=\"p\">[</span><span class=\"n\">hypsometric_tints_db</span><span class=\"o\">$</span><span class=\"n\">pal</span><span class=\"w\"> </span><span class=\"o\">==</span><span class=\"w\"> </span><span class=\"n\">pal</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"p\">]</span><span class=\"w\">\n  </span><span class=\"n\">elevt_test</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n    </span><span class=\"n\">scale_fill_hypso_tint_c</span><span class=\"p\">(</span><span class=\"w\">\n      </span><span class=\"n\">limits</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">r_limits</span><span class=\"p\">,</span><span class=\"w\">\n      </span><span class=\"n\">values</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">rescale</span><span class=\"p\">(</span><span class=\"n\">palette_stops</span><span class=\"o\">$</span><span class=\"n\">limit</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">to</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">r_limits</span><span class=\"p\">),</span><span class=\"w\">\n      </span><span class=\"n\">palette</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">pal</span><span class=\"w\">\n    </span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n    </span><span class=\"n\">ggtitle</span><span class=\"p\">(</span><span class=\"n\">pal</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n    </span><span class=\"n\">theme_minimal</span><span class=\"p\">()</span><span class=\"w\">\n</span><span class=\"p\">}</span><span class=\"w\">\n\n</span><span class=\"n\">plot_pal_test</span><span class=\"p\">(</span><span class=\"s2\">\"etopo1_hypso\"</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">plot_pal_test</span><span class=\"p\">(</span><span class=\"s2\">\"dem_poster\"</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">plot_pal_test</span><span class=\"p\">(</span><span class=\"s2\">\"spain\"</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">plot_pal_test</span><span class=\"p\">(</span><span class=\"s2\">\"pakistan\"</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">plot_pal_test</span><span class=\"p\">(</span><span class=\"s2\">\"utah_1\"</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">plot_pal_test</span><span class=\"p\">(</span><span class=\"s2\">\"wiki-2.0_hypso\"</span><span class=\"p\">)</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<p><img src=\"https://dieghernan.github.io/assets/img/blog/20221017-4-explorepals-1.webp\" alt=\"Relief map of Romania using the etopo1_hypso elevation palette over hillshade. The Carpathian arc is visible against the surrounding lowlands.\" width=\"50%\" /><img src=\"https://dieghernan.github.io/assets/img/blog/20221017-4-explorepals-2.webp\" alt=\"Relief map of Romania using the dem_poster elevation palette over hillshade. The Carpathian arc is visible against the surrounding lowlands.\" width=\"50%\" /><img src=\"https://dieghernan.github.io/assets/img/blog/20221017-4-explorepals-3.webp\" alt=\"Relief map of Romania using the spain elevation palette over hillshade. The Carpathian arc is visible against the surrounding lowlands.\" width=\"50%\" /><img src=\"https://dieghernan.github.io/assets/img/blog/20221017-4-explorepals-4.webp\" alt=\"Relief map of Romania using the pakistan elevation palette over hillshade. The Carpathian arc is visible against the surrounding lowlands.\" width=\"50%\" /><img src=\"https://dieghernan.github.io/assets/img/blog/20221017-4-explorepals-5.webp\" alt=\"Relief map of Romania using the utah_1 elevation palette over hillshade. The Carpathian arc is visible against the surrounding lowlands.\" width=\"50%\" /><img src=\"https://dieghernan.github.io/assets/img/blog/20221017-4-explorepals-6.webp\" alt=\"Relief map of Romania using the wiki-2.0_hypso elevation palette over hillshade. The Carpathian arc is visible against the surrounding lowlands.\" width=\"50%\" /></p>\n\n<p>I finally selected for my plot the <code class=\"language-plaintext highlighter-rouge\">\"dem_poster\"</code> palette, but this is\ncompletely a personal choice. You should select the palette you feel more\ncomfortable with. See the full range of color palettes provided by <strong>tidyterra</strong>\n<a href=\"https://dieghernan.github.io/tidyterra/articles/palettes.html\">here</a>.</p>\n\n<h2 id=\"final-plot\">Final plot</h2>\n\n<p>We can combine the elevation colors and hillshade with a multiply blend. This\npreserves more of the elevation palette’s saturation than the original overlay,\nwhich used <code class=\"language-plaintext highlighter-rouge\">alpha = 0.4</code>. The hillshade darkens the colors to reveal the\nterrain. Its opacity controls the strength of the shading.</p>\n\n<p>Both rasters would normally need their own <code class=\"language-plaintext highlighter-rouge\">fill</code> scale. We already converted\nthe hillshade to fixed colors above. Here we also extract the elevation colors\nwith <code class=\"language-plaintext highlighter-rouge\">ggplot_build()</code> before passing both layers to <strong>ggblend</strong>. Using\n<code class=\"language-plaintext highlighter-rouge\">maxcell = Inf</code> keeps the color vectors matched to the raster cells.</p>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"c1\"># Fit the full palette to the local elevation range</span><span class=\"w\">\n</span><span class=\"n\">palette_stops</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">subset</span><span class=\"p\">(</span><span class=\"n\">hypsometric_tints_db</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">pal</span><span class=\"w\"> </span><span class=\"o\">==</span><span class=\"w\"> </span><span class=\"s2\">\"dem_poster\"</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">palette_values</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">rescale</span><span class=\"p\">(</span><span class=\"n\">palette_stops</span><span class=\"o\">$</span><span class=\"n\">limit</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">to</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">r_limits</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"n\">elevation_plot</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">ggplot</span><span class=\"p\">()</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">geom_spatraster</span><span class=\"p\">(</span><span class=\"n\">data</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">r</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">maxcell</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">Inf</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">scale_fill_hypso_tint_c</span><span class=\"p\">(</span><span class=\"w\">\n    </span><span class=\"n\">limits</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">r_limits</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"n\">values</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">palette_values</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"n\">palette</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"dem_poster\"</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"n\">na.value</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">NA</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"n\">guide</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">guide_colourbar</span><span class=\"p\">(</span><span class=\"n\">barheight</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">unit</span><span class=\"p\">(</span><span class=\"m\">4</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"in\"</span><span class=\"p\">)),</span><span class=\"w\">\n    </span><span class=\"n\">labels</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">label_comma</span><span class=\"p\">(),</span><span class=\"w\">\n    </span><span class=\"c1\"># For the legend I use custom breaks</span><span class=\"w\">\n    </span><span class=\"n\">breaks</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"w\">\n      </span><span class=\"n\">seq</span><span class=\"p\">(</span><span class=\"m\">0</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">500</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">100</span><span class=\"p\">),</span><span class=\"w\">\n      </span><span class=\"n\">seq</span><span class=\"p\">(</span><span class=\"m\">750</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">1500</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">250</span><span class=\"p\">),</span><span class=\"w\">\n      </span><span class=\"m\">2000</span><span class=\"w\">\n    </span><span class=\"p\">)</span><span class=\"w\">\n  </span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"n\">elevation_fill</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">ggplot_build</span><span class=\"p\">(</span><span class=\"n\">elevation_plot</span><span class=\"p\">)</span><span class=\"o\">$</span><span class=\"n\">data</span><span class=\"p\">[[</span><span class=\"m\">1</span><span class=\"p\">]]</span><span class=\"o\">$</span><span class=\"n\">fill</span><span class=\"w\">\n</span><span class=\"n\">stopifnot</span><span class=\"p\">(</span><span class=\"w\">\n  </span><span class=\"n\">compareGeom</span><span class=\"p\">(</span><span class=\"n\">r</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">hill</span><span class=\"p\">),</span><span class=\"w\">\n  </span><span class=\"nf\">length</span><span class=\"p\">(</span><span class=\"n\">elevation_fill</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">==</span><span class=\"w\"> </span><span class=\"n\">ncell</span><span class=\"p\">(</span><span class=\"n\">r</span><span class=\"p\">),</span><span class=\"w\">\n  </span><span class=\"nf\">length</span><span class=\"p\">(</span><span class=\"n\">vector_cols</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">==</span><span class=\"w\"> </span><span class=\"n\">ncell</span><span class=\"p\">(</span><span class=\"n\">hill</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"c1\"># Keep the scale-trained layer underneath to generate the elevation legend</span><span class=\"w\">\n</span><span class=\"n\">base_plot</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">elevation_plot</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"p\">(</span><span class=\"nf\">list</span><span class=\"p\">(</span><span class=\"w\">\n    </span><span class=\"n\">geom_spatraster</span><span class=\"p\">(</span><span class=\"n\">data</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">r</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">fill</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">elevation_fill</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">maxcell</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">Inf</span><span class=\"p\">),</span><span class=\"w\">\n    </span><span class=\"n\">geom_spatraster</span><span class=\"p\">(</span><span class=\"w\">\n      </span><span class=\"n\">data</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">hill</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">fill</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">vector_cols</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">alpha</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">0.85</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">maxcell</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">Inf</span><span class=\"w\">\n    </span><span class=\"p\">)</span><span class=\"w\">\n  </span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">|&gt;</span><span class=\"w\">\n    </span><span class=\"n\">ggblend</span><span class=\"o\">::</span><span class=\"n\">blend</span><span class=\"p\">(</span><span class=\"s2\">\"multiply\"</span><span class=\"p\">))</span><span class=\"w\">\n\n</span><span class=\"n\">base_plot</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<p><img src=\"https://dieghernan.github.io/assets/img/blog/20221017-5-blend-1.webp\" alt=\"Relief map of Romania combining elevation colors with hillshade so mountain slopes remain visible beneath the color gradient.\" width=\"100%\" /></p>\n\n<p>The opaque elevation layer inside the blend covers the scale-trained layer\nunderneath, which supplies the legend. The legend shows the elevation palette\nbefore shading. We render with <strong>ragg</strong>, which supports the compositing groups\nused by <strong>ggblend</strong>.</p>\n\n<p>For the final map, we use Noto Serif when its font files are available locally\nand fall back to the system serif font otherwise:</p>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"n\">font_dir</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">path.expand</span><span class=\"p\">(</span><span class=\"s2\">\"~/R/googlefonts\"</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">font_files</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">file.path</span><span class=\"p\">(</span><span class=\"w\">\n  </span><span class=\"n\">font_dir</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">paste0</span><span class=\"p\">(</span><span class=\"s2\">\"NotoSerif-\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"s2\">\"Regular\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"Bold\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"Italic\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"BoldItalic\"</span><span class=\"p\">),</span><span class=\"w\"> </span><span class=\"s2\">\".ttf\"</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">font_family</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"s2\">\"serif\"</span><span class=\"w\">\n</span><span class=\"k\">if</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"nf\">all</span><span class=\"p\">(</span><span class=\"n\">file.exists</span><span class=\"p\">(</span><span class=\"n\">font_files</span><span class=\"p\">)))</span><span class=\"w\"> </span><span class=\"p\">{</span><span class=\"w\">\n  </span><span class=\"n\">systemfonts</span><span class=\"o\">::</span><span class=\"n\">register_font</span><span class=\"p\">(</span><span class=\"w\">\n    </span><span class=\"s2\">\"notoserif\"</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"n\">plain</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">font_files</span><span class=\"p\">[</span><span class=\"m\">1</span><span class=\"p\">],</span><span class=\"w\">\n    </span><span class=\"n\">bold</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">font_files</span><span class=\"p\">[</span><span class=\"m\">2</span><span class=\"p\">],</span><span class=\"w\">\n    </span><span class=\"n\">italic</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">font_files</span><span class=\"p\">[</span><span class=\"m\">3</span><span class=\"p\">],</span><span class=\"w\">\n    </span><span class=\"n\">bolditalic</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">font_files</span><span class=\"p\">[</span><span class=\"m\">4</span><span class=\"p\">]</span><span class=\"w\">\n  </span><span class=\"p\">)</span><span class=\"w\">\n  </span><span class=\"n\">font_family</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"s2\">\"notoserif\"</span><span class=\"w\">\n</span><span class=\"p\">}</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<p>And now we theme it:</p>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"c1\"># Theming</span><span class=\"w\">\n\n</span><span class=\"c1\"># Adjust text size</span><span class=\"w\">\n</span><span class=\"n\">base_text_size</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"m\">16</span><span class=\"w\">\n\n</span><span class=\"n\">base_plot</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"c1\"># Change guide</span><span class=\"w\">\n  </span><span class=\"n\">guides</span><span class=\"p\">(</span><span class=\"n\">fill</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">guide_legend</span><span class=\"p\">(</span><span class=\"w\">\n    </span><span class=\"n\">title</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"   m.\"</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"n\">direction</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"horizontal\"</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"n\">nrow</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">1</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"n\">keywidth</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">unit</span><span class=\"p\">(</span><span class=\"m\">0.45</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"in\"</span><span class=\"p\">),</span><span class=\"w\">\n    </span><span class=\"n\">keyheight</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">0.5</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"n\">theme</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">theme</span><span class=\"p\">(</span><span class=\"w\">\n      </span><span class=\"n\">legend.text.position</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"bottom\"</span><span class=\"p\">,</span><span class=\"w\">\n      </span><span class=\"n\">legend.title.position</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"right\"</span><span class=\"w\">\n    </span><span class=\"p\">),</span><span class=\"w\">\n    </span><span class=\"n\">override.aes</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nf\">list</span><span class=\"p\">(</span><span class=\"n\">alpha</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">1</span><span class=\"p\">)</span><span class=\"w\">\n  </span><span class=\"p\">))</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">labs</span><span class=\"p\">(</span><span class=\"w\">\n    </span><span class=\"n\">title</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"Elevation of Romania\"</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"n\">subtitle</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"Hillshade and hypsometric tint | Multiply blend\"</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"n\">caption</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">paste0</span><span class=\"p\">(</span><span class=\"w\">\n      </span><span class=\"s2\">\"@dhernangomez using tidyterra, ggplot2, geodata R packages.\"</span><span class=\"p\">,</span><span class=\"w\">\n      </span><span class=\"s2\">\" Data: Shuttle Radar Topography Mission (SRTM)\"</span><span class=\"w\">\n    </span><span class=\"p\">)</span><span class=\"w\">\n  </span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">theme_minimal</span><span class=\"p\">(</span><span class=\"n\">base_family</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">font_family</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">theme</span><span class=\"p\">(</span><span class=\"w\">\n    </span><span class=\"n\">plot.background</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">element_rect</span><span class=\"p\">(</span><span class=\"s2\">\"grey97\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">colour</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">NA</span><span class=\"p\">),</span><span class=\"w\">\n    </span><span class=\"n\">plot.margin</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">margin</span><span class=\"p\">(</span><span class=\"m\">20</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">20</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">20</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">20</span><span class=\"p\">),</span><span class=\"w\">\n    </span><span class=\"n\">plot.caption</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">element_text</span><span class=\"p\">(</span><span class=\"n\">size</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">base_text_size</span><span class=\"w\"> </span><span class=\"o\">*</span><span class=\"w\"> </span><span class=\"m\">0.5</span><span class=\"p\">),</span><span class=\"w\">\n    </span><span class=\"n\">plot.title</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">element_text</span><span class=\"p\">(</span><span class=\"n\">face</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"bold\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">size</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">base_text_size</span><span class=\"w\"> </span><span class=\"o\">*</span><span class=\"w\"> </span><span class=\"m\">1.4</span><span class=\"p\">),</span><span class=\"w\">\n    </span><span class=\"n\">plot.subtitle</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">element_text</span><span class=\"p\">(</span><span class=\"w\">\n      </span><span class=\"n\">margin</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">margin</span><span class=\"p\">(</span><span class=\"n\">b</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">10</span><span class=\"p\">),</span><span class=\"w\">\n      </span><span class=\"n\">size</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">base_text_size</span><span class=\"w\">\n    </span><span class=\"p\">),</span><span class=\"w\">\n    </span><span class=\"n\">axis.text</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">element_text</span><span class=\"p\">(</span><span class=\"n\">size</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">base_text_size</span><span class=\"w\"> </span><span class=\"o\">*</span><span class=\"w\"> </span><span class=\"m\">0.7</span><span class=\"p\">),</span><span class=\"w\">\n    </span><span class=\"n\">legend.position</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"bottom\"</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"n\">legend.title</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">element_text</span><span class=\"p\">(</span><span class=\"n\">size</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">8</span><span class=\"p\">),</span><span class=\"w\">\n    </span><span class=\"n\">legend.text</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">element_text</span><span class=\"p\">(</span><span class=\"n\">size</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">8</span><span class=\"p\">),</span><span class=\"w\">\n    </span><span class=\"n\">legend.key</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">element_rect</span><span class=\"p\">(</span><span class=\"s2\">\"grey50\"</span><span class=\"p\">),</span><span class=\"w\">\n    </span><span class=\"n\">legend.key.spacing.x</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">unit</span><span class=\"p\">(</span><span class=\"m\">0</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"pt\"</span><span class=\"p\">)</span><span class=\"w\">\n  </span><span class=\"p\">)</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<p><img src=\"https://dieghernan.github.io/assets/img/blog/20221017-6-finalplot-1.webp\" alt=\"Relief map of Romania with elevation colors and hillshade highlighting the Carpathian arc, accompanied by an altitude legend.\" width=\"100%\" /></p>\n\n<iframe class=\"d-block w-100 border-0 rounded my-3\" title=\"High by Lighthouse Family on Spotify\" src=\"https://open.spotify.com/embed/track/1KP6ieHBqTmEjqLy75gAEn?theme=0\" height=\"152\" loading=\"lazy\" allow=\"autoplay; clipboard-write; encrypted-media; fullscreen; picture-in-picture\" allowfullscreen=\"\">\n</iframe>\n\n<h2 id=\"references\">References</h2>\n\n<ul>\n  <li>Grossenbacher, T. (2019, April 19). Bivariate maps with ggplot2 and sf.\n<em>Timo Grossenbacher</em>. <a href=\"https://timogrossenbacher.ch/bivariate-maps-with-ggplot2-and-sf/\">https://timogrossenbacher.ch/bivariate-maps-with-ggplot2-and-sf/</a>\n(The 2016 article <em>Beautiful thematic maps with ggplot2 (only)</em> redirects here.)</li>\n  <li>Hernangómez, D. (2023). Using the tidyverse with terra objects: The tidyterra\npackage. <em>Journal of Open Source Software, 8</em>(91), Article 5751.\n<a href=\"https://doi.org/10.21105/joss.05751\">https://doi.org/10.21105/joss.05751</a></li>\n  <li>Patterson, T., &amp; Jenny, B. (2011). The development and rationale of\ncross-blended hypsometric tints. <em>Cartographic Perspectives</em>, (69), 31–46.\n<a href=\"https://doi.org/10.14714/CP69.20\">https://doi.org/10.14714/CP69.20</a></li>\n  <li>Royé, D. (2022, July 20). Hillshade effects. <em>Dr Dominic Royé</em>.\n<a href=\"https://dominicroye.github.io/blog/hillshade-effect/\">https://dominicroye.github.io/blog/hillshade-effect/</a></li>\n</ul>\n",
      "date_published": "2022-10-17T00:00:00+02:00",
      "date_modified": "2026-10-25T00:00:00+02:00",
      "image": "https://dieghernan.github.io/assets/img/blog/20221017-6-finalplot-1.webp",
      "summary": "Using shadow effects on relief maps is a very common technique, which produces informative yet beautiful maps.",
      "tags": ["music","r_bloggers","rstats","rspatial","maps","hillshading","ggplot2","tidyterra","terra"],
      "authors": [{
        "name": "Diego HH",
        "url": "https://dieghernan.github.io/"
      }]
    },
    {
      "id": "https://dieghernan.github.io/202205_tidyterra/",
      "url": "https://dieghernan.github.io/202205_tidyterra/",
      "title": "Introducing tidyterra",
      "content_html": "<p>If you have been playing around with <strong>R</strong> for a while, you are probably\nfamiliar with the <code class=\"language-plaintext highlighter-rouge\">volcano</code> dataset:</p>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"n\">data</span><span class=\"p\">(</span><span class=\"s2\">\"volcano\"</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">image</span><span class=\"p\">(</span><span class=\"n\">volcano</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">col</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">terrain.colors</span><span class=\"p\">(</span><span class=\"m\">256</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">rev</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">TRUE</span><span class=\"p\">))</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<p><img src=\"https://dieghernan.github.io/assets/img/blog/20220525_volcano-1.webp\" alt=\"Elevation heatmap of Maungawhau in Auckland from the volcano dataset. Colors indicate altitude and reveal the crater surrounded by higher ground.\" width=\"100%\" /></p>\n\n<p>This represents the topographic information about one of the volcanoes of Auckland\n(New Zealand), specifically <a href=\"https://en.wikipedia.org/wiki/Maungawhau_/_Mount_Eden\">Maungawhau / Mount\nEden</a>. But <strong>do you know\nthat this map is flipped?</strong></p>\n\n<p>In this post I introduce the <a href=\"https://github.com/dieghernan/tidyterra\"><strong>tidyterra</strong>\npackage</a>, recently added to\n<a href=\"https://CRAN.R-project.org/package=tidyterra\">CRAN</a>, and I show you how to\ngeotag the <code class=\"language-plaintext highlighter-rouge\">volcano</code> dataset. We will also produce <strong>ggplot2</strong> maps using the\nfunctions of <strong>tidyterra</strong>.</p>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"c1\"># Libraries</span><span class=\"w\">\n</span><span class=\"n\">library</span><span class=\"p\">(</span><span class=\"n\">terra</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">library</span><span class=\"p\">(</span><span class=\"n\">ggplot2</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">library</span><span class=\"p\">(</span><span class=\"n\">tidyterra</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">library</span><span class=\"p\">(</span><span class=\"n\">maptiles</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">library</span><span class=\"p\">(</span><span class=\"n\">sf</span><span class=\"p\">)</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<h2 id=\"wait-volcano-is-flipped\">Wait, <code class=\"language-plaintext highlighter-rouge\">volcano</code> is flipped?</h2>\n\n<p>Let’s check it out. Thanks to the package <strong>maptiles</strong> we can have a glimpse of\nthe location of Maungawhau using map tiles, as in Google Maps. We will use\n<strong>tidyterra</strong> for displaying the map tile:</p>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"c1\"># location of Maungawhau</span><span class=\"w\">\n\n</span><span class=\"n\">box</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"w\">\n  </span><span class=\"m\">174.7611552780</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"m\">-36.8799200525</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"m\">174.7682380109</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"m\">-36.8719519780</span><span class=\"w\">\n</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"nf\">class</span><span class=\"p\">(</span><span class=\"n\">box</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"s2\">\"bbox\"</span><span class=\"w\">\n</span><span class=\"n\">box</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">st_as_sfc</span><span class=\"p\">(</span><span class=\"n\">box</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">st_crs</span><span class=\"p\">(</span><span class=\"n\">box</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"m\">4326</span><span class=\"w\">\n\n</span><span class=\"n\">box</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">box</span><span class=\"w\"> </span><span class=\"o\">%&gt;%</span><span class=\"w\">\n  </span><span class=\"c1\"># To crs for NZGD49</span><span class=\"w\">\n  </span><span class=\"n\">st_transform</span><span class=\"p\">(</span><span class=\"m\">27200</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"n\">tile</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">get_tiles</span><span class=\"p\">(</span><span class=\"n\">box</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">crop</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">TRUE</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">zoom</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">16</span><span class=\"p\">)</span><span class=\"w\">\n\n\n</span><span class=\"n\">ggtile</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">ggplot</span><span class=\"p\">()</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">geom_spatraster_rgb</span><span class=\"p\">(</span><span class=\"n\">data</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">tile</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"n\">ggtile</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<p><img src=\"https://dieghernan.github.io/assets/img/blog/20220525_tile-1.webp\" alt=\"Street map of Maungawhau in Auckland, showing the crater, surrounding paths and nearby streets.\" width=\"100%\" /></p>\n\n<p>Here we have a crisp RGB tile of Maungawhau. Now, the next\nquestion is how to match the <code class=\"language-plaintext highlighter-rouge\">volcano</code> dataset (a matrix) with this tile (a\ngeotagged map tile)? Let’s check it out.</p>\n\n<h2 id=\"working-with-spatrasters\">Working with SpatRasters</h2>\n\n<p>Thanks to the <strong>terra</strong> package we can start converting <code class=\"language-plaintext highlighter-rouge\">volcano</code> into a\nSpatRaster:</p>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"n\">volcano_rast</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">rast</span><span class=\"p\">(</span><span class=\"n\">volcano</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"n\">terra</span><span class=\"o\">::</span><span class=\"n\">plot</span><span class=\"p\">(</span><span class=\"n\">volcano_rast</span><span class=\"p\">)</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<p><img src=\"https://dieghernan.github.io/assets/img/blog/20220525_volcano_raster-1.webp\" alt=\"Elevation raster of Maungawhau before orientation correction. The crater appears near the top of the map.\" width=\"100%\" /></p>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"w\">\n</span><span class=\"c1\"># Wait, it is flipped!</span><span class=\"w\">\n</span><span class=\"n\">volcano_rast_ok</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">rast</span><span class=\"p\">(</span><span class=\"n\">volcano</span><span class=\"p\">[</span><span class=\"w\">\n  </span><span class=\"n\">seq</span><span class=\"p\">(</span><span class=\"n\">nrow</span><span class=\"p\">(</span><span class=\"n\">volcano</span><span class=\"p\">),</span><span class=\"w\"> </span><span class=\"m\">1</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">-1</span><span class=\"p\">),</span><span class=\"w\">\n  </span><span class=\"n\">seq</span><span class=\"p\">(</span><span class=\"n\">ncol</span><span class=\"p\">(</span><span class=\"n\">volcano</span><span class=\"p\">),</span><span class=\"w\"> </span><span class=\"m\">1</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">-1</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"p\">])</span><span class=\"w\">\n\n</span><span class=\"c1\"># Much better!</span><span class=\"w\">\n</span><span class=\"n\">terra</span><span class=\"o\">::</span><span class=\"n\">plot</span><span class=\"p\">(</span><span class=\"n\">volcano_rast_ok</span><span class=\"p\">)</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<p><img src=\"https://dieghernan.github.io/assets/img/blog/20220525_volcano_raster-2.webp\" alt=\"Elevation raster of Maungawhau after reversing rows and columns. The crater now appears near the bottom of the map.\" width=\"100%\" /></p>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"w\">\n</span><span class=\"n\">volcano_rast_ok</span><span class=\"w\">\n</span><span class=\"c1\">#&gt; class       : SpatRaster</span><span class=\"w\">\n</span><span class=\"c1\">#&gt; size        : 87, 61, 1  (nrow, ncol, nlyr)</span><span class=\"w\">\n</span><span class=\"c1\">#&gt; resolution  : 1, 1  (x, y)</span><span class=\"w\">\n</span><span class=\"c1\">#&gt; extent      : 0, 61, 0, 87  (xmin, xmax, ymin, ymax)</span><span class=\"w\">\n</span><span class=\"c1\">#&gt; coord. ref. :</span><span class=\"w\">\n</span><span class=\"c1\">#&gt; source(s)   : memory</span><span class=\"w\">\n</span><span class=\"c1\">#&gt; name        : lyr.1</span><span class=\"w\">\n</span><span class=\"c1\">#&gt; min value   :    94</span><span class=\"w\">\n</span><span class=\"c1\">#&gt; max value   :   195</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<p>Nice! Now we have a raster of <code class=\"language-plaintext highlighter-rouge\">volcano</code>, but still without geotagged\ninformation. Thanks to this article by Tomislav Hengl\n(<a href=\"https://twitter.com/tom_hengl\">\\@tom_hengl</a>) we can check the basic geographic\nparameters of <code class=\"language-plaintext highlighter-rouge\">volcano</code> (see <a href=\"https://www.geomorphometry.org/2009/08/20/volcano-maungawhau/\">Volcano\nMaungawhau</a>), which are:</p>\n\n<ul>\n  <li><strong>CRS</strong>: EPSG:27200</li>\n  <li><strong>xllcorner</strong>: 2667400</li>\n  <li><strong>yllcorner</strong>: 6478700</li>\n  <li><strong>cellsize</strong>: 10 m</li>\n  <li><strong>ncols</strong>: 61</li>\n  <li><strong>nrows</strong>: 87</li>\n</ul>\n\n<p>And we can translate that easily to an empty SpatRaster:</p>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"c1\"># Extra length for proper handling extent</span><span class=\"w\">\n</span><span class=\"n\">xrange</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"nf\">range</span><span class=\"p\">(</span><span class=\"n\">seq</span><span class=\"p\">(</span><span class=\"n\">from</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">2667400</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">length.out</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">62</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">by</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">10</span><span class=\"p\">))</span><span class=\"w\">\n</span><span class=\"n\">yrange</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"nf\">range</span><span class=\"p\">(</span><span class=\"n\">seq</span><span class=\"p\">(</span><span class=\"n\">from</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">6478700</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">length.out</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">88</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">by</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">10</span><span class=\"p\">))</span><span class=\"w\">\n\n</span><span class=\"n\">template</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">rast</span><span class=\"p\">(</span><span class=\"w\">\n  </span><span class=\"n\">crs</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"EPSG:27200\"</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">xmin</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">xrange</span><span class=\"p\">[</span><span class=\"m\">1</span><span class=\"p\">],</span><span class=\"w\">\n  </span><span class=\"n\">xmax</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">xrange</span><span class=\"p\">[</span><span class=\"m\">2</span><span class=\"p\">],</span><span class=\"w\">\n  </span><span class=\"n\">ymin</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">yrange</span><span class=\"p\">[</span><span class=\"m\">1</span><span class=\"p\">],</span><span class=\"w\">\n  </span><span class=\"n\">ymax</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">yrange</span><span class=\"p\">[</span><span class=\"m\">2</span><span class=\"p\">],</span><span class=\"w\">\n  </span><span class=\"n\">resolution</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">10</span><span class=\"w\">\n</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">template</span><span class=\"w\">\n</span><span class=\"c1\">#&gt; class       : SpatRaster</span><span class=\"w\">\n</span><span class=\"c1\">#&gt; size        : 87, 61, 1  (nrow, ncol, nlyr)</span><span class=\"w\">\n</span><span class=\"c1\">#&gt; resolution  : 10, 10  (x, y)</span><span class=\"w\">\n</span><span class=\"c1\">#&gt; extent      : 2667400, 2668010, 6478700, 6479570  (xmin, xmax, ymin, ymax)</span><span class=\"w\">\n</span><span class=\"c1\">#&gt; coord. ref. : NZGD49 / New Zealand Map Grid (EPSG:27200)</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<p>So now we only need to transfer the values from <code class=\"language-plaintext highlighter-rouge\">volcano_rast_ok</code> to our\ntemplate:</p>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"c1\"># Use tidyterra to pull the values of one raster</span><span class=\"w\">\n</span><span class=\"c1\"># and create a new layer</span><span class=\"w\">\n\n</span><span class=\"n\">volcano2</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">template</span><span class=\"w\"> </span><span class=\"o\">%&gt;%</span><span class=\"w\">\n  </span><span class=\"n\">mutate</span><span class=\"p\">(</span><span class=\"n\">elevation</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">pull</span><span class=\"p\">(</span><span class=\"n\">volcano_rast_ok</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">lyr.1</span><span class=\"p\">))</span><span class=\"w\"> </span><span class=\"o\">%&gt;%</span><span class=\"w\">\n  </span><span class=\"n\">select</span><span class=\"p\">(</span><span class=\"n\">elevation</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"n\">volcano2</span><span class=\"w\">\n</span><span class=\"c1\">#&gt; class       : SpatRaster</span><span class=\"w\">\n</span><span class=\"c1\">#&gt; size        : 87, 61, 1  (nrow, ncol, nlyr)</span><span class=\"w\">\n</span><span class=\"c1\">#&gt; resolution  : 10, 10  (x, y)</span><span class=\"w\">\n</span><span class=\"c1\">#&gt; extent      : 2667400, 2668010, 6478700, 6479570  (xmin, xmax, ymin, ymax)</span><span class=\"w\">\n</span><span class=\"c1\">#&gt; coord. ref. : NZGD49 / New Zealand Map Grid (EPSG:27200)</span><span class=\"w\">\n</span><span class=\"c1\">#&gt; source(s)   : memory</span><span class=\"w\">\n</span><span class=\"c1\">#&gt; name        : elevation</span><span class=\"w\">\n</span><span class=\"c1\">#&gt; min value   :        94</span><span class=\"w\">\n</span><span class=\"c1\">#&gt; max value   :       195</span><span class=\"w\">\n\n</span><span class=\"n\">terra</span><span class=\"o\">::</span><span class=\"n\">plot</span><span class=\"p\">(</span><span class=\"n\">volcano2</span><span class=\"p\">)</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<p><img src=\"https://dieghernan.github.io/assets/img/blog/20220525_create_volcano2-1.webp\" alt=\"Georeferenced elevation map of Maungawhau. Projected coordinates locate the terrain and colors represent altitude from 94 to 195 meters.\" width=\"100%\" /></p>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"w\">\n</span><span class=\"c1\"># And plot it</span><span class=\"w\">\n</span><span class=\"n\">ggtile</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">geom_spatraster</span><span class=\"p\">(</span><span class=\"n\">data</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">volcano2</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">scale_fill_terrain_c</span><span class=\"p\">(</span><span class=\"n\">alpha</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">0.75</span><span class=\"p\">)</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<p><img src=\"https://dieghernan.github.io/assets/img/blog/20220525_create_volcano2-2.webp\" alt=\"Street map of Maungawhau overlaid with a translucent elevation raster, aligning the terrain with the crater and surrounding streets.\" width=\"100%\" /></p>\n\n<h2 id=\"an-easter-egg\">An Easter egg</h2>\n\n<p>The <code class=\"language-plaintext highlighter-rouge\">volcano</code> dataset may not be completely up to date. As a complement,\n<strong>tidyterra</strong> includes a <code class=\"language-plaintext highlighter-rouge\">.tif</code> file with the same dimensions as our <code class=\"language-plaintext highlighter-rouge\">volcano2</code>\nraster, but with the topographic values extracted from <a href=\"https://data.linz.govt.nz/layer/53405-auckland-lidar-1m-dem-2013/\">Auckland LiDAR 1m DEM\n(2013)</a> and\nresampled to a resolution of 5x5 meters, for package size optimization. See here\nhow to load it and check the plotting possibilities of <strong>tidyterra</strong>:</p>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"c1\"># Load out Easter Egg</span><span class=\"w\">\n\n</span><span class=\"n\">volcano2_easter</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">rast</span><span class=\"p\">(</span><span class=\"n\">system.file</span><span class=\"p\">(</span><span class=\"s2\">\"extdata/volcano2.tif\"</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">package</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"tidyterra\"</span><span class=\"w\">\n</span><span class=\"p\">))</span><span class=\"w\">\n\n</span><span class=\"n\">volcano2_easter</span><span class=\"w\">\n</span><span class=\"c1\">#&gt; class       : SpatRaster</span><span class=\"w\">\n</span><span class=\"c1\">#&gt; size        : 174, 122, 1  (nrow, ncol, nlyr)</span><span class=\"w\">\n</span><span class=\"c1\">#&gt; resolution  : 5, 5  (x, y)</span><span class=\"w\">\n</span><span class=\"c1\">#&gt; extent      : 1756969, 1757579, 5917003, 5917873  (xmin, xmax, ymin, ymax)</span><span class=\"w\">\n</span><span class=\"c1\">#&gt; coord. ref. : NZGD2000 / New Zealand Transverse Mercator 2000 (EPSG:2193)</span><span class=\"w\">\n</span><span class=\"c1\">#&gt; source      : volcano2.tif</span><span class=\"w\">\n</span><span class=\"c1\">#&gt; name        :  elevation</span><span class=\"w\">\n</span><span class=\"c1\">#&gt; min value   :  76.262222</span><span class=\"w\">\n</span><span class=\"c1\">#&gt; max value   : 195.554199</span><span class=\"w\">\n</span><span class=\"n\">terra</span><span class=\"o\">::</span><span class=\"n\">plot</span><span class=\"p\">(</span><span class=\"n\">volcano2_easter</span><span class=\"p\">)</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<p><img src=\"https://dieghernan.github.io/assets/img/blog/20220525_easteregg-1.webp\" alt=\"Elevation map of Maungawhau derived from LiDAR data, showing the crater and surrounding terrain at 5-meter resolution.\" width=\"100%\" /></p>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"w\">\n\n</span><span class=\"c1\"># Only altitudes of more than 130m</span><span class=\"w\">\n\n</span><span class=\"n\">volcano_filter</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">volcano2_easter</span><span class=\"w\"> </span><span class=\"o\">%&gt;%</span><span class=\"w\">\n  </span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">elevation</span><span class=\"w\"> </span><span class=\"o\">&gt;</span><span class=\"w\"> </span><span class=\"m\">130</span><span class=\"p\">)</span><span class=\"w\">\n\n\n</span><span class=\"n\">ggtile</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">geom_spatraster</span><span class=\"p\">(</span><span class=\"n\">data</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">volcano_filter</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">scale_fill_viridis_c</span><span class=\"p\">(</span><span class=\"n\">na.value</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">NA</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">alpha</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">0.7</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">labs</span><span class=\"p\">(</span><span class=\"n\">fill</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"Elevation (m)\"</span><span class=\"p\">)</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<p><img src=\"https://dieghernan.github.io/assets/img/blog/20220525_easteregg-2.webp\" alt=\"Street map of Maungawhau with an elevation overlay restricted to terrain above 130 meters. Lower ground remains visible on the base map.\" width=\"100%\" /></p>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"w\">\n\n</span><span class=\"c1\"># Contour lines</span><span class=\"w\">\n\n</span><span class=\"n\">ggtile</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">geom_spatraster_contour</span><span class=\"p\">(</span><span class=\"n\">data</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">volcano2_easter</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">binwidth</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">10</span><span class=\"p\">)</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<p><img src=\"https://dieghernan.github.io/assets/img/blog/20220525_easteregg-3.webp\" alt=\"Street map of Maungawhau overlaid with elevation contours at 10-meter intervals. Nested contours outline the crater and its rim.\" width=\"100%\" /></p>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"w\">\n\n</span><span class=\"c1\"># Contour lines + contour polygons</span><span class=\"w\">\n\n</span><span class=\"n\">ggtile</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">geom_spatraster_contour_filled</span><span class=\"p\">(</span><span class=\"w\">\n    </span><span class=\"n\">data</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">volcano2_easter</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"n\">breaks</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">seq</span><span class=\"p\">(</span><span class=\"m\">70</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">210</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">20</span><span class=\"p\">),</span><span class=\"w\">\n    </span><span class=\"n\">alpha</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">0.7</span><span class=\"w\">\n  </span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">geom_spatraster_contour</span><span class=\"p\">(</span><span class=\"w\">\n    </span><span class=\"n\">data</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">volcano2_easter</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">binwidth</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">2.5</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"n\">alpha</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">0.7</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">size</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">.2</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">color</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"grey10\"</span><span class=\"w\">\n  </span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">coord_sf</span><span class=\"p\">(</span><span class=\"n\">expand</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">FALSE</span><span class=\"p\">)</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<p><img src=\"https://dieghernan.github.io/assets/img/blog/20220525_easteregg-4.webp\" alt=\"Street map of Maungawhau overlaid with colored elevation bands at 20-meter intervals and contour lines at 2.5-meter intervals.\" width=\"100%\" /></p>\n\n<iframe class=\"d-block w-100 border-0 rounded my-3\" title=\"Eruption by Van Halen on Spotify\" src=\"https://open.spotify.com/embed/track/4USM2iFc7ICK65ODvZAd0w?theme=0\" height=\"152\" loading=\"lazy\" allow=\"autoplay; clipboard-write; encrypted-media; fullscreen; picture-in-picture\" allowfullscreen=\"\">\n</iframe>\n",
      "date_published": "2022-05-25T00:00:00+02:00",
      "image": "https://dieghernan.github.io/assets/img/blog/20220525_easteregg-2.webp",
      "summary": "tidyterra provides tidyverse methods for terra objects and geom functions for plotting with ggplot2.",
      "tags": ["music","r_bloggers","rstats","rspatial","maps","ggplot2","tidyterra","terra","maptiles","r_package"],
      "authors": [{
        "name": "Diego HH",
        "url": "https://dieghernan.github.io/"
      }]
    },
    {
      "id": "https://dieghernan.github.io/202205_Unknown-pleasures-R/",
      "url": "https://dieghernan.github.io/202205_Unknown-pleasures-R/",
      "title": "Unknown pleasures with R",
      "content_html": "<p>In 1970, Harold D. Craft Jr. published his Ph.D. thesis <em>“Radio observations of\nthe pulse profiles and dispersion measures of twelve pulsars”.</em> The thesis (337\npages) includes on pages 214 to 216 the following depictions of successive\npulses of some pulsars:</p>\n\n<p><img src=\"https://dieghernan.github.io/assets/img/misc/pulsar_trio.webp\" alt=\"Three stacked-line diagrams of successive pulsar signals from Harold D. Craft Jr.'s thesis. Peaks in each trace represent recorded pulses.\" /></p>\n\n<p class=\"caption\">From “Radio Observations of the Pulse Profiles and Dispersion Measures of Twelve\nPulsars” by Harold D. Craft, Jr. (September 1970). Original source:\n<a href=\"https://blogs.scientificamerican.com/sa-visual/pop-culture-pulsar-origin-story-of-joy-division-s-unknown-pleasures-album-cover-video/\">https://blogs.scientificamerican.com/sa-visual/pop-culture-pulsar-origin-story-of-joy-division-s-unknown-pleasures-album-cover-video/</a></p>\n\n<p>Nine years later, a young graphic designer named Peter Saville had a new\nproject. He had to design the cover of the debut album of a young British rock\nband, named Joy Division. At some point in the process, Bernard Sumner (lead\nguitarist of Joy Division)<sup id=\"fnref:1\"><a href=\"#fn:1\" class=\"footnote\" rel=\"footnote\" role=\"doc-noteref\">1</a></sup> found the following image in <em>The Cambridge\nEncyclopaedia of Astronomy</em> (1977 edition):</p>\n\n<p><img src=\"https://dieghernan.github.io/assets/img/misc/cp1919-joy-division.jpg\" alt=\"Page from The Cambridge Encyclopaedia of Astronomy with stacked signal traces from pulsar CP 1919, forming a central cluster of peaks.\" /></p>\n\n<p>Saville presented a black-and-white version, producing a cover that reached\niconic status in the ’80s. This cover has been reproduced in the form of\ntattoos, clothing, merchandise, video games and even 3-D sculptures:</p>\n\n<p><img src=\"https://dieghernan.github.io/assets/img/misc/unknown_pleasures-cover.jpg\" alt=\"Unknown Pleasures album cover by Joy Division, with stacked white pulsar signal traces on a black background.\" /></p>\n\n<p>If you are interested in learning more about this fascinating history of science\nand design, you can read <a href=\"https://blogs.scientificamerican.com/sa-visual/pop-culture-pulsar-origin-story-of-joy-division-s-unknown-pleasures-album-cover-video/\">Pop Culture Pulsar: Origin Story of Joy\nDivision’s Unknown Pleasures Album\nCover</a>\nby <a href=\"https://www.scientificamerican.com/author/jen-christiansen/\">Jen\nChristiansen</a>.</p>\n\n<p>Since then, these kinds of plots have become very popular, known as <strong>ridge\nplots</strong> or <strong>joyplots</strong>, in honor of Joy Division. In this post, I produce\n“joyplots” with <strong>R</strong> for specific regions of the world using elevation data for\ncreating the ridges.</p>\n\n<h2 id=\"creating-joyplot-maps-with-r\">Creating joyplot maps with <strong>R</strong></h2>\n\n<p>This topic has already been covered by other authors, such as <a href=\"https://danielredondo.com/blog/2020-01-25-joy_division/\">Daniel\nRedondo</a> (Spanish) and\n<a href=\"https://cartographicperspectives.org/index.php/journal/article/view/1536/1726\">Travis M.\nWhite</a>.\nHowever, they both use QGIS, while in this post I work completely in\n<strong>R</strong>.</p>\n\n<p>Some initial considerations we may need to bear in mind:</p>\n\n<ul>\n  <li>\n    <p>In this post I will use <code class=\"language-plaintext highlighter-rouge\">geom_ridgeline()</code> instead of\n<code class=\"language-plaintext highlighter-rouge\">geom_density_ridges()</code>. This gives us more control over the\nfinal plot, but there is a caveat: <strong>both the coordinates and the\nelevation should be in the same unit</strong> (<a href=\"https://wilkelab.org/ggridges/reference/geom_ridgeline.html\">See\nwhy</a>).\nTherefore, we should project both the raster and the base <code class=\"language-plaintext highlighter-rouge\">sf</code> object to a\nsuitable CRS defined in meters (in this case).</p>\n  </li>\n  <li>\n    <p>Joyplots are much cooler when only a few lines are displayed. This is\ndirectly related to the number of rows in our raster. A very detailed\nraster (e.g. lots of rows) would produce a much more detailed plot but it may not\nsuit our needs.</p>\n  </li>\n</ul>\n\n<p>Now, let’s start with the required libraries:</p>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"w\">\n</span><span class=\"c1\"># Libraries</span><span class=\"w\">\n\n</span><span class=\"c1\"># Spatial</span><span class=\"w\">\n</span><span class=\"n\">library</span><span class=\"p\">(</span><span class=\"n\">sf</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">library</span><span class=\"p\">(</span><span class=\"n\">terra</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">library</span><span class=\"p\">(</span><span class=\"n\">giscoR</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"c1\"># Shapes</span><span class=\"w\">\n</span><span class=\"n\">library</span><span class=\"p\">(</span><span class=\"n\">elevatr</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"c1\"># Data viz and wrangling</span><span class=\"w\">\n</span><span class=\"n\">library</span><span class=\"p\">(</span><span class=\"n\">ggplot2</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">library</span><span class=\"p\">(</span><span class=\"n\">dplyr</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">library</span><span class=\"p\">(</span><span class=\"n\">ggridges</span><span class=\"p\">)</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<p>The first step consists of selecting our region of interest (<code class=\"language-plaintext highlighter-rouge\">sf</code> object) and\nextracting the elevation data. We can achieve that with <strong>giscoR</strong> and\n<strong>elevatr</strong>.\nIn this post, I create a joyplot of\n<a href=\"https://en.wikipedia.org/wiki/Andalusia\">Andalusia</a>. Note that, given we are\ncreating just a visualization, the resolution of the <code class=\"language-plaintext highlighter-rouge\">sf</code> object is not very\nrelevant.</p>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"w\">\n</span><span class=\"c1\"># Select a Spanish Region: Andalucia</span><span class=\"w\">\n</span><span class=\"n\">region</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">gisco_get_nuts</span><span class=\"p\">(</span><span class=\"n\">nuts_id</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"ES61\"</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">%&gt;%</span><span class=\"w\">\n  </span><span class=\"c1\"># And project data</span><span class=\"w\">\n  </span><span class=\"n\">st_transform</span><span class=\"p\">(</span><span class=\"m\">25830</span><span class=\"p\">)</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<p>Now we need to extract the elevation using <strong>elevatr</strong>. We can also adjust the\nzoom level as needed. You can find guidance on zoom levels in the\n<a href=\"https://wiki.openstreetmap.org/wiki/Zoom_levels\">OpenStreetMap wiki</a>.</p>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"w\">\n</span><span class=\"n\">dem</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">get_elev_raster</span><span class=\"p\">(</span><span class=\"n\">region</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">z</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">7</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">clip</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"bbox\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">expand</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">10000</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">%&gt;%</span><span class=\"w\">\n  </span><span class=\"c1\"># And convert to terra</span><span class=\"w\">\n  </span><span class=\"n\">rast</span><span class=\"p\">()</span><span class=\"w\"> </span><span class=\"o\">%&gt;%</span><span class=\"w\">\n  </span><span class=\"c1\"># Mask to the shape</span><span class=\"w\">\n  </span><span class=\"n\">mask</span><span class=\"p\">(</span><span class=\"n\">vect</span><span class=\"p\">(</span><span class=\"n\">region</span><span class=\"p\">))</span><span class=\"w\">\n\n</span><span class=\"c1\"># Rename layer for further manipulation</span><span class=\"w\">\n</span><span class=\"nf\">names</span><span class=\"p\">(</span><span class=\"n\">dem</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"s2\">\"elev\"</span><span class=\"w\">\n\n</span><span class=\"n\">nrow</span><span class=\"p\">(</span><span class=\"n\">dem</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"c1\">#&gt; [1] 698</span><span class=\"w\">\n\n</span><span class=\"n\">terra</span><span class=\"o\">::</span><span class=\"n\">plot</span><span class=\"p\">(</span><span class=\"n\">dem</span><span class=\"p\">)</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<p><img src=\"https://dieghernan.github.io/assets/img/blog/20220501_andalucia_dem-1.webp\" title=\"plot of chunk 20220501_andalucia_dem\" alt=\"Elevation map of Andalusia. Colors represent altitude in meters, with higher terrain concentrated in the east.\" width=\"100%\" /></p>\n\n<p>We already have our elevation raster. Now the next step is to adjust the number\nof rows of our raster to a lower number. We can then aggregate the raster (i.e.\nreduce the number of cells or increase their size) using a scaling\nfactor that would reduce the number of rows to our desired target (in this case\n90 rows):</p>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"c1\"># Approx</span><span class=\"w\">\n</span><span class=\"n\">factor</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"nf\">round</span><span class=\"p\">(</span><span class=\"n\">nrow</span><span class=\"p\">(</span><span class=\"n\">dem</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">/</span><span class=\"w\"> </span><span class=\"m\">90</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"n\">dem_agg</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">aggregate</span><span class=\"p\">(</span><span class=\"n\">dem</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">factor</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"n\">nrow</span><span class=\"p\">(</span><span class=\"n\">dem_agg</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"c1\">#&gt; [1] 88</span><span class=\"w\">\n\n</span><span class=\"n\">terra</span><span class=\"o\">::</span><span class=\"n\">plot</span><span class=\"p\">(</span><span class=\"n\">dem_agg</span><span class=\"p\">)</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<p><img src=\"https://dieghernan.github.io/assets/img/blog/20220501_andalucia_dem_agg-1.webp\" title=\"plot of chunk 20220501_andalucia_dem_agg\" alt=\"Elevation map of Andalusia reduced to 88 raster rows. Larger cells retain the broad pattern of higher terrain in the east.\" width=\"100%\" /></p>\n\n<p>We can check how the number of rows has decreased. Also, the plot shows that we\nnow have fewer cells.</p>\n\n<p>Now, we may need to perform additional manipulations on the values of the\nraster:</p>\n\n<ul>\n  <li>\n    <p>We need to ensure that all valid values are greater than or equal to zero.</p>\n  </li>\n  <li>\n    <p>We will replace the <code class=\"language-plaintext highlighter-rouge\">NA</code> values produced when masking the raster with zeros. We\nwill use this later to decide whether to remove some parts of the\nplot.</p>\n  </li>\n</ul>\n\n<p>After that, we create a data frame with the information needed for\ncreating the joyplot.</p>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"w\">\n</span><span class=\"n\">dem_agg</span><span class=\"p\">[</span><span class=\"n\">dem_agg</span><span class=\"w\"> </span><span class=\"o\">&lt;</span><span class=\"w\"> </span><span class=\"m\">0</span><span class=\"p\">]</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"m\">0</span><span class=\"w\">\n</span><span class=\"n\">dem_agg</span><span class=\"p\">[</span><span class=\"nf\">is.na</span><span class=\"p\">(</span><span class=\"n\">dem_agg</span><span class=\"p\">)]</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"m\">0</span><span class=\"w\">\n\n</span><span class=\"n\">dem_df</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">as.data.frame</span><span class=\"p\">(</span><span class=\"n\">dem_agg</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">xy</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">TRUE</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">na.rm</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">FALSE</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"n\">as_tibble</span><span class=\"p\">(</span><span class=\"n\">dem_df</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"c1\">#&gt; # A tibble: 12,848 x 3</span><span class=\"w\">\n</span><span class=\"c1\">#&gt;          x        y  elev</span><span class=\"w\">\n</span><span class=\"c1\">#&gt;      &lt;dbl&gt;    &lt;dbl&gt; &lt;dbl&gt;</span><span class=\"w\">\n</span><span class=\"c1\">#&gt;  1  77184. 4306315.     0</span><span class=\"w\">\n</span><span class=\"c1\">#&gt;  2  81049. 4306315.     0</span><span class=\"w\">\n</span><span class=\"c1\">#&gt;  3  84914. 4306315.     0</span><span class=\"w\">\n</span><span class=\"c1\">#&gt;  4  88779. 4306315.     0</span><span class=\"w\">\n</span><span class=\"c1\">#&gt;  5  92644. 4306315.     0</span><span class=\"w\">\n</span><span class=\"c1\">#&gt;  6  96510. 4306315.     0</span><span class=\"w\">\n</span><span class=\"c1\">#&gt;  7 100375. 4306315.     0</span><span class=\"w\">\n</span><span class=\"c1\">#&gt;  8 104240. 4306315.     0</span><span class=\"w\">\n</span><span class=\"c1\">#&gt;  9 108105. 4306315.     0</span><span class=\"w\">\n</span><span class=\"c1\">#&gt; 10 111970. 4306315.     0</span><span class=\"w\">\n</span><span class=\"c1\">#&gt; # ... with 12,838 more rows</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<p>Now is a good moment to adjust the units of the coordinates and the elevation if\nneeded. In this case both are in meters, but I will show you how to perform\nthose adjustments with the <strong>units</strong> package:</p>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"w\">\n</span><span class=\"n\">library</span><span class=\"p\">(</span><span class=\"n\">units</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"c1\"># Units of DEM projection</span><span class=\"w\">\n</span><span class=\"n\">units_crs</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">st_crs</span><span class=\"p\">(</span><span class=\"n\">dem_agg</span><span class=\"p\">)</span><span class=\"o\">$</span><span class=\"n\">units</span><span class=\"w\">\n\n</span><span class=\"n\">units_crs</span><span class=\"w\">\n</span><span class=\"c1\">#&gt; [1] \"m\"</span><span class=\"w\">\n\n</span><span class=\"c1\"># Example, convert to miles</span><span class=\"w\">\n</span><span class=\"c1\"># Adjust as needed</span><span class=\"w\">\n\n</span><span class=\"n\">dem_miles</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">dem_df</span><span class=\"w\"> </span><span class=\"o\">%&gt;%</span><span class=\"w\">\n  </span><span class=\"n\">mutate</span><span class=\"p\">(</span><span class=\"w\">\n    </span><span class=\"n\">x</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">set_units</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"m\"</span><span class=\"p\">),</span><span class=\"w\">\n    </span><span class=\"n\">x_mile</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">set_units</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"mi\"</span><span class=\"p\">),</span><span class=\"w\">\n    </span><span class=\"n\">y</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">set_units</span><span class=\"p\">(</span><span class=\"n\">y</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"m\"</span><span class=\"p\">),</span><span class=\"w\">\n    </span><span class=\"n\">y_mile</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">set_units</span><span class=\"p\">(</span><span class=\"n\">y</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"mi\"</span><span class=\"p\">),</span><span class=\"w\">\n    </span><span class=\"n\">elev</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">set_units</span><span class=\"p\">(</span><span class=\"n\">elev</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"m\"</span><span class=\"p\">),</span><span class=\"w\">\n    </span><span class=\"n\">elev_mile</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">set_units</span><span class=\"p\">(</span><span class=\"n\">elev</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"mi\"</span><span class=\"p\">)</span><span class=\"w\">\n  </span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"n\">as_tibble</span><span class=\"p\">(</span><span class=\"n\">dem_miles</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"c1\">#&gt; # A tibble: 12,848 x 6</span><span class=\"w\">\n</span><span class=\"c1\">#&gt;          x        y elev x_mile y_mile elev_mile</span><span class=\"w\">\n</span><span class=\"c1\">#&gt;        [m]      [m]  [m]   [mi]   [mi]      [mi]</span><span class=\"w\">\n</span><span class=\"c1\">#&gt;  1  77184. 4306315.    0   48.0  2676.         0</span><span class=\"w\">\n</span><span class=\"c1\">#&gt;  2  81049. 4306315.    0   50.4  2676.         0</span><span class=\"w\">\n</span><span class=\"c1\">#&gt;  3  84914. 4306315.    0   52.8  2676.         0</span><span class=\"w\">\n</span><span class=\"c1\">#&gt;  4  88779. 4306315.    0   55.2  2676.         0</span><span class=\"w\">\n</span><span class=\"c1\">#&gt;  5  92644. 4306315.    0   57.6  2676.         0</span><span class=\"w\">\n</span><span class=\"c1\">#&gt;  6  96510. 4306315.    0   60.0  2676.         0</span><span class=\"w\">\n</span><span class=\"c1\">#&gt;  7 100375. 4306315.    0   62.4  2676.         0</span><span class=\"w\">\n</span><span class=\"c1\">#&gt;  8 104240. 4306315.    0   64.8  2676.         0</span><span class=\"w\">\n</span><span class=\"c1\">#&gt;  9 108105. 4306315.    0   67.2  2676.         0</span><span class=\"w\">\n</span><span class=\"c1\">#&gt; 10 111970. 4306315.    0   69.6  2676.         0</span><span class=\"w\">\n</span><span class=\"c1\">#&gt; # ... with 12,838 more rows</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<p>Finally, we can create our joyplot. Note that we can “train” the scales of our\n<code class=\"language-plaintext highlighter-rouge\">ggplot</code> to a spatial object automatically if we pass our <code class=\"language-plaintext highlighter-rouge\">region</code> object into\nthe plot. The relative height of the ridges is controlled via the <code class=\"language-plaintext highlighter-rouge\">scale</code>\nparameter:</p>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"w\">\n</span><span class=\"n\">ggplot</span><span class=\"p\">()</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"c1\"># Just for the scales, pass with NA arguments so it is not shown</span><span class=\"w\">\n  </span><span class=\"n\">geom_sf</span><span class=\"p\">(</span><span class=\"n\">data</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">region</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">color</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">NA</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">fill</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">NA</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">geom_ridgeline</span><span class=\"p\">(</span><span class=\"w\">\n    </span><span class=\"n\">data</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">dem_df</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">aes</span><span class=\"p\">(</span><span class=\"w\">\n      </span><span class=\"n\">x</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">x</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">y</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">y</span><span class=\"p\">,</span><span class=\"w\">\n      </span><span class=\"n\">group</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">y</span><span class=\"p\">,</span><span class=\"w\">\n      </span><span class=\"n\">height</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">elev</span><span class=\"w\">\n    </span><span class=\"p\">),</span><span class=\"w\">\n    </span><span class=\"n\">scale</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">25</span><span class=\"w\">\n  </span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">theme_ridges</span><span class=\"p\">()</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<p><img src=\"https://dieghernan.github.io/assets/img/blog/20220501_andalucia_ridges-1.webp\" title=\"plot of chunk 20220501_andalucia_ridges\" alt=\"Ridgeline map of Andalusia with longitude horizontally and latitude vertically. Each ridge traces an elevation profile, with taller peaks in the east.\" width=\"100%\" /></p>\n\n<p>The last step is to provide a black theme, resembling the cover of the album:</p>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"w\">\n</span><span class=\"n\">ggplot</span><span class=\"p\">()</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">geom_sf</span><span class=\"p\">(</span><span class=\"n\">data</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">region</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">color</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">NA</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">fill</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">NA</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">geom_ridgeline</span><span class=\"p\">(</span><span class=\"w\">\n    </span><span class=\"n\">data</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">dem_df</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">aes</span><span class=\"p\">(</span><span class=\"w\">\n      </span><span class=\"n\">x</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">x</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">y</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">y</span><span class=\"p\">,</span><span class=\"w\">\n      </span><span class=\"n\">group</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">y</span><span class=\"p\">,</span><span class=\"w\">\n      </span><span class=\"n\">height</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">elev</span><span class=\"w\">\n    </span><span class=\"p\">),</span><span class=\"w\">\n    </span><span class=\"n\">scale</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">25</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"n\">fill</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"black\"</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"n\">color</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"white\"</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"n\">size</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">.25</span><span class=\"w\">\n  </span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">theme_void</span><span class=\"p\">()</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">theme</span><span class=\"p\">(</span><span class=\"n\">plot.background</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">element_rect</span><span class=\"p\">(</span><span class=\"n\">fill</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"black\"</span><span class=\"p\">))</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<p><img src=\"https://dieghernan.github.io/assets/img/blog/20220501_andalucia_joyplot-1.webp\" title=\"plot of chunk 20220501_andalucia_joyplot\" alt=\"Ridgeline map of Andalusia with elevation profiles drawn as light lines on a dark background, resembling the Unknown Pleasures album cover.\" width=\"100%\" /></p>\n\n<iframe class=\"d-block w-100 border-0 rounded my-3\" title=\"Unknown Pleasures by Joy Division on Spotify\" src=\"https://open.spotify.com/embed/album/5Dgqy4bBg09Rdw7CQM545s?utm_source=generator&amp;si=12e3c6b3c41940fb\" height=\"352\" loading=\"lazy\" allow=\"autoplay; clipboard-write; encrypted-media; fullscreen; picture-in-picture\" allowfullscreen=\"\">\n</iframe>\n\n<h2 id=\"variations\">Variations</h2>\n\n<p>We can produce some variations of the same map using several parameters and\nother artifacts.</p>\n\n<h3 id=\"using-geom_density_ridges\">Using <code class=\"language-plaintext highlighter-rouge\">geom_density_ridges()</code></h3>\n\n<p>We can use <code class=\"language-plaintext highlighter-rouge\">geom_density_ridges()</code> with <code class=\"language-plaintext highlighter-rouge\">stat=\"identity\"</code> instead of\n<code class=\"language-plaintext highlighter-rouge\">geom_ridgeline()</code> for creating a similar map:</p>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"w\">\n</span><span class=\"n\">ggplot</span><span class=\"p\">()</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">geom_sf</span><span class=\"p\">(</span><span class=\"n\">data</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">region</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">color</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">NA</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">fill</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">NA</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">geom_density_ridges</span><span class=\"p\">(</span><span class=\"w\">\n    </span><span class=\"n\">data</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">dem_df</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">aes</span><span class=\"p\">(</span><span class=\"w\">\n      </span><span class=\"n\">x</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">x</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">y</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">y</span><span class=\"p\">,</span><span class=\"w\">\n      </span><span class=\"n\">group</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">y</span><span class=\"p\">,</span><span class=\"w\">\n      </span><span class=\"n\">height</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">elev</span><span class=\"w\">\n    </span><span class=\"p\">),</span><span class=\"w\">\n    </span><span class=\"n\">stat</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"identity\"</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"n\">scale</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">25</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"n\">fill</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"black\"</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"n\">color</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"white\"</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"n\">size</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">.25</span><span class=\"w\">\n  </span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">theme_void</span><span class=\"p\">()</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">theme</span><span class=\"p\">(</span><span class=\"n\">plot.background</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">element_rect</span><span class=\"p\">(</span><span class=\"n\">fill</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"black\"</span><span class=\"p\">))</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<p><img src=\"https://dieghernan.github.io/assets/img/blog/20220501_andalucia_ridges_dens-1.webp\" title=\"plot of chunk 20220501_andalucia_ridges_dens\" alt=\"Ridgeline map of Andalusia with more closely spaced elevation profiles, revealing finer terrain detail.\" width=\"100%\" /></p>\n\n<h3 id=\"land-only\">Land only</h3>\n\n<p>If we use <code class=\"language-plaintext highlighter-rouge\">geom_ridgeline()</code> it is quite easy to remove some parts of the lines,\nas the parameter <code class=\"language-plaintext highlighter-rouge\">min_height</code> allows us to control the minimum height to be\nplotted. I found this much more difficult when using <code class=\"language-plaintext highlighter-rouge\">geom_density_ridges()</code>,\nwhere the equivalent parameter <code class=\"language-plaintext highlighter-rouge\">rel_min_height</code> is relative to the overall\nmaximum height.</p>\n\n<p>This is the main reason why we replaced the <code class=\"language-plaintext highlighter-rouge\">NA</code> values with zeros, so those\nparts of the string can be easily removed.</p>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"n\">ggplot</span><span class=\"p\">()</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">geom_sf</span><span class=\"p\">(</span><span class=\"n\">data</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">region</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">color</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">NA</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">fill</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">NA</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">geom_ridgeline</span><span class=\"p\">(</span><span class=\"w\">\n    </span><span class=\"n\">data</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">dem_df</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">aes</span><span class=\"p\">(</span><span class=\"w\">\n      </span><span class=\"n\">x</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">x</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">y</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">y</span><span class=\"p\">,</span><span class=\"w\">\n      </span><span class=\"n\">group</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">y</span><span class=\"p\">,</span><span class=\"w\">\n      </span><span class=\"n\">height</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">elev</span><span class=\"w\">\n    </span><span class=\"p\">),</span><span class=\"w\">\n    </span><span class=\"n\">scale</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">25</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"n\">fill</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"black\"</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"n\">color</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"white\"</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"n\">size</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">.25</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"n\">min_height</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">0.1</span><span class=\"w\">\n  </span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">theme_void</span><span class=\"p\">()</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">theme</span><span class=\"p\">(</span><span class=\"n\">plot.background</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">element_rect</span><span class=\"p\">(</span><span class=\"n\">fill</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"black\"</span><span class=\"p\">))</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<p><img src=\"https://dieghernan.github.io/assets/img/blog/20220501_andalucia_landonly-1.webp\" title=\"plot of chunk 20220501_andalucia_landonly\" alt=\"Ridgeline map of Andalusia with lines outside the land boundary removed, leaving the regional outline visible against a black background.\" width=\"100%\" /></p>\n\n<h3 id=\"with-colors\">With colors</h3>\n\n<p>We can apply different colors to the plot. Note that <strong>ggridges</strong> only accepts\ndifferent <code class=\"language-plaintext highlighter-rouge\">aes</code> by row, not by column:</p>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"w\">\n</span><span class=\"c1\"># Classify on three different bands</span><span class=\"w\">\n\n</span><span class=\"n\">dem_df</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">dem_df</span><span class=\"w\"> </span><span class=\"o\">%&gt;%</span><span class=\"w\">\n  </span><span class=\"n\">mutate</span><span class=\"p\">(</span><span class=\"n\">class</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">cut_number</span><span class=\"p\">(</span><span class=\"n\">y</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">n</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">3</span><span class=\"p\">))</span><span class=\"w\">\n\n</span><span class=\"n\">ggplot</span><span class=\"p\">()</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">geom_sf</span><span class=\"p\">(</span><span class=\"n\">data</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">region</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">color</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">NA</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">fill</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">NA</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">geom_ridgeline</span><span class=\"p\">(</span><span class=\"w\">\n    </span><span class=\"n\">data</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">dem_df</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">aes</span><span class=\"p\">(</span><span class=\"w\">\n      </span><span class=\"n\">x</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">x</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">y</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">y</span><span class=\"p\">,</span><span class=\"w\">\n      </span><span class=\"n\">group</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">y</span><span class=\"p\">,</span><span class=\"w\">\n      </span><span class=\"n\">height</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">elev</span><span class=\"p\">,</span><span class=\"w\">\n      </span><span class=\"n\">color</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">class</span><span class=\"w\">\n    </span><span class=\"p\">),</span><span class=\"w\">\n    </span><span class=\"n\">scale</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">25</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"n\">fill</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"black\"</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"n\">size</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">.5</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"n\">show.legend</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">FALSE</span><span class=\"w\">\n  </span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">theme_void</span><span class=\"p\">()</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">theme</span><span class=\"p\">(</span><span class=\"n\">plot.background</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">element_rect</span><span class=\"p\">(</span><span class=\"n\">fill</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"black\"</span><span class=\"p\">))</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">scale_color_manual</span><span class=\"p\">(</span><span class=\"n\">values</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">alpha</span><span class=\"p\">(</span><span class=\"w\">\n    </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"w\">\n      </span><span class=\"s2\">\"#007A33\"</span><span class=\"p\">,</span><span class=\"w\">\n      </span><span class=\"s2\">\"white\"</span><span class=\"p\">,</span><span class=\"w\">\n      </span><span class=\"s2\">\"#007A33\"</span><span class=\"w\">\n    </span><span class=\"p\">),</span><span class=\"w\">\n    </span><span class=\"m\">.95</span><span class=\"w\">\n  </span><span class=\"p\">))</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<p><img src=\"https://dieghernan.github.io/assets/img/blog/20220501_andalucia_colors-1.webp\" title=\"plot of chunk 20220501_andalucia_colors\" alt=\"Ridgeline map of Andalusia with white elevation profiles over alternating green and white horizontal bands.\" width=\"100%\" /></p>\n\n<h3 id=\"combine-with-another-object\">Combine with another object</h3>\n\n<p>For example, using an <code class=\"language-plaintext highlighter-rouge\">sf</code> object:</p>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"w\">\n</span><span class=\"n\">highres</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">gisco_get_nuts</span><span class=\"p\">(</span><span class=\"w\">\n  </span><span class=\"n\">nuts_id</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"ES61\"</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">resolution</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">1</span><span class=\"w\">\n</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">%&gt;%</span><span class=\"w\">\n  </span><span class=\"c1\"># And project data</span><span class=\"w\">\n  </span><span class=\"n\">st_transform</span><span class=\"p\">(</span><span class=\"m\">25830</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">%&gt;%</span><span class=\"w\">\n  </span><span class=\"n\">st_buffer</span><span class=\"p\">(</span><span class=\"m\">-5000</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"n\">ggplot</span><span class=\"p\">()</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">geom_sf</span><span class=\"p\">(</span><span class=\"n\">data</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">highres</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">color</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">NA</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">fill</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"#007A33\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">alpha</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">0.95</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">geom_ridgeline</span><span class=\"p\">(</span><span class=\"w\">\n    </span><span class=\"n\">data</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">dem_df</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">aes</span><span class=\"p\">(</span><span class=\"w\">\n      </span><span class=\"n\">x</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">x</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">y</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">y</span><span class=\"p\">,</span><span class=\"w\">\n      </span><span class=\"n\">group</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">y</span><span class=\"p\">,</span><span class=\"w\">\n      </span><span class=\"n\">height</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">elev</span><span class=\"w\">\n    </span><span class=\"p\">),</span><span class=\"w\">\n    </span><span class=\"n\">scale</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">25</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"n\">fill</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"black\"</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"n\">color</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"white\"</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"n\">size</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">.25</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"n\">min_height</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">0.1</span><span class=\"w\">\n  </span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">theme_void</span><span class=\"p\">()</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">theme</span><span class=\"p\">(</span><span class=\"n\">plot.background</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">element_rect</span><span class=\"p\">(</span><span class=\"n\">fill</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"black\"</span><span class=\"p\">))</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<p><img src=\"https://dieghernan.github.io/assets/img/blog/20220501_andalucia_combine-1.webp\" title=\"plot of chunk 20220501_andalucia_combine\" alt=\"Ridgeline map of Andalusia with green shading on the lower western terrain and white profiles over the higher eastern mountains.\" width=\"100%\" /></p>\n\n<p>Or adding a frame to the plot:</p>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"w\">\n</span><span class=\"n\">frame</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">as.polygons</span><span class=\"p\">(</span><span class=\"n\">dem_agg</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">extent</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">TRUE</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">%&gt;%</span><span class=\"w\">\n  </span><span class=\"n\">st_as_sf</span><span class=\"p\">()</span><span class=\"w\">\n\n</span><span class=\"n\">ggplot</span><span class=\"p\">()</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">geom_sf</span><span class=\"p\">(</span><span class=\"n\">data</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">frame</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">color</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"lightblue\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">fill</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">NA</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">size</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">2</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">geom_ridgeline</span><span class=\"p\">(</span><span class=\"w\">\n    </span><span class=\"n\">data</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">dem_df</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">aes</span><span class=\"p\">(</span><span class=\"w\">\n      </span><span class=\"n\">x</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">x</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">y</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">y</span><span class=\"p\">,</span><span class=\"w\">\n      </span><span class=\"n\">group</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">y</span><span class=\"p\">,</span><span class=\"w\">\n      </span><span class=\"n\">height</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">elev</span><span class=\"w\">\n    </span><span class=\"p\">),</span><span class=\"w\">\n    </span><span class=\"n\">scale</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">25</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"n\">fill</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"black\"</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"n\">color</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"white\"</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"n\">size</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">.25</span><span class=\"w\">\n  </span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">theme_void</span><span class=\"p\">()</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">theme</span><span class=\"p\">(</span><span class=\"n\">plot.background</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">element_rect</span><span class=\"p\">(</span><span class=\"n\">fill</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"black\"</span><span class=\"p\">))</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<p><img src=\"https://dieghernan.github.io/assets/img/blog/20220501_andalucia_frame-1.webp\" title=\"plot of chunk 20220501_andalucia_frame\" alt=\"Ridgeline map of Andalusia with light elevation profiles on a dark background, enclosed by a rectangular frame.\" width=\"100%\" /></p>\n\n<h2 id=\"references\">References</h2>\n\n<ul>\n  <li>Craft, H. D., Jr. (1970). <em>Radio observations of the pulse profiles and\ndispersion measures of twelve pulsars</em> [Doctoral dissertation, Cornell\nUniversity]. <a href=\"https://books.google.com/books?id=bdxYAAAAYAAJ\">https://books.google.com/books?id=bdxYAAAAYAAJ</a></li>\n  <li>Lipez, Z. (2019, June 14). How Joy Division’s ‘Unknown Pleasures’ image\nwent from underground album cover to a piece of cultural ubiquity.\n<em>The Washington Post</em>.\n<a href=\"https://www.washingtonpost.com/entertainment/music/how-joy-divisions-unknown-pleasures-image-went-from-underground-album-cover-to-a-piece-of-cultural-ubiquity/2019/06/14/26e75338-8c76-11e9-adf3-f70f78c156e8_story.html\">Article</a></li>\n  <li>Mitton, S. (Ed.). (1977). <em>The Cambridge encyclopaedia of astronomy</em>.\nPrentice-Hall of Canada.</li>\n  <li>Redondo, D. (2020, January 25). Mapas estilo Joy Division con QGIS y R.\n<em>Daniel Redondo</em>. <a href=\"https://danielredondo.com/blog/2020-01-25-joy_division/\">https://danielredondo.com/blog/2020-01-25-joy_division/</a></li>\n  <li>White, T. M. (2019). Cartographic pleasures: Maps inspired by Joy\nDivision’s <em>Unknown Pleasures</em> album art. <em>Cartographic Perspectives</em>,\n(92), 65–78. <a href=\"https://doi.org/10.14714/CP92.1536\">https://doi.org/10.14714/CP92.1536</a></li>\n</ul>\n<div class=\"footnotes\" role=\"doc-endnotes\">\n  <ol>\n    <li id=\"fn:1\">\n      <p>Other versions of the story credit drummer Stephen Morris for finding it. <a href=\"#fnref:1\" class=\"reversefootnote\" role=\"doc-backlink\">&uarr;</a></p>\n    </li>\n  </ol>\n</div>\n",
      "date_published": "2022-05-01T00:00:00+02:00",
      "image": "https://dieghernan.github.io/assets/img/blog/20220501_joyplots.webp",
      "summary": "Create ridgelines (AKA joyplots) of territories using elevation data with R, sf, terra and ggridges.",
      "tags": ["music","r_bloggers","rstats","rspatial","maps","ggplot2","ggridges","terra","giscoR"],
      "authors": [{
        "name": "Diego HH",
        "url": "https://dieghernan.github.io/"
      }]
    },
    {
      "id": "https://dieghernan.github.io/202203_Corona-timelapse/",
      "url": "https://dieghernan.github.io/202203_Corona-timelapse/",
      "title": "Corona timelapse",
      "content_html": "<p class=\"alert alert-danger p-3 mx-2 mb-3 lead text-center\"><i class=\"fas fa-skull-crossbones\"></i> <strong>Project discontinued.</strong> This post reflects the situation in March 2022 and\nis preserved as a historical account, not current travel information.</p>\n\n<p><img src=\"https://dieghernan.github.io/corona-atlas.de/assets/img/corona_atlas_timelapse.gif\" alt=\"Animated map tracking the spread of COVID-19 over time.\" /></p>\n\n<p>In April 2021, my brother Diego and I saw\nthe need for a friendly and automated interface to the meticulous and ever-changing restrictions that the German authorities imposed on travel abroad amid the COVID crisis.</p>\n\n<p>Despite the drastic variations in this regard that most foreign countries have experienced during the last year, the mild character of the currently predominant Omicron variant has finally led Germany to lift all\nCOVID-related obstacles to international travel. The long-awaited contemplation of an all-green world map has filled us with joy, but, to be honest, it has also rendered <a href=\"https://dieghernan.github.io/corona-atlas.de/en\">our website</a> quite boring, no matter how many languages we have translated it into (6 as of now 🇩🇪 🇬🇧 🇪🇸 🇫🇷 🇵🇱 🇹🇷).</p>\n\n<p>To compensate for this, we have put all the pieces together to produce a chronology of the COVID crisis through the lenses of the <a href=\"https://rki.de/risikogebiete\">Robert Koch Institut (RKI)</a>, the German entity that was responsible for COVID risk assessment of international areas. Most of the effort was already made, since we have been scraping RKI’s information (via <a href=\"https://scrapy.org/\">scrapy</a>) for almost one year. To complete the puzzle, we only needed to apply our method to the old risk assessment reports that had been issued before we started the project. That is, we have just combined our already developed scraping muscle with the\n<a href=\"https://archive.org/web/\">Archive.org Wayback Machine</a> as provided by\n<a href=\"https://sangaline.com/post/wayback-machine-scraper/\">Evan Sangaline</a>, and we have of course worked around the inconsistencies of\nGerman bureaucracy.</p>\n\n<p>After all, we hope that <a href=\"https://dieghernan.github.io/corona-atlas.de/en\">corona-atlas</a> remains boring and that our world map remains green. Now it is finally time for quite some <strong>Wanderlust</strong>!</p>\n\n<h2 id=\"links\">Links</h2>\n\n<ul>\n  <li><a href=\"https://dieghernan.github.io/projects/corona-atlas/\">Read more on this site</a></li>\n  <li><a href=\"https://dieghernan.github.io/corona-atlas.de/en\">Project’s Website</a></li>\n  <li><a href=\"https://github.com/dieghernan/corona-atlas.de\">Project’s Repository</a></li>\n</ul>\n\n",
      "date_published": "2022-03-14T00:00:00+01:00",
      "date_modified": "2026-10-07T00:00:00+02:00",
      "image": "https://raw.githubusercontent.com/dieghernan/corona-atlas.de/master/timelapse/frames/D2021-04-16.png",
      "summary": "Follow how COVID-19 travel restrictions changed over time for travelers from Germany.",
      "tags": ["discontinued","project","rstats","maps","leaflet","python","guest-author","COVID19"],
      "authors": [{
        "name": "Rodrigo Hernangómez",
        "url": "https://uselessness.science"
      }]
    },
    {
      "id": "https://dieghernan.github.io/202203_insetmaps/",
      "url": "https://dieghernan.github.io/202203_insetmaps/",
      "title": "Insets with ggplot2 and tmap - and mapsf!",
      "content_html": "<p><em>This post is dedicated to <a href=\"https://dominicroye.github.io/\">Dominic Royé</a>, AKA <a href=\"https://twitter.com/dr_xeo\">\\@dr_xeo</a></em></p>\n\n<p>A common challenge when creating maps is how to include an inset map in your\nvisualization. An inset map is nothing more than a smaller map usually included\nin a corner that may provide additional context to the overall map. It is also\nuseful for representing spatial units that may form part of a country but whose\ngeographical location would result in an imperfect visualization, or for\nincluding small units that would otherwise not be shown on the map.</p>\n\n<p>I have already covered this\n<a href=\"https://dieghernan.github.io//201911_QuickR/\">using the base <code class=\"language-plaintext highlighter-rouge\">plot()</code> function</a>,\nbut this time I show how to produce these insets using the <strong>ggplot2</strong> and\n<strong>tmap</strong> packages. In short: use the <strong>cowplot</strong> package.</p>\n\n<h2 id=\"test-case-canary-islands-as-an-inset\">Test case: Canary Islands as an inset</h2>\n\n<p>In this example, I create a map of Spain using <strong>mapSpain</strong> and an inset for the\nCanary Islands.</p>\n\n<p>The “true” map of Spain is:</p>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"n\">library</span><span class=\"p\">(</span><span class=\"n\">mapSpain</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">library</span><span class=\"p\">(</span><span class=\"n\">sf</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">library</span><span class=\"p\">(</span><span class=\"n\">ggplot2</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">library</span><span class=\"p\">(</span><span class=\"n\">dplyr</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"n\">regions</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">esp_get_ccaa</span><span class=\"p\">(</span><span class=\"n\">moveCAN</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">FALSE</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"n\">ggplot</span><span class=\"p\">(</span><span class=\"n\">regions</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">geom_sf</span><span class=\"p\">()</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<p><img src=\"https://dieghernan.github.io/assets/img/blog/20220303_truemap-1.webp\" alt=\"Map of Spain with autonomous community boundaries and the Canary Islands in their geographic position southwest of the mainland.\" width=\"100%\" /></p>\n\n<p>I use a different CRS for each part of Spain. In the case of mainland Spain, I\nuse ETRS89 / UTM 30N (<a href=\"https://epsg.io/25830\">EPSG:25830</a>) and for the Canary\nIslands I use REGCAN95 / UTM 28N (<a href=\"https://epsg.io/4083\">EPSG:4083</a>).</p>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"n\">main</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">regions</span><span class=\"w\"> </span><span class=\"o\">%&gt;%</span><span class=\"w\">\n  </span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">ccaa.shortname.es</span><span class=\"w\"> </span><span class=\"o\">!=</span><span class=\"w\"> </span><span class=\"s2\">\"Canarias\"</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">%&gt;%</span><span class=\"w\">\n  </span><span class=\"n\">st_transform</span><span class=\"p\">(</span><span class=\"m\">25830</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"n\">ggplot</span><span class=\"p\">(</span><span class=\"n\">main</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">geom_sf</span><span class=\"p\">()</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<p><img src=\"https://dieghernan.github.io/assets/img/blog/20220303_mainsub-1.webp\" alt=\"Map of mainland Spain and the Balearic Islands with autonomous community boundaries, excluding the Canary Islands.\" width=\"100%\" /></p>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"w\">\n\n</span><span class=\"n\">island</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">regions</span><span class=\"w\"> </span><span class=\"o\">%&gt;%</span><span class=\"w\">\n  </span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">ccaa.shortname.es</span><span class=\"w\"> </span><span class=\"o\">==</span><span class=\"w\"> </span><span class=\"s2\">\"Canarias\"</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">%&gt;%</span><span class=\"w\">\n  </span><span class=\"n\">st_transform</span><span class=\"p\">(</span><span class=\"m\">4083</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"n\">ggplot</span><span class=\"p\">(</span><span class=\"n\">island</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">geom_sf</span><span class=\"p\">()</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<p><img src=\"https://dieghernan.github.io/assets/img/blog/20220303_mainsub-2.webp\" alt=\"Map of the Canary Islands in their local projected coordinate system.\" width=\"100%\" /></p>\n\n<p>So that was easy! Just a couple of maps using <strong>ggplot2</strong>. Let’s start mixing and\nmatching!</p>\n\n<h2 id=\"on-ggplot2\">On <strong>ggplot2</strong></h2>\n\n<p>We have already created two quick maps with <strong>ggplot2</strong>. Now, to produce our map\nwith insets we will:</p>\n\n<ol>\n  <li>\n    <p>Produce two plots: the main plot and the subplot, providing a minimal style.\nWe will store them as <code class=\"language-plaintext highlighter-rouge\">ggplot</code> objects.</p>\n  </li>\n  <li>\n    <p>Combine both objects with <strong>cowplot</strong>.</p>\n  </li>\n</ol>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"c1\"># Main plot</span><span class=\"w\">\n</span><span class=\"n\">main_gg</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">ggplot</span><span class=\"p\">(</span><span class=\"n\">main</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">geom_sf</span><span class=\"p\">()</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">theme_void</span><span class=\"p\">()</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">theme</span><span class=\"p\">(</span><span class=\"w\">\n    </span><span class=\"n\">plot.background</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">element_rect</span><span class=\"p\">(</span><span class=\"n\">fill</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"grey85\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">colour</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">NA</span><span class=\"p\">),</span><span class=\"w\">\n    </span><span class=\"c1\"># Add a bit of margin on the bottom left</span><span class=\"w\">\n    </span><span class=\"c1\"># We will place the inset there</span><span class=\"w\">\n    </span><span class=\"n\">plot.margin</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">margin</span><span class=\"p\">(</span><span class=\"n\">l</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">80</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">b</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">80</span><span class=\"p\">)</span><span class=\"w\">\n  </span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"c1\"># Sub plot</span><span class=\"w\">\n</span><span class=\"n\">sub_gg</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">ggplot</span><span class=\"p\">(</span><span class=\"n\">island</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">geom_sf</span><span class=\"p\">()</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">theme_void</span><span class=\"p\">()</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"c1\"># Add a border to the inset</span><span class=\"w\">\n  </span><span class=\"n\">theme</span><span class=\"p\">(</span><span class=\"w\">\n    </span><span class=\"n\">panel.border</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">element_rect</span><span class=\"p\">(</span><span class=\"n\">fill</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">NA</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">colour</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"black\"</span><span class=\"p\">),</span><span class=\"w\">\n    </span><span class=\"n\">plot.background</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">element_rect</span><span class=\"p\">(</span><span class=\"n\">fill</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"grey95\"</span><span class=\"p\">)</span><span class=\"w\">\n  </span><span class=\"p\">)</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<p>We have our objects in place, and now is when the magic happens! With <strong>cowplot</strong>,\nwe can combine both maps into a single one. You may need to play a bit with the\nparameters <code class=\"language-plaintext highlighter-rouge\">x</code>, <code class=\"language-plaintext highlighter-rouge\">y</code>, <code class=\"language-plaintext highlighter-rouge\">hjust</code> and <code class=\"language-plaintext highlighter-rouge\">vjust</code> of the subplot to improve the\nplacement:</p>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"n\">library</span><span class=\"p\">(</span><span class=\"n\">cowplot</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"n\">ggdraw</span><span class=\"p\">()</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">draw_plot</span><span class=\"p\">(</span><span class=\"n\">main_gg</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">draw_plot</span><span class=\"p\">(</span><span class=\"n\">sub_gg</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"n\">height</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">0.2</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"n\">x</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">-0.25</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"n\">y</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">0.08</span><span class=\"w\">\n  </span><span class=\"p\">)</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<p><img src=\"https://dieghernan.github.io/assets/img/blog/20220303_insetggplot-1.webp\" alt=\"Map of Spain with the Canary Islands moved into a boxed inset at the lower left.\" width=\"100%\" /></p>\n\n<p>Note also that this approach is valid not only for maps, but for all types of\nplots produced by <strong>ggplot2</strong>, since this package is not specific to map\nobjects:</p>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"c1\"># Combining non-spatial plots</span><span class=\"w\">\n</span><span class=\"n\">library</span><span class=\"p\">(</span><span class=\"n\">palmerpenguins</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"n\">mass_flipper</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">ggplot</span><span class=\"p\">(</span><span class=\"w\">\n  </span><span class=\"n\">data</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">penguins</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">aes</span><span class=\"p\">(</span><span class=\"w\">\n    </span><span class=\"n\">x</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">flipper_length_mm</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"n\">y</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">body_mass_g</span><span class=\"w\">\n  </span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">geom_point</span><span class=\"p\">(</span><span class=\"w\">\n    </span><span class=\"n\">aes</span><span class=\"p\">(</span><span class=\"w\">\n      </span><span class=\"n\">color</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">species</span><span class=\"p\">,</span><span class=\"w\">\n      </span><span class=\"n\">shape</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">species</span><span class=\"w\">\n    </span><span class=\"p\">),</span><span class=\"w\">\n    </span><span class=\"n\">size</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">3</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"n\">alpha</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">0.8</span><span class=\"w\">\n  </span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">theme_minimal</span><span class=\"p\">()</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">scale_color_manual</span><span class=\"p\">(</span><span class=\"n\">values</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"s2\">\"darkorange\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"purple\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"cyan4\"</span><span class=\"p\">))</span><span class=\"w\">\n\n</span><span class=\"n\">flipper_hist</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">ggplot</span><span class=\"p\">(</span><span class=\"n\">data</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">penguins</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">aes</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">flipper_length_mm</span><span class=\"p\">))</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">geom_histogram</span><span class=\"p\">(</span><span class=\"n\">aes</span><span class=\"p\">(</span><span class=\"n\">fill</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">species</span><span class=\"p\">),</span><span class=\"w\">\n    </span><span class=\"n\">alpha</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">0.5</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"n\">position</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"identity\"</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"n\">show.legend</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">FALSE</span><span class=\"w\">\n  </span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">scale_fill_manual</span><span class=\"p\">(</span><span class=\"n\">values</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"s2\">\"darkorange\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"purple\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"cyan4\"</span><span class=\"p\">))</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">theme_void</span><span class=\"p\">()</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">theme</span><span class=\"p\">(</span><span class=\"n\">plot.background</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">element_rect</span><span class=\"p\">(</span><span class=\"n\">fill</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"white\"</span><span class=\"p\">))</span><span class=\"w\">\n\n\n</span><span class=\"c1\"># Nonsense plot!</span><span class=\"w\">\n</span><span class=\"n\">ggdraw</span><span class=\"p\">()</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">draw_plot</span><span class=\"p\">(</span><span class=\"n\">mass_flipper</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">draw_plot</span><span class=\"p\">(</span><span class=\"n\">flipper_hist</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"n\">scale</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">0.25</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"n\">y</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">0.3</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"n\">x</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">-0.2</span><span class=\"w\">\n  </span><span class=\"p\">)</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<p><img src=\"https://dieghernan.github.io/assets/img/blog/20220303_insetggplot_nonsense-1.webp\" alt=\"Scatter plot of penguin body mass against flipper length, colored by species, with an inset histogram of flipper length at the upper left.\" width=\"100%\" /></p>\n\n<h2 id=\"on-tmap\">On <strong>tmap</strong></h2>\n\n<p>We can follow a similar approach with <strong>tmap</strong>. In version 3.x.x (there is a\nnew <a href=\"https://github.com/r-tmap/tmap/issues/599\">revamped version under development</a>),\nwe can use <a href=\"https://github.com/r-tmap/tmap/issues/541\"><code class=\"language-plaintext highlighter-rouge\">tmap_grob()</code></a> to\nconvert the <code class=\"language-plaintext highlighter-rouge\">tmap</code> objects to the objects that <strong>cowplot</strong> can handle.</p>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"n\">library</span><span class=\"p\">(</span><span class=\"n\">tmap</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"n\">main_tmap</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">tm_shape</span><span class=\"p\">(</span><span class=\"n\">main</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">tm_polygons</span><span class=\"p\">()</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">tm_layout</span><span class=\"p\">(</span><span class=\"w\">\n    </span><span class=\"n\">inner.margins</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"m\">.3</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">.3</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">0</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">0</span><span class=\"p\">),</span><span class=\"w\">\n    </span><span class=\"n\">frame</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">FALSE</span><span class=\"w\">\n  </span><span class=\"p\">)</span><span class=\"w\">\n\n\n</span><span class=\"n\">main_tmap</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">tmap_grob</span><span class=\"p\">(</span><span class=\"n\">main_tmap</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"n\">sub_tmap</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">tm_shape</span><span class=\"p\">(</span><span class=\"n\">island</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">tm_polygons</span><span class=\"p\">()</span><span class=\"w\">\n\n</span><span class=\"n\">sub_tmap</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">tmap_grob</span><span class=\"p\">(</span><span class=\"n\">sub_tmap</span><span class=\"p\">)</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<p>Once we have these new “grobs”, we can use the same approach as the one we\napplied to <strong>ggplot2</strong> objects.</p>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"n\">ggdraw</span><span class=\"p\">()</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">draw_plot</span><span class=\"p\">(</span><span class=\"n\">main_tmap</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">draw_plot</span><span class=\"p\">(</span><span class=\"n\">sub_tmap</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"n\">height</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">0.3</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"n\">x</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">-0.2</span><span class=\"w\">\n  </span><span class=\"p\">)</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<p><img src=\"https://dieghernan.github.io/assets/img/blog/20220303_insettmap-1.webp\" alt=\"Map of Spain with regional boundaries and a Canary Islands inset at the lower left.\" width=\"100%\" /></p>\n\n<h2 id=\"update-on-mapsf\">Update: on <strong>mapsf</strong></h2>\n\n<p><a href=\"https://rgeomatic.hypotheses.org/\">Timothée Giraud</a> (AKA\n<a href=\"https://twitter.com/rgeomatic\">\\@rgeomatic</a>), the developer of <strong>mapsf</strong>, also\nshared how to create inset maps using that package:</p>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"n\">library</span><span class=\"p\">(</span><span class=\"n\">mapsf</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"n\">mf_map</span><span class=\"p\">(</span><span class=\"n\">main</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">mf_inset_on</span><span class=\"p\">(</span><span class=\"n\">island</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">pos</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"bottomright\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">cex</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">.3</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">mf_map</span><span class=\"p\">(</span><span class=\"n\">island</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">box</span><span class=\"p\">(</span><span class=\"n\">lwd</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">.5</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">mf_inset_off</span><span class=\"p\">()</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<p><img src=\"https://dieghernan.github.io/assets/img/blog/20220303_insetmapsf-1.webp\" alt=\"Map of Spain with regional boundaries and a boxed Canary Islands inset at the lower right.\" width=\"100%\" /></p>\n",
      "date_published": "2022-03-03T00:00:00+01:00",
      "date_modified": "2022-03-03T00:00:00+01:00",
      "image": "https://dieghernan.github.io/assets/img/blog/20220303_inset.webp",
      "summary": "A common challenge when creating maps is how to include an inset map in your visualization. An inset map is a smaller map usually included in a corner that may provide additional context to the overall map, or may include map units that would not usually be represented properly.",
      "tags": ["r_bloggers","rstats","rspatial","maps","sf","ggplot2","tmap","mapSpain","mapsf","inset"],
      "authors": [{
        "name": "Diego HH",
        "url": "https://dieghernan.github.io/"
      }]
    },
    {
      "id": "https://dieghernan.github.io/202201_maps-flags/",
      "url": "https://dieghernan.github.io/202201_maps-flags/",
      "title": "Beautiful maps with R (IV): Fun with flags revisited",
      "content_html": "<p>On 27 Jan. 2022 my package <strong>rasterpic</strong> was accepted on\n<a href=\"https://cran.r-project.org/package=rasterpic\">CRAN</a> (Hooray!). This package\ngeotags images, using a spatial object (from <strong>sf</strong> or <strong>terra</strong>) as a\ngeographic reference.</p>\n\n<p>I tweeted about that, and it seems to have received good feedback from the\n<a href=\"https://twitter.com/hashtag/rspatial\">#rspatial</a> community:</p>\n\n<blockquote class=\"twitter-tweet\"><p lang=\"en\" dir=\"ltr\"><a href=\"https://twitter.com/hashtag/rspatial?src=hash&amp;ref_src=twsrc%5Etfw\">#rspatial</a> Do we need a package for using our own pictures as base maps? I don’t know, but anyway we have it! {rasterpic} 📦 is now on CRAN, and we can convert our pngs to spatial rasters like this <a href=\"https://t.co/fpoollARoN\">https://t.co/fpoollARoN</a> <a href=\"https://t.co/l9o7rQwdgX\">pic.twitter.com/l9o7rQwdgX</a></p>&mdash; dieghernan ن (@dhernangomez) <a href=\"https://twitter.com/dhernangomez/status/1486666356544225281?ref_src=twsrc%5Etfw\">January 27, 2022</a></blockquote>\n\n<p>I also received an interesting reply to this from <strong>Hefin Ioan Rhys</strong>\n<a href=\"https://twitter.com/HRJ21\">@HRJ21</a>:</p>\n\n<blockquote class=\"twitter-tweet\"><p lang=\"en\" dir=\"ltr\">Ooh I think a map with countries filled with their own flag would be poppin&#39;.</p>&mdash; Hefin Ioan Rhys (@HRJ21) <a href=\"https://twitter.com/HRJ21/status/1486976368936116225?ref_src=twsrc%5Etfw\">January 28, 2022</a></blockquote>\n<script async=\"\" src=\"https://platform.twitter.com/widgets.js\" charset=\"utf-8\"></script>\n\n<p>That reminds me of a <a href=\"https://dieghernan.github.io/202002_cartography1/#png-layer\">previous\npost</a> that I wrote\nwhen I added some new functions to the <strong>cartography</strong> package, now replaced by\nthe <a href=\"https://cran.r-project.org/package=mapsf\"><strong>mapsf</strong></a> package.</p>\n\n<p>With <strong>rasterpic</strong>, we now have an alternative tool for creating maps using\nimages, and this quick post shows you how to do it.</p>\n\n<p>I will replicate the Africa map presented in my previous plot, but this time I\nwill use newer packages, such as\n<a href=\"https://cran.r-project.org/package=giscoR\"><strong>giscoR</strong></a>, and the development\nversion of <a href=\"https://github.com/paleolimbot/ggspatial/pull/92\"><strong>ggspatial</strong></a>\n(not released yet), which adds support for <code class=\"language-plaintext highlighter-rouge\">SpatRaster</code> objects in <strong>ggplot2</strong>.\nThe flags will be extracted from the GitHub repository\n<a href=\"https://github.com/hampusborgos/country-flags\">https://github.com/hampusborgos/country-flags</a>.</p>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"w\">\n</span><span class=\"c1\"># Development version of ggspatial</span><span class=\"w\">\n</span><span class=\"c1\"># devtools::install_github(\"paleolimbot/ggspatial\")</span><span class=\"w\">\n</span><span class=\"n\">library</span><span class=\"p\">(</span><span class=\"n\">ggspatial</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">library</span><span class=\"p\">(</span><span class=\"n\">ggplot2</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">library</span><span class=\"p\">(</span><span class=\"n\">giscoR</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">library</span><span class=\"p\">(</span><span class=\"n\">dplyr</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">library</span><span class=\"p\">(</span><span class=\"n\">rasterpic</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"c1\"># For country names</span><span class=\"w\">\n</span><span class=\"n\">library</span><span class=\"p\">(</span><span class=\"n\">countrycode</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"n\">world</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">gisco_get_countries</span><span class=\"p\">(</span><span class=\"n\">epsg</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">3857</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">africa</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">gisco_get_countries</span><span class=\"p\">(</span><span class=\"n\">region</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"Africa\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">epsg</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">3857</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"c1\"># Base map of Africa</span><span class=\"w\">\n</span><span class=\"n\">plot</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">ggplot</span><span class=\"p\">(</span><span class=\"n\">world</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">geom_sf</span><span class=\"p\">(</span><span class=\"n\">fill</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"grey90\"</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">theme_minimal</span><span class=\"p\">()</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">theme</span><span class=\"p\">(</span><span class=\"n\">panel.background</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">element_rect</span><span class=\"p\">(</span><span class=\"n\">fill</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"lightblue\"</span><span class=\"p\">))</span><span class=\"w\">\n\n</span><span class=\"n\">plot</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"c1\"># Zoom on Africa</span><span class=\"w\">\n  </span><span class=\"n\">coord_sf</span><span class=\"p\">(</span><span class=\"w\">\n    </span><span class=\"n\">xlim</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"m\">-2000000</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">6000000</span><span class=\"p\">),</span><span class=\"w\">\n    </span><span class=\"n\">ylim</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"m\">-4000000</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">5000000</span><span class=\"p\">)</span><span class=\"w\">\n  </span><span class=\"p\">)</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<p><img src=\"https://dieghernan.github.io/assets/img/blog/20220128_africa-1.webp\" title=\"plot of chunk 20220128_africa\" alt=\"Map of Africa with national borders and neighboring countries shown for context.\" width=\"100%\" /></p>\n\n<p>Now, let’s add the flags with a loop:</p>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"w\">\n</span><span class=\"c1\"># We paste the ISO2 code to each African country</span><span class=\"w\">\n</span><span class=\"n\">africa</span><span class=\"o\">$</span><span class=\"n\">iso2</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">countrycode</span><span class=\"p\">(</span><span class=\"n\">africa</span><span class=\"o\">$</span><span class=\"n\">ISO3_CODE</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"iso3c\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"iso2c\"</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"c1\"># Get flags from repo - low quality to speed up the code</span><span class=\"w\">\n</span><span class=\"n\">flagrepo</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"s2\">\"https://raw.githubusercontent.com/hjnilsson/country-flags/master/png250px/\"</span><span class=\"w\">\n\n</span><span class=\"c1\"># Loop and add</span><span class=\"w\">\n</span><span class=\"k\">for</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"n\">iso</span><span class=\"w\"> </span><span class=\"k\">in</span><span class=\"w\"> </span><span class=\"n\">africa</span><span class=\"o\">$</span><span class=\"n\">iso2</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"p\">{</span><span class=\"w\">\n  </span><span class=\"c1\"># Download pic and plot</span><span class=\"w\">\n  </span><span class=\"n\">imgurl</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">paste0</span><span class=\"p\">(</span><span class=\"n\">flagrepo</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">tolower</span><span class=\"p\">(</span><span class=\"n\">iso</span><span class=\"p\">),</span><span class=\"w\"> </span><span class=\"s2\">\".png\"</span><span class=\"p\">)</span><span class=\"w\">\n  </span><span class=\"n\">tmpfile</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">tempfile</span><span class=\"p\">(</span><span class=\"n\">fileext</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\".png\"</span><span class=\"p\">)</span><span class=\"w\">\n  </span><span class=\"n\">download.file</span><span class=\"p\">(</span><span class=\"n\">imgurl</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">tmpfile</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">quiet</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">TRUE</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">mode</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"wb\"</span><span class=\"p\">)</span><span class=\"w\">\n\n  </span><span class=\"c1\"># Raster</span><span class=\"w\">\n  </span><span class=\"n\">x</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">africa</span><span class=\"w\"> </span><span class=\"o\">%&gt;%</span><span class=\"w\"> </span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">iso2</span><span class=\"w\"> </span><span class=\"o\">==</span><span class=\"w\"> </span><span class=\"n\">iso</span><span class=\"p\">)</span><span class=\"w\">\n  </span><span class=\"n\">x_rast</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">rasterpic_img</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">tmpfile</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">crop</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">TRUE</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">mask</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">TRUE</span><span class=\"p\">)</span><span class=\"w\">\n  </span><span class=\"n\">plot</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">plot</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"n\">layer_spatial</span><span class=\"p\">(</span><span class=\"n\">x_rast</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"p\">}</span><span class=\"w\">\n\n</span><span class=\"n\">plot</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"n\">geom_sf</span><span class=\"p\">(</span><span class=\"n\">data</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">africa</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">fill</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">NA</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\">\n  </span><span class=\"c1\"># Zoom on Africa</span><span class=\"w\">\n  </span><span class=\"n\">coord_sf</span><span class=\"p\">(</span><span class=\"w\">\n    </span><span class=\"n\">xlim</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"m\">-2000000</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">6000000</span><span class=\"p\">),</span><span class=\"w\">\n    </span><span class=\"n\">ylim</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"m\">-4000000</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">5000000</span><span class=\"p\">)</span><span class=\"w\">\n  </span><span class=\"p\">)</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<p><img src=\"https://dieghernan.github.io/assets/img/blog/20220128_flag-1.webp\" title=\"plot of chunk 20220128_flag\" alt=\"Map of Africa with national flags clipped to each country boundary.\" width=\"100%\" /></p>\n",
      "date_published": "2022-01-28T00:00:00+01:00",
      "image": "https://dieghernan.github.io/assets/img/blog/20220128_flag-1.webp",
      "summary": "On 27 Jan. 2022 my package rasterpic was accepted on CRAN (hooray!). This package geotags images, using a spatial object (from sf or terra) as a geographic reference.",
      "tags": ["r_bloggers","rstats","rspatial","beautiful_maps","maps","terra","flags","rasterpic","giscoR"],
      "authors": [{
        "name": "Diego HH",
        "url": "https://dieghernan.github.io/"
      }]
    },
    {
      "id": "https://dieghernan.github.io/projects/corona-atlas/",
      "url": "https://dieghernan.github.io/projects/corona-atlas/",
      "title": "Corona Atlas",
      "content_html": "<p class=\"alert alert-danger p-3 mx-2 mb-3 lead text-center\"><i class=\"fas fa-skull-crossbones\"></i> <strong>Project discontinued.</strong> This page documents a historical project; the\ndescriptions below refer to its period of operation.</p>\n\n<p><img src=\"https://dieghernan.github.io/corona-atlas.de/assets/img/corona-atlas-icon.png\" alt=\"Corona Atlas logo\" style=\"width: 25%;\" /></p>\n\n<p>Visit <a href=\"https://dieghernan.github.io/corona-atlas.de/\">https://dieghernan.github.io/corona-atlas.de/</a></p>\n\n<p>Interactive map of the international COVID-19 risk areas as designated by the German authorities.</p>\n\n<p>During the project, data was updated periodically from the website of the <a href=\"https://www.rki.de/DE/Content/InfAZ/N/Neuartiges_Coronavirus/Risikogebiete_neu.html\">Robert Koch Institute</a>.</p>\n\n<p>Data scraping is performed in <strong>Python</strong> with\n<a href=\"https://scrapy.org/\"><strong>scrapy</strong></a>.\nThe scraper also uses\n<a href=\"https://pandas.pydata.org/\"><strong>pandas</strong></a> and\n<a href=\"https://pypi.org/project/pycountry/\"><strong>pycountry</strong></a>.</p>\n\n<p>For the prototype version, map visualization was created with <strong>R</strong> and\ngenerated via <a href=\"https://rmarkdown.rstudio.com/\"><strong>rmarkdown</strong></a> using\n<a href=\"http://rstudio.github.io/leaflet/\"><strong>leaflet</strong></a>,\n<a href=\"https://dieghernan.github.io/giscoR/\"><strong>giscoR</strong></a> and some packages included in\nthe <a href=\"https://www.tidyverse.org/\">tidyverse</a>.\nFor the deployment, map logic has moved to JavaScript to support multiple languages.</p>\n\n<p><a href=\"https://dieghernan.github.io/202203_Corona-timelapse/\">Read more in this post</a></p>\n",
      "date_published": "2021-04-30T00:00:00+02:00",
      "date_modified": "2026-10-07T00:00:00+02:00",
      "image": "https://dieghernan.github.io/corona-atlas.de/assets/img/og_corona_atlas.png",
      "summary": "Historical interactive map of international COVID-19 risk areas, based on assessments by the German authorities during the project’s operation.",
      "tags": ["discontinued","project","rstats","maps","leaflet","python","COVID19","rspatial","giscoR","javascript"],
      "authors": [{
        "name": "Diego HH",
        "url": "https://dieghernan.github.io/"
      }]
    },
    {
      "id": "https://dieghernan.github.io/projects/spain-munic-bot/",
      "url": "https://dieghernan.github.io/projects/spain-munic-bot/",
      "title": "spain-munic-bot",
      "content_html": "<p class=\"alert alert-danger p-3 mx-2 mb-3 lead text-center\"><i class=\"fas fa-skull-crossbones\"></i> <strong>Project discontinued.</strong> This page documents a historical project; the\ndescriptions below refer to its period of operation.</p>\n\n<h2 id=\"-twitter-bot-random-municipalities-of-spain--with-mapspain-posted-with-rtweet-via-a-github-action\">🤖 Twitter bot: random municipalities of Spain 🇪🇸 with <strong>mapSpain</strong>, posted with <strong>rtweet</strong> via a GitHub Action</h2>\n\n<p>I was a bot 🤖 that tweeted a random map of a Spanish municipality with its name, province and autonomous community (and an inset map of Spain showing the region and the community). I ran 🏃‍♀️ every 20 minutes.</p>\n\n<h2 id=\"i-have-a-website\"><a href=\"https://dieghernan.github.io/spain-munic-bot/\">I have a website!</a></h2>\n\n<p><a class=\"twitter-timeline\" data-height=\"550\" href=\"https://twitter.com/spainmunic?ref_src=twsrc%5Etfw\">Tweets by spainmunic</a> <script async=\"\" src=\"https://platform.twitter.com/widgets.js\" charset=\"utf-8\"></script></p>\n\n<h2 id=\"-r-packages\">📦 <strong>R</strong> packages</h2>\n\n<p>Core packages used in the project are:</p>\n\n<ul>\n  <li><a href=\"https://ropenspain.github.io/mapSpain/\"><strong>mapSpain</strong></a> for the location of the\nmunicipalities, base polygons, coordinates and imagery.</li>\n  <li><a href=\"https://docs.ropensci.org/osmdata/\"><strong>osmdata</strong></a> for the streets.</li>\n  <li><a href=\"https://mtennekes.github.io/tmap/\"><strong>tmap</strong></a> for plotting.</li>\n  <li><a href=\"https://docs.ropensci.org/rtweet/\"><strong>rtweet</strong></a> for posting.</li>\n</ul>\n\n<p>Other packages used are <strong>sf</strong>, <strong>dplyr</strong> and other common supporting packages.</p>\n",
      "date_published": "2021-01-29T00:00:00+01:00",
      "date_modified": "2026-10-07T00:00:00+02:00",
      "image": "https://dieghernan.github.io/spain-munic-bot/assets/img/sample.png",
      "summary": "Archived maps of buildings and urban growth in Spanish municipalities, generated with R. Automated posting is disabled.",
      "tags": ["discontinued","project","rstats","maps","twitter","rspatial","mapSpain","tmap"],
      "authors": [{
        "name": "Diego HH",
        "url": "https://dieghernan.github.io/"
      }]
    },
    {
      "id": "https://dieghernan.github.io/projects/leaflet-providersESP/",
      "url": "https://dieghernan.github.io/projects/leaflet-providersESP/",
      "title": "Leaflet-providersESP",
      "content_html": "<p><strong>Leaflet-providersESP</strong> is a plugin for <a href=\"https://leafletjs.com/\">Leaflet</a> that\ncontains configurations for various tile layers provided by public agencies in\nSpain.</p>\n\n<p><a href=\"https://doi.org/10.5281/zenodo.4318010\"><img src=\"https://zenodo.org/badge/DOI/10.5281/zenodo.4318010.svg\" alt=\"DOI\" /></a></p>\n\n<h2 id=\"demo\">Demo</h2>\n\n<p>Full docs and examples are available at\n<a href=\"https://dieghernan.github.io/leaflet-providersESP/\">https://dieghernan.github.io/leaflet-providersESP/</a>.</p>\n\n<p>This code generates a Leaflet map with a layer provided by\nLeaflet-providersESP.</p>\n\n<div class=\"language-html highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"cp\">&lt;!DOCTYPE html&gt;</span>\n<span class=\"nt\">&lt;html</span> <span class=\"na\">lang=</span><span class=\"s\">\"en\"</span><span class=\"nt\">&gt;</span>\n  <span class=\"nt\">&lt;head&gt;</span>\n    <span class=\"nt\">&lt;meta</span> <span class=\"na\">charset=</span><span class=\"s\">\"utf-8\"</span> <span class=\"nt\">/&gt;</span>\n    <span class=\"nt\">&lt;title&gt;</span>Minimal page | leaflet-providersESP<span class=\"nt\">&lt;/title&gt;</span>\n    <span class=\"nt\">&lt;meta</span> <span class=\"na\">name=</span><span class=\"s\">\"viewport\"</span> <span class=\"na\">content=</span><span class=\"s\">\"width=device-width, initial-scale=1.0\"</span> <span class=\"nt\">/&gt;</span>\n    <span class=\"c\">&lt;!-- Load Leaflet --&gt;</span>\n    <span class=\"nt\">&lt;link</span>\n      <span class=\"na\">rel=</span><span class=\"s\">\"stylesheet\"</span>\n      <span class=\"na\">href=</span><span class=\"s\">\"https://unpkg.com/leaflet@1.7.1/dist/leaflet.css\"</span>\n    <span class=\"nt\">/&gt;</span>\n    <span class=\"nt\">&lt;script </span><span class=\"na\">src=</span><span class=\"s\">\"https://unpkg.com/leaflet@1.7.1/dist/leaflet.js\"</span><span class=\"nt\">&gt;&lt;/script&gt;</span>\n    <span class=\"c\">&lt;!-- Install leaflet-providersESP --&gt;</span>\n    <span class=\"nt\">&lt;script </span><span class=\"na\">src=</span><span class=\"s\">\"https://cdn.jsdelivr.net/gh/dieghernan/leaflet-providersESP/dist/leaflet-providersESP.min.js\"</span><span class=\"nt\">&gt;&lt;/script&gt;</span>\n    <span class=\"c\">&lt;!-- Display map full page --&gt;</span>\n    <span class=\"nt\">&lt;style&gt;</span>\n      <span class=\"nt\">html</span> <span class=\"p\">{</span>\n        <span class=\"nl\">height</span><span class=\"p\">:</span> <span class=\"m\">100%</span><span class=\"p\">;</span>\n      <span class=\"p\">}</span>\n      <span class=\"nt\">body</span> <span class=\"p\">{</span>\n        <span class=\"nl\">height</span><span class=\"p\">:</span> <span class=\"m\">100%</span><span class=\"p\">;</span>\n        <span class=\"nl\">margin</span><span class=\"p\">:</span> <span class=\"m\">0</span><span class=\"p\">;</span>\n        <span class=\"nl\">padding</span><span class=\"p\">:</span> <span class=\"m\">0</span><span class=\"p\">;</span>\n      <span class=\"p\">}</span>\n      <span class=\"nf\">#mapid</span> <span class=\"p\">{</span>\n        <span class=\"nl\">height</span><span class=\"p\">:</span> <span class=\"m\">100%</span><span class=\"p\">;</span>\n        <span class=\"nl\">width</span><span class=\"p\">:</span> <span class=\"m\">100%</span><span class=\"p\">;</span>\n      <span class=\"p\">}</span>\n    <span class=\"nt\">&lt;/style&gt;</span>\n  <span class=\"nt\">&lt;/head&gt;</span>\n  <span class=\"nt\">&lt;body&gt;</span>\n    <span class=\"c\">&lt;!-- Create map --&gt;</span>\n    <span class=\"nt\">&lt;div</span> <span class=\"na\">id=</span><span class=\"s\">\"mapid\"</span><span class=\"nt\">&gt;&lt;/div&gt;</span>\n    <span class=\"c\">&lt;!-- Puerta del Sol - IDErioja server --&gt;</span>\n    <span class=\"nt\">&lt;script&gt;</span>\n      <span class=\"kd\">var</span> <span class=\"nx\">mymap</span> <span class=\"o\">=</span> <span class=\"nx\">L</span><span class=\"p\">.</span><span class=\"nf\">map</span><span class=\"p\">(</span><span class=\"dl\">\"</span><span class=\"s2\">mapid</span><span class=\"dl\">\"</span><span class=\"p\">).</span><span class=\"nf\">setView</span><span class=\"p\">([</span><span class=\"mf\">40.4166</span><span class=\"p\">,</span> <span class=\"o\">-</span><span class=\"mf\">3.70384</span><span class=\"p\">],</span> <span class=\"mi\">18</span><span class=\"p\">);</span>\n      <span class=\"nx\">L</span><span class=\"p\">.</span><span class=\"nx\">tileLayer</span><span class=\"p\">.</span><span class=\"nf\">providerESP</span><span class=\"p\">(</span><span class=\"dl\">\"</span><span class=\"s2\">IDErioja</span><span class=\"dl\">\"</span><span class=\"p\">).</span><span class=\"nf\">addTo</span><span class=\"p\">(</span><span class=\"nx\">mymap</span><span class=\"p\">);</span>\n    <span class=\"nt\">&lt;/script&gt;</span>\n  <span class=\"nt\">&lt;/body&gt;</span>\n<span class=\"nt\">&lt;/html&gt;</span>\n</code></pre></div></div>\n\n<div class=\"embed-responsive embed-responsive-4by3 my-2 chulapa-rounded-lg border border-primary\">\n  <iframe class=\"embed-responsive-item\" title=\"Leaflet-providersESP minimal map demo\" src=\"https://dieghernan.github.io/leaflet-providersESP/demo/minimal\" allowfullscreen=\"\" loading=\"lazy\"></iframe>\n</div>\n\n<h2 id=\"all-providers\">All providers</h2>\n\n<p class=\"d-flex flex-wrap mt-5 mb-2\">\n  <a class=\"btn btn-primary mr-2 mb-2\" href=\"https://dieghernan.github.io/leaflet-providersESP/allproviders/\">Open the map in a full window</a>\n  <a class=\"btn btn-outline-primary mb-2\" href=\"https://dieghernan.github.io/leaflet-providersESP/\">Documentation</a>\n</p>\n\n<div class=\"embed-responsive embed-responsive-4by3 my-2 chulapa-rounded-lg border border-primary\">\n  <iframe class=\"embed-responsive-item\" title=\"Leaflet-providersESP map with all providers\" src=\"https://dieghernan.github.io/leaflet-providersESP/allproviders/\" allowfullscreen=\"\" loading=\"lazy\"></iframe>\n</div>\n",
      "date_published": "2020-10-26T00:00:00+01:00",
      "image": "https://dieghernan.github.io/assets/img/misc/leaflet-providersesp.png",
      "summary": "Leaflet plugin for adding WMS/WMTS provided by public agencies in Spain.",
      "tags": ["project","maps","leaflet"],
      "authors": [{
        "name": "Diego HH",
        "url": "https://dieghernan.github.io/"
      }]
    },
    {
      "id": "https://dieghernan.github.io/202004_headtails/",
      "url": "https://dieghernan.github.io/202004_headtails/",
      "title": "Head/tail breaks in the classInt package",
      "content_html": "<blockquote class=\"blockquote\">\n  <p class=\"small font-italic\">There are far more ordinary people (say, 80 percent) than extraordinary people (say, 20 percent), and this is often characterized by the 80/20 principle, based on the observation made by the Italian economist Vilfredo Pareto in 1906 that 80% of land in Italy was owned by 20% of the population. A histogram of the data values for these phenomena would reveal a right-skewed or heavy-tailed distribution. How to map the data with the heavy-tailed distribution?</p>\n  <footer class=\"blockquote-footer text-right\">Jiang (2013)</footer>\n</blockquote>\n\n<h2 id=\"abstract\">Abstract</h2>\n\n<p>This vignette discusses the implementation of the “Head/tail breaks” style\n(Jiang (2013)) in the <code class=\"language-plaintext highlighter-rouge\">classIntervals()</code> function from the <strong>classInt</strong> package.\nA step-by-step example is presented to clarify the method. A case study using\n<code class=\"language-plaintext highlighter-rouge\">spData::afcon</code> is also included, making use of additional packages such as\n<strong>sf</strong>.</p>\n\n<p class=\"alert alert-info p-3 mx-2 mb-3\"><strong>Historical example:</strong> The mapping examples use <strong>cartography</strong>, which is now\nin maintenance mode. Its maintainers recommend <a href=\"https://riatelab.github.io/mapsf/\"><strong>mapsf</strong></a>\nfor new work. The original code and outputs are preserved and have not been\nrevalidated against current package versions.</p>\n\n<h2 id=\"introduction\">Introduction</h2>\n\n<p><strong>Head/tail breaks</strong> is a classification scheme introduced by Jiang (2013) for\nrevealing hierarchies in data with many small values and a few large ones.\nThe related <strong>ht-index</strong> measures the depth of this hierarchy, rather than\nbeing another name for the classification method.</p>\n\n<p>The distributions considered here are strongly right-skewed, with a minority\nof large values in the head and a majority of small values in the tail. This\nimbalance can be expressed as <em>“far more small things than large things”</em>.</p>\n\n<p>Power-law and lognormal distributions are examples of heavy-tailed\ndistributions. The head/tail breaks literature also considers exponential\ndistributions under its broader description of this imbalance. Nature,\nsociety and finance (Vasicek (2002)) provide examples of rare and extreme\nevents. Taleb (2008) discusses the impact of unexpected extreme events,\noffering another reason to pay attention to low-frequency observations.</p>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"n\">library</span><span class=\"p\">(</span><span class=\"n\">classInt</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"c1\"># 1. Characterization of heavy-tail distributions----</span><span class=\"w\">\n</span><span class=\"n\">set.seed</span><span class=\"p\">(</span><span class=\"m\">1234</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"c1\"># Pareto distribution a=1 b=1.161 n=1000</span><span class=\"w\">\n</span><span class=\"n\">sample_par</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"m\">1</span><span class=\"w\"> </span><span class=\"o\">/</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"m\">1</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"w\"> </span><span class=\"n\">runif</span><span class=\"p\">(</span><span class=\"m\">1000</span><span class=\"p\">))</span><span class=\"o\">^</span><span class=\"p\">(</span><span class=\"m\">1</span><span class=\"w\"> </span><span class=\"o\">/</span><span class=\"w\"> </span><span class=\"m\">1.161</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">opar</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">par</span><span class=\"p\">(</span><span class=\"n\">no.readonly</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">TRUE</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">par</span><span class=\"p\">(</span><span class=\"n\">mar</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"m\">2</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">4</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">3</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">1</span><span class=\"p\">),</span><span class=\"w\"> </span><span class=\"n\">cex</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">0.8</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">plot</span><span class=\"p\">(</span><span class=\"w\">\n  </span><span class=\"n\">sort</span><span class=\"p\">(</span><span class=\"n\">sample_par</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">decreasing</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">TRUE</span><span class=\"p\">),</span><span class=\"w\">\n  </span><span class=\"n\">type</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"l\"</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">ylab</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"F(x)\"</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">xlab</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"\"</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">main</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"80/20 principle\"</span><span class=\"w\">\n</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">abline</span><span class=\"p\">(</span><span class=\"w\">\n  </span><span class=\"n\">h</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">quantile</span><span class=\"p\">(</span><span class=\"n\">sample_par</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">.8</span><span class=\"p\">),</span><span class=\"w\">\n  </span><span class=\"n\">lty</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">2</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">col</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"red3\"</span><span class=\"w\">\n</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">abline</span><span class=\"p\">(</span><span class=\"w\">\n  </span><span class=\"n\">v</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">0.2</span><span class=\"w\"> </span><span class=\"o\">*</span><span class=\"w\"> </span><span class=\"nf\">length</span><span class=\"p\">(</span><span class=\"n\">sample_par</span><span class=\"p\">),</span><span class=\"w\">\n  </span><span class=\"n\">lty</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">2</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">col</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"darkblue\"</span><span class=\"w\">\n</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">legend</span><span class=\"p\">(</span><span class=\"w\">\n  </span><span class=\"s2\">\"topleft\"</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">legend</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"s2\">\"F(x): p80\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"x: Top 20%\"</span><span class=\"p\">),</span><span class=\"w\">\n  </span><span class=\"n\">col</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"s2\">\"red3\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"darkblue\"</span><span class=\"p\">),</span><span class=\"w\">\n  </span><span class=\"n\">lty</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">2</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">cex</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">0.8</span><span class=\"w\">\n</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"n\">hist</span><span class=\"p\">(</span><span class=\"w\">\n  </span><span class=\"n\">sample_par</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">n</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">100</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">xlab</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"\"</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">main</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"Histogram\"</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">col</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"grey50\"</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">border</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">NA</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">probability</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">TRUE</span><span class=\"w\">\n</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">par</span><span class=\"p\">(</span><span class=\"n\">opar</span><span class=\"p\">)</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<p><img src=\"https://dieghernan.github.io/assets/img/blog/20200405_charheavytail-1.webp\" alt=\"Ranked-value plot of a Pareto sample. Values fall steeply and then flatten, with reference lines marking the top 20 percent and the 80th percentile.\" /><img src=\"https://dieghernan.github.io/assets/img/blog/20200405_charheavytail-2.webp\" alt=\"Histogram of a Pareto sample. Most values are small, with a long tail of rare large values.\" /></p>\n\n<h2 id=\"breaking-method\">Breaking method</h2>\n\n<p>The method itself consists of a four-step process performed recursively until a\nstopping condition is satisfied. Given a vector of values \\(v = (a_1, a_2,\n..., a_n)\\), the process can be described as follows:</p>\n\n<ol>\n  <li>Compute the arithmetic mean, \\(\\mu = \\frac{1}{n}\\sum_{i=1}^{n} a_i\\).</li>\n  <li>Break \\(v\\) into the \\(tail\\) and the \\(head\\):\n\\(tail = \\{ a_x \\in v | a_x \\lt \\mu \\}\\)\n\\(head = \\{ a_x \\in v | a_x \\gt \\mu \\}\\).</li>\n  <li>Check whether the proportion of observations in the head is at most the\nchosen threshold:\n\\(\\frac{|head|}{|v|} \\le threshold\\)</li>\n  <li>If step 3 is <code class=\"language-plaintext highlighter-rouge\">TRUE</code> and the head contains at least two observations, replace\n\\(v\\) with \\(head\\) and repeat. Otherwise, stop.</li>\n</ol>\n\n<p>Only values strictly above the mean enter the next iteration. Values equal to\nthe mean are not part of the head. Stopping does not require an exact 50/50\nsplit.</p>\n\n<p>A threshold of 40% provides a practical stopping rule. It is not a statistical\ntest for whether a distribution is heavy-tailed.</p>\n\n<p>The final breaks are the vector of consecutive \\(\\mu\\):</p>\n\n<p>[breaks = (\\mu_1, \\mu_2, \\mu_3, …, \\mu_n )]</p>\n\n<h2 id=\"step-by-step-example\">Step-by-step example</h2>\n\n<p>We reproduce here the pseudo-code<sup id=\"fnref:1\"><a href=\"#fn:1\" class=\"footnote\" rel=\"footnote\" role=\"doc-noteref\">1</a></sup> as per Jiang (2019):</p>\n\n<div class=\"language-plaintext highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code>Recursive function Head/tail Breaks:\n Rank the input data from the largest to the smallest\n Break the data into the head and the tail around the mean;\n // the head for those above the mean\n // the tail for those below the mean\n While (head &lt;= 40%):\n Head/tail Breaks (head);\nEnd Function\n</code></pre></div></div>\n\n<p>The following <strong>R</strong> example uses <code class=\"language-plaintext highlighter-rouge\">prop &lt; thr</code>, whereas the pseudocode above\nuses <code class=\"language-plaintext highlighter-rouge\">head &lt;= 40%</code>. At exactly 40%, the R loop stops and the pseudocode\ncontinues. This distinction does not affect the example below.</p>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"n\">opar</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">par</span><span class=\"p\">(</span><span class=\"n\">no.readonly</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">TRUE</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">par</span><span class=\"p\">(</span><span class=\"n\">mar</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"m\">2</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">2</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">3</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">1</span><span class=\"p\">),</span><span class=\"w\"> </span><span class=\"n\">cex</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">0.8</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">var</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">sample_par</span><span class=\"w\">\n</span><span class=\"n\">thr</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"m\">.4</span><span class=\"w\">\n</span><span class=\"n\">brks</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"nf\">min</span><span class=\"p\">(</span><span class=\"n\">var</span><span class=\"p\">),</span><span class=\"w\"> </span><span class=\"nf\">max</span><span class=\"p\">(</span><span class=\"n\">var</span><span class=\"p\">))</span><span class=\"w\"> </span><span class=\"c1\"># Initialise with min and max</span><span class=\"w\">\n\n</span><span class=\"n\">sum_table</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">data.frame</span><span class=\"p\">(</span><span class=\"w\">\n  </span><span class=\"n\">iter</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">0</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">mu</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">NA</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">prop</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">NA</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">n_var</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">NA</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">n_head</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">NA</span><span class=\"w\">\n</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"c1\"># Pars for chart</span><span class=\"w\">\n</span><span class=\"n\">limchart</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">brks</span><span class=\"w\">\n</span><span class=\"c1\"># Iteration</span><span class=\"w\">\n</span><span class=\"k\">for</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"n\">i</span><span class=\"w\"> </span><span class=\"k\">in</span><span class=\"w\"> </span><span class=\"m\">1</span><span class=\"o\">:</span><span class=\"m\">10</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"p\">{</span><span class=\"w\">\n  </span><span class=\"n\">mu</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">mean</span><span class=\"p\">(</span><span class=\"n\">var</span><span class=\"p\">)</span><span class=\"w\">\n  </span><span class=\"n\">brks</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">sort</span><span class=\"p\">(</span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"n\">brks</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">mu</span><span class=\"p\">))</span><span class=\"w\">\n  </span><span class=\"n\">head</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">var</span><span class=\"p\">[</span><span class=\"n\">var</span><span class=\"w\"> </span><span class=\"o\">&gt;</span><span class=\"w\"> </span><span class=\"n\">mu</span><span class=\"p\">]</span><span class=\"w\">\n  </span><span class=\"n\">prop</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"nf\">length</span><span class=\"p\">(</span><span class=\"n\">head</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">/</span><span class=\"w\"> </span><span class=\"nf\">length</span><span class=\"p\">(</span><span class=\"n\">var</span><span class=\"p\">)</span><span class=\"w\">\n  </span><span class=\"n\">stopit</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">prop</span><span class=\"w\"> </span><span class=\"o\">&lt;</span><span class=\"w\"> </span><span class=\"n\">thr</span><span class=\"w\"> </span><span class=\"o\">&amp;</span><span class=\"w\"> </span><span class=\"nf\">length</span><span class=\"p\">(</span><span class=\"n\">head</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">&gt;</span><span class=\"w\"> </span><span class=\"m\">1</span><span class=\"w\">\n  </span><span class=\"n\">sum_table</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">rbind</span><span class=\"p\">(</span><span class=\"w\">\n    </span><span class=\"n\">sum_table</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"n\">i</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">mu</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">prop</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"nf\">length</span><span class=\"p\">(</span><span class=\"n\">var</span><span class=\"p\">),</span><span class=\"w\"> </span><span class=\"nf\">length</span><span class=\"p\">(</span><span class=\"n\">head</span><span class=\"p\">))</span><span class=\"w\">\n  </span><span class=\"p\">)</span><span class=\"w\">\n  </span><span class=\"n\">hist</span><span class=\"p\">(</span><span class=\"w\">\n    </span><span class=\"n\">var</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"n\">main</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">paste0</span><span class=\"p\">(</span><span class=\"s2\">\"Iter \"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">i</span><span class=\"p\">),</span><span class=\"w\">\n    </span><span class=\"n\">breaks</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">50</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"n\">col</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"grey50\"</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"n\">border</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">NA</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"n\">xlab</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"\"</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"n\">xlim</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">limchart</span><span class=\"w\">\n  </span><span class=\"p\">)</span><span class=\"w\">\n  </span><span class=\"n\">abline</span><span class=\"p\">(</span><span class=\"n\">v</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">mu</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">col</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"red3\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">lty</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">2</span><span class=\"p\">)</span><span class=\"w\">\n  </span><span class=\"n\">ylabel</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"nf\">max</span><span class=\"p\">(</span><span class=\"n\">hist</span><span class=\"p\">(</span><span class=\"n\">var</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">breaks</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">50</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">plot</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">FALSE</span><span class=\"p\">)</span><span class=\"o\">$</span><span class=\"n\">counts</span><span class=\"p\">)</span><span class=\"w\">\n  </span><span class=\"n\">labelplot</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">paste0</span><span class=\"p\">(</span><span class=\"s2\">\"PropHead: \"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"nf\">round</span><span class=\"p\">(</span><span class=\"n\">prop</span><span class=\"w\"> </span><span class=\"o\">*</span><span class=\"w\"> </span><span class=\"m\">100</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">2</span><span class=\"p\">),</span><span class=\"w\"> </span><span class=\"s2\">\"%\"</span><span class=\"p\">)</span><span class=\"w\">\n  </span><span class=\"n\">text</span><span class=\"p\">(</span><span class=\"w\">\n    </span><span class=\"n\">x</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">mu</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"n\">y</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">ylabel</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"n\">labels</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">labelplot</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"n\">cex</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">0.8</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"n\">pos</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">4</span><span class=\"w\">\n  </span><span class=\"p\">)</span><span class=\"w\">\n  </span><span class=\"n\">legend</span><span class=\"p\">(</span><span class=\"w\">\n    </span><span class=\"s2\">\"right\"</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"n\">legend</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">paste0</span><span class=\"p\">(</span><span class=\"s2\">\"mu\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">i</span><span class=\"p\">),</span><span class=\"w\">\n    </span><span class=\"n\">col</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"s2\">\"red3\"</span><span class=\"p\">),</span><span class=\"w\">\n    </span><span class=\"n\">lty</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">2</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"n\">cex</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">0.8</span><span class=\"w\">\n  </span><span class=\"p\">)</span><span class=\"w\">\n  </span><span class=\"k\">if</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"n\">isFALSE</span><span class=\"p\">(</span><span class=\"n\">stopit</span><span class=\"p\">))</span><span class=\"w\"> </span><span class=\"p\">{</span><span class=\"w\">\n    </span><span class=\"k\">break</span><span class=\"w\">\n  </span><span class=\"p\">}</span><span class=\"w\">\n  </span><span class=\"n\">var</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">head</span><span class=\"w\">\n</span><span class=\"p\">}</span><span class=\"w\">\n</span><span class=\"n\">par</span><span class=\"p\">(</span><span class=\"n\">opar</span><span class=\"p\">)</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<p><img src=\"https://dieghernan.github.io/assets/img/blog/20200405_stepbystep-1.webp\" alt=\"Histogram at step 1 of head/tail classification of a Pareto sample. A vertical line marks the mean used to separate the head from the tail.\" /><img src=\"https://dieghernan.github.io/assets/img/blog/20200405_stepbystep-2.webp\" alt=\"Histogram at step 2 of head/tail classification of a Pareto sample. A vertical line marks the mean used to separate the head from the tail. Only values above the previous mean remain.\" /><img src=\"https://dieghernan.github.io/assets/img/blog/20200405_stepbystep-3.webp\" alt=\"Histogram at step 3 of head/tail classification of a Pareto sample. A vertical line marks the mean used to separate the head from the tail. Only values above the previous mean remain.\" /><img src=\"https://dieghernan.github.io/assets/img/blog/20200405_stepbystep-4.webp\" alt=\"Histogram at step 4 of head/tail classification of a Pareto sample. A vertical line marks the mean used to separate the head from the tail. Only values above the previous mean remain.\" /></p>\n\n<p>The head proportion varies across iterations and reaches 50% in the fourth,\nwhich stops the loop. It does not increase monotonically.</p>\n\n<table>\n  <thead>\n    <tr>\n      <th style=\"text-align: right\">iter</th>\n      <th style=\"text-align: right\">mu</th>\n      <th style=\"text-align: left\">prop</th>\n      <th style=\"text-align: right\">n_var</th>\n      <th style=\"text-align: right\">n_head</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <td style=\"text-align: right\">1</td>\n      <td style=\"text-align: right\">5.6755</td>\n      <td style=\"text-align: left\">14.5%</td>\n      <td style=\"text-align: right\">1000</td>\n      <td style=\"text-align: right\">145</td>\n    </tr>\n    <tr>\n      <td style=\"text-align: right\">2</td>\n      <td style=\"text-align: right\">27.2369</td>\n      <td style=\"text-align: left\">21.38%</td>\n      <td style=\"text-align: right\">145</td>\n      <td style=\"text-align: right\">31</td>\n    </tr>\n    <tr>\n      <td style=\"text-align: right\">3</td>\n      <td style=\"text-align: right\">85.1766</td>\n      <td style=\"text-align: left\">19.35%</td>\n      <td style=\"text-align: right\">31</td>\n      <td style=\"text-align: right\">6</td>\n    </tr>\n    <tr>\n      <td style=\"text-align: right\">4</td>\n      <td style=\"text-align: right\">264.7126</td>\n      <td style=\"text-align: left\">50%</td>\n      <td style=\"text-align: right\">6</td>\n      <td style=\"text-align: right\">3</td>\n    </tr>\n  </tbody>\n</table>\n\n<p>The break vector includes the original minimum and maximum, plus the means\ncomputed during the iterations. Here the original data are <code class=\"language-plaintext highlighter-rouge\">sample_par</code>, since\n<code class=\"language-plaintext highlighter-rouge\">var</code> is replaced by the head inside the loop.</p>\n\n<h2 id=\"implementation-in-the-classint-package\">Implementation in the <strong>classInt</strong> package</h2>\n\n<p>The implementation in <code class=\"language-plaintext highlighter-rouge\">classIntervals()</code> reproduces these results:</p>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"n\">ht_sample_par</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">classIntervals</span><span class=\"p\">(</span><span class=\"n\">sample_par</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">style</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"headtails\"</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">brks</span><span class=\"w\"> </span><span class=\"o\">==</span><span class=\"w\"> </span><span class=\"n\">ht_sample_par</span><span class=\"o\">$</span><span class=\"n\">brks</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<div class=\"language-plaintext highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code>## [1] TRUE TRUE TRUE TRUE TRUE TRUE\n</code></pre></div></div>\n\n<p>As stated in Jiang (2013), the number of breaks is determined by the data.\nHowever, the <code class=\"language-plaintext highlighter-rouge\">thr</code> parameter can help adjust the final number. A lower value\nof <code class=\"language-plaintext highlighter-rouge\">thr</code> can yield fewer breaks, while a larger <code class=\"language-plaintext highlighter-rouge\">thr</code> can increase the number if\nthe underlying distribution follows the <em>“far more small things than large\nthings”</em> principle.</p>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"n\">opar</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">par</span><span class=\"p\">(</span><span class=\"n\">no.readonly</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">TRUE</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">par</span><span class=\"p\">(</span><span class=\"n\">mar</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"m\">2</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">2</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">2</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">1</span><span class=\"p\">),</span><span class=\"w\"> </span><span class=\"n\">cex</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">0.8</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"n\">pal1</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"s2\">\"wheat1\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"wheat2\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"red3\"</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"c1\"># Minimum: single break</span><span class=\"w\">\n</span><span class=\"n\">print</span><span class=\"p\">(</span><span class=\"n\">paste</span><span class=\"p\">(</span><span class=\"s2\">\"number of breaks\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"nf\">length</span><span class=\"p\">(</span><span class=\"n\">classIntervals</span><span class=\"p\">(</span><span class=\"n\">sample_par</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">style</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"headtails\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">thr</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">0</span><span class=\"p\">)</span><span class=\"o\">$</span><span class=\"n\">brks</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"w\"> </span><span class=\"m\">1</span><span class=\"p\">)))</span><span class=\"w\">\n</span><span class=\"n\">plot</span><span class=\"p\">(</span><span class=\"w\">\n  </span><span class=\"n\">classIntervals</span><span class=\"p\">(</span><span class=\"n\">sample_par</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">style</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"headtails\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">thr</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">0</span><span class=\"p\">),</span><span class=\"w\">\n  </span><span class=\"n\">pal</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">pal1</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">main</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"thr = 0\"</span><span class=\"w\">\n</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"c1\"># Two breaks</span><span class=\"w\">\n</span><span class=\"n\">print</span><span class=\"p\">(</span><span class=\"n\">paste</span><span class=\"p\">(</span><span class=\"s2\">\"number of breaks\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"nf\">length</span><span class=\"p\">(</span><span class=\"n\">classIntervals</span><span class=\"p\">(</span><span class=\"n\">sample_par</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">style</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"headtails\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">thr</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">0.2</span><span class=\"p\">)</span><span class=\"o\">$</span><span class=\"n\">brks</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"w\"> </span><span class=\"m\">1</span><span class=\"p\">)))</span><span class=\"w\">\n</span><span class=\"n\">plot</span><span class=\"p\">(</span><span class=\"w\">\n  </span><span class=\"n\">classIntervals</span><span class=\"p\">(</span><span class=\"n\">sample_par</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">style</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"headtails\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">thr</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">0.2</span><span class=\"p\">),</span><span class=\"w\">\n  </span><span class=\"n\">pal</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">pal1</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">main</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"thr = 0.2\"</span><span class=\"w\">\n</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"c1\"># Default breaks: 0.4</span><span class=\"w\">\n</span><span class=\"n\">print</span><span class=\"p\">(</span><span class=\"n\">paste</span><span class=\"p\">(</span><span class=\"s2\">\"number of breaks\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"nf\">length</span><span class=\"p\">(</span><span class=\"n\">classIntervals</span><span class=\"p\">(</span><span class=\"n\">sample_par</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">style</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"headtails\"</span><span class=\"p\">)</span><span class=\"o\">$</span><span class=\"n\">brks</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"w\"> </span><span class=\"m\">1</span><span class=\"p\">)))</span><span class=\"w\">\n</span><span class=\"n\">plot</span><span class=\"p\">(</span><span class=\"n\">classIntervals</span><span class=\"p\">(</span><span class=\"n\">sample_par</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">style</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"headtails\"</span><span class=\"p\">),</span><span class=\"w\">\n  </span><span class=\"n\">pal</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">pal1</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">main</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"thr = Default\"</span><span class=\"w\">\n</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"c1\"># Maximum breaks</span><span class=\"w\">\n</span><span class=\"n\">print</span><span class=\"p\">(</span><span class=\"n\">paste</span><span class=\"p\">(</span><span class=\"s2\">\"number of breaks\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"nf\">length</span><span class=\"p\">(</span><span class=\"n\">classIntervals</span><span class=\"p\">(</span><span class=\"n\">sample_par</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">style</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"headtails\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">thr</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">1</span><span class=\"p\">)</span><span class=\"o\">$</span><span class=\"n\">brks</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"w\"> </span><span class=\"m\">1</span><span class=\"p\">)))</span><span class=\"w\">\n</span><span class=\"n\">plot</span><span class=\"p\">(</span><span class=\"w\">\n  </span><span class=\"n\">classIntervals</span><span class=\"p\">(</span><span class=\"n\">sample_par</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">style</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"headtails\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">thr</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">1</span><span class=\"p\">),</span><span class=\"w\">\n  </span><span class=\"n\">pal</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">pal1</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">main</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"thr = 1\"</span><span class=\"w\">\n</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">par</span><span class=\"p\">(</span><span class=\"n\">opar</span><span class=\"p\">)</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<p><img src=\"https://dieghernan.github.io/assets/img/blog/20200405_examplesimp-1.webp\" alt=\"Cumulative distribution of a Pareto sample classified with a head/tail threshold of 0. Vertical lines and a colored strip indicate the resulting class intervals.\" /><img src=\"https://dieghernan.github.io/assets/img/blog/20200405_examplesimp-2.webp\" alt=\"Cumulative distribution of a Pareto sample classified with a head/tail threshold of 0.2. Vertical lines and a colored strip indicate the resulting class intervals.\" /><img src=\"https://dieghernan.github.io/assets/img/blog/20200405_examplesimp-3.webp\" alt=\"Cumulative distribution of a Pareto sample classified with a head/tail threshold of the default value. Vertical lines and a colored strip indicate the resulting class intervals.\" /><img src=\"https://dieghernan.github.io/assets/img/blog/20200405_examplesimp-4.webp\" alt=\"Cumulative distribution of a Pareto sample classified with a head/tail threshold of 1. Vertical lines and a colored strip indicate the resulting class intervals.\" /></p>\n\n<p>For this example, even <code class=\"language-plaintext highlighter-rouge\">thr = 0</code> retains the mean as an internal break.\nThe returned vector also contains the minimum and maximum, so this gives two\nclasses, not one.</p>\n\n<h2 id=\"case-study\">Case study</h2>\n\n<p>Jiang (2013) states that <em>\"the new classification scheme is more natural than\nthe natural breaks in finding the groupings or hierarchy for data with a\nheavy-tailed distribution.\"</em> (p. 482), referring to Jenks’ natural breaks\nmethod. In this case study, we compare <code class=\"language-plaintext highlighter-rouge\">headtails</code> vs. <code class=\"language-plaintext highlighter-rouge\">fisher</code>, which is the\nalias for the Fisher-Jenks algorithm and is always preferred to the <code class=\"language-plaintext highlighter-rouge\">jenks</code>\nstyle (see <code class=\"language-plaintext highlighter-rouge\">?classIntervals</code>). For this example, we will use the <code class=\"language-plaintext highlighter-rouge\">afcon</code>\ndataset from the <strong>spData</strong> package, plus some additional spatial information to\ncreate the data visualization.</p>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"n\">library</span><span class=\"p\">(</span><span class=\"n\">spData</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">data</span><span class=\"p\">(</span><span class=\"n\">afcon</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">package</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"spData\"</span><span class=\"p\">)</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<p>Let’s have a look at the top 10 values and the distribution of the variable\n<code class=\"language-plaintext highlighter-rouge\">totcon</code> (index of total conflict 1966-78):</p>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"c1\"># Top10</span><span class=\"w\">\n</span><span class=\"n\">knitr</span><span class=\"o\">::</span><span class=\"n\">kable</span><span class=\"p\">(</span><span class=\"n\">head</span><span class=\"p\">(</span><span class=\"n\">afcon</span><span class=\"p\">[</span><span class=\"n\">order</span><span class=\"p\">(</span><span class=\"n\">afcon</span><span class=\"o\">$</span><span class=\"n\">totcon</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">decreasing</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">TRUE</span><span class=\"p\">),</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"s2\">\"name\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"totcon\"</span><span class=\"p\">)],</span><span class=\"w\"> </span><span class=\"m\">10</span><span class=\"p\">))</span><span class=\"w\">\n\n</span><span class=\"n\">opar</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">par</span><span class=\"p\">(</span><span class=\"n\">no.readonly</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">TRUE</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">par</span><span class=\"p\">(</span><span class=\"n\">mar</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"m\">4</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">4</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">3</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">1</span><span class=\"p\">),</span><span class=\"w\"> </span><span class=\"n\">cex</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">0.8</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">hist</span><span class=\"p\">(</span><span class=\"n\">afcon</span><span class=\"o\">$</span><span class=\"n\">totcon</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">n</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">20</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">main</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"Histogram\"</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">xlab</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"totcon\"</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">col</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"grey50\"</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">border</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">NA</span><span class=\"p\">,</span><span class=\"w\">\n</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">plot</span><span class=\"p\">(</span><span class=\"w\">\n  </span><span class=\"n\">density</span><span class=\"p\">(</span><span class=\"n\">afcon</span><span class=\"o\">$</span><span class=\"n\">totcon</span><span class=\"p\">),</span><span class=\"w\">\n  </span><span class=\"n\">main</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"Distribution\"</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">xlab</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"totcon\"</span><span class=\"p\">,</span><span class=\"w\">\n</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">par</span><span class=\"p\">(</span><span class=\"n\">opar</span><span class=\"p\">)</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<p><img src=\"https://dieghernan.github.io/assets/img/blog/20200405_summspdata-1.webp\" alt=\"Histogram of total conflict counts in African countries from 1966 to 1978. Most countries have low counts, with a few much higher values.\" /><img src=\"https://dieghernan.github.io/assets/img/blog/20200405_summspdata-2.webp\" alt=\"Density curve of total conflict counts in African countries from 1966 to 1978, with a peak at low counts and a long right tail.\" /></p>\n\n<p>The values for Egypt (EG) and Sudan (SU) stand out from the rest. The histogram\nshows a strongly right-skewed pattern with many small values and a few large\nones.</p>\n\n<p>In addition to <code class=\"language-plaintext highlighter-rouge\">headtails</code> and <code class=\"language-plaintext highlighter-rouge\">fisher</code>, we use <code class=\"language-plaintext highlighter-rouge\">quantile</code> to compare the\nclassification styles. Quantile breaks are based on ranks rather than the\nsize of the gaps between observations.</p>\n\n<p>Applying the three aforementioned methods to break the data:</p>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"n\">brks_ht</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">classIntervals</span><span class=\"p\">(</span><span class=\"n\">afcon</span><span class=\"o\">$</span><span class=\"n\">totcon</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">style</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"headtails\"</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">print</span><span class=\"p\">(</span><span class=\"n\">brks_ht</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"c1\"># Same number of classes for \"fisher\"</span><span class=\"w\">\n</span><span class=\"n\">nclass</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"nf\">length</span><span class=\"p\">(</span><span class=\"n\">brks_ht</span><span class=\"o\">$</span><span class=\"n\">brks</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"w\"> </span><span class=\"m\">1</span><span class=\"w\">\n</span><span class=\"n\">brks_fisher</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">classIntervals</span><span class=\"p\">(</span><span class=\"n\">afcon</span><span class=\"o\">$</span><span class=\"n\">totcon</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">style</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"fisher\"</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">n</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">nclass</span><span class=\"w\">\n</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">print</span><span class=\"p\">(</span><span class=\"n\">brks_fisher</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"n\">brks_quantile</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">classIntervals</span><span class=\"p\">(</span><span class=\"n\">afcon</span><span class=\"o\">$</span><span class=\"n\">totcon</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">style</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"quantile\"</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">n</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">nclass</span><span class=\"w\">\n</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">print</span><span class=\"p\">(</span><span class=\"n\">brks_quantile</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"n\">pal1</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"s2\">\"wheat1\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"wheat2\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"red3\"</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">opar</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">par</span><span class=\"p\">(</span><span class=\"n\">no.readonly</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">TRUE</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">par</span><span class=\"p\">(</span><span class=\"n\">mar</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"m\">2</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">2</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">2</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">1</span><span class=\"p\">),</span><span class=\"w\"> </span><span class=\"n\">cex</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">0.8</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">plot</span><span class=\"p\">(</span><span class=\"n\">brks_ht</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">pal</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">pal1</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">main</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"headtails\"</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">plot</span><span class=\"p\">(</span><span class=\"n\">brks_fisher</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">pal</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">pal1</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">main</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"fisher\"</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">plot</span><span class=\"p\">(</span><span class=\"n\">brks_quantile</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">pal</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">pal1</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">main</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"quantile\"</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">par</span><span class=\"p\">(</span><span class=\"n\">opar</span><span class=\"p\">)</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<p><img src=\"https://dieghernan.github.io/assets/img/blog/20200405_breaksample-1.webp\" alt=\"Cumulative distribution of African conflict counts classified using head/tail breaks. Vertical lines and a colored strip identify the class intervals.\" /><img src=\"https://dieghernan.github.io/assets/img/blog/20200405_breaksample-2.webp\" alt=\"Cumulative distribution of African conflict counts classified using Fisher breaks. Vertical lines and a colored strip identify the class intervals.\" /><img src=\"https://dieghernan.github.io/assets/img/blog/20200405_breaksample-3.webp\" alt=\"Cumulative distribution of African conflict counts classified using quantile breaks. Vertical lines and a colored strip identify the class intervals.\" /></p>\n\n<p>The top three classes of <code class=\"language-plaintext highlighter-rouge\">headtails</code> contain five observations, whereas those\nof <code class=\"language-plaintext highlighter-rouge\">fisher</code> contain 13. In this example, <code class=\"language-plaintext highlighter-rouge\">headtails</code> gives more detail at the\nupper end of the distribution.</p>\n\n<p>The next plot compares density estimates of the rescaled <code class=\"language-plaintext highlighter-rouge\">totcon</code> values and\nthe class assignments from each method. The original values are rescaled to\n<code class=\"language-plaintext highlighter-rouge\">[1, nclass]</code> and shifted by -0.5 for the visual comparison.</p>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"c1\"># Helper function to reescale values</span><span class=\"w\">\n</span><span class=\"n\">help_reescale</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"k\">function</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">min</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">1</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">max</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">10</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"p\">{</span><span class=\"w\">\n  </span><span class=\"n\">r</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"w\"> </span><span class=\"nf\">min</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">))</span><span class=\"w\"> </span><span class=\"o\">/</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"nf\">max</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"w\"> </span><span class=\"nf\">min</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">))</span><span class=\"w\">\n  </span><span class=\"n\">r</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">r</span><span class=\"w\"> </span><span class=\"o\">*</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"n\">max</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"w\"> </span><span class=\"n\">min</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"n\">min</span><span class=\"w\">\n  </span><span class=\"nf\">return</span><span class=\"p\">(</span><span class=\"n\">r</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"p\">}</span><span class=\"w\">\n</span><span class=\"n\">afcon</span><span class=\"o\">$</span><span class=\"n\">ecdf_class</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">help_reescale</span><span class=\"p\">(</span><span class=\"n\">afcon</span><span class=\"o\">$</span><span class=\"n\">totcon</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">min</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">1</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"w\"> </span><span class=\"m\">0.5</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">max</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">nclass</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"w\"> </span><span class=\"m\">0.5</span><span class=\"w\">\n</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">afcon</span><span class=\"o\">$</span><span class=\"n\">ht_breaks</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">cut</span><span class=\"p\">(</span><span class=\"n\">afcon</span><span class=\"o\">$</span><span class=\"n\">totcon</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">brks_ht</span><span class=\"o\">$</span><span class=\"n\">brks</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">labels</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">FALSE</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">include.lowest</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">TRUE</span><span class=\"w\">\n</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"n\">afcon</span><span class=\"o\">$</span><span class=\"n\">fisher_breaks</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">cut</span><span class=\"p\">(</span><span class=\"n\">afcon</span><span class=\"o\">$</span><span class=\"n\">totcon</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">brks_fisher</span><span class=\"o\">$</span><span class=\"n\">brks</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">labels</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">FALSE</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">include.lowest</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">TRUE</span><span class=\"w\">\n</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"n\">afcon</span><span class=\"o\">$</span><span class=\"n\">quantile_break</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">cut</span><span class=\"p\">(</span><span class=\"n\">afcon</span><span class=\"o\">$</span><span class=\"n\">totcon</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">brks_quantile</span><span class=\"o\">$</span><span class=\"n\">brks</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">labels</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">FALSE</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">include.lowest</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">TRUE</span><span class=\"w\">\n</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"n\">opar</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">par</span><span class=\"p\">(</span><span class=\"n\">no.readonly</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">TRUE</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">par</span><span class=\"p\">(</span><span class=\"n\">mar</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"m\">4</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">4</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">1</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">1</span><span class=\"p\">),</span><span class=\"w\"> </span><span class=\"n\">cex</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">0.8</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">plot</span><span class=\"p\">(</span><span class=\"w\">\n  </span><span class=\"n\">density</span><span class=\"p\">(</span><span class=\"n\">afcon</span><span class=\"o\">$</span><span class=\"n\">ecdf_class</span><span class=\"p\">),</span><span class=\"w\">\n  </span><span class=\"n\">ylim</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"m\">0</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">0.8</span><span class=\"p\">),</span><span class=\"w\">\n  </span><span class=\"n\">lwd</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">2</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">main</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"\"</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">xlab</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"class\"</span><span class=\"w\">\n</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">lines</span><span class=\"p\">(</span><span class=\"n\">density</span><span class=\"p\">(</span><span class=\"n\">afcon</span><span class=\"o\">$</span><span class=\"n\">ht_breaks</span><span class=\"p\">),</span><span class=\"w\"> </span><span class=\"n\">col</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"darkblue\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">lty</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">2</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">lines</span><span class=\"p\">(</span><span class=\"n\">density</span><span class=\"p\">(</span><span class=\"n\">afcon</span><span class=\"o\">$</span><span class=\"n\">fisher_breaks</span><span class=\"p\">),</span><span class=\"w\"> </span><span class=\"n\">col</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"limegreen\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">lty</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">2</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">lines</span><span class=\"p\">(</span><span class=\"n\">density</span><span class=\"p\">(</span><span class=\"n\">afcon</span><span class=\"o\">$</span><span class=\"n\">quantile_break</span><span class=\"p\">),</span><span class=\"w\">\n  </span><span class=\"n\">col</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"red3\"</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">lty</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">2</span><span class=\"w\">\n</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">legend</span><span class=\"p\">(</span><span class=\"s2\">\"topright\"</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">legend</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"w\">\n    </span><span class=\"s2\">\"Continuous\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"headtails\"</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"s2\">\"fisher\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"quantile\"</span><span class=\"w\">\n  </span><span class=\"p\">),</span><span class=\"w\">\n  </span><span class=\"n\">col</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"s2\">\"black\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"darkblue\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"limegreen\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"red3\"</span><span class=\"p\">),</span><span class=\"w\">\n  </span><span class=\"n\">lwd</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"m\">2</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">1</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">1</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">1</span><span class=\"p\">),</span><span class=\"w\">\n  </span><span class=\"n\">lty</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"m\">1</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">2</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">2</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">2</span><span class=\"p\">),</span><span class=\"w\">\n  </span><span class=\"n\">cex</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">0.8</span><span class=\"w\">\n</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">par</span><span class=\"p\">(</span><span class=\"n\">opar</span><span class=\"p\">)</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<p><img src=\"https://dieghernan.github.io/assets/img/blog/20200405_benchmarkbreaks-1.webp\" alt=\"Density curves comparing continuous African conflict counts with values classified using head/tail, Fisher and quantile breaks. The methods produce different distribution shapes.\" /></p>\n\n<p>In this example, the class assignments from <code class=\"language-plaintext highlighter-rouge\">headtails</code> retain more of the\noriginal imbalance. By contrast, <code class=\"language-plaintext highlighter-rouge\">quantile</code> aims for similar numbers of\nobservations per class, regardless of the gaps between values.</p>\n\n<p>We now compare the methods using proportional-symbol maps. Symbol size\nrepresents <code class=\"language-plaintext highlighter-rouge\">totcon</code>, while color distinguishes the classes.</p>\n\n<p>The first map uses proportional symbols without class-based colors, providing\na reference for the three classified maps.</p>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"n\">library</span><span class=\"p\">(</span><span class=\"n\">sf</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">library</span><span class=\"p\">(</span><span class=\"n\">giscoR</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">library</span><span class=\"p\">(</span><span class=\"n\">cartography</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"n\">opar</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">par</span><span class=\"p\">(</span><span class=\"n\">no.readonly</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">TRUE</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"n\">par</span><span class=\"p\">(</span><span class=\"w\">\n  </span><span class=\"n\">mfrow</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"m\">2</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">2</span><span class=\"p\">),</span><span class=\"w\">\n  </span><span class=\"n\">mar</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"m\">1</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">1</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">1</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">1</span><span class=\"p\">),</span><span class=\"w\">\n  </span><span class=\"n\">bg</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"white\"</span><span class=\"w\">\n</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">africa</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">gisco_get_countries</span><span class=\"p\">(</span><span class=\"n\">resolution</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">60</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">region</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"Africa\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">epsg</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">3857</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"n\">afcon.sf</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">st_as_sf</span><span class=\"p\">(</span><span class=\"n\">afcon</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">crs</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">4326</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">coords</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"s2\">\"x\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"y\"</span><span class=\"p\">))</span><span class=\"w\">\n</span><span class=\"n\">afcon.sf</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">st_transform</span><span class=\"p\">(</span><span class=\"n\">afcon.sf</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">st_crs</span><span class=\"p\">(</span><span class=\"n\">africa</span><span class=\"p\">))</span><span class=\"w\">\n</span><span class=\"c1\"># afcon.sf &lt;- st_join(africa[, \"admin\"], afcon.sf)</span><span class=\"w\">\n</span><span class=\"n\">afcon.sf</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">afcon.sf</span><span class=\"p\">[</span><span class=\"n\">order</span><span class=\"p\">(</span><span class=\"n\">afcon.sf</span><span class=\"o\">$</span><span class=\"n\">totcon</span><span class=\"p\">),</span><span class=\"w\"> </span><span class=\"p\">]</span><span class=\"w\">\n\n\n\n</span><span class=\"c1\"># High granularity map</span><span class=\"w\">\n</span><span class=\"n\">plot</span><span class=\"p\">(</span><span class=\"n\">st_geometry</span><span class=\"p\">(</span><span class=\"n\">africa</span><span class=\"p\">),</span><span class=\"w\"> </span><span class=\"n\">col</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"grey80\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">border</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">NA</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">propSymbolsLayer</span><span class=\"p\">(</span><span class=\"w\">\n  </span><span class=\"n\">afcon.sf</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">var</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"totcon\"</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">inches</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">0.2</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">col</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">adjustcolor</span><span class=\"p\">(</span><span class=\"s2\">\"grey10\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">alpha.f</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">0.5</span><span class=\"p\">),</span><span class=\"w\">\n  </span><span class=\"n\">border</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">NA</span><span class=\"w\">\n</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">title</span><span class=\"p\">(</span><span class=\"n\">main</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"High granularity map\"</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"c1\"># Quantile</span><span class=\"w\">\n\n</span><span class=\"n\">pal</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">hcl.colors</span><span class=\"p\">(</span><span class=\"m\">5</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">palette</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"inferno\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">alpha</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">0.6</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">plot</span><span class=\"p\">(</span><span class=\"n\">st_geometry</span><span class=\"p\">(</span><span class=\"n\">africa</span><span class=\"p\">),</span><span class=\"w\"> </span><span class=\"n\">col</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"grey80\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">border</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">NA</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">propSymbolsTypoLayer</span><span class=\"p\">(</span><span class=\"w\">\n  </span><span class=\"n\">afcon.sf</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">var</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"totcon\"</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">inches</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">0.2</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">col</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">pal</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">border</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">NA</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">legend.var.pos</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"n\"</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">legend.var2.pos</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"bottomleft\"</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">var2</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"quantile_break\"</span><span class=\"w\">\n</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">title</span><span class=\"p\">(</span><span class=\"n\">main</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"Quantile\"</span><span class=\"p\">)</span><span class=\"w\">\n\n\n</span><span class=\"c1\"># Fisher</span><span class=\"w\">\n</span><span class=\"n\">plot</span><span class=\"p\">(</span><span class=\"n\">st_geometry</span><span class=\"p\">(</span><span class=\"n\">africa</span><span class=\"p\">),</span><span class=\"w\"> </span><span class=\"n\">col</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"grey80\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">border</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">NA</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">propSymbolsTypoLayer</span><span class=\"p\">(</span><span class=\"w\">\n  </span><span class=\"n\">afcon.sf</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">var</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"totcon\"</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">inches</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">0.2</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">col</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">pal</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">border</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">NA</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">legend.var.pos</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"n\"</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">legend.var2.pos</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"bottomleft\"</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">var2</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"fisher_breaks\"</span><span class=\"w\">\n</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">title</span><span class=\"p\">(</span><span class=\"n\">main</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"Fisher\"</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"c1\"># Head Tails</span><span class=\"w\">\n</span><span class=\"n\">plot</span><span class=\"p\">(</span><span class=\"n\">st_geometry</span><span class=\"p\">(</span><span class=\"n\">africa</span><span class=\"p\">),</span><span class=\"w\"> </span><span class=\"n\">col</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"grey80\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">border</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">NA</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">propSymbolsTypoLayer</span><span class=\"p\">(</span><span class=\"w\">\n  </span><span class=\"n\">afcon.sf</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">var</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"totcon\"</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">inches</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">0.2</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">col</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">pal</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">border</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">NA</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">legend.var.pos</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"n\"</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">legend.var2.pos</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"bottomleft\"</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">var2</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"ht_breaks\"</span><span class=\"w\">\n</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">title</span><span class=\"p\">(</span><span class=\"n\">main</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"Head Tails\"</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">par</span><span class=\"p\">(</span><span class=\"n\">opar</span><span class=\"p\">)</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<p><img src=\"https://dieghernan.github.io/assets/img/blog/20200405_finalplot-1.webp\" alt=\"Four proportional-symbol maps of African conflict counts comparing the unclassified data with quantile, Fisher and head/tail classifications. Circle size represents conflict counts and colors distinguish classes.\" /></p>\n\n<p>Compared with the unclassified proportional-symbol map, <code class=\"language-plaintext highlighter-rouge\">headtails</code> makes\nthe most extreme values easier to distinguish. The <code class=\"language-plaintext highlighter-rouge\">quantile</code> style groups\nobservations by rank, while <code class=\"language-plaintext highlighter-rouge\">fisher</code> provides an intermediate view in this\nexample.</p>\n\n<p>It is also important to note that <code class=\"language-plaintext highlighter-rouge\">headtails</code> and <code class=\"language-plaintext highlighter-rouge\">fisher</code> reveal different\ninformation that can be useful depending on the context. While <code class=\"language-plaintext highlighter-rouge\">headtails</code>\nhighlights the outliers, it fails to provide good clustering on the tail, while\n<code class=\"language-plaintext highlighter-rouge\">fisher</code> seems to reflect these patterns better. This can be observed in the\nvalues of Western Africa and the Niger River Basin, where <code class=\"language-plaintext highlighter-rouge\">headtails</code> does not\nhighlight any special cluster of conflicts, while <code class=\"language-plaintext highlighter-rouge\">fisher</code> suggests a\npotential cluster consistent with the unclassified map. This can be\nconfirmed in the histogram generated previously, where a concentration of\n<code class=\"language-plaintext highlighter-rouge\">totcon</code> around 1,000 is visible.</p>\n\n<h2 id=\"references\">References</h2>\n\n<ul>\n  <li>Jiang, B. (2013). Head/tail breaks: A new classification scheme for data\nwith a heavy-tailed distribution. <em>The Professional Geographer, 65</em>(3),\n482–494. <a href=\"https://doi.org/10.1080/00330124.2012.700499\">https://doi.org/10.1080/00330124.2012.700499</a></li>\n  <li>Jiang, B. (2019). A recursive definition of goodness of space for bridging\nthe concepts of space and place for sustainability. <em>Sustainability,\n11</em>(15), Article 4091. <a href=\"https://doi.org/10.3390/su11154091\">https://doi.org/10.3390/su11154091</a></li>\n  <li>Jiang, B., Liu, X., &amp; Jia, T. (2013). Scaling of geographic space as a\nuniversal rule for map generalization. <em>Annals of the Association of\nAmerican Geographers, 103</em>(4), 844–855.\n<a href=\"https://doi.org/10.1080/00045608.2013.765773\">DOI</a></li>\n  <li>Jiang, B., &amp; Yin, J. (2014). Ht-index for quantifying the fractal or scaling\nstructure of geographic features. <em>Annals of the Association of American\nGeographers, 104</em>(3), 530–540.\n<a href=\"https://doi.org/10.1080/00045608.2013.834239\">DOI</a></li>\n  <li>Taleb, N. N. (2008). <em>The black swan: The impact of the highly improbable</em>.\nPenguin.</li>\n  <li>Vasicek, O. (2002, December). Loan portfolio value. <em>Risk, 15</em>(12), 160–162.\n<a href=\"https://www.risk.net/risk-management/credit-risk/1530287/loan-portfolio-value\">Article</a></li>\n</ul>\n\n<div class=\"footnotes\" role=\"doc-endnotes\">\n  <ol>\n    <li id=\"fn:1\">\n      <p>The method implemented in <strong>classInt</strong> corresponds to head/tail breaks\n1.0, as named in this article. <a href=\"#fnref:1\" class=\"reversefootnote\" role=\"doc-backlink\">&uarr;</a></p>\n    </li>\n  </ol>\n</div>\n",
      "date_published": "2020-04-05T00:00:00+02:00",
      "date_modified": "2026-10-07T00:00:00+02:00",
      "image": "https://dieghernan.github.io/assets/img/blog/20200405_finalplot-1.webp",
      "summary": "Explore head/tail breaks classification with classInt and a spatial case study.",
      "tags": ["r_bloggers","rstats","rspatial","classInt","r_package"],
      "authors": [{
        "name": "Diego HH",
        "url": "https://dieghernan.github.io/"
      }]
    },
    {
      "id": "https://dieghernan.github.io/projects/COVID19",
      "url": "https://dieghernan.github.io/projects/COVID19",
      "title": "COVID19 microsite",
      "content_html": "<p class=\"alert alert-danger p-3 mx-2 mb-3 lead text-center\"><i class=\"fas fa-skull-crossbones\"></i> <strong>Project discontinued.</strong> This page documents a historical project; the\ndescriptions below refer to its period of operation.</p>\n\n<p>The microsite documented the impact of COVID-19 in Spain with maps and official data.</p>\n\n<p><a href=\"https://dieghernan.github.io/COVID19\">https://dieghernan.github.io/COVID19</a>\n[In Spanish]</p>\n\n<p><img src=\"https://dieghernan.github.io/COVID19/assets/Fallecidos.gif\" alt=\"Animation of the evolution of reported COVID-19 deaths in Spain.\" /></p>\n\n<p class=\"caption\">Overall deaths in Spain due to COVID-19: evolution</p>\n",
      "date_published": "2020-04-04T00:00:00+02:00",
      "date_modified": "2026-10-07T00:00:00+02:00",
      "image": "https://dieghernan.github.io/COVID19/assets/img/header.png",
      "summary": "Historical maps and charts of processed COVID-19 data for Spain, preserved as an archive of the discontinued project.",
      "tags": ["discontinued","project","rstats","maps","sf","COVID19"],
      "authors": [{
        "name": "Diego HH",
        "url": "https://dieghernan.github.io/"
      }]
    },
    {
      "id": "https://dieghernan.github.io/202002_cartography1/",
      "url": "https://dieghernan.github.io/202002_cartography1/",
      "title": "New features in the cartography package",
      "content_html": "<h2 id=\"introduction\">Introduction</h2>\n\n<p>This document describes the new features added to <strong>cartography</strong> in version\n<code class=\"language-plaintext highlighter-rouge\">2.4.0</code> by\n<a href=\"https://github.com/dieghernan/\">dieghernan</a> and already available on <strong>CRAN</strong>.</p>\n\n<p class=\"alert alert-info p-3 mx-2 mb-3\"><strong>Historical example:</strong> The mapping examples use <strong>cartography</strong>, which is now\nin maintenance mode. Its maintainers recommend <a href=\"https://riatelab.github.io/mapsf/\"><strong>mapsf</strong></a>\nfor new work. The original code and outputs are preserved and have not been\nrevalidated against current package versions.</p>\n\n<p>Those new features are:</p>\n\n<ul>\n  <li><code class=\"language-plaintext highlighter-rouge\">hatchedLayer</code> and <code class=\"language-plaintext highlighter-rouge\">legendHatched</code> functions.</li>\n  <li><code class=\"language-plaintext highlighter-rouge\">pngLayer</code> and <code class=\"language-plaintext highlighter-rouge\">getPngLayer</code> functions.</li>\n  <li><code class=\"language-plaintext highlighter-rouge\">wordcloudLayer</code> function.</li>\n</ul>\n\n<p>These functions don’t handle <code class=\"language-plaintext highlighter-rouge\">sp</code> objects on purpose, favoring <code class=\"language-plaintext highlighter-rouge\">sf</code> instead.</p>\n\n<h2 id=\"installation\">Installation</h2>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"c1\">#install.packages(\"cartography\")</span><span class=\"w\">\n</span><span class=\"n\">library</span><span class=\"p\">(</span><span class=\"n\">cartography</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">packageVersion</span><span class=\"p\">(</span><span class=\"s2\">\"cartography\"</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"c1\">## [1] '3.0.0'</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<h2 id=\"hatched-map\">Hatched map</h2>\n\n<p>This is a way to create typology or choropleth maps using hatching. It is\nparticularly useful for maps that need to be printed in black and white, such\nas academic papers. These maps are also useful for representing overlapping\ndimensions.</p>\n\n<h3 id=\"example-1\">Example 1</h3>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"n\">library</span><span class=\"p\">(</span><span class=\"n\">sf</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">library</span><span class=\"p\">(</span><span class=\"n\">jsonlite</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">library</span><span class=\"p\">(</span><span class=\"n\">dplyr</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"c1\">#Shape</span><span class=\"w\">\n</span><span class=\"n\">cntries</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">st_read</span><span class=\"p\">(</span><span class=\"s2\">\"https://ec.europa.eu/eurostat/cache/GISCO/distribution/v2/countries/geojson/CNTR_RG_20M_2016_3035.geojson\"</span><span class=\"p\">,</span><span class=\"w\">\n                  </span><span class=\"n\">stringsAsFactors</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">FALSE</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"c1\">## Reading layer `CNTR_RG_20M_2016_3035' from data source `https://ec.europa.eu/eurostat/cache/GISCO/distribution/v2/countries/geojson/CNTR_RG_20M_2016_3035.geojson' using driver `GeoJSON'</span><span class=\"w\">\n</span><span class=\"c1\">## Simple feature collection with 257 features and 6 fields</span><span class=\"w\">\n</span><span class=\"c1\">## Geometry type: MULTIPOLYGON</span><span class=\"w\">\n</span><span class=\"c1\">## Dimension:     XY</span><span class=\"w\">\n</span><span class=\"c1\">## Bounding box:  xmin: -7142317 ymin: -9160665 xmax: 16932290 ymax: 15428010</span><span class=\"w\">\n</span><span class=\"c1\">## Projected CRS: ETRS89-extended / LAEA Europe</span><span class=\"w\">\n\n</span><span class=\"c1\"># Include trade blocks</span><span class=\"w\">\n</span><span class=\"n\">df</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">fromJSON</span><span class=\"p\">(</span><span class=\"s2\">\"https://raw.githubusercontent.com/dieghernan/Country-Codes-and-International-Organizations/master/outputs/Countrycodesfull.json\"</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">ISO_memcol</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"k\">function</span><span class=\"p\">(</span><span class=\"n\">df</span><span class=\"p\">,</span><span class=\"w\">\n                       </span><span class=\"n\">orgtosearch</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"p\">{</span><span class=\"w\">\n  </span><span class=\"n\">ind</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">match</span><span class=\"p\">(</span><span class=\"n\">orgtosearch</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">unlist</span><span class=\"p\">(</span><span class=\"n\">df</span><span class=\"p\">[</span><span class=\"m\">1</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"org_id\"</span><span class=\"p\">]))</span><span class=\"w\">\n  </span><span class=\"n\">or</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">lapply</span><span class=\"p\">(</span><span class=\"m\">1</span><span class=\"o\">:</span><span class=\"n\">nrow</span><span class=\"p\">(</span><span class=\"n\">df</span><span class=\"p\">),</span><span class=\"w\"> </span><span class=\"k\">function</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">)</span><span class=\"w\">\n    </span><span class=\"n\">unlist</span><span class=\"p\">(</span><span class=\"n\">df</span><span class=\"p\">[</span><span class=\"n\">x</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"org_member\"</span><span class=\"p\">])[</span><span class=\"n\">ind</span><span class=\"p\">])</span><span class=\"w\">\n  </span><span class=\"n\">or</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">data.frame</span><span class=\"p\">(</span><span class=\"n\">matrix</span><span class=\"p\">(</span><span class=\"n\">unlist</span><span class=\"p\">(</span><span class=\"n\">or</span><span class=\"p\">)),</span><span class=\"w\"> </span><span class=\"n\">stringsAsFactors</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nb\">F</span><span class=\"p\">)</span><span class=\"w\">\n  </span><span class=\"nf\">names</span><span class=\"p\">(</span><span class=\"n\">or</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">orgtosearch</span><span class=\"w\">\n  </span><span class=\"n\">df2</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">as.data.frame</span><span class=\"p\">(</span><span class=\"n\">cbind</span><span class=\"p\">(</span><span class=\"n\">df</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">or</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">stringsAsFactors</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nb\">F</span><span class=\"p\">))</span><span class=\"w\">\n  </span><span class=\"nf\">return</span><span class=\"p\">(</span><span class=\"n\">df2</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"p\">}</span><span class=\"w\">\n</span><span class=\"n\">df</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">ISO_memcol</span><span class=\"p\">(</span><span class=\"n\">df</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"EU\"</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">df</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">ISO_memcol</span><span class=\"p\">(</span><span class=\"n\">df</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"EFTA\"</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">df</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">ISO_memcol</span><span class=\"p\">(</span><span class=\"n\">df</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"EuroArea\"</span><span class=\"p\">)</span><span class=\"w\">\n\n\n</span><span class=\"n\">cntries</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">merge</span><span class=\"p\">(</span><span class=\"n\">cntries</span><span class=\"p\">,</span><span class=\"w\">\n                </span><span class=\"n\">df</span><span class=\"p\">,</span><span class=\"w\">\n                </span><span class=\"n\">by.x</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"ISO3_CODE\"</span><span class=\"p\">,</span><span class=\"w\">\n                </span><span class=\"n\">by.y</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"ISO_3166_3\"</span><span class=\"p\">,</span><span class=\"w\">\n                </span><span class=\"n\">all.x</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">TRUE</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"n\">library</span><span class=\"p\">(</span><span class=\"n\">cartography</span><span class=\"p\">)</span><span class=\"w\">\n\n\n</span><span class=\"c1\">#Limits EU</span><span class=\"w\">\n</span><span class=\"c1\">#Plot base map</span><span class=\"w\">\n</span><span class=\"n\">plot</span><span class=\"p\">(</span><span class=\"w\">\n  </span><span class=\"n\">st_geometry</span><span class=\"p\">(</span><span class=\"n\">cntries</span><span class=\"p\">),</span><span class=\"w\">\n  </span><span class=\"n\">xlim</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"m\">2200000</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">7150000</span><span class=\"p\">),</span><span class=\"w\">\n  </span><span class=\"n\">ylim</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"m\">1380000</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">5500000</span><span class=\"p\">),</span><span class=\"w\">\n</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">plot</span><span class=\"p\">(</span><span class=\"n\">st_geometry</span><span class=\"p\">(</span><span class=\"n\">cntries</span><span class=\"p\">),</span><span class=\"w\"> </span><span class=\"n\">add</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">TRUE</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">plot</span><span class=\"p\">(</span><span class=\"n\">st_geometry</span><span class=\"p\">(</span><span class=\"n\">cntries</span><span class=\"p\">[</span><span class=\"o\">!</span><span class=\"nf\">is.na</span><span class=\"p\">(</span><span class=\"n\">cntries</span><span class=\"o\">$</span><span class=\"n\">EU</span><span class=\"p\">),]),</span><span class=\"w\"> </span><span class=\"n\">col</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"grey60\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">add</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">TRUE</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">plot</span><span class=\"p\">(</span><span class=\"n\">st_geometry</span><span class=\"p\">(</span><span class=\"n\">cntries</span><span class=\"p\">[</span><span class=\"o\">!</span><span class=\"nf\">is.na</span><span class=\"p\">(</span><span class=\"n\">cntries</span><span class=\"o\">$</span><span class=\"n\">EFTA</span><span class=\"p\">),]),</span><span class=\"w\"> </span><span class=\"n\">col</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"black\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">add</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">TRUE</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"c1\">#Add hatching</span><span class=\"w\">\n</span><span class=\"n\">hatchedLayer</span><span class=\"p\">(</span><span class=\"w\">\n  </span><span class=\"n\">cntries</span><span class=\"p\">[</span><span class=\"o\">!</span><span class=\"nf\">is.na</span><span class=\"p\">(</span><span class=\"n\">cntries</span><span class=\"o\">$</span><span class=\"n\">EuroArea</span><span class=\"p\">),],</span><span class=\"w\">\n  </span><span class=\"n\">pattern</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"right2left\"</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">col</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"white\"</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">density</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">3</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">add</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">TRUE</span><span class=\"w\">\n</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">legendTypo</span><span class=\"p\">(</span><span class=\"w\">\n  </span><span class=\"s2\">\"topright\"</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">title.txt</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"\"</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">categ</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"s2\">\"EU\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"EFTA\"</span><span class=\"p\">),</span><span class=\"w\">\n  </span><span class=\"n\">col</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"s2\">\"grey60\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"black\"</span><span class=\"p\">),</span><span class=\"w\">\n  </span><span class=\"n\">nodata</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">FALSE</span><span class=\"w\">\n</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"n\">legendHatched</span><span class=\"p\">(</span><span class=\"w\">\n  </span><span class=\"s2\">\"right\"</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">title.txt</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"Within EU\"</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">categ</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"Euro\\nArea\"</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">patterns</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"right2left\"</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">frame</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">TRUE</span><span class=\"w\">\n</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">layoutLayer</span><span class=\"p\">(</span><span class=\"w\">\n  </span><span class=\"n\">title</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"European Trade Blocks\"</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">theme</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"grey.pal\"</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">sources</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"© EuroGeographics for the administrative boundaries.\"</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">author</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\">  </span><span class=\"n\">paste0</span><span class=\"p\">(</span><span class=\"s2\">\"cartography \"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">packageVersion</span><span class=\"p\">(</span><span class=\"s2\">\"cartography\"</span><span class=\"p\">)),</span><span class=\"w\">\n  </span><span class=\"n\">scale</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">500</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">frame</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">TRUE</span><span class=\"w\">\n</span><span class=\"p\">)</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<p><img src=\"https://dieghernan.github.io/assets/img/blog/20200217_hatched-min-1.webp\" alt=\"Map of European trade blocs using gray fills for membership and diagonal hatching to identify the euro area.\" /></p>\n\n<h3 id=\"example-2\">Example 2</h3>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"n\">library</span><span class=\"p\">(</span><span class=\"n\">sf</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">library</span><span class=\"p\">(</span><span class=\"n\">cartography</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"c1\"># Plot World</span><span class=\"w\">\n</span><span class=\"n\">plot</span><span class=\"p\">(</span><span class=\"w\">\n  </span><span class=\"n\">cntries</span><span class=\"o\">$</span><span class=\"n\">geometry</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">col</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"white\"</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">xlim</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"m\">2200000</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">7150000</span><span class=\"p\">),</span><span class=\"w\">\n  </span><span class=\"n\">ylim</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"m\">1380000</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">5500000</span><span class=\"p\">),</span><span class=\"w\">\n</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"c1\">#Add layers for non european area - left2right</span><span class=\"w\">\n</span><span class=\"n\">NOEUR</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">subset</span><span class=\"p\">(</span><span class=\"n\">cntries</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">CONTINENT.EN</span><span class=\"w\"> </span><span class=\"o\">!=</span><span class=\"w\"> </span><span class=\"s2\">\"Europe\"</span><span class=\"w\"> </span><span class=\"o\">|</span><span class=\"w\"> </span><span class=\"nf\">is.na</span><span class=\"p\">(</span><span class=\"n\">CONTINENT.EN</span><span class=\"p\">))</span><span class=\"w\">\n</span><span class=\"n\">hatchedLayer</span><span class=\"p\">(</span><span class=\"w\">\n  </span><span class=\"n\">NOEUR</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">pattern</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"left2right\"</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">add</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">TRUE</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"c1\">#Basic usage</span><span class=\"w\">\n  </span><span class=\"n\">density</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">2</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"c1\">#Densify default grid</span><span class=\"w\">\n  </span><span class=\"n\">lwd</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">1.2</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">lty</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">3</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">col</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"grey50\"</span><span class=\"w\">\n</span><span class=\"p\">)</span><span class=\"w\">            </span><span class=\"c1\">#Formatting</span><span class=\"w\">\n\n</span><span class=\"c1\">#Extract Europe Regions</span><span class=\"w\">\n</span><span class=\"n\">EUR</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">subset</span><span class=\"p\">(</span><span class=\"n\">cntries</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">CONTINENT.EN</span><span class=\"w\"> </span><span class=\"o\">==</span><span class=\"w\"> </span><span class=\"s2\">\"Europe\"</span><span class=\"w\"> </span><span class=\"o\">&amp;</span><span class=\"w\"> </span><span class=\"n\">SUBREGION.EN</span><span class=\"w\"> </span><span class=\"o\">!=</span><span class=\"w\"> </span><span class=\"s2\">\"Western Asia\"</span><span class=\"p\">)[,</span><span class=\"w\"> </span><span class=\"s2\">\"SUBREGION.EN\"</span><span class=\"p\">]</span><span class=\"w\">\n</span><span class=\"n\">levels</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">sort</span><span class=\"p\">(</span><span class=\"n\">unique</span><span class=\"p\">(</span><span class=\"n\">EUR</span><span class=\"o\">$</span><span class=\"n\">SUBREGION.EN</span><span class=\"p\">))</span><span class=\"w\">\n\n\n</span><span class=\"c1\">#Plot Regions</span><span class=\"w\">\n</span><span class=\"c1\"># First element with zigzag</span><span class=\"w\">\n</span><span class=\"n\">hatchedLayer</span><span class=\"p\">(</span><span class=\"n\">EUR</span><span class=\"p\">[</span><span class=\"n\">EUR</span><span class=\"o\">$</span><span class=\"n\">SUBREGION.EN</span><span class=\"w\"> </span><span class=\"o\">==</span><span class=\"w\"> </span><span class=\"n\">levels</span><span class=\"p\">[</span><span class=\"m\">1</span><span class=\"p\">],</span><span class=\"w\"> </span><span class=\"p\">],</span><span class=\"w\">\n             </span><span class=\"n\">add</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">TRUE</span><span class=\"p\">,</span><span class=\"w\">\n             </span><span class=\"n\">density</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">4</span><span class=\"p\">,</span><span class=\"w\">\n             </span><span class=\"n\">pattern</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"zigzag\"</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"c1\">#dot with parms</span><span class=\"w\">\n</span><span class=\"n\">hatchedLayer</span><span class=\"p\">(</span><span class=\"w\">\n  </span><span class=\"n\">EUR</span><span class=\"p\">[</span><span class=\"n\">EUR</span><span class=\"o\">$</span><span class=\"n\">SUBREGION.EN</span><span class=\"w\"> </span><span class=\"o\">==</span><span class=\"w\"> </span><span class=\"n\">levels</span><span class=\"p\">[</span><span class=\"m\">2</span><span class=\"p\">],</span><span class=\"w\"> </span><span class=\"p\">],</span><span class=\"w\">\n  </span><span class=\"n\">add</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">TRUE</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">pattern</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"dot\"</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">pch</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">4</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">cex</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">0.5</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">density</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">3.5</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"c1\">#vertical</span><span class=\"w\">\n</span><span class=\"n\">hatchedLayer</span><span class=\"p\">(</span><span class=\"n\">EUR</span><span class=\"p\">[</span><span class=\"n\">EUR</span><span class=\"o\">$</span><span class=\"n\">SUBREGION.EN</span><span class=\"w\"> </span><span class=\"o\">==</span><span class=\"w\"> </span><span class=\"n\">levels</span><span class=\"p\">[</span><span class=\"m\">3</span><span class=\"p\">],</span><span class=\"w\"> </span><span class=\"p\">],</span><span class=\"w\">\n             </span><span class=\"n\">add</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">TRUE</span><span class=\"p\">,</span><span class=\"w\">\n             </span><span class=\"n\">pattern</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"vertical\"</span><span class=\"p\">,</span><span class=\"w\">\n             </span><span class=\"n\">density</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">3</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"c1\">#another dot</span><span class=\"w\">\n</span><span class=\"n\">hatchedLayer</span><span class=\"p\">(</span><span class=\"n\">EUR</span><span class=\"p\">[</span><span class=\"n\">EUR</span><span class=\"o\">$</span><span class=\"n\">SUBREGION.EN</span><span class=\"w\"> </span><span class=\"o\">==</span><span class=\"w\"> </span><span class=\"n\">levels</span><span class=\"p\">[</span><span class=\"m\">4</span><span class=\"p\">],</span><span class=\"w\"> </span><span class=\"p\">],</span><span class=\"w\">\n             </span><span class=\"n\">add</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">TRUE</span><span class=\"p\">,</span><span class=\"w\">\n             </span><span class=\"n\">pattern</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"dot\"</span><span class=\"p\">,</span><span class=\"w\">\n             </span><span class=\"n\">pch</span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">15</span><span class=\"p\">,</span><span class=\"w\">\n             </span><span class=\"n\">density</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">3.5</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"c1\">#create legend</span><span class=\"w\">\n</span><span class=\"n\">legendHatched</span><span class=\"p\">(</span><span class=\"w\">\n  </span><span class=\"n\">pos</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"topright\"</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">title.txt</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"\"</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">title.cex</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">0.1</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">categ</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"n\">levels</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"Others\"</span><span class=\"p\">),</span><span class=\"w\">\n  </span><span class=\"n\">patterns</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"s2\">\"zigzag\"</span><span class=\"p\">,</span><span class=\"w\">\n               </span><span class=\"s2\">\"dot\"</span><span class=\"p\">,</span><span class=\"w\">\n               </span><span class=\"s2\">\"vertical\"</span><span class=\"p\">,</span><span class=\"w\">\n               </span><span class=\"s2\">\"dot\"</span><span class=\"p\">,</span><span class=\"w\">\n               </span><span class=\"s2\">\"left2right\"</span><span class=\"p\">),</span><span class=\"w\">\n  </span><span class=\"n\">pch</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"m\">4</span><span class=\"p\">,</span><span class=\"m\">15</span><span class=\"p\">),</span><span class=\"w\">\n  </span><span class=\"n\">lty</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"m\">1</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">1</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">3</span><span class=\"p\">),</span><span class=\"w\">\n  </span><span class=\"n\">col</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"nf\">rep</span><span class=\"p\">(</span><span class=\"s2\">\"black\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"nf\">length</span><span class=\"p\">(</span><span class=\"n\">levels</span><span class=\"p\">)),</span><span class=\"w\"> </span><span class=\"s2\">\"grey50\"</span><span class=\"p\">),</span><span class=\"w\">\n  </span><span class=\"n\">frame</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">TRUE</span><span class=\"w\">\n</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"n\">layoutLayer</span><span class=\"p\">(</span><span class=\"w\">\n  </span><span class=\"n\">title</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"Regions of Europe (United Nations)\"</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">theme</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"grey.pal\"</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">sources</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"© EuroGeographics for the administrative boundaries.\"</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">author</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\">  </span><span class=\"n\">paste0</span><span class=\"p\">(</span><span class=\"s2\">\"cartography \"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">packageVersion</span><span class=\"p\">(</span><span class=\"s2\">\"cartography\"</span><span class=\"p\">)),</span><span class=\"w\">\n  </span><span class=\"n\">scale</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">500</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">frame</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">TRUE</span><span class=\"w\">\n</span><span class=\"p\">)</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<p><img src=\"https://dieghernan.github.io/assets/img/blog/20200217_hatched-1.webp\" alt=\"Map of Europe using different hatching patterns to distinguish the United Nations geographic regions.\" /></p>\n\n<p><code class=\"language-plaintext highlighter-rouge\">legendHatched</code> honors the order of the parameters. In this case, two <code class=\"language-plaintext highlighter-rouge\">dot</code>\npatterns are present, so <code class=\"language-plaintext highlighter-rouge\">pch = c(4,15)</code> takes care of that. Note that three\nline-type patterns are also plotted, as in the previous case, and <code class=\"language-plaintext highlighter-rouge\">lty = c(1,\n1, 3)</code> respects that order.</p>\n\n<h3 id=\"example-3\">Example 3</h3>\n\n<p><code class=\"language-plaintext highlighter-rouge\">hatchedLayer</code> could also be useful for plotting several dimensions on the same map, in combination with another function of the package.</p>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"w\">\n</span><span class=\"n\">library</span><span class=\"p\">(</span><span class=\"n\">sf</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">library</span><span class=\"p\">(</span><span class=\"n\">cartography</span><span class=\"p\">)</span><span class=\"w\">\n\n\n\n</span><span class=\"c1\">#Warsaw Pact - roughly mapped via UN Region</span><span class=\"w\">\n</span><span class=\"n\">wp</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">subset</span><span class=\"p\">(</span><span class=\"n\">cntries</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">SUBREGION.EN</span><span class=\"w\"> </span><span class=\"o\">==</span><span class=\"w\"> </span><span class=\"s2\">\"Eastern Europe\"</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"c1\">#European Union - after Brexit</span><span class=\"w\">\n</span><span class=\"n\">eu</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">subset</span><span class=\"p\">(</span><span class=\"n\">cntries</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"o\">!</span><span class=\"nf\">is.na</span><span class=\"p\">(</span><span class=\"n\">EU</span><span class=\"p\">))</span><span class=\"w\">\n\n</span><span class=\"c1\">#Euro Area</span><span class=\"w\">\n</span><span class=\"n\">ea</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">subset</span><span class=\"p\">(</span><span class=\"n\">cntries</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"o\">!</span><span class=\"nf\">is.na</span><span class=\"p\">(</span><span class=\"n\">EuroArea</span><span class=\"p\">))</span><span class=\"w\">\n\n</span><span class=\"c1\">#Flags for plotting</span><span class=\"w\">\n</span><span class=\"n\">flag</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">ifelse</span><span class=\"p\">(</span><span class=\"n\">cntries</span><span class=\"o\">$</span><span class=\"n\">ISO3_CODE</span><span class=\"w\"> </span><span class=\"o\">%in%</span><span class=\"w\"> </span><span class=\"n\">eu</span><span class=\"o\">$</span><span class=\"n\">ISO3_CODE</span><span class=\"p\">,</span><span class=\"w\">\n              </span><span class=\"s2\">\"European Union\"</span><span class=\"p\">,</span><span class=\"w\">\n              </span><span class=\"n\">cntries</span><span class=\"o\">$</span><span class=\"n\">CONTINENT.EN</span><span class=\"p\">)</span><span class=\"w\">\n\n\n</span><span class=\"n\">flag</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">ifelse</span><span class=\"p\">(</span><span class=\"o\">!</span><span class=\"n\">flag</span><span class=\"w\"> </span><span class=\"o\">%in%</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"s2\">\"Europe\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"European Union\"</span><span class=\"p\">),</span><span class=\"w\"> </span><span class=\"s2\">\"Other\"</span><span class=\"p\">,</span><span class=\"w\">\n              </span><span class=\"n\">flag</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">cntries</span><span class=\"o\">$</span><span class=\"n\">flag</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">flag</span><span class=\"w\">\n\n\n\n</span><span class=\"c1\">#Plot lims</span><span class=\"w\">\n</span><span class=\"n\">plot</span><span class=\"p\">(</span><span class=\"w\">\n  </span><span class=\"n\">st_geometry</span><span class=\"p\">(</span><span class=\"n\">cntries</span><span class=\"p\">),</span><span class=\"w\">\n  </span><span class=\"n\">xlim</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"m\">2200000</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">7150000</span><span class=\"p\">),</span><span class=\"w\">\n  </span><span class=\"n\">ylim</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"m\">1380000</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">5500000</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"p\">)</span><span class=\"w\">\n\n\n</span><span class=\"c1\">#Combine with typoLayer</span><span class=\"w\">\n</span><span class=\"n\">typoLayer</span><span class=\"p\">(</span><span class=\"w\">\n  </span><span class=\"n\">x</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">cntries</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">var</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"flag\"</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">legend.pos</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"n\"</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">legend.values.order</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"s2\">\"European Union\"</span><span class=\"p\">,</span><span class=\"w\">\n                          </span><span class=\"s2\">\"Europe\"</span><span class=\"p\">,</span><span class=\"w\">\n                          </span><span class=\"s2\">\"Other\"</span><span class=\"p\">),</span><span class=\"w\">\n  </span><span class=\"n\">col</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"s2\">\"#A6BDDB\"</span><span class=\"p\">,</span><span class=\"w\">\n          </span><span class=\"s2\">\"#FEFEE9\"</span><span class=\"p\">,</span><span class=\"w\">\n          </span><span class=\"s2\">\"#E0E0E0\"</span><span class=\"p\">),</span><span class=\"w\">\n  </span><span class=\"n\">add</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">TRUE</span><span class=\"w\">\n</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"c1\">#hatching</span><span class=\"w\">\n</span><span class=\"n\">hatchedLayer</span><span class=\"p\">(</span><span class=\"w\">\n  </span><span class=\"n\">x</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">ea</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">pattern</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"left2right\"</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">cellsize</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">100000</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">add</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">TRUE</span><span class=\"w\">\n</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"n\">hatchedLayer</span><span class=\"p\">(</span><span class=\"w\">\n  </span><span class=\"n\">x</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">wp</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">pattern</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"vertical\"</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">col</span><span class=\"o\">=</span><span class=\"s2\">\"red\"</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">cellsize</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">75000</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">add</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">TRUE</span><span class=\"w\">\n</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"c1\">#Legend</span><span class=\"w\">\n</span><span class=\"n\">legendHatched</span><span class=\"p\">(</span><span class=\"w\">\n  </span><span class=\"n\">pos</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"right\"</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">title.txt</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"Economic Region\"</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">categ</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"w\">\n    </span><span class=\"s2\">\"Euro Area\"</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"s2\">\"Former \\nWarsaw Pact\"</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"s2\">\"European Union\"</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"s2\">\"Europe\"</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"s2\">\"Other\"</span><span class=\"w\">\n  </span><span class=\"p\">),</span><span class=\"w\">\n  </span><span class=\"n\">patterns</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"s2\">\"left2right\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"vertical\"</span><span class=\"p\">),</span><span class=\"w\">\n  </span><span class=\"n\">col</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"s2\">\"black\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"red\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"#A6BDDB\"</span><span class=\"p\">,</span><span class=\"w\">\n          </span><span class=\"s2\">\"#FEFEE9\"</span><span class=\"p\">,</span><span class=\"w\">\n          </span><span class=\"s2\">\"#E0E0E0\"</span><span class=\"p\">),</span><span class=\"w\">\n  </span><span class=\"n\">ptrn.bg</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"s2\">\"white\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"white\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"#A6BDDB\"</span><span class=\"p\">,</span><span class=\"w\">\n              </span><span class=\"s2\">\"#FEFEE9\"</span><span class=\"p\">,</span><span class=\"w\">\n              </span><span class=\"s2\">\"#E0E0E0\"</span><span class=\"p\">),</span><span class=\"w\">\n  </span><span class=\"n\">frame</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">TRUE</span><span class=\"w\">\n</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"n\">layoutLayer</span><span class=\"p\">(</span><span class=\"w\">\n  </span><span class=\"n\">title</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"European Countries - Blocks\"</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">theme</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"blue.pal\"</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">sources</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"© EuroGeographics for the administrative boundaries.\"</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">author</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\">  </span><span class=\"n\">paste0</span><span class=\"p\">(</span><span class=\"s2\">\"cartography \"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">packageVersion</span><span class=\"p\">(</span><span class=\"s2\">\"cartography\"</span><span class=\"p\">)),</span><span class=\"w\">\n  </span><span class=\"n\">scale</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">500</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">frame</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">TRUE</span><span class=\"w\">\n</span><span class=\"p\">)</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<p><img src=\"https://dieghernan.github.io/assets/img/blog/20200217_hatched-adv-1.webp\" alt=\"Map of European countries combining colored fills and hatching to distinguish trade bloc membership.\" /></p>\n\n<h2 id=\"png-layer\">PNG layer</h2>\n\n<p>This new capability geotags a <code class=\"language-plaintext highlighter-rouge\">.png</code> file, effectively converting the image into a tile. This allows the user to create visual maps by masking an image to the shape of a <code class=\"language-plaintext highlighter-rouge\">POLYGON/MULTIPOLYGON</code>.</p>\n\n<p>For high-quality PNG maps, <strong>it is recommended to plot your map on an SVG\ngraphics device</strong>.</p>\n\n<h3 id=\"example-1-1\">Example 1</h3>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"n\">library</span><span class=\"p\">(</span><span class=\"n\">sf</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">library</span><span class=\"p\">(</span><span class=\"n\">cartography</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"n\">cntries2</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">st_read</span><span class=\"p\">(</span><span class=\"s2\">\"https://ec.europa.eu/eurostat/cache/GISCO/distribution/v2/countries/geojson/CNTR_RG_20M_2016_3857.geojson\"</span><span class=\"p\">,</span><span class=\"w\">\n                  </span><span class=\"n\">stringsAsFactors</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">FALSE</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"c1\">## Reading layer `CNTR_RG_20M_2016_3857' from data source `https://ec.europa.eu/eurostat/cache/GISCO/distribution/v2/countries/geojson/CNTR_RG_20M_2016_3857.geojson' using driver `GeoJSON'</span><span class=\"w\">\n</span><span class=\"c1\">## Simple feature collection with 257 features and 6 fields</span><span class=\"w\">\n</span><span class=\"c1\">## Geometry type: MULTIPOLYGON</span><span class=\"w\">\n</span><span class=\"c1\">## Dimension:     XY</span><span class=\"w\">\n</span><span class=\"c1\">## Bounding box:  xmin: -20037510 ymin: -30240970 xmax: 20037510 ymax: 18446790</span><span class=\"w\">\n</span><span class=\"c1\">## Projected CRS: WGS 84 / Pseudo-Mercator</span><span class=\"w\">\n\n</span><span class=\"n\">cntries2</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">merge</span><span class=\"p\">(</span><span class=\"n\">cntries2</span><span class=\"p\">,</span><span class=\"w\">\n                </span><span class=\"n\">df</span><span class=\"p\">,</span><span class=\"w\">\n                </span><span class=\"n\">by.x</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"ISO3_CODE\"</span><span class=\"p\">,</span><span class=\"w\">\n                </span><span class=\"n\">by.y</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"ISO_3166_3\"</span><span class=\"p\">,</span><span class=\"w\">\n                </span><span class=\"n\">all.x</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">TRUE</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"n\">africa</span><span class=\"o\">=</span><span class=\"n\">subset</span><span class=\"p\">(</span><span class=\"n\">cntries2</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">CONTINENT.EN</span><span class=\"w\"> </span><span class=\"o\">==</span><span class=\"s2\">\"Africa\"</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">%&gt;%</span><span class=\"w\">\n  </span><span class=\"n\">arrange</span><span class=\"p\">(</span><span class=\"n\">desc</span><span class=\"p\">(</span><span class=\"n\">area_km2</span><span class=\"p\">))</span><span class=\"w\">\n\n\n</span><span class=\"c1\">#Get bigger countries</span><span class=\"w\">\n\n</span><span class=\"n\">plot</span><span class=\"p\">(</span><span class=\"n\">st_geometry</span><span class=\"p\">(</span><span class=\"n\">africa</span><span class=\"p\">[</span><span class=\"m\">1</span><span class=\"o\">:</span><span class=\"m\">20</span><span class=\"p\">,]),</span><span class=\"w\"> </span><span class=\"n\">bg</span><span class=\"o\">=</span><span class=\"s2\">\"lightblue\"</span><span class=\"p\">)</span><span class=\"w\">\n\n\n</span><span class=\"n\">plot</span><span class=\"p\">(</span><span class=\"n\">st_geometry</span><span class=\"p\">(</span><span class=\"n\">cntries2</span><span class=\"p\">),</span><span class=\"w\"> </span><span class=\"n\">col</span><span class=\"o\">=</span><span class=\"s2\">\"grey90\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">add</span><span class=\"o\">=</span><span class=\"kc\">TRUE</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"c1\">#Iterate for Africa</span><span class=\"w\">\n</span><span class=\"c1\">#Get flags from repo - low quality to speed up the vignette</span><span class=\"w\">\n</span><span class=\"n\">flagrepo</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"https://raw.githubusercontent.com/hjnilsson/country-flags/master/png250px/\"</span><span class=\"w\">\n\n\n</span><span class=\"k\">for</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"n\">i</span><span class=\"w\"> </span><span class=\"k\">in</span><span class=\"w\"> </span><span class=\"m\">1</span><span class=\"o\">:</span><span class=\"n\">nrow</span><span class=\"p\">(</span><span class=\"n\">africa</span><span class=\"p\">))</span><span class=\"w\"> </span><span class=\"p\">{</span><span class=\"w\">\n  </span><span class=\"n\">cntry</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"nf\">as.character</span><span class=\"p\">(</span><span class=\"n\">st_drop_geometry</span><span class=\"p\">(</span><span class=\"n\">africa</span><span class=\"p\">[</span><span class=\"n\">i</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"ISO_3166_2\"</span><span class=\"p\">]))</span><span class=\"w\">\n  </span><span class=\"n\">a</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">getPngLayer</span><span class=\"p\">(</span><span class=\"n\">africa</span><span class=\"p\">[</span><span class=\"n\">i</span><span class=\"p\">,],</span><span class=\"w\">\n                  </span><span class=\"n\">paste</span><span class=\"p\">(</span><span class=\"n\">flagrepo</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">tolower</span><span class=\"p\">(</span><span class=\"n\">cntry</span><span class=\"p\">),</span><span class=\"w\"> </span><span class=\"s2\">\".png\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">sep</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"\"</span><span class=\"p\">))</span><span class=\"w\">\n  </span><span class=\"n\">pngLayer</span><span class=\"p\">(</span><span class=\"n\">a</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">add</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">TRUE</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"p\">}</span><span class=\"w\">\n</span><span class=\"c1\">#Add borders</span><span class=\"w\">\n</span><span class=\"n\">plot</span><span class=\"p\">(</span><span class=\"n\">st_geometry</span><span class=\"p\">(</span><span class=\"n\">cntries2</span><span class=\"p\">),</span><span class=\"w\"> </span><span class=\"n\">add</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">TRUE</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">col</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">NA</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">lwd</span><span class=\"o\">=</span><span class=\"m\">0.4</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"n\">layoutLayer</span><span class=\"p\">(</span><span class=\"w\">\n  </span><span class=\"n\">title</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"Flags of Africa\"</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">theme</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"green.pal\"</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">sources</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"© EuroGeographics for the administrative boundaries.\"</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">author</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\">  </span><span class=\"n\">paste0</span><span class=\"p\">(</span><span class=\"s2\">\"cartography \"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">packageVersion</span><span class=\"p\">(</span><span class=\"s2\">\"cartography\"</span><span class=\"p\">)),</span><span class=\"w\">\n  </span><span class=\"n\">scale</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">500</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">frame</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">TRUE</span><span class=\"w\">\n</span><span class=\"p\">)</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<p><img src=\"https://dieghernan.github.io/assets/img/blog/20200217_pnglayer-1.webp\" alt=\"Map of Africa with each country filled with its national flag.\" /></p>\n\n<h3 id=\"example-2-1\">Example 2</h3>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"w\">\n</span><span class=\"n\">library</span><span class=\"p\">(</span><span class=\"n\">sf</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">library</span><span class=\"p\">(</span><span class=\"n\">cartography</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"n\">box</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"n\">xmin</span><span class=\"o\">=</span><span class=\"m\">2200000</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">xmax</span><span class=\"o\">=</span><span class=\"m\">7150000</span><span class=\"p\">,</span><span class=\"n\">ymin</span><span class=\"o\">=</span><span class=\"m\">1380000</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">ymax</span><span class=\"o\">=</span><span class=\"m\">5500000</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">nuts0</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\">  </span><span class=\"n\">st_crop</span><span class=\"p\">(</span><span class=\"n\">cntries</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">box</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"n\">UK</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">nuts0</span><span class=\"w\"> </span><span class=\"o\">%&gt;%</span><span class=\"w\"> </span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">id</span><span class=\"w\"> </span><span class=\"o\">==</span><span class=\"w\"> </span><span class=\"s2\">\"UK\"</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">url</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"https://upload.wikimedia.org/wikipedia/commons/thumb/b/b7/Flag_of_Europe.svg/800px-Flag_of_Europe.svg.png\"</span><span class=\"w\">\n\n\n</span><span class=\"n\">EU</span><span class=\"o\">=</span><span class=\"n\">getPngLayer</span><span class=\"p\">(</span><span class=\"n\">nuts0</span><span class=\"p\">,</span><span class=\"n\">url</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">mask</span><span class=\"o\">=</span><span class=\"kc\">FALSE</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">pngLayer</span><span class=\"p\">(</span><span class=\"n\">EU</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">alpha</span><span class=\"o\">=</span><span class=\"m\">100</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">urluk</span><span class=\"o\">=</span><span class=\"n\">flagrepo</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"https://raw.githubusercontent.com/hjnilsson/country-flags/master/png250px/gb.png\"</span><span class=\"w\">\n\n</span><span class=\"n\">UKpng</span><span class=\"o\">=</span><span class=\"n\">getPngLayer</span><span class=\"p\">(</span><span class=\"n\">UK</span><span class=\"p\">,</span><span class=\"n\">urluk</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"n\">pngLayer</span><span class=\"p\">(</span><span class=\"n\">UKpng</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">add</span><span class=\"o\">=</span><span class=\"kc\">TRUE</span><span class=\"p\">)</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<p><img src=\"https://dieghernan.github.io/assets/img/blog/20200217_png-adv-1.webp\" alt=\"European Union flag with the Union Jack clipped to the outline of the United Kingdom.\" /></p>\n\n<h2 id=\"wordcloudlayer\"><code class=\"language-plaintext highlighter-rouge\">wordcloudLayer()</code></h2>\n\n<p>A word cloud (or tag cloud) is a visual representation of text data. In a mapping context, this representation is useful for including several pieces of information at a glance.</p>\n\n<p>Word cloud layers fitted into a map shape provide a good trade-off between\nphysical location, scale and labels. The size and color of the words are based\non the frequency of the factor being plotted, highlighting the most frequent\nterms.</p>\n\n<h3 id=\"example-1-2\">Example 1</h3>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"w\">\n</span><span class=\"n\">eu</span><span class=\"o\">$</span><span class=\"n\">dens</span><span class=\"o\">=</span><span class=\"n\">eu</span><span class=\"o\">$</span><span class=\"n\">pop</span><span class=\"o\">/</span><span class=\"n\">eu</span><span class=\"o\">$</span><span class=\"n\">area_km2</span><span class=\"w\">\n\n</span><span class=\"n\">wordcloudLayer</span><span class=\"p\">(</span><span class=\"n\">eu</span><span class=\"p\">,</span><span class=\"n\">txt</span><span class=\"o\">=</span><span class=\"s2\">\"NAME.EN\"</span><span class=\"p\">,</span><span class=\"n\">freq</span><span class=\"o\">=</span><span class=\"s2\">\"dens\"</span><span class=\"p\">,</span><span class=\"w\">\n               </span><span class=\"n\">fittopol</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">TRUE</span><span class=\"p\">,</span><span class=\"w\">\n               </span><span class=\"n\">nclass</span><span class=\"o\">=</span><span class=\"m\">7</span><span class=\"p\">,</span><span class=\"w\">\n               </span><span class=\"n\">cex.maxmin</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"m\">3</span><span class=\"p\">,</span><span class=\"m\">1</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">br</span><span class=\"o\">=</span><span class=\"n\">getBreaks</span><span class=\"p\">(</span><span class=\"n\">eu</span><span class=\"o\">$</span><span class=\"n\">dens</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">nclass</span><span class=\"o\">=</span><span class=\"m\">7</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"n\">legendChoro</span><span class=\"p\">(</span><span class=\"n\">breaks</span><span class=\"o\">=</span><span class=\"n\">br</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">title.txt</span><span class=\"o\">=</span><span class=\"s2\">\"Pop Density\"</span><span class=\"p\">,</span><span class=\"n\">col</span><span class=\"o\">=</span><span class=\"n\">carto.pal</span><span class=\"p\">(</span><span class=\"s2\">\"blue.pal\"</span><span class=\"p\">,</span><span class=\"m\">7</span><span class=\"p\">))</span><span class=\"w\">\n</span><span class=\"n\">layoutLayer</span><span class=\"p\">(</span><span class=\"w\">\n  </span><span class=\"n\">title</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"Population Density in Europe\"</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">theme</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"blue.pal\"</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">sources</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"© EuroGeographics for the administrative boundaries.\"</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">author</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\">  </span><span class=\"n\">paste0</span><span class=\"p\">(</span><span class=\"s2\">\"cartography \"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">packageVersion</span><span class=\"p\">(</span><span class=\"s2\">\"cartography\"</span><span class=\"p\">)),</span><span class=\"w\">\n  </span><span class=\"n\">scale</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">500</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">frame</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">TRUE</span><span class=\"w\">\n</span><span class=\"p\">)</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<p><img src=\"https://dieghernan.github.io/assets/img/blog/20200217_wordcloud1-1.webp\" alt=\"Word map of Europe with country names positioned geographically. Text size and color represent population density, with Malta especially prominent.\" /></p>\n\n<h3 id=\"example-2-2\">Example 2</h3>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"w\">\n</span><span class=\"c1\"># Genres from MB--</span><span class=\"w\">\n</span><span class=\"c1\">#Import genres</span><span class=\"w\">\n</span><span class=\"n\">collected</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">read.csv</span><span class=\"p\">(</span><span class=\"s2\">\"./assets/data/US_MB.csv\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">stringsAsFactors</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nb\">F</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">collected</span><span class=\"o\">=</span><span class=\"n\">collected</span><span class=\"p\">[</span><span class=\"m\">-1</span><span class=\"p\">,]</span><span class=\"w\"> </span><span class=\"o\">%&gt;%</span><span class=\"w\"> </span><span class=\"n\">arrange</span><span class=\"p\">(</span><span class=\"n\">desc</span><span class=\"p\">(</span><span class=\"n\">n</span><span class=\"p\">))</span><span class=\"w\">\n\n</span><span class=\"n\">set.seed</span><span class=\"p\">(</span><span class=\"m\">1234</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"n\">library</span><span class=\"p\">(</span><span class=\"n\">rnaturalearth</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">shape</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">ne_countries</span><span class=\"p\">(</span><span class=\"n\">country</span><span class=\"o\">=</span><span class=\"s2\">\"united states of america\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">returnclass</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"sf\"</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">%&gt;%</span><span class=\"w\"> </span><span class=\"n\">st_transform</span><span class=\"p\">(</span><span class=\"m\">3857</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"c1\">#Get main polygon</span><span class=\"w\">\n</span><span class=\"n\">shape</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">shape</span><span class=\"w\"> </span><span class=\"o\">%&gt;%</span><span class=\"w\"> </span><span class=\"n\">st_union</span><span class=\"w\"> </span><span class=\"o\">%&gt;%</span><span class=\"w\"> </span><span class=\"n\">st_cast</span><span class=\"p\">(</span><span class=\"s2\">\"POLYGON\"</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">areas</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">st_area</span><span class=\"p\">(</span><span class=\"n\">shape</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">shape</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">shape</span><span class=\"p\">[</span><span class=\"n\">areas</span><span class=\"w\"> </span><span class=\"o\">==</span><span class=\"w\"> </span><span class=\"nf\">max</span><span class=\"p\">(</span><span class=\"n\">areas</span><span class=\"p\">)]</span><span class=\"w\">\n\n</span><span class=\"n\">set.seed</span><span class=\"p\">(</span><span class=\"m\">1234</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">points</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">100</span><span class=\"w\">\n</span><span class=\"c1\">#Sample regular</span><span class=\"w\">\n</span><span class=\"n\">points</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">st_sample</span><span class=\"p\">(</span><span class=\"n\">shape</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">points</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"m\">5</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">type</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"regular\"</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"c1\">#Center points</span><span class=\"w\">\n\n</span><span class=\"n\">centr</span><span class=\"o\">=</span><span class=\"n\">st_centroid</span><span class=\"p\">(</span><span class=\"n\">shape</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">of_largest_polygon</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">TRUE</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">f</span><span class=\"o\">=</span><span class=\"n\">st_distance</span><span class=\"p\">(</span><span class=\"n\">points</span><span class=\"p\">,</span><span class=\"n\">centr</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">dfpoints</span><span class=\"o\">=</span><span class=\"n\">st_sf</span><span class=\"p\">(</span><span class=\"n\">dist</span><span class=\"o\">=</span><span class=\"n\">f</span><span class=\"p\">,</span><span class=\"w\">\n               </span><span class=\"n\">geometry</span><span class=\"o\">=</span><span class=\"n\">points</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">%&gt;%</span><span class=\"w\">\n  </span><span class=\"n\">arrange</span><span class=\"p\">((</span><span class=\"n\">dist</span><span class=\"p\">))</span><span class=\"w\">\n\n\n</span><span class=\"c1\">#Create df</span><span class=\"w\">\n</span><span class=\"n\">points</span><span class=\"o\">=</span><span class=\"n\">st_sf</span><span class=\"p\">(</span><span class=\"n\">collected</span><span class=\"p\">[</span><span class=\"m\">1</span><span class=\"o\">:</span><span class=\"m\">100</span><span class=\"p\">,],</span><span class=\"w\">\n             </span><span class=\"n\">geometry</span><span class=\"o\">=</span><span class=\"n\">st_geometry</span><span class=\"p\">(</span><span class=\"n\">dfpoints</span><span class=\"p\">)[</span><span class=\"m\">1</span><span class=\"o\">:</span><span class=\"m\">100</span><span class=\"p\">])</span><span class=\"w\">\n\n</span><span class=\"n\">plot</span><span class=\"p\">(</span><span class=\"n\">shape</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">col</span><span class=\"o\">=</span><span class=\"s2\">\"grey95\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">border</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">NA</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">wordcloudLayer</span><span class=\"p\">(</span><span class=\"n\">points</span><span class=\"p\">,</span><span class=\"w\">\n               </span><span class=\"n\">txt</span><span class=\"o\">=</span><span class=\"s2\">\"genre\"</span><span class=\"p\">,</span><span class=\"w\">\n               </span><span class=\"n\">freq</span><span class=\"o\">=</span><span class=\"s2\">\"n\"</span><span class=\"p\">,</span><span class=\"w\">\n               </span><span class=\"n\">cex.maxmin</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\">  </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"m\">3</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">0.6</span><span class=\"p\">),</span><span class=\"w\">\n               </span><span class=\"n\">col</span><span class=\"o\">=</span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"s2\">\"#ba478f\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"#eb743b\"</span><span class=\"p\">),</span><span class=\"w\">\n               </span><span class=\"n\">nclass</span><span class=\"o\">=</span><span class=\"m\">7</span><span class=\"p\">,</span><span class=\"w\">\n               </span><span class=\"n\">add</span><span class=\"o\">=</span><span class=\"kc\">TRUE</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">layoutLayer</span><span class=\"p\">(</span><span class=\"n\">title</span><span class=\"o\">=</span><span class=\"s2\">\"Most frequent genres on US\"</span><span class=\"p\">,</span><span class=\"w\">\n            </span><span class=\"n\">sources</span><span class=\"o\">=</span><span class=\"s2\">\"Musicbrainz\"</span><span class=\"p\">,</span><span class=\"w\">\n              </span><span class=\"n\">author</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\">  </span><span class=\"n\">paste0</span><span class=\"p\">(</span><span class=\"s2\">\"cartography \"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">packageVersion</span><span class=\"p\">(</span><span class=\"s2\">\"cartography\"</span><span class=\"p\">)),</span><span class=\"w\">\n            </span><span class=\"n\">theme</span><span class=\"o\">=</span><span class=\"s2\">\"orange.pal\"</span><span class=\"p\">)</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<p><img src=\"https://dieghernan.github.io/assets/img/blog/20200217_wordcloud2-1.webp\" alt=\"Word map of the United States with music genre names positioned geographically and sized by frequency. Rock and jazz appear prominently.\" /></p>\n",
      "date_published": "2020-02-17T00:00:00+01:00",
      "date_modified": "2026-10-07T00:00:00+02:00",
      "image": "https://dieghernan.github.io/assets/img/blog/20200217_wordcloud2-1.webp",
      "summary": "Examples of hatched maps, PNG layers and word clouds in cartography 2.4.0.",
      "tags": ["r_bloggers","rstats","rspatial","beautiful_maps","maps","sf","r_package"],
      "authors": [{
        "name": "Diego HH",
        "url": "https://dieghernan.github.io/"
      }]
    },
    {
      "id": "https://dieghernan.github.io/202002_Brexit/",
      "url": "https://dieghernan.github.io/202002_Brexit/",
      "title": "We’ll miss you, UK",
      "content_html": "<p>This is just a short post regarding Brexit. Setting aside economic, political\nand social considerations, there is another consequence: there is now one fewer\ncountry in the EU.</p>\n\n<p>We will miss you, UK. We wish you the best.</p>\n\n<p class=\"alert alert-info p-3 mx-2 mb-3\"><strong>Historical example:</strong> The mapping examples use <strong>cartography</strong>, which is now\nin maintenance mode. Its maintainers recommend <a href=\"https://riatelab.github.io/mapsf/\"><strong>mapsf</strong></a>\nfor new work. The original code and outputs are preserved and have not been\nrevalidated against current package versions.</p>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"n\">library</span><span class=\"p\">(</span><span class=\"n\">cartography</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">library</span><span class=\"p\">(</span><span class=\"n\">sf</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">library</span><span class=\"p\">(</span><span class=\"n\">giscoR</span><span class=\"p\">)</span><span class=\"w\">\n\n\n</span><span class=\"c1\">#EU</span><span class=\"w\">\n</span><span class=\"n\">eu</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">giscoR</span><span class=\"o\">::</span><span class=\"n\">gisco_countrycode</span><span class=\"w\"> </span><span class=\"o\">%&gt;%</span><span class=\"w\"> </span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">eu</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"c1\"># Download maps</span><span class=\"w\">\n</span><span class=\"n\">NUTS1</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">gisco_get_nuts</span><span class=\"p\">(</span><span class=\"n\">epsg</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">3035</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">country</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">eu</span><span class=\"o\">$</span><span class=\"n\">ISO3_CODE</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">nuts_level</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">1</span><span class=\"p\">)</span><span class=\"w\">\n\n\n</span><span class=\"n\">UK</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">gisco_get_countries</span><span class=\"p\">(</span><span class=\"n\">country</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\">  </span><span class=\"s2\">\"GBR\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">epsg</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">3035</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"n\">noplot</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"s2\">\"FRY\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"ES7\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"PT2\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"PT3\"</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">NUTS1_Clean</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">NUTS1</span><span class=\"w\"> </span><span class=\"o\">%&gt;%</span><span class=\"w\"> </span><span class=\"n\">subset</span><span class=\"p\">(</span><span class=\"o\">!</span><span class=\"n\">NUTS_ID</span><span class=\"w\"> </span><span class=\"o\">%in%</span><span class=\"w\"> </span><span class=\"n\">noplot</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">%&gt;%</span><span class=\"w\">\n  </span><span class=\"n\">group_by</span><span class=\"p\">(</span><span class=\"n\">CNTR_CODE</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">%&gt;%</span><span class=\"w\"> </span><span class=\"n\">summarise</span><span class=\"p\">(</span><span class=\"n\">a</span><span class=\"o\">=</span><span class=\"n\">dplyr</span><span class=\"o\">::</span><span class=\"n\">n</span><span class=\"p\">())</span><span class=\"w\">\n\n</span><span class=\"c1\"># Flag image</span><span class=\"w\">\n</span><span class=\"n\">url</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"https://upload.wikimedia.org/wikipedia/commons/thumb/b/b7/Flag_of_Europe.svg/800px-Flag_of_Europe.svg.png\"</span><span class=\"w\">\n\n</span><span class=\"c1\">#Mask UK</span><span class=\"w\">\n</span><span class=\"n\">flagcut</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">getPngLayer</span><span class=\"p\">(</span><span class=\"n\">NUTS1_Clean</span><span class=\"p\">,</span><span class=\"w\">\n                       </span><span class=\"n\">url</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"c1\"># Full extent</span><span class=\"w\">\n</span><span class=\"n\">flag</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">getPngLayer</span><span class=\"p\">(</span><span class=\"n\">NUTS1_Clean</span><span class=\"p\">,</span><span class=\"w\">\n                       </span><span class=\"n\">url</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">mask</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">FALSE</span><span class=\"p\">)</span><span class=\"w\">\n\n\n</span><span class=\"n\">par</span><span class=\"p\">(</span><span class=\"n\">mar</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"m\">0</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">0</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">0</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">0</span><span class=\"p\">))</span><span class=\"w\">\n</span><span class=\"n\">tilesLayer</span><span class=\"p\">(</span><span class=\"n\">flag</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">alpha</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">150</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">tilesLayer</span><span class=\"p\">(</span><span class=\"n\">flagcut</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">bgalpha</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">0</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">add</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nb\">T</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">plot</span><span class=\"p\">(</span><span class=\"n\">st_geometry</span><span class=\"p\">(</span><span class=\"n\">UK</span><span class=\"p\">),</span><span class=\"w\">\n     </span><span class=\"n\">col</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"white\"</span><span class=\"p\">,</span><span class=\"w\">\n     </span><span class=\"n\">border</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">NA</span><span class=\"p\">,</span><span class=\"w\">\n     </span><span class=\"n\">add</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">TRUE</span><span class=\"p\">)</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<p><img src=\"https://dieghernan.github.io/assets/img/blog/20200602_imgpost-1.webp\" alt=\"Map of Europe overlaid with the European Union flag. The United Kingdom is left white to illustrate Brexit.\" /></p>\n\n<iframe class=\"d-block w-100 border-0 rounded my-3\" title=\"Should I Stay or Should I Go by The Clash on Spotify\" src=\"https://open.spotify.com/embed/track/0IpYUW4JjANgjoJaFUvZJ2?theme=0\" height=\"152\" loading=\"lazy\" allow=\"autoplay; clipboard-write; encrypted-media; fullscreen; picture-in-picture\" allowfullscreen=\"\">\n</iframe>\n",
      "date_published": "2020-02-06T00:00:00+01:00",
      "date_modified": "2026-10-07T00:00:00+02:00",
      "image": "https://dieghernan.github.io/assets/img/blog/20200602_imgpost-1.webp",
      "summary": "Map the United Kingdom’s departure from the EU using country boundaries and flag imagery.",
      "tags": ["music","rstats","rspatial","maps","flags","giscoR"],
      "authors": [{
        "name": "Diego HH",
        "url": "https://dieghernan.github.io/"
      }]
    },
    {
      "id": "https://dieghernan.github.io/201912_Beautiful3/",
      "url": "https://dieghernan.github.io/201912_Beautiful3/",
      "title": "Beautiful maps with R (III): Patterns and hatched maps",
      "content_html": "<p>In this post, I show how to produce different filling patterns that can be added\nover your shapefiles with the <strong>cartography</strong> package.</p>\n\n<p class=\"alert alert-info p-3 mx-2 mb-3\"><strong>Historical example:</strong> The mapping examples use <strong>cartography</strong>, which is now\nin maintenance mode. Its maintainers recommend <a href=\"https://riatelab.github.io/mapsf/\"><strong>mapsf</strong></a>\nfor new work. The original code and outputs are preserved and have not been\nrevalidated against current package versions.</p>\n\n<p class=\"alert alert-info p-3 mx-2 mb-3\"><strong>Updated 17 February 2020</strong>: All these pieces of work are already available\nin <strong>cartography</strong> &gt;v.2.4.0 through the <a href=\"http://riatelab.github.io/cartography/docs/reference/hatchedLayer.html\"><code class=\"language-plaintext highlighter-rouge\">hatchedLayer</code></a>\nand <a href=\"https://riatelab.github.io/cartography/docs/reference/legendHatched.html\"><code class=\"language-plaintext highlighter-rouge\">legendHatched</code></a>\nfunctions. Just install it via <code class=\"language-plaintext highlighter-rouge\">install.packages(\"cartography\")</code>. A dedicated\nblog post with examples is available in this <a href=\"https://dieghernan.github.io/202002_cartography1/\">post</a>.</p>\n\n<h2 id=\"required-r-packages\">Required <strong>R</strong> packages</h2>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"n\">library</span><span class=\"p\">(</span><span class=\"n\">sf</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">library</span><span class=\"p\">(</span><span class=\"n\">dplyr</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">library</span><span class=\"p\">(</span><span class=\"n\">giscoR</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">library</span><span class=\"p\">(</span><span class=\"n\">cartography</span><span class=\"p\">)</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"n\">DE</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">gisco_get_countries</span><span class=\"p\">(</span><span class=\"n\">country</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"Germany\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">epsg</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">3857</span><span class=\"p\">)</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<p>Let’s see how it works.</p>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"n\">par</span><span class=\"p\">(</span><span class=\"w\">\n  </span><span class=\"n\">mfrow</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"m\">3</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">4</span><span class=\"p\">),</span><span class=\"w\">\n  </span><span class=\"n\">mar</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"m\">1</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">1</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">1</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">1</span><span class=\"p\">),</span><span class=\"w\">\n  </span><span class=\"n\">cex</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">0.5</span><span class=\"w\">\n</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">hatchedLayer</span><span class=\"p\">(</span><span class=\"n\">DE</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"dot\"</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">title</span><span class=\"p\">(</span><span class=\"s2\">\"dot\"</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">hatchedLayer</span><span class=\"p\">(</span><span class=\"n\">DE</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"text\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">txt</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"Y\"</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">title</span><span class=\"p\">(</span><span class=\"s2\">\"text\"</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">hatchedLayer</span><span class=\"p\">(</span><span class=\"n\">DE</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"diamond\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">density</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">0.5</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">title</span><span class=\"p\">(</span><span class=\"s2\">\"diamond\"</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">hatchedLayer</span><span class=\"p\">(</span><span class=\"n\">DE</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"grid\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">lwd</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">1.5</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">title</span><span class=\"p\">(</span><span class=\"s2\">\"grid\"</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">hatchedLayer</span><span class=\"p\">(</span><span class=\"n\">DE</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"hexagon\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">col</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"blue\"</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">title</span><span class=\"p\">(</span><span class=\"s2\">\"hexagon\"</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">hatchedLayer</span><span class=\"p\">(</span><span class=\"n\">DE</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"horizontal\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">lty</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">5</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">title</span><span class=\"p\">(</span><span class=\"s2\">\"horizontal\"</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">hatchedLayer</span><span class=\"p\">(</span><span class=\"n\">DE</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"vertical\"</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">title</span><span class=\"p\">(</span><span class=\"s2\">\"vertical\"</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">hatchedLayer</span><span class=\"p\">(</span><span class=\"n\">DE</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"left2right\"</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">title</span><span class=\"p\">(</span><span class=\"s2\">\"left2right\"</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">hatchedLayer</span><span class=\"p\">(</span><span class=\"n\">DE</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"right2left\"</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">title</span><span class=\"p\">(</span><span class=\"s2\">\"right2left\"</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">hatchedLayer</span><span class=\"p\">(</span><span class=\"n\">DE</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"zigzag\"</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">title</span><span class=\"p\">(</span><span class=\"s2\">\"zigzag\"</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">hatchedLayer</span><span class=\"p\">(</span><span class=\"n\">DE</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"circle\"</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">title</span><span class=\"p\">(</span><span class=\"s2\">\"circle\"</span><span class=\"p\">)</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<p><img src=\"https://dieghernan.github.io/assets/img/blog/20191212_showfun-1.webp\" alt=\"Eleven outlines of Germany filled with different patterns, including dots, text, diamonds, grids, hexagons, lines, zigzags and circles.\" /></p>\n\n<p>Let’s play a little bit more with some of the additional features of the\nfunction:</p>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"n\">par</span><span class=\"p\">(</span><span class=\"n\">mar</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"m\">1</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">1</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">1</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">1</span><span class=\"p\">),</span><span class=\"w\"> </span><span class=\"n\">mfrow</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"m\">2</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">3</span><span class=\"p\">))</span><span class=\"w\">\n</span><span class=\"n\">plot</span><span class=\"p\">(</span><span class=\"n\">st_geometry</span><span class=\"p\">(</span><span class=\"n\">DE</span><span class=\"p\">))</span><span class=\"w\">\n</span><span class=\"n\">hatchedLayer</span><span class=\"p\">(</span><span class=\"w\">\n  </span><span class=\"n\">DE</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"s2\">\"dot\"</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">pch</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">10</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">density</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">0.5</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">cex</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">2</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">col</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"darkblue\"</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">add</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nb\">T</span><span class=\"w\">\n</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">plot</span><span class=\"p\">(</span><span class=\"n\">st_geometry</span><span class=\"p\">(</span><span class=\"n\">DE</span><span class=\"p\">))</span><span class=\"w\">\n</span><span class=\"n\">hatchedLayer</span><span class=\"p\">(</span><span class=\"w\">\n  </span><span class=\"n\">DE</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"s2\">\"dot\"</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">pch</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">21</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">col</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"red\"</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">bg</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"green\"</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">cex</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">1.25</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">add</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nb\">T</span><span class=\"w\">\n</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">plot</span><span class=\"p\">(</span><span class=\"n\">st_geometry</span><span class=\"p\">(</span><span class=\"n\">DE</span><span class=\"p\">),</span><span class=\"w\"> </span><span class=\"n\">col</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"grey\"</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">hatchedLayer</span><span class=\"p\">(</span><span class=\"w\">\n  </span><span class=\"n\">DE</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"s2\">\"text\"</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">txt</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"DE\"</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">density</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">1.1</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">col</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"white\"</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">add</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nb\">T</span><span class=\"w\">\n</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">plot</span><span class=\"p\">(</span><span class=\"n\">st_geometry</span><span class=\"p\">(</span><span class=\"n\">DE</span><span class=\"p\">),</span><span class=\"w\"> </span><span class=\"n\">col</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"blue\"</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">hatchedLayer</span><span class=\"p\">(</span><span class=\"w\">\n  </span><span class=\"n\">DE</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"s2\">\"horizontal\"</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">lty</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">3</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">cellsize</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">150</span><span class=\"w\"> </span><span class=\"o\">*</span><span class=\"w\"> </span><span class=\"m\">1000</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">add</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nb\">T</span><span class=\"w\">\n</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">hatchedLayer</span><span class=\"p\">(</span><span class=\"n\">DE</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"zigzag\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">lwd</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">2</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">col</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"red\"</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">plot</span><span class=\"p\">(</span><span class=\"n\">st_geometry</span><span class=\"p\">(</span><span class=\"n\">DE</span><span class=\"p\">),</span><span class=\"w\"> </span><span class=\"n\">border</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"orange\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">lwd</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">2</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">hatchedLayer</span><span class=\"p\">(</span><span class=\"n\">DE</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"s2\">\"left2right\"</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">density</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">2</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">col</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"orange\"</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">add</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nb\">T</span><span class=\"w\">\n</span><span class=\"p\">)</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<p><img src=\"https://dieghernan.github.io/assets/img/blog/20191212_playing-1.webp\" alt=\"Six outlines of Germany illustrating variations in pattern size, density, color and background.\" /></p>\n\n<h2 id=\"adding-legends-the-legendhatched-function\">Adding legends: the <code class=\"language-plaintext highlighter-rouge\">legendHatched</code> function</h2>\n\n<p>As a complementary function, there is also <code class=\"language-plaintext highlighter-rouge\">legendHatched</code>. The main parameters\nare:</p>\n\n<ul>\n  <li><code class=\"language-plaintext highlighter-rouge\">pos</code>, <code class=\"language-plaintext highlighter-rouge\">title.txt</code>, <code class=\"language-plaintext highlighter-rouge\">title.cex</code>, <code class=\"language-plaintext highlighter-rouge\">values.cex</code>, <code class=\"language-plaintext highlighter-rouge\">categ</code>, <code class=\"language-plaintext highlighter-rouge\">cex</code> and <code class=\"language-plaintext highlighter-rouge\">frame</code>:\nSee <code class=\"language-plaintext highlighter-rouge\">?cartography::legendTypo</code>.</li>\n  <li><code class=\"language-plaintext highlighter-rouge\">patterns</code>: Vector of patterns to be created for each element on <code class=\"language-plaintext highlighter-rouge\">categ</code>.</li>\n  <li><code class=\"language-plaintext highlighter-rouge\">ptrn.bg</code>: Background of the legend box for each <code class=\"language-plaintext highlighter-rouge\">categ</code>.</li>\n  <li><code class=\"language-plaintext highlighter-rouge\">ptrn.text</code>: Text to be used for each <code class=\"language-plaintext highlighter-rouge\">categ=\"text\"</code>, as a single value or a vector.</li>\n  <li><code class=\"language-plaintext highlighter-rouge\">dot.cex</code>: <code class=\"language-plaintext highlighter-rouge\">cex</code> of each <code class=\"language-plaintext highlighter-rouge\">categ=\"dot\"</code>, as a single value or a vector.</li>\n  <li><code class=\"language-plaintext highlighter-rouge\">text.cex</code>: Text size of each <code class=\"language-plaintext highlighter-rouge\">categ=\"text\"</code>, as a single value or a vector.</li>\n  <li>As in the case of the <code class=\"language-plaintext highlighter-rouge\">hatchedLayer</code> function, different graphical\nparameters can be passed (<code class=\"language-plaintext highlighter-rouge\">lty</code>, <code class=\"language-plaintext highlighter-rouge\">lwd</code>, <code class=\"language-plaintext highlighter-rouge\">pch</code>, <code class=\"language-plaintext highlighter-rouge\">bg</code> on points).</li>\n</ul>\n\n<p>Note that it is also possible to create solid legends by setting <code class=\"language-plaintext highlighter-rouge\">col</code> and\n<code class=\"language-plaintext highlighter-rouge\">ptrn.bg</code> to the same color. Parameters respect the order of the <code class=\"language-plaintext highlighter-rouge\">categ</code>\nvariable.</p>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"n\">par</span><span class=\"p\">(</span><span class=\"n\">mar</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"m\">0</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">0</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">0</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">0</span><span class=\"p\">),</span><span class=\"w\"> </span><span class=\"n\">mfrow</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"m\">1</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">1</span><span class=\"p\">))</span><span class=\"w\">\n</span><span class=\"n\">plot</span><span class=\"p\">(</span><span class=\"n\">st_geometry</span><span class=\"p\">(</span><span class=\"n\">DE</span><span class=\"p\">))</span><span class=\"w\"> </span><span class=\"c1\"># Null geometry</span><span class=\"w\">\n</span><span class=\"n\">legendHatched</span><span class=\"p\">(</span><span class=\"w\">\n  </span><span class=\"n\">title.txt</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"Example 1\"</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">categ</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"s2\">\"a\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"b\"</span><span class=\"p\">),</span><span class=\"w\">\n  </span><span class=\"n\">patterns</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"dot\"</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">pch</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"m\">16</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">23</span><span class=\"p\">),</span><span class=\"w\">\n  </span><span class=\"n\">frame</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nb\">T</span><span class=\"w\">\n</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">legendHatched</span><span class=\"p\">(</span><span class=\"w\">\n  </span><span class=\"n\">pos</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"left\"</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">title.txt</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"Example 2\"</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">categ</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"s2\">\"c\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"d\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"other text\"</span><span class=\"p\">),</span><span class=\"w\">\n  </span><span class=\"n\">patterns</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"s2\">\"text\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"zigzag\"</span><span class=\"p\">),</span><span class=\"w\">\n  </span><span class=\"n\">ptrn.text</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"s2\">\"s\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"pp\"</span><span class=\"p\">),</span><span class=\"w\">\n  </span><span class=\"n\">ptrn.bg</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"grey80\"</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">col</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"s2\">\"red\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"blue\"</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"n\">legendHatched</span><span class=\"p\">(</span><span class=\"w\">\n  </span><span class=\"n\">pos</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"topright\"</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">title.txt</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"Example 3\"</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">categ</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"s2\">\"e\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"f\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"solid\"</span><span class=\"p\">),</span><span class=\"w\">\n  </span><span class=\"n\">patterns</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"s2\">\"circle\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"left2right\"</span><span class=\"p\">),</span><span class=\"w\">\n  </span><span class=\"n\">ptrn.bg</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"s2\">\"orange\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"yellow\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"green\"</span><span class=\"p\">),</span><span class=\"w\">\n  </span><span class=\"n\">col</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"s2\">\"white\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"white\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"green\"</span><span class=\"p\">),</span><span class=\"w\">\n  </span><span class=\"n\">lty</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"m\">2</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">4</span><span class=\"p\">),</span><span class=\"w\">\n  </span><span class=\"n\">lwd</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"m\">1</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">3</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"p\">)</span><span class=\"w\">\n\n\n</span><span class=\"n\">legendHatched</span><span class=\"p\">(</span><span class=\"w\">\n  </span><span class=\"n\">pos</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"bottomright\"</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">title.txt</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"Example 4\"</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">values.cex</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">1.2</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">categ</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"s2\">\"h\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"i\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"j\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"k\"</span><span class=\"p\">),</span><span class=\"w\">\n  </span><span class=\"n\">patterns</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"s2\">\"grid\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"diamond\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"horizontal\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"dot\"</span><span class=\"p\">),</span><span class=\"w\">\n  </span><span class=\"n\">cex</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">2</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">pch</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">22</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">col</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"white\"</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">ptrn.bg</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"black\"</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">bg</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"pink\"</span><span class=\"w\">\n</span><span class=\"p\">)</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<p><img src=\"https://dieghernan.github.io/assets/img/blog/20191212_playinglegend-1.webp\" alt=\"Outline of Germany surrounded by four example legends combining patterns, text and solid fills.\" /></p>\n\n<p>I hope that you find these functions useful. Enjoy, and happy mapping!</p>\n\n<p><img src=\"https://dieghernan.github.io/assets/img/blog/20191212_imgpost-1.webp\" title=\"plot of chunk 20191212_imgpost\" alt=\"Map of Martinique combining hatching for median income ranges with gray fills distinguishing the prefecture, sub-prefectures and other municipalities.\" style=\"display: block; margin: auto;\" /></p>\n",
      "date_published": "2019-12-12T00:00:00+01:00",
      "date_modified": "2026-10-07T00:00:00+02:00",
      "image": "https://dieghernan.github.io/assets/img/blog/20191212_imgpost-1.webp",
      "summary": "Create patterned and hatched map fills with the cartography package.",
      "tags": ["r_bloggers","rstats","rspatial","beautiful_maps","maps","sf","function","r_package","giscoR"],
      "authors": [{
        "name": "Diego HH",
        "url": "https://dieghernan.github.io/"
      }]
    },
    {
      "id": "https://dieghernan.github.io/201911_QuickR/",
      "url": "https://dieghernan.github.io/201911_QuickR/",
      "title": "Quick R: Inset maps",
      "content_html": "<p>How to place an inset map in <strong>R</strong>? There are many solutions out there using\nthe <strong>ggplot2</strong> package (see <a href=\"https://www.r-spatial.org/r/2018/10/25/ggplot2-sf-3.html\">Drawing beautiful maps programmatically with\n<strong>R</strong>, <strong>sf</strong> and <strong>ggplot2</strong></a>\nby Mel Moreno and Mathieu Basille). However, I like the old reliable <code class=\"language-plaintext highlighter-rouge\">plot</code>\nfunction, so the question is: is there another way?</p>\n\n<p>There is. I found inspiration\n<a href=\"https://www.datacamp.com/doc/r/combining-plots\">here</a> and I just applied it\nto a map.</p>\n\n<h2 id=\"required-r-packages\">Required <strong>R</strong> packages</h2>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"n\">library</span><span class=\"p\">(</span><span class=\"n\">sf</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">library</span><span class=\"p\">(</span><span class=\"n\">dplyr</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">library</span><span class=\"p\">(</span><span class=\"n\">rnaturalearth</span><span class=\"p\">)</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<h2 id=\"mimicking-moreno--basille\">Mimicking Moreno &amp; Basille</h2>\n\n<p>I present here an alternative version of\n<a href=\"https://www.r-spatial.org/r/2018/10/25/ggplot2-sf-3.html\">Drawing beautiful maps programmatically with R, sf and ggplot2</a>,\nso the bulk of the detail can be found there. I focus only on the <code class=\"language-plaintext highlighter-rouge\">plot()</code>\nside.</p>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"n\">world</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">ne_countries</span><span class=\"p\">(</span><span class=\"n\">scale</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"medium\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">returnclass</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"sf\"</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">USA</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">subset</span><span class=\"p\">(</span><span class=\"n\">world</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">admin</span><span class=\"w\"> </span><span class=\"o\">==</span><span class=\"w\"> </span><span class=\"s2\">\"United States of America\"</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"c1\"># Plot mainland USA----</span><span class=\"w\">\n</span><span class=\"n\">par</span><span class=\"p\">(</span><span class=\"n\">mar</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"m\">0</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">0</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">0</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">0</span><span class=\"p\">))</span><span class=\"w\">\n</span><span class=\"n\">plot</span><span class=\"p\">(</span><span class=\"w\">\n  </span><span class=\"n\">st_geometry</span><span class=\"p\">(</span><span class=\"n\">world</span><span class=\"w\"> </span><span class=\"o\">%&gt;%</span><span class=\"w\">\n    </span><span class=\"n\">st_transform</span><span class=\"p\">(</span><span class=\"m\">2163</span><span class=\"p\">)),</span><span class=\"w\">\n  </span><span class=\"n\">xlim</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"m\">-2500000</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">2500000</span><span class=\"p\">),</span><span class=\"w\">\n  </span><span class=\"n\">ylim</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"m\">-2300000</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">730000</span><span class=\"p\">),</span><span class=\"w\">\n  </span><span class=\"n\">col</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"#F6E1B9\"</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">border</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"#646464\"</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">bg</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"#C6ECFF\"</span><span class=\"w\">\n</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">plot</span><span class=\"p\">(</span><span class=\"w\">\n  </span><span class=\"n\">st_geometry</span><span class=\"p\">(</span><span class=\"n\">USA</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">%&gt;%</span><span class=\"w\"> </span><span class=\"n\">st_transform</span><span class=\"p\">(</span><span class=\"m\">2163</span><span class=\"p\">),</span><span class=\"w\">\n  </span><span class=\"n\">col</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"#FEFEE9\"</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">border</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"black\"</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">add</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nb\">T</span><span class=\"w\">\n</span><span class=\"p\">)</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<p><img src=\"https://dieghernan.github.io/assets/img/blog/20191108_main-1.webp\" alt=\"Map of the contiguous United States with neighboring countries shown for geographic context.\" /></p>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"c1\"># Plot Alaska----</span><span class=\"w\">\n</span><span class=\"n\">plot</span><span class=\"p\">(</span><span class=\"w\">\n  </span><span class=\"n\">st_geometry</span><span class=\"p\">(</span><span class=\"n\">world</span><span class=\"w\"> </span><span class=\"o\">%&gt;%</span><span class=\"w\">\n    </span><span class=\"n\">st_transform</span><span class=\"p\">(</span><span class=\"m\">3467</span><span class=\"p\">)),</span><span class=\"w\">\n  </span><span class=\"n\">xlim</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"m\">-2400000</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">1600000</span><span class=\"p\">),</span><span class=\"w\">\n  </span><span class=\"n\">ylim</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"m\">200000</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">2500000</span><span class=\"p\">),</span><span class=\"w\">\n  </span><span class=\"n\">col</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"#F6E1B9\"</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">border</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"#646464\"</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">bg</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"#C6ECFF\"</span><span class=\"w\">\n</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">plot</span><span class=\"p\">(</span><span class=\"w\">\n  </span><span class=\"n\">st_geometry</span><span class=\"p\">(</span><span class=\"n\">USA</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">%&gt;%</span><span class=\"w\"> </span><span class=\"n\">st_transform</span><span class=\"p\">(</span><span class=\"m\">3467</span><span class=\"p\">),</span><span class=\"w\">\n  </span><span class=\"n\">col</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"#FEFEE9\"</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">border</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"black\"</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">add</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nb\">T</span><span class=\"w\">\n</span><span class=\"p\">)</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<p><img src=\"https://dieghernan.github.io/assets/img/blog/20191108_Alaska-1.webp\" alt=\"Map of Alaska with neighboring parts of Canada and Russia shown for geographic context.\" /></p>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"c1\"># Plot Hawaii----</span><span class=\"w\">\n</span><span class=\"n\">plot</span><span class=\"p\">(</span><span class=\"w\">\n  </span><span class=\"n\">st_geometry</span><span class=\"p\">(</span><span class=\"n\">world</span><span class=\"w\"> </span><span class=\"o\">%&gt;%</span><span class=\"w\">\n    </span><span class=\"n\">st_transform</span><span class=\"p\">(</span><span class=\"m\">4135</span><span class=\"p\">)),</span><span class=\"w\">\n  </span><span class=\"n\">xlim</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"m\">-161</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">-154</span><span class=\"p\">),</span><span class=\"w\">\n  </span><span class=\"n\">ylim</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"m\">18</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">23</span><span class=\"p\">),</span><span class=\"w\">\n  </span><span class=\"n\">col</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"#F6E1B9\"</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">border</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"#646464\"</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">bg</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"#C6ECFF\"</span><span class=\"w\">\n</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">plot</span><span class=\"p\">(</span><span class=\"w\">\n  </span><span class=\"n\">st_geometry</span><span class=\"p\">(</span><span class=\"n\">USA</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">%&gt;%</span><span class=\"w\"> </span><span class=\"n\">st_transform</span><span class=\"p\">(</span><span class=\"m\">4135</span><span class=\"p\">),</span><span class=\"w\">\n  </span><span class=\"n\">col</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"#FEFEE9\"</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">border</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"black\"</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">add</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nb\">T</span><span class=\"w\">\n</span><span class=\"p\">)</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<p><img src=\"https://dieghernan.github.io/assets/img/blog/20191108_Hawaii-1.webp\" alt=\"Map of the Hawaiian island chain.\" /></p>\n\n<h2 id=\"insetting\">Insetting</h2>\n\n<p>From now on, I focus on the inset part, using the <code class=\"language-plaintext highlighter-rouge\">fig</code> argument of <code class=\"language-plaintext highlighter-rouge\">par()</code>.\nQuoting <a href=\"https://www.datacamp.com/doc/r/combining-plots\">statmethods</a>:</p>\n\n<blockquote>\n  <p><em>(…) think of the full graph area as going from <code class=\"language-plaintext highlighter-rouge\">(0,0)</code> in the lower left corner to <code class=\"language-plaintext highlighter-rouge\">(1,1)</code> in the upper right corner. The format of the <code class=\"language-plaintext highlighter-rouge\">fig=</code> parameter is a numerical vector of the form <code class=\"language-plaintext highlighter-rouge\">c(x1, x2, y1, y2)</code>(…)\n<code class=\"language-plaintext highlighter-rouge\">fig=</code> starts a new plot, so to add to an existing plot use <code class=\"language-plaintext highlighter-rouge\">new=TRUE</code>.</em></p>\n</blockquote>\n\n<p>With <code class=\"language-plaintext highlighter-rouge\">x1</code> and <code class=\"language-plaintext highlighter-rouge\">y1</code> as the starting points and <code class=\"language-plaintext highlighter-rouge\">x2</code>, <code class=\"language-plaintext highlighter-rouge\">y2</code> as the final points,\nwe can set up those parameters and adjust the final placement of the insets.\nAdditionally, I added a box around the insets using <code class=\"language-plaintext highlighter-rouge\">bbox()</code>. I didn’t mimic\nMoreno &amp; Basille here and I just worked it out by myself.</p>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"n\">par</span><span class=\"p\">(</span><span class=\"n\">mar</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"m\">0</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">0</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">0</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">0</span><span class=\"p\">))</span><span class=\"w\">\n</span><span class=\"n\">plot</span><span class=\"p\">(</span><span class=\"w\">\n  </span><span class=\"n\">st_geometry</span><span class=\"p\">(</span><span class=\"n\">world</span><span class=\"w\"> </span><span class=\"o\">%&gt;%</span><span class=\"w\">\n    </span><span class=\"n\">st_transform</span><span class=\"p\">(</span><span class=\"m\">2163</span><span class=\"p\">)),</span><span class=\"w\">\n  </span><span class=\"n\">xlim</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"m\">-2500000</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">2500000</span><span class=\"p\">),</span><span class=\"w\">\n  </span><span class=\"n\">ylim</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"m\">-2300000</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">730000</span><span class=\"p\">),</span><span class=\"w\">\n  </span><span class=\"n\">col</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"#F6E1B9\"</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">border</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"#646464\"</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">bg</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"#C6ECFF\"</span><span class=\"w\">\n</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">plot</span><span class=\"p\">(</span><span class=\"w\">\n  </span><span class=\"n\">st_geometry</span><span class=\"p\">(</span><span class=\"n\">USA</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">%&gt;%</span><span class=\"w\"> </span><span class=\"n\">st_transform</span><span class=\"p\">(</span><span class=\"m\">2163</span><span class=\"p\">),</span><span class=\"w\">\n  </span><span class=\"n\">col</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"#FEFEE9\"</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">border</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"black\"</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">add</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nb\">T</span><span class=\"w\">\n</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"c1\"># Alaska</span><span class=\"w\">\n</span><span class=\"n\">par</span><span class=\"p\">(</span><span class=\"w\">\n  </span><span class=\"n\">fig</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"m\">0.01</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">0.28</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">0.01</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">0.33</span><span class=\"p\">),</span><span class=\"w\">\n  </span><span class=\"n\">new</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">TRUE</span><span class=\"w\">\n</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">plot</span><span class=\"p\">(</span><span class=\"w\">\n  </span><span class=\"n\">st_geometry</span><span class=\"p\">(</span><span class=\"n\">world</span><span class=\"w\"> </span><span class=\"o\">%&gt;%</span><span class=\"w\">\n    </span><span class=\"n\">st_transform</span><span class=\"p\">(</span><span class=\"m\">3467</span><span class=\"p\">)),</span><span class=\"w\">\n  </span><span class=\"n\">xlim</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"m\">-2400000</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">1600000</span><span class=\"p\">),</span><span class=\"w\">\n  </span><span class=\"n\">ylim</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"m\">200000</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">2500000</span><span class=\"p\">),</span><span class=\"w\">\n  </span><span class=\"n\">col</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"#F6E1B9\"</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">border</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"#646464\"</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">bg</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"#C6ECFF\"</span><span class=\"w\">\n</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">plot</span><span class=\"p\">(</span><span class=\"w\">\n  </span><span class=\"n\">st_geometry</span><span class=\"p\">(</span><span class=\"n\">USA</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">%&gt;%</span><span class=\"w\"> </span><span class=\"n\">st_transform</span><span class=\"p\">(</span><span class=\"m\">3467</span><span class=\"p\">),</span><span class=\"w\">\n  </span><span class=\"n\">col</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"#FEFEE9\"</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">border</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"black\"</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">add</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nb\">T</span><span class=\"w\">\n</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">box</span><span class=\"p\">(</span><span class=\"n\">which</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"figure\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">lwd</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">1</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"c1\"># Hawaii</span><span class=\"w\">\n</span><span class=\"n\">par</span><span class=\"p\">(</span><span class=\"w\">\n  </span><span class=\"n\">fig</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"m\">0.29</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">0.45</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">0.01</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">0.15</span><span class=\"p\">),</span><span class=\"w\">\n  </span><span class=\"n\">new</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">TRUE</span><span class=\"w\">\n</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">plot</span><span class=\"p\">(</span><span class=\"w\">\n  </span><span class=\"n\">st_geometry</span><span class=\"p\">(</span><span class=\"n\">world</span><span class=\"w\"> </span><span class=\"o\">%&gt;%</span><span class=\"w\">\n    </span><span class=\"n\">st_transform</span><span class=\"p\">(</span><span class=\"m\">4135</span><span class=\"p\">)),</span><span class=\"w\">\n  </span><span class=\"n\">xlim</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"m\">-161</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">-154</span><span class=\"p\">),</span><span class=\"w\">\n  </span><span class=\"n\">ylim</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"m\">18</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">23</span><span class=\"p\">),</span><span class=\"w\">\n  </span><span class=\"n\">col</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"#F6E1B9\"</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">border</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"#646464\"</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">bg</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"#C6ECFF\"</span><span class=\"w\">\n</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">plot</span><span class=\"p\">(</span><span class=\"w\">\n  </span><span class=\"n\">st_geometry</span><span class=\"p\">(</span><span class=\"n\">USA</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">%&gt;%</span><span class=\"w\"> </span><span class=\"n\">st_transform</span><span class=\"p\">(</span><span class=\"m\">4135</span><span class=\"p\">),</span><span class=\"w\">\n  </span><span class=\"n\">col</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"#FEFEE9\"</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">border</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"black\"</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">add</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nb\">T</span><span class=\"w\">\n</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"n\">box</span><span class=\"p\">(</span><span class=\"n\">which</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"figure\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">lwd</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">1</span><span class=\"p\">)</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<p><img src=\"https://dieghernan.github.io/assets/img/blog/20191108_inset-1.webp\" alt=\"Map of the contiguous United States with separate insets for Alaska and Hawaii at the lower left.\" /></p>\n\n<p>Results may vary depending on the size of the original plot (Mainland USA),\nyour plotting device and the output. However, with a bit of trial and error,\nit is quite easy to adjust the final result.</p>\n\n<p>As an example, see one of my contributions to <strong>Wikimedia Commons</strong>, which\nrepresents a map of the NUTS3 regions of the European Union. Several countries\n(France, Portugal, Spain) have overseas territories, so I made a few insets on\nthe right side.</p>\n\n<p><img src=\"https://thumb.wikimedia.org/wikipedia/commons/thumb/4/46/Population_density_by_NUTS_3_region_%282017%29.svg/3840px-Population_density_by_NUTS_3_region_%282017%29.svg.png\" alt=\"Choropleth map of population density in European NUTS 3 regions in 2017, with insets for overseas territories.\" /></p>\n",
      "date_published": "2019-11-07T00:00:00+01:00",
      "image": "https://thumb.wikimedia.org/wikipedia/commons/thumb/4/46/Population_density_by_NUTS_3_region_%282017%29.svg/3840px-Population_density_by_NUTS_3_region_%282017%29.svg.png",
      "summary": "Use base R’s plot() to add a locator inset to a map.",
      "tags": ["r_bloggers","rstats","rspatial","maps","flags","sf","inset","rnaturalearth"],
      "authors": [{
        "name": "Diego HH",
        "url": "https://dieghernan.github.io/"
      }]
    },
    {
      "id": "https://dieghernan.github.io/201910_WikiMap1/",
      "url": "https://dieghernan.github.io/201910_WikiMap1/",
      "title": "Wikipedia maps (I): Organ donor rates",
      "content_html": "<p>This is a quick post on how to create a map according to the\n<a href=\"https://en.wikipedia.org/wiki/Wikipedia:WikiProject_Maps/Conventions#Gradient_maps\">Wikipedia conventions</a>.\nIn this case, I have chosen to plot the\n<a href=\"https://en.wikipedia.org/wiki/International_organ_donor_rates\">international organ donor rates</a>,\nretrieved on February 10, 2019, although the data refers to 2017 (source:\n<a href=\"http://www.irodat.org/?p=database\">IRODaT</a>).</p>\n\n<p class=\"alert alert-info p-3 mx-2 mb-3\"><strong>Historical example:</strong> The mapping examples use <strong>cartography</strong>, which is now\nin maintenance mode. Its maintainers recommend <a href=\"https://riatelab.github.io/mapsf/\"><strong>mapsf</strong></a>\nfor new work. The original code and outputs are preserved and have not been\nrevalidated against current package versions.</p>\n\n<h2 id=\"web-scraping\">Web scraping</h2>\n\n<p>The first step is to scrape Wikipedia in order to get the final table. To do\nso, I will use the <strong>rvest</strong> package. You can get the <code class=\"language-plaintext highlighter-rouge\">xpath</code> you want to\nscrape as explained <a href=\"https://stackoverflow.com/a/57972054/7877917\">here</a>.</p>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"n\">library</span><span class=\"p\">(</span><span class=\"n\">rvest</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">library</span><span class=\"p\">(</span><span class=\"n\">dplyr</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"n\">Base</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\">\n  </span><span class=\"n\">read_html</span><span class=\"p\">(</span><span class=\"s2\">\"https://en.wikipedia.org/wiki/International_organ_donor_rates\"</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">%&gt;%</span><span class=\"w\">\n  </span><span class=\"n\">html_nodes</span><span class=\"p\">(</span><span class=\"n\">xpath</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s1\">'//*[@id=\"mw-content-text\"]/div/table[3]'</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">%&gt;%</span><span class=\"w\">\n  </span><span class=\"n\">html_table</span><span class=\"p\">()</span><span class=\"w\"> </span><span class=\"o\">%&gt;%</span><span class=\"w\">\n  </span><span class=\"n\">as.data.frame</span><span class=\"p\">(</span><span class=\"w\">\n    </span><span class=\"n\">stringsAsFactors</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nb\">F</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"n\">fix.empty.names</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nb\">F</span><span class=\"w\">\n  </span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">%&gt;%</span><span class=\"w\">\n  </span><span class=\"n\">select</span><span class=\"p\">(</span><span class=\"n\">Country</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"n\">RateDonperMill</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">Number.of.deceased.donors..per.million.of.population</span><span class=\"w\">\n  </span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"n\">knitr</span><span class=\"o\">::</span><span class=\"n\">kable</span><span class=\"p\">(</span><span class=\"n\">head</span><span class=\"p\">(</span><span class=\"n\">Base</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">10</span><span class=\"p\">),</span><span class=\"w\"> </span><span class=\"n\">format</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"markdown\"</span><span class=\"p\">)</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<table>\n  <thead>\n    <tr>\n      <th style=\"text-align: left\">Country</th>\n      <th style=\"text-align: right\">RateDonperMill</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <td style=\"text-align: left\">Argentina</td>\n      <td style=\"text-align: right\">19.60</td>\n    </tr>\n    <tr>\n      <td style=\"text-align: left\">Armenia</td>\n      <td style=\"text-align: right\">0.00</td>\n    </tr>\n    <tr>\n      <td style=\"text-align: left\">Australia</td>\n      <td style=\"text-align: right\">21.60</td>\n    </tr>\n    <tr>\n      <td style=\"text-align: left\">Austria</td>\n      <td style=\"text-align: right\">23.88</td>\n    </tr>\n    <tr>\n      <td style=\"text-align: left\">Azerbaijan</td>\n      <td style=\"text-align: right\">0.00</td>\n    </tr>\n    <tr>\n      <td style=\"text-align: left\">Bahrain</td>\n      <td style=\"text-align: right\">4.00</td>\n    </tr>\n    <tr>\n      <td style=\"text-align: left\">Bangladesh</td>\n      <td style=\"text-align: right\">0.00</td>\n    </tr>\n    <tr>\n      <td style=\"text-align: left\">Belarus</td>\n      <td style=\"text-align: right\">26.20</td>\n    </tr>\n    <tr>\n      <td style=\"text-align: left\">Belgium</td>\n      <td style=\"text-align: right\">30.30</td>\n    </tr>\n    <tr>\n      <td style=\"text-align: left\">Bolivia</td>\n      <td style=\"text-align: right\">0.36</td>\n    </tr>\n  </tbody>\n</table>\n\n<p>Now we need to choose a <a href=\"https://dieghernan.github.io/201906_Beautiful2/\">good source of maps</a>:</p>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"n\">library</span><span class=\"p\">(</span><span class=\"n\">sf</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">library</span><span class=\"p\">(</span><span class=\"n\">giscoR</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"c1\"># Map import from Eurostat</span><span class=\"w\">\n</span><span class=\"n\">WorldMap</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">gisco_get_countries</span><span class=\"p\">(</span><span class=\"n\">resolution</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">3</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">epsg</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">3857</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">%&gt;%</span><span class=\"w\">\n  </span><span class=\"n\">select</span><span class=\"p\">(</span><span class=\"n\">ISO_3166_3</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">ISO3_CODE</span><span class=\"p\">)</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<h2 id=\"merging-everything-together\">Merging everything together</h2>\n\n<p>Now let’s join and have a look to see what is going on. We use the\n<strong>countrycode</strong> package to retrieve the ISO3 codes of our scraped dataset:</p>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"n\">library</span><span class=\"p\">(</span><span class=\"n\">countrycode</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"n\">Base</span><span class=\"o\">$</span><span class=\"n\">ISO_3166_3</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">countrycode</span><span class=\"p\">(</span><span class=\"n\">Base</span><span class=\"o\">$</span><span class=\"n\">Country</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">origin</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"country.name\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">destination</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"iso3c\"</span><span class=\"p\">)</span><span class=\"w\">\n\n\n</span><span class=\"n\">DonorRate</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">left_join</span><span class=\"p\">(</span><span class=\"w\">\n  </span><span class=\"n\">WorldMap</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">Base</span><span class=\"w\">\n</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">%&gt;%</span><span class=\"w\">\n  </span><span class=\"n\">select</span><span class=\"p\">(</span><span class=\"w\">\n    </span><span class=\"n\">Country</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"n\">ISO_3166_3</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"n\">RateDonperMill</span><span class=\"w\">\n  </span><span class=\"p\">)</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<h2 id=\"make-the-svg-file\">Make the <code class=\"language-plaintext highlighter-rouge\">.svg</code> file</h2>\n\n<p>As already explained, I would like to follow the Wikipedia conventions, so there\nare some things to bear in mind:</p>\n\n<ul>\n  <li>Obviously, the colors. Wikipedia already provides good guidance for this. I\nwill use the <strong>RColorBrewer</strong> library, which implements\n<a href=\"http://colorbrewer2.org/#type=sequential&amp;scheme=PuBu&amp;n=9\">ColorBrewer</a> in\n<strong>R</strong>.</li>\n  <li>In terms of projection, Wikipedia recommends the\n<a href=\"https://en.wikipedia.org/wiki/Equirectangular_projection\">Equirectangular projection</a>\nbut, as in their own sample of a gradient map, I will use the\n<a href=\"https://en.wikipedia.org/wiki/Robinson_projection\">Robinson projection</a>.</li>\n  <li>I should also produce an <code class=\"language-plaintext highlighter-rouge\">.svg</code> file following the naming convention.</li>\n</ul>\n\n<p>Some libraries remain to be used: <strong>RColorBrewer</strong>, <strong>rsvg</strong> and, especially,\none of my favorites, <strong>cartography</strong>:</p>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"n\">library</span><span class=\"p\">(</span><span class=\"n\">RColorBrewer</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">library</span><span class=\"p\">(</span><span class=\"n\">cartography</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">library</span><span class=\"p\">(</span><span class=\"n\">rsvg</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"c1\"># Create bbox of the world</span><span class=\"w\">\n</span><span class=\"n\">bbox</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">st_linestring</span><span class=\"p\">(</span><span class=\"n\">rbind</span><span class=\"p\">(</span><span class=\"w\">\n  </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"m\">-180</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">90</span><span class=\"p\">),</span><span class=\"w\">\n  </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"m\">180</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">90</span><span class=\"p\">),</span><span class=\"w\">\n  </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"m\">180</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">-90</span><span class=\"p\">),</span><span class=\"w\">\n  </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"m\">-180</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">-90</span><span class=\"p\">),</span><span class=\"w\">\n  </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"m\">-180</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">90</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"p\">))</span><span class=\"w\"> </span><span class=\"o\">%&gt;%</span><span class=\"w\">\n  </span><span class=\"n\">st_segmentize</span><span class=\"p\">(</span><span class=\"m\">5</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">%&gt;%</span><span class=\"w\">\n  </span><span class=\"n\">st_cast</span><span class=\"p\">(</span><span class=\"s2\">\"POLYGON\"</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">%&gt;%</span><span class=\"w\">\n  </span><span class=\"n\">st_sfc</span><span class=\"p\">(</span><span class=\"n\">crs</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">4326</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">%&gt;%</span><span class=\"w\">\n  </span><span class=\"n\">st_transform</span><span class=\"p\">(</span><span class=\"n\">crs</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"+proj=robin\"</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"c1\"># Create SVG</span><span class=\"w\">\n</span><span class=\"n\">svg</span><span class=\"p\">(</span><span class=\"w\">\n  </span><span class=\"s2\">\"Organ donor rate per million by country gradient map (2017).svg\"</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">pointsize</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">90</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">width</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\">  </span><span class=\"m\">1600</span><span class=\"w\"> </span><span class=\"o\">/</span><span class=\"w\"> </span><span class=\"m\">90</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">height</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">728</span><span class=\"w\"> </span><span class=\"o\">/</span><span class=\"w\"> </span><span class=\"m\">90</span><span class=\"w\">\n</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"n\">par</span><span class=\"p\">(</span><span class=\"n\">mar</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"m\">0.5</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">0</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">0</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">0</span><span class=\"p\">))</span><span class=\"w\">\n</span><span class=\"n\">choroLayer</span><span class=\"p\">(</span><span class=\"w\">\n  </span><span class=\"n\">DonorRate</span><span class=\"w\"> </span><span class=\"o\">%&gt;%</span><span class=\"w\"> </span><span class=\"n\">st_transform</span><span class=\"p\">(</span><span class=\"s2\">\"+proj=robin\"</span><span class=\"p\">),</span><span class=\"w\">\n  </span><span class=\"n\">var</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"RateDonperMill\"</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">breaks</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"m\">0</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">5</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">10</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">20</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">30</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">40</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">50</span><span class=\"p\">),</span><span class=\"w\">\n  </span><span class=\"n\">col</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">brewer.pal</span><span class=\"p\">(</span><span class=\"m\">6</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"PuBu\"</span><span class=\"p\">),</span><span class=\"w\">\n  </span><span class=\"n\">border</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"#646464\"</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">lwd</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">0.1</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">colNA</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"#E0E0E0\"</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">legend.pos</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"left\"</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">legend.title.txt</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"\"</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">legend.values.cex</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">0.25</span><span class=\"w\">\n</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"c1\"># Bounding box</span><span class=\"w\">\n</span><span class=\"n\">plot</span><span class=\"p\">(</span><span class=\"n\">bbox</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">add</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nb\">T</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">border</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"#646464\"</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">lwd</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">0.2</span><span class=\"w\">\n</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"n\">dev.off</span><span class=\"p\">()</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<p>And that’s all. Our <code class=\"language-plaintext highlighter-rouge\">.svg</code> file is ready to be included in Wikipedia.</p>\n\n<p><img src=\"https://dieghernan.github.io/assets/img/blog/20191016_imgpost.webp\" alt=\"World choropleth map of organ donors per million people in 2017. Darker blue indicates higher donor rates and gray indicates missing data.\" /></p>\n\n<p class=\"alert alert-info p-3 mx-2 mb-3\"><strong>Update</strong>: The map is already part of the <a href=\"https://en.wikipedia.org/wiki/International_organ_donor_rates#Global_Summary\">Wikipedia article</a>.</p>\n",
      "date_published": "2019-10-16T00:00:00+02:00",
      "date_modified": "2026-10-07T00:00:00+02:00",
      "image": "https://dieghernan.github.io/assets/img/blog/20191016_imgpost.webp",
      "summary": "Map international organ donor rates using Wikipedia data and cartography.",
      "tags": ["r_bloggers","rstats","rspatial","sf","maps","giscoR"],
      "authors": [{
        "name": "Diego HH",
        "url": "https://dieghernan.github.io/"
      }]
    },
    {
      "id": "https://dieghernan.github.io/201906_Beautiful2/",
      "url": "https://dieghernan.github.io/201906_Beautiful2/",
      "title": "Beautiful maps with R (II): Fun with flags",
      "content_html": "<p class=\"alert alert-info p-3 mx-2 mb-3\"><strong>Updated 29 December 2020</strong>: All these pieces of work are already available\nin <strong>cartography</strong> &gt;v.2.4.0 in the <a href=\"http://riatelab.github.io/cartography/docs/reference/getPngLayer.html\"><code class=\"language-plaintext highlighter-rouge\">getPngLayer</code></a>\nfunction. Just install it via <code class=\"language-plaintext highlighter-rouge\">install.packages(\"cartography\")</code>. A dedicated\nblog post with examples is available in this <a href=\"https://dieghernan.github.io/202002_cartography1/\">post</a>.</p>\n\n<p class=\"alert alert-info p-3 mx-2 mb-3\"><strong>Updated 25 January 2023</strong>: <strong>cartography</strong> is in maintenance mode. You can use\n<strong>rasterpic</strong> + <strong>tidyterra</strong> to achieve the same result, see <a href=\"https://dieghernan.github.io/202201_maps-flags/\">link1</a>\nand <a href=\"https://dieghernan.github.io/202205_tidyterra/\">link2</a>.</p>\n\n<p>Want to use a flag (or any <code class=\"language-plaintext highlighter-rouge\">*.png</code> file) as a background for your map? You are\nin the right place. I am aware that there are some <strong>R</strong> packages out\n<a href=\"https://github.com/RobertMyles/flagfillr\">there</a>, but we focus here on the\noption provided by <code class=\"language-plaintext highlighter-rouge\">cartography::getPngLayer()</code>, which basically converts your\nimage into a raster. See also Paul Murrell’s article <strong>“Raster Images in R\nGraphics”</strong> <a href=\"https://journal.r-project.org/archive/2011/RJ-2011-008/RJ-2011-008.pdf\">(<em>The R Journal, Volume 3/1, June 2011</em>)</a>.</p>\n\n<h2 id=\"required-r-packages\">Required <strong>R</strong> packages</h2>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"n\">library</span><span class=\"p\">(</span><span class=\"n\">dplyr</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">library</span><span class=\"p\">(</span><span class=\"n\">sf</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">library</span><span class=\"p\">(</span><span class=\"n\">cartography</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">library</span><span class=\"p\">(</span><span class=\"n\">mapSpain</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">library</span><span class=\"p\">(</span><span class=\"n\">giscoR</span><span class=\"p\">)</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<h2 id=\"choosing-a-good-source-for-our-shape\">Choosing a good source for our shape</h2>\n\n<p>In this post, I am going to plot a map of Spain with its\n<a href=\"https://en.wikipedia.org/wiki/Autonomous_communities_of_Spain\">autonomous communities (plus 2 autonomous cities)</a>,\nwhich are the first-level administrative divisions of the country.\n<a href=\"https://en.wikipedia.org/wiki/Autonomous_communities_of_Spain\">Wikipedia</a>\nshows an initial map that also identifies the flag of each territory.</p>\n\n<p>For that, I will use <strong>mapSpain</strong>, which uses information from <strong>giscoR</strong>, whose\nsource is the geodata available in <a href=\"https://ec.europa.eu/eurostat\"><strong>Eurostat</strong></a>.\nI will also use <strong>giscoR</strong> to get the world around Spain.</p>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"n\">Spain</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">esp_get_ccaa</span><span class=\"p\">(</span><span class=\"n\">epsg</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">3857</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">res</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">3</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"n\">World</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">gisco_get_countries</span><span class=\"p\">(</span><span class=\"n\">epsg</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">3857</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">res</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">3</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"n\">bboxcan</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">esp_get_can_box</span><span class=\"p\">(</span><span class=\"n\">epsg</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">3857</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"c1\"># Plot</span><span class=\"w\">\n</span><span class=\"n\">par</span><span class=\"p\">(</span><span class=\"n\">mar</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"m\">0</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">0</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">0</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">0</span><span class=\"p\">))</span><span class=\"w\">\n</span><span class=\"n\">plot</span><span class=\"p\">(</span><span class=\"n\">st_geometry</span><span class=\"p\">(</span><span class=\"n\">Spain</span><span class=\"p\">),</span><span class=\"w\">\n  </span><span class=\"n\">col</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">NA</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">border</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">NA</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">bg</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"#C6ECFF\"</span><span class=\"w\">\n</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">plot</span><span class=\"p\">(</span><span class=\"n\">st_geometry</span><span class=\"p\">(</span><span class=\"n\">World</span><span class=\"p\">),</span><span class=\"w\">\n  </span><span class=\"n\">col</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"#E0E0E0\"</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">bg</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"#C6ECFF\"</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">add</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nb\">T</span><span class=\"w\">\n</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">plot</span><span class=\"p\">(</span><span class=\"n\">st_geometry</span><span class=\"p\">(</span><span class=\"n\">Spain</span><span class=\"p\">),</span><span class=\"w\"> </span><span class=\"n\">col</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"#FEFEE9\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">add</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nb\">T</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">layoutLayer</span><span class=\"p\">(</span><span class=\"w\">\n  </span><span class=\"n\">title</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"\"</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">frame</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">FALSE</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">scale</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">500</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">sources</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">gisco_attributions</span><span class=\"p\">(),</span><span class=\"w\">\n  </span><span class=\"n\">author</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"dieghernan, 2019\"</span><span class=\"p\">,</span><span class=\"w\">\n</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">plot</span><span class=\"p\">(</span><span class=\"n\">bboxcan</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">add</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">TRUE</span><span class=\"p\">)</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<p><img src=\"https://dieghernan.github.io/assets/img/blog/20190618_preparing-1.webp\" alt=\"Map of Spain with autonomous community boundaries and a separate box for the Canary Islands.\" /></p>\n\n<p>Now we have it! A nice map of Spain with a layout based on the <a href=\"https://en.wikipedia.org/wiki/Wikipedia:WikiProject_Maps/Conventions/Location_maps\">Wikipedia convention for location maps</a>.</p>\n\n<h2 id=\"loading-the-flag\">Loading the flag</h2>\n\n<p>As a first example, I chose <a href=\"https://en.wikipedia.org/wiki/Asturias\">Asturias</a>\nto build my code. The goal here is to create a <code class=\"language-plaintext highlighter-rouge\">RasterBrick</code> from the desired\n<code class=\"language-plaintext highlighter-rouge\">*.png</code> file, add the necessary geographical information and use the shape of\nAsturias to crop the flag.</p>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"c1\"># 1.Shape---</span><span class=\"w\">\n</span><span class=\"n\">shp</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">Spain</span><span class=\"w\"> </span><span class=\"o\">%&gt;%</span><span class=\"w\"> </span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">ccaa.shortname.es</span><span class=\"w\"> </span><span class=\"o\">==</span><span class=\"w\"> </span><span class=\"s2\">\"Asturias\"</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"c1\"># 2.Get flag---</span><span class=\"w\">\n\n</span><span class=\"c1\"># Masked</span><span class=\"w\">\n</span><span class=\"n\">url</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"s2\">\"https://upload.wikimedia.org/wikipedia/commons/thumb/3/3e/Flag_of_Asturias.svg/800px-Flag_of_Asturias.svg.png\"</span><span class=\"w\">\n\n</span><span class=\"n\">flagnomask</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">getPngLayer</span><span class=\"p\">(</span><span class=\"n\">shp</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">url</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">mask</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">FALSE</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"n\">flagmask</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">getPngLayer</span><span class=\"p\">(</span><span class=\"n\">shp</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">url</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">mask</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">TRUE</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"n\">opar</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">par</span><span class=\"p\">(</span><span class=\"n\">no.readonly</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">TRUE</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">par</span><span class=\"p\">(</span><span class=\"n\">mar</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"m\">1</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">1</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">1</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">1</span><span class=\"p\">),</span><span class=\"w\"> </span><span class=\"n\">mfrow</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"m\">1</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">2</span><span class=\"p\">))</span><span class=\"w\">\n</span><span class=\"n\">pngLayer</span><span class=\"p\">(</span><span class=\"n\">flagnomask</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">plot</span><span class=\"p\">(</span><span class=\"n\">st_geometry</span><span class=\"p\">(</span><span class=\"n\">Spain</span><span class=\"p\">),</span><span class=\"w\"> </span><span class=\"n\">add</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nb\">T</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"c1\"># 4.Mask---</span><span class=\"w\">\n</span><span class=\"n\">pngLayer</span><span class=\"p\">(</span><span class=\"n\">flagmask</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">plot</span><span class=\"p\">(</span><span class=\"n\">st_geometry</span><span class=\"p\">(</span><span class=\"n\">Spain</span><span class=\"p\">),</span><span class=\"w\"> </span><span class=\"n\">add</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nb\">T</span><span class=\"p\">)</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<p><img src=\"https://dieghernan.github.io/assets/img/blog/20190618_Asturias-1.webp\" alt=\"Two maps comparing the rectangular flag of Asturias with the same flag clipped to the boundary of Asturias.\" /></p>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"n\">par</span><span class=\"p\">(</span><span class=\"n\">opar</span><span class=\"p\">)</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<p class=\"alert alert-info p-3 mx-2 mb-3\"><i class=\"fa fa-star\"></i> <strong>Pro tip:</strong> Use high-quality <code class=\"language-plaintext highlighter-rouge\">*.png</code> files,\notherwise the plot will look quite poor. Here I show an extreme example.</p>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"n\">MURshp</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">Spain</span><span class=\"w\"> </span><span class=\"o\">%&gt;%</span><span class=\"w\"> </span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">ccaa.shortname.es</span><span class=\"w\"> </span><span class=\"o\">==</span><span class=\"w\"> </span><span class=\"s2\">\"Murcia\"</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">MURLow</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">getPngLayer</span><span class=\"p\">(</span><span class=\"w\">\n  </span><span class=\"n\">MURshp</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"s2\">\"https://upload.wikimedia.org/wikipedia/commons/thumb/a/a5/Flag_of_the_Region_of_Murcia.svg/100px-Flag_of_the_Region_of_Murcia.svg.png\"</span><span class=\"w\">\n</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">MURHigh</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">getPngLayer</span><span class=\"p\">(</span><span class=\"w\">\n  </span><span class=\"n\">MURshp</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"s2\">\"https://upload.wikimedia.org/wikipedia/commons/thumb/a/a5/Flag_of_the_Region_of_Murcia.svg/1200px-Flag_of_the_Region_of_Murcia.svg.png\"</span><span class=\"w\">\n</span><span class=\"p\">)</span><span class=\"w\">\n\n\n</span><span class=\"c1\"># Plot and compare</span><span class=\"w\">\n</span><span class=\"n\">opar</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">par</span><span class=\"p\">(</span><span class=\"n\">no.readonly</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">TRUE</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">par</span><span class=\"p\">(</span><span class=\"n\">mfrow</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"m\">1</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">2</span><span class=\"p\">),</span><span class=\"w\"> </span><span class=\"n\">mar</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"m\">1</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">1</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">1</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">1</span><span class=\"p\">))</span><span class=\"w\">\n</span><span class=\"n\">plot_sf</span><span class=\"p\">(</span><span class=\"n\">MURshp</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">main</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"Low\"</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">pngLayer</span><span class=\"p\">(</span><span class=\"n\">MURLow</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">add</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">TRUE</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"n\">plot_sf</span><span class=\"p\">(</span><span class=\"n\">MURshp</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">main</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"High\"</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">pngLayer</span><span class=\"p\">(</span><span class=\"n\">MURHigh</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">add</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">TRUE</span><span class=\"p\">)</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<p><img src=\"https://dieghernan.github.io/assets/img/blog/20190618_svg-1.webp\" alt=\"Two flag-filled maps of Murcia comparing low and high image resolutions. The higher-resolution flag has smoother edges.\" /></p>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"n\">par</span><span class=\"p\">(</span><span class=\"n\">opar</span><span class=\"p\">)</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<p>Now, we are ready to have <a href=\"https://the-big-bang-theory.com/fun_with_flags/\">fun with flags</a>. It’s time to make the flag map of the autonomous communities of Spain.</p>\n\n<iframe class=\"d-block w-100 border-0 rounded my-3\" title=\"Big Bang Theory Theme by Barenaked Ladies on Spotify\" src=\"https://open.spotify.com/embed/track/4aZSisNDZxHVHsR9NwqCSR?theme=0\" height=\"152\" loading=\"lazy\" allow=\"autoplay; clipboard-write; encrypted-media; fullscreen; picture-in-picture\" allowfullscreen=\"\">\n</iframe>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"n\">par</span><span class=\"p\">(</span><span class=\"n\">mar</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"m\">0</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">0</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">0</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">0</span><span class=\"p\">),</span><span class=\"w\"> </span><span class=\"n\">mfrow</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"m\">1</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">1</span><span class=\"p\">))</span><span class=\"w\">\n</span><span class=\"n\">plot</span><span class=\"p\">(</span><span class=\"n\">Spain</span><span class=\"w\"> </span><span class=\"o\">%&gt;%</span><span class=\"w\">\n  </span><span class=\"n\">st_geometry</span><span class=\"p\">(),</span><span class=\"w\">\n</span><span class=\"n\">col</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">NA</span><span class=\"p\">,</span><span class=\"w\">\n</span><span class=\"n\">border</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">NA</span><span class=\"p\">,</span><span class=\"w\">\n</span><span class=\"n\">bg</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"#C6ECFF\"</span><span class=\"w\">\n</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">plot</span><span class=\"p\">(</span><span class=\"n\">st_geometry</span><span class=\"p\">(</span><span class=\"n\">World</span><span class=\"p\">),</span><span class=\"w\">\n  </span><span class=\"n\">col</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"#E0E0E0\"</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">add</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nb\">T</span><span class=\"w\">\n</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">plot</span><span class=\"p\">(</span><span class=\"n\">st_geometry</span><span class=\"p\">(</span><span class=\"n\">bboxcan</span><span class=\"p\">),</span><span class=\"w\">\n  </span><span class=\"n\">add</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nb\">T</span><span class=\"w\">\n</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">layoutLayer</span><span class=\"p\">(</span><span class=\"w\">\n  </span><span class=\"n\">title</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"\"</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">frame</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">FALSE</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">sources</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"© EuroGeographics for the administrative boundaries\"</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">author</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"dieghernan, 2019\"</span><span class=\"p\">,</span><span class=\"w\">\n</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"c1\"># Andalucia</span><span class=\"w\">\n</span><span class=\"n\">flag</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\">\n  </span><span class=\"s2\">\"https://upload.wikimedia.org/wikipedia/commons/thumb/9/9a/Bandera_de_Andalucia.svg/1000px-Bandera_de_Andalucia.svg.png\"</span><span class=\"w\">\n</span><span class=\"n\">shp</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">Spain</span><span class=\"w\"> </span><span class=\"o\">%&gt;%</span><span class=\"w\"> </span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"n\">ccaa.shortname.es</span><span class=\"w\"> </span><span class=\"o\">==</span><span class=\"w\"> </span><span class=\"s2\">\"Andalucía\"</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">pngLayer</span><span class=\"p\">(</span><span class=\"n\">getPngLayer</span><span class=\"p\">(</span><span class=\"n\">shp</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">flag</span><span class=\"p\">),</span><span class=\"w\"> </span><span class=\"n\">add</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">TRUE</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"c1\"># ...more flags</span><span class=\"w\">\n</span><span class=\"c1\"># Go to the source code of this post on GitHub for the full code</span><span class=\"w\">\n\n</span><span class=\"n\">plot</span><span class=\"p\">(</span><span class=\"n\">st_geometry</span><span class=\"p\">(</span><span class=\"n\">Spain</span><span class=\"p\">),</span><span class=\"w\">\n  </span><span class=\"n\">col</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">NA</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">lwd</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">2</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">add</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nb\">T</span><span class=\"w\">\n</span><span class=\"p\">)</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<p><img src=\"https://dieghernan.github.io/assets/img/blog/20190618_allCCAA-1.webp\" alt=\"Map of Spain with each autonomous community filled with its flag and the Canary Islands shown in an inset.\" /></p>\n\n<p>We are done now. If you have suggestions, you can leave a comment. As always,\nif you enjoyed the post, you can share it on your preferred social network.</p>\n",
      "date_published": "2019-06-18T00:00:00+02:00",
      "date_modified": "2023-01-23T00:00:00+01:00",
      "image": "https://dieghernan.github.io/assets/img/blog/20190618_imgpost-1.webp",
      "summary": "Want to use a flag (or any *.png file) as a background for your map? You are in the right place.",
      "tags": ["music","r_bloggers","rstats","rspatial","beautiful_maps","maps","raster","flags","function","mapSpain","giscoR"],
      "authors": [{
        "name": "Diego HH",
        "url": "https://dieghernan.github.io/"
      }]
    },
    {
      "id": "https://dieghernan.github.io/201906_Beautiful1/",
      "url": "https://dieghernan.github.io/201906_Beautiful1/",
      "title": "Beautiful maps with R (I): Fishnets, honeycombs and pixels",
      "content_html": "<p>Sometimes you want to produce maps with special layouts. I especially like\nmaps with modified geometries, e.g. simplifying the original shapes to squares\nor dots. When searching the web, I found the fantastic post <a href=\"https://strimas.com/post/hexagonal-grids/\">Fishnets and\nHoneycomb: Square vs. Hexagonal Spatial Grids</a>\nby <a href=\"https://strimas.com/#about\">Matt Strimas-Mackey</a>, which was a huge\ninspiration (by the way, don’t miss <a href=\"http://strimas.com/#posts\">his blog</a>, full\nof very interesting pieces of work).</p>\n\n<p>The only thing I was not completely comfortable with was that the post used the\n<a href=\"https://r.geocompx.org/\">old-fashioned</a>\n<strong>sp</strong> package instead of my personal favorite, the <strong>sf</strong> package. The post\nwas published in 2016, and note that the author has also moved to the <strong>sf</strong>\npackage since then. So I decided to explore further options with <strong>sf</strong>.</p>\n\n<p>The approach is similar, using grids over a map and working with them, but with\n<a href=\"https://www.rdocumentation.org/packages/sf/versions/0.7-4/topics/st_make_grid\"><code class=\"language-plaintext highlighter-rouge\">st_make_grid</code></a>.\nI also expanded it by grouping the grids and producing dots over the geometries.\nSo basically I produced five variations of the map:</p>\n\n<table>\n  <thead>\n    <tr>\n      <th>Type</th>\n      <th style=\"text-align: center\">Replacement</th>\n      <th style=\"text-align: center\">Grouped</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <td><strong>Fishnet</strong></td>\n      <td style=\"text-align: center\">Square</td>\n      <td style=\"text-align: center\">No</td>\n    </tr>\n    <tr>\n      <td><strong>Puzzle</strong></td>\n      <td style=\"text-align: center\">Square</td>\n      <td style=\"text-align: center\">Yes</td>\n    </tr>\n    <tr>\n      <td><strong>Honeycomb</strong></td>\n      <td style=\"text-align: center\">Hexagon</td>\n      <td style=\"text-align: center\">No</td>\n    </tr>\n    <tr>\n      <td><strong>Hexbin</strong></td>\n      <td style=\"text-align: center\">Hexagon</td>\n      <td style=\"text-align: center\">Yes</td>\n    </tr>\n    <tr>\n      <td><strong>Pixel</strong></td>\n      <td style=\"text-align: center\">Dot</td>\n      <td style=\"text-align: center\">No</td>\n    </tr>\n  </tbody>\n</table>\n\n<h2 id=\"required-r-packages\">Required <strong>R</strong> packages</h2>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"n\">library</span><span class=\"p\">(</span><span class=\"n\">sf</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">library</span><span class=\"p\">(</span><span class=\"n\">giscoR</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">library</span><span class=\"p\">(</span><span class=\"n\">dplyr</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">library</span><span class=\"p\">(</span><span class=\"n\">RColorBrewer</span><span class=\"p\">)</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<h2 id=\"working-with-square-grids\">Working with square grids</h2>\n\n<p>Let’s use the <code class=\"language-plaintext highlighter-rouge\">square</code> option of <code class=\"language-plaintext highlighter-rouge\">st_make_grid</code> and play a bit with it.</p>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"n\">GB</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">ne_download</span><span class=\"p\">(</span><span class=\"m\">50</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">type</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"map_subunits\"</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">returnclass</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"sf\"</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">destdir</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">tempdir</span><span class=\"p\">()</span><span class=\"w\">\n</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">%&gt;%</span><span class=\"w\">\n  </span><span class=\"n\">subset</span><span class=\"p\">(</span><span class=\"n\">CONTINENT</span><span class=\"w\"> </span><span class=\"o\">==</span><span class=\"w\"> </span><span class=\"s2\">\"Europe\"</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">%&gt;%</span><span class=\"w\">\n  </span><span class=\"n\">subset</span><span class=\"p\">(</span><span class=\"n\">ADM0_A3</span><span class=\"w\"> </span><span class=\"o\">==</span><span class=\"w\"> </span><span class=\"s2\">\"GBR\"</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"c1\"># Projecting and cleaning</span><span class=\"w\">\n</span><span class=\"n\">GB</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">st_transform</span><span class=\"p\">(</span><span class=\"n\">GB</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">3857</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">%&gt;%</span><span class=\"w\"> </span><span class=\"n\">select</span><span class=\"p\">(</span><span class=\"n\">NAME_EN</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">ADM0_A3</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">initial</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">GB</span><span class=\"w\">\n</span><span class=\"n\">initial</span><span class=\"o\">$</span><span class=\"n\">index_target</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"m\">1</span><span class=\"o\">:</span><span class=\"n\">nrow</span><span class=\"p\">(</span><span class=\"n\">initial</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">target</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">st_geometry</span><span class=\"p\">(</span><span class=\"n\">initial</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"c1\"># Create my own color palette</span><span class=\"w\">\n</span><span class=\"n\">mypal</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">colorRampPalette</span><span class=\"p\">(</span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"s2\">\"#F3F8F8\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"#008080\"</span><span class=\"p\">))</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<p class=\"alert alert-danger p-3 mx-2 mb-3\"><i class=\"fas fa-exclamation-triangle\"></i> <strong>Warning:</strong> The <code class=\"language-plaintext highlighter-rouge\">cellsize</code> should\nbe set in the same unit as the projection (in this case, meters). Pay special\nattention to this because if the parameter is too small, meaning that the grid\nis too dense, <strong>R</strong> could crash easily.</p>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"n\">grid</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">st_make_grid</span><span class=\"p\">(</span><span class=\"n\">target</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"m\">50</span><span class=\"w\"> </span><span class=\"o\">*</span><span class=\"w\"> </span><span class=\"m\">1000</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"c1\"># Kms</span><span class=\"w\">\n  </span><span class=\"n\">crs</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">st_crs</span><span class=\"p\">(</span><span class=\"n\">initial</span><span class=\"p\">),</span><span class=\"w\">\n  </span><span class=\"n\">what</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"polygons\"</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">square</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">TRUE</span><span class=\"w\">\n</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"c1\"># To sf</span><span class=\"w\">\n</span><span class=\"n\">grid</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">st_sf</span><span class=\"p\">(</span><span class=\"n\">index</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">1</span><span class=\"o\">:</span><span class=\"nf\">length</span><span class=\"p\">(</span><span class=\"n\">lengths</span><span class=\"p\">(</span><span class=\"n\">grid</span><span class=\"p\">)),</span><span class=\"w\"> </span><span class=\"n\">grid</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"c1\"># Add index</span><span class=\"w\">\n\n</span><span class=\"c1\"># We identify the grids that belong to an entity by assessing the centroid</span><span class=\"w\">\n</span><span class=\"n\">cent_grid</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">st_centroid</span><span class=\"p\">(</span><span class=\"n\">grid</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">cent_merge</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">st_join</span><span class=\"p\">(</span><span class=\"n\">cent_grid</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">initial</span><span class=\"p\">[</span><span class=\"s2\">\"index_target\"</span><span class=\"p\">],</span><span class=\"w\"> </span><span class=\"n\">left</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nb\">F</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">grid_new</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">inner_join</span><span class=\"p\">(</span><span class=\"n\">grid</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">st_drop_geometry</span><span class=\"p\">(</span><span class=\"n\">cent_merge</span><span class=\"p\">))</span><span class=\"w\">\n\n</span><span class=\"c1\"># Fishnet</span><span class=\"w\">\n</span><span class=\"n\">Fishgeom</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">aggregate</span><span class=\"p\">(</span><span class=\"n\">grid_new</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">by</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nf\">list</span><span class=\"p\">(</span><span class=\"n\">grid_new</span><span class=\"o\">$</span><span class=\"n\">index_target</span><span class=\"p\">),</span><span class=\"w\">\n  </span><span class=\"n\">FUN</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">min</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">do_union</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">FALSE</span><span class=\"w\">\n</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"c1\"># Let's add the data frame</span><span class=\"w\">\n</span><span class=\"n\">Fishnet</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">left_join</span><span class=\"p\">(</span><span class=\"w\">\n  </span><span class=\"n\">Fishgeom</span><span class=\"w\"> </span><span class=\"o\">%&gt;%</span><span class=\"w\"> </span><span class=\"n\">select</span><span class=\"p\">(</span><span class=\"n\">index_target</span><span class=\"p\">),</span><span class=\"w\">\n  </span><span class=\"n\">st_drop_geometry</span><span class=\"p\">(</span><span class=\"n\">initial</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">%&gt;%</span><span class=\"w\">\n  </span><span class=\"n\">select</span><span class=\"p\">(</span><span class=\"o\">-</span><span class=\"n\">index_target</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"c1\"># Now let's create the puzzle</span><span class=\"w\">\n</span><span class=\"n\">Puzzlegeom</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">aggregate</span><span class=\"p\">(</span><span class=\"n\">st_buffer</span><span class=\"p\">(</span><span class=\"n\">grid_new</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">0.5</span><span class=\"p\">),</span><span class=\"w\"> </span><span class=\"c1\"># Avoid slivers</span><span class=\"w\">\n  </span><span class=\"n\">by</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nf\">list</span><span class=\"p\">(</span><span class=\"n\">grid_new</span><span class=\"o\">$</span><span class=\"n\">index_target</span><span class=\"p\">),</span><span class=\"w\">\n  </span><span class=\"n\">FUN</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">min</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">do_union</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">TRUE</span><span class=\"w\">\n</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"c1\"># This changes!!!</span><span class=\"w\">\n\n</span><span class=\"n\">Puzzle</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">left_join</span><span class=\"p\">(</span><span class=\"w\">\n  </span><span class=\"n\">Puzzlegeom</span><span class=\"w\"> </span><span class=\"o\">%&gt;%</span><span class=\"w\"> </span><span class=\"n\">select</span><span class=\"p\">(</span><span class=\"n\">index_target</span><span class=\"p\">),</span><span class=\"w\">\n  </span><span class=\"n\">st_drop_geometry</span><span class=\"p\">(</span><span class=\"n\">initial</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">%&gt;%</span><span class=\"w\">\n  </span><span class=\"n\">select</span><span class=\"p\">(</span><span class=\"o\">-</span><span class=\"n\">index_target</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"c1\"># Plot</span><span class=\"w\">\n</span><span class=\"n\">par</span><span class=\"p\">(</span><span class=\"n\">mfrow</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"m\">1</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">2</span><span class=\"p\">),</span><span class=\"w\"> </span><span class=\"n\">mar</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"m\">1</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">1</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">1</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">1</span><span class=\"p\">),</span><span class=\"w\"> </span><span class=\"n\">bg</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">NA</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">plot</span><span class=\"p\">(</span><span class=\"n\">st_geometry</span><span class=\"p\">(</span><span class=\"n\">Fishnet</span><span class=\"p\">),</span><span class=\"w\"> </span><span class=\"n\">col</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">mypal</span><span class=\"p\">(</span><span class=\"m\">4</span><span class=\"p\">),</span><span class=\"w\"> </span><span class=\"n\">main</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"Fishnet\"</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">plot</span><span class=\"p\">(</span><span class=\"n\">st_geometry</span><span class=\"p\">(</span><span class=\"n\">Puzzle</span><span class=\"p\">),</span><span class=\"w\"> </span><span class=\"n\">col</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">mypal</span><span class=\"p\">(</span><span class=\"m\">4</span><span class=\"p\">),</span><span class=\"w\"> </span><span class=\"n\">main</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"Puzzle\"</span><span class=\"p\">)</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<p><img src=\"https://dieghernan.github.io/assets/img/blog/20190602_squares-1.webp\" alt=\"Two maps of Great Britain comparing separate square grid cells with cells merged into regional shapes. Colors distinguish regions.\" /></p>\n\n<h2 id=\"going-hex\">Going hex</h2>\n\n<p>Extremely easy. We just need to change the <code class=\"language-plaintext highlighter-rouge\">square</code> parameter of\n<code class=\"language-plaintext highlighter-rouge\">st_make_grid</code> from <code class=\"language-plaintext highlighter-rouge\">TRUE</code> to <code class=\"language-plaintext highlighter-rouge\">FALSE</code>.</p>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"n\">grid</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">st_make_grid</span><span class=\"p\">(</span><span class=\"n\">target</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"m\">50</span><span class=\"w\"> </span><span class=\"o\">*</span><span class=\"w\"> </span><span class=\"m\">1000</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"c1\"># Kms</span><span class=\"w\">\n  </span><span class=\"n\">crs</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">st_crs</span><span class=\"p\">(</span><span class=\"n\">initial</span><span class=\"p\">),</span><span class=\"w\">\n  </span><span class=\"n\">what</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"polygons\"</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">square</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">FALSE</span><span class=\"w\"> </span><span class=\"c1\"># This is the only piece that changes!!!</span><span class=\"w\">\n</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"c1\"># Make sf</span><span class=\"w\">\n</span><span class=\"n\">grid</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">st_sf</span><span class=\"p\">(</span><span class=\"n\">index</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">1</span><span class=\"o\">:</span><span class=\"nf\">length</span><span class=\"p\">(</span><span class=\"n\">lengths</span><span class=\"p\">(</span><span class=\"n\">grid</span><span class=\"p\">)),</span><span class=\"w\"> </span><span class=\"n\">grid</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"c1\"># Add index</span><span class=\"w\">\n\n</span><span class=\"c1\"># We identify the grids that belong to an entity by assessing the centroid</span><span class=\"w\">\n</span><span class=\"n\">cent_grid</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">st_centroid</span><span class=\"p\">(</span><span class=\"n\">grid</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">cent_merge</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">st_join</span><span class=\"p\">(</span><span class=\"n\">cent_grid</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">initial</span><span class=\"p\">[</span><span class=\"s2\">\"index_target\"</span><span class=\"p\">],</span><span class=\"w\"> </span><span class=\"n\">left</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nb\">F</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">grid_new</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">inner_join</span><span class=\"p\">(</span><span class=\"n\">grid</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">st_drop_geometry</span><span class=\"p\">(</span><span class=\"n\">cent_merge</span><span class=\"p\">))</span><span class=\"w\">\n\n</span><span class=\"c1\"># Honeycomb</span><span class=\"w\">\n</span><span class=\"n\">Honeygeom</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">aggregate</span><span class=\"p\">(</span><span class=\"w\">\n  </span><span class=\"n\">grid_new</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">by</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nf\">list</span><span class=\"p\">(</span><span class=\"n\">grid_new</span><span class=\"o\">$</span><span class=\"n\">index_target</span><span class=\"p\">),</span><span class=\"w\">\n  </span><span class=\"n\">FUN</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">min</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">do_union</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">FALSE</span><span class=\"w\">\n</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"c1\"># Let's add the data frame</span><span class=\"w\">\n</span><span class=\"n\">Honeycomb</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">left_join</span><span class=\"p\">(</span><span class=\"w\">\n  </span><span class=\"n\">Honeygeom</span><span class=\"w\"> </span><span class=\"o\">%&gt;%</span><span class=\"w\">\n    </span><span class=\"n\">select</span><span class=\"p\">(</span><span class=\"n\">index_target</span><span class=\"p\">),</span><span class=\"w\">\n  </span><span class=\"n\">st_drop_geometry</span><span class=\"p\">(</span><span class=\"n\">initial</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">%&gt;%</span><span class=\"w\">\n  </span><span class=\"n\">select</span><span class=\"p\">(</span><span class=\"o\">-</span><span class=\"n\">index_target</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"c1\"># Now let's create the hexbin</span><span class=\"w\">\n\n</span><span class=\"n\">Hexbingeom</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">aggregate</span><span class=\"p\">(</span><span class=\"w\">\n  </span><span class=\"n\">st_buffer</span><span class=\"p\">(</span><span class=\"n\">grid_new</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">0.5</span><span class=\"p\">),</span><span class=\"w\"> </span><span class=\"c1\"># Avoid slivers</span><span class=\"w\">\n  </span><span class=\"n\">by</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nf\">list</span><span class=\"p\">(</span><span class=\"n\">grid_new</span><span class=\"o\">$</span><span class=\"n\">index_target</span><span class=\"p\">),</span><span class=\"w\">\n  </span><span class=\"n\">FUN</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">min</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">do_union</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">TRUE</span><span class=\"w\">\n</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"n\">Hexbin</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">left_join</span><span class=\"p\">(</span><span class=\"w\">\n  </span><span class=\"n\">Hexbingeom</span><span class=\"w\"> </span><span class=\"o\">%&gt;%</span><span class=\"w\">\n    </span><span class=\"n\">select</span><span class=\"p\">(</span><span class=\"n\">index_target</span><span class=\"p\">),</span><span class=\"w\">\n  </span><span class=\"n\">st_drop_geometry</span><span class=\"p\">(</span><span class=\"n\">initial</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">%&gt;%</span><span class=\"w\">\n  </span><span class=\"n\">select</span><span class=\"p\">(</span><span class=\"o\">-</span><span class=\"n\">index_target</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"c1\"># Plot</span><span class=\"w\">\n</span><span class=\"n\">par</span><span class=\"p\">(</span><span class=\"n\">mfrow</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"m\">1</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">2</span><span class=\"p\">),</span><span class=\"w\"> </span><span class=\"n\">mar</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"m\">1</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">1</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">1</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">1</span><span class=\"p\">),</span><span class=\"w\"> </span><span class=\"n\">bg</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">NA</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">plot</span><span class=\"p\">(</span><span class=\"n\">st_geometry</span><span class=\"p\">(</span><span class=\"n\">Honeycomb</span><span class=\"p\">),</span><span class=\"w\"> </span><span class=\"n\">col</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">mypal</span><span class=\"p\">(</span><span class=\"m\">4</span><span class=\"p\">),</span><span class=\"w\"> </span><span class=\"n\">main</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"Honeycomb\"</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">plot</span><span class=\"p\">(</span><span class=\"n\">st_geometry</span><span class=\"p\">(</span><span class=\"n\">Hexbin</span><span class=\"p\">),</span><span class=\"w\"> </span><span class=\"n\">col</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">mypal</span><span class=\"p\">(</span><span class=\"m\">4</span><span class=\"p\">),</span><span class=\"w\"> </span><span class=\"n\">main</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"Hexbin\"</span><span class=\"p\">)</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<p><img src=\"https://dieghernan.github.io/assets/img/blog/20190602_hex-1.webp\" alt=\"Two maps of Great Britain comparing separate hexagonal grid cells with cells merged into regional shapes. Colors distinguish regions.\" /></p>\n\n<h2 id=\"pixel-it\">Pixel it!</h2>\n\n<p>Also quite easy, just a couple more tweaks, still using <code class=\"language-plaintext highlighter-rouge\">st_make_grid</code>.</p>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"n\">grid</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">st_make_grid</span><span class=\"p\">(</span><span class=\"n\">target</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"m\">50</span><span class=\"w\"> </span><span class=\"o\">*</span><span class=\"w\"> </span><span class=\"m\">1000</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"c1\"># Kms</span><span class=\"w\">\n  </span><span class=\"n\">crs</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">st_crs</span><span class=\"p\">(</span><span class=\"n\">initial</span><span class=\"p\">),</span><span class=\"w\">\n  </span><span class=\"n\">what</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"centers\"</span><span class=\"w\">\n</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"c1\"># Make sf</span><span class=\"w\">\n</span><span class=\"n\">grid</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">st_sf</span><span class=\"p\">(</span><span class=\"n\">index</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">1</span><span class=\"o\">:</span><span class=\"nf\">length</span><span class=\"p\">(</span><span class=\"n\">lengths</span><span class=\"p\">(</span><span class=\"n\">grid</span><span class=\"p\">)),</span><span class=\"w\"> </span><span class=\"n\">grid</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"c1\"># Add index</span><span class=\"w\">\n\n</span><span class=\"c1\"># We identify the grids that belong to an entity by assessing the centroid</span><span class=\"w\">\n</span><span class=\"n\">cent_grid</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">st_centroid</span><span class=\"p\">(</span><span class=\"n\">grid</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">cent_merge</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">st_join</span><span class=\"p\">(</span><span class=\"n\">cent_grid</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">initial</span><span class=\"p\">[</span><span class=\"s2\">\"index_target\"</span><span class=\"p\">],</span><span class=\"w\"> </span><span class=\"n\">left</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nb\">F</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">grid_new</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">st_buffer</span><span class=\"p\">(</span><span class=\"n\">cent_merge</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">50</span><span class=\"w\"> </span><span class=\"o\">*</span><span class=\"w\"> </span><span class=\"m\">1000</span><span class=\"w\"> </span><span class=\"o\">/</span><span class=\"w\"> </span><span class=\"m\">2</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">Pixelgeom</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">aggregate</span><span class=\"p\">(</span><span class=\"w\">\n  </span><span class=\"n\">grid_new</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">by</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nf\">list</span><span class=\"p\">(</span><span class=\"n\">grid_new</span><span class=\"o\">$</span><span class=\"n\">index_target</span><span class=\"p\">),</span><span class=\"w\">\n  </span><span class=\"n\">FUN</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">min</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">do_union</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">FALSE</span><span class=\"w\">\n</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"c1\"># Let's add the data frame</span><span class=\"w\">\n</span><span class=\"n\">Pixel</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">left_join</span><span class=\"p\">(</span><span class=\"w\">\n  </span><span class=\"n\">Pixelgeom</span><span class=\"w\"> </span><span class=\"o\">%&gt;%</span><span class=\"w\">\n    </span><span class=\"n\">select</span><span class=\"p\">(</span><span class=\"n\">index_target</span><span class=\"p\">),</span><span class=\"w\">\n  </span><span class=\"n\">st_drop_geometry</span><span class=\"p\">(</span><span class=\"n\">initial</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">%&gt;%</span><span class=\"w\">\n  </span><span class=\"n\">select</span><span class=\"p\">(</span><span class=\"o\">-</span><span class=\"n\">index_target</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"c1\"># Plot</span><span class=\"w\">\n</span><span class=\"n\">par</span><span class=\"p\">(</span><span class=\"n\">mfrow</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"m\">1</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">1</span><span class=\"p\">),</span><span class=\"w\"> </span><span class=\"n\">mar</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"m\">1</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">1</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">1</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">1</span><span class=\"p\">),</span><span class=\"w\"> </span><span class=\"n\">bg</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">NA</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">plot</span><span class=\"p\">(</span><span class=\"n\">st_geometry</span><span class=\"p\">(</span><span class=\"n\">Pixel</span><span class=\"p\">),</span><span class=\"w\"> </span><span class=\"n\">col</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">mypal</span><span class=\"p\">(</span><span class=\"m\">4</span><span class=\"p\">),</span><span class=\"w\"> </span><span class=\"n\">main</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"Pixel\"</span><span class=\"p\">)</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<p><img src=\"https://dieghernan.github.io/assets/img/blog/20190602_pix-1.webp\" alt=\"Map of Great Britain represented by separated square pixels, colored by region.\" /></p>\n\n<h2 id=\"wrap-up\">Wrap up</h2>\n\n<p>Finally, I wrapped all that in a function named <code class=\"language-plaintext highlighter-rouge\">stdh_gridpol</code>. See the code in\n<a href=\"https://github.com/dieghernan/dieghernan.github.io/tree/master/assets/functions\">my repo</a>:</p>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"n\">stdh_gridpol</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"k\">function</span><span class=\"p\">(</span><span class=\"n\">sf</span><span class=\"p\">,</span><span class=\"w\">\n                         </span><span class=\"n\">to</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"fishnet\"</span><span class=\"p\">,</span><span class=\"w\">\n                         </span><span class=\"n\">gridsize</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nf\">as.integer</span><span class=\"p\">(</span><span class=\"w\">\n                           </span><span class=\"nf\">min</span><span class=\"p\">(</span><span class=\"w\">\n                             </span><span class=\"n\">diff</span><span class=\"p\">(</span><span class=\"n\">st_bbox</span><span class=\"p\">(</span><span class=\"n\">sf</span><span class=\"p\">)[</span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"m\">1</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">3</span><span class=\"p\">)]),</span><span class=\"w\">\n                             </span><span class=\"n\">diff</span><span class=\"p\">(</span><span class=\"n\">st_bbox</span><span class=\"p\">(</span><span class=\"n\">sf</span><span class=\"p\">)[</span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"m\">2</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">4</span><span class=\"p\">)])</span><span class=\"w\">\n                           </span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">/</span><span class=\"w\"> </span><span class=\"m\">40</span><span class=\"w\">\n                         </span><span class=\"p\">),</span><span class=\"w\">\n                         </span><span class=\"n\">sliver</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">0.5</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"p\">{</span><span class=\"w\">\n  </span><span class=\"k\">if</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"o\">!</span><span class=\"n\">unique</span><span class=\"p\">(</span><span class=\"n\">st_geometry_type</span><span class=\"p\">(</span><span class=\"n\">sf</span><span class=\"p\">))</span><span class=\"w\"> </span><span class=\"o\">%in%</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"s2\">\"POLYGON\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"MULTIPOLYGON\"</span><span class=\"p\">))</span><span class=\"w\"> </span><span class=\"p\">{</span><span class=\"w\">\n    </span><span class=\"n\">stop</span><span class=\"p\">(</span><span class=\"s2\">\"Input should be MULTIPOLYGON or POLYGON\"</span><span class=\"p\">)</span><span class=\"w\">\n  </span><span class=\"p\">}</span><span class=\"w\">\n  </span><span class=\"k\">if</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"o\">!</span><span class=\"n\">to</span><span class=\"w\"> </span><span class=\"o\">%in%</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"s2\">\"fishnet\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"puzzle\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"honeycomb\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"hexbin\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"pixel\"</span><span class=\"p\">))</span><span class=\"w\"> </span><span class=\"p\">{</span><span class=\"w\">\n    </span><span class=\"n\">stop</span><span class=\"p\">(</span><span class=\"s2\">\"'to' should be 'fishnet','puzzle','honeycomb','hexbin' or 'pixel'\"</span><span class=\"p\">)</span><span class=\"w\">\n  </span><span class=\"p\">}</span><span class=\"w\">\n\n  </span><span class=\"k\">if</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"nf\">class</span><span class=\"p\">(</span><span class=\"n\">sf</span><span class=\"p\">)[</span><span class=\"m\">1</span><span class=\"p\">]</span><span class=\"w\"> </span><span class=\"o\">==</span><span class=\"w\"> </span><span class=\"s2\">\"sf\"</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"p\">{</span><span class=\"w\">\n    </span><span class=\"n\">initial</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">sf</span><span class=\"w\">\n    </span><span class=\"n\">initial</span><span class=\"o\">$</span><span class=\"n\">index_target</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"m\">1</span><span class=\"o\">:</span><span class=\"n\">nrow</span><span class=\"p\">(</span><span class=\"n\">initial</span><span class=\"p\">)</span><span class=\"w\">\n  </span><span class=\"p\">}</span><span class=\"w\"> </span><span class=\"k\">else</span><span class=\"w\"> </span><span class=\"p\">{</span><span class=\"w\">\n    </span><span class=\"n\">initial</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">st_sf</span><span class=\"p\">(</span><span class=\"n\">index_target</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">1</span><span class=\"o\">:</span><span class=\"nf\">length</span><span class=\"p\">(</span><span class=\"n\">sf</span><span class=\"p\">),</span><span class=\"w\"> </span><span class=\"n\">geom</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">sf</span><span class=\"p\">)</span><span class=\"w\">\n  </span><span class=\"p\">}</span><span class=\"w\">\n\n  </span><span class=\"n\">target</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">st_geometry</span><span class=\"p\">(</span><span class=\"n\">initial</span><span class=\"p\">)</span><span class=\"w\">\n\n  </span><span class=\"k\">if</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"n\">to</span><span class=\"w\"> </span><span class=\"o\">%in%</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"s2\">\"fishnet\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"puzzle\"</span><span class=\"p\">))</span><span class=\"w\"> </span><span class=\"p\">{</span><span class=\"w\">\n    </span><span class=\"n\">sq</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"nb\">T</span><span class=\"w\">\n  </span><span class=\"p\">}</span><span class=\"w\"> </span><span class=\"k\">else</span><span class=\"w\"> </span><span class=\"p\">{</span><span class=\"w\">\n    </span><span class=\"n\">sq</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"nb\">F</span><span class=\"w\">\n  </span><span class=\"p\">}</span><span class=\"w\">\n  </span><span class=\"k\">if</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"n\">to</span><span class=\"w\"> </span><span class=\"o\">==</span><span class=\"w\"> </span><span class=\"s2\">\"pixel\"</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"p\">{</span><span class=\"w\">\n    </span><span class=\"n\">grid</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">st_make_grid</span><span class=\"p\">(</span><span class=\"n\">target</span><span class=\"p\">,</span><span class=\"w\">\n      </span><span class=\"n\">gridsize</span><span class=\"p\">,</span><span class=\"w\">\n      </span><span class=\"n\">crs</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">st_crs</span><span class=\"p\">(</span><span class=\"n\">initial</span><span class=\"p\">),</span><span class=\"w\">\n      </span><span class=\"n\">what</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"centers\"</span><span class=\"w\">\n    </span><span class=\"p\">)</span><span class=\"w\">\n  </span><span class=\"p\">}</span><span class=\"w\"> </span><span class=\"k\">else</span><span class=\"w\"> </span><span class=\"p\">{</span><span class=\"w\">\n    </span><span class=\"n\">grid</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">st_make_grid</span><span class=\"p\">(</span><span class=\"w\">\n      </span><span class=\"n\">target</span><span class=\"p\">,</span><span class=\"w\">\n      </span><span class=\"n\">gridsize</span><span class=\"p\">,</span><span class=\"w\">\n      </span><span class=\"n\">crs</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">st_crs</span><span class=\"p\">(</span><span class=\"n\">initial</span><span class=\"p\">),</span><span class=\"w\">\n      </span><span class=\"n\">what</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"polygons\"</span><span class=\"p\">,</span><span class=\"w\">\n      </span><span class=\"n\">square</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">sq</span><span class=\"w\">\n    </span><span class=\"p\">)</span><span class=\"w\">\n  </span><span class=\"p\">}</span><span class=\"w\">\n  </span><span class=\"n\">grid</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">st_sf</span><span class=\"p\">(</span><span class=\"n\">index</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">1</span><span class=\"o\">:</span><span class=\"nf\">length</span><span class=\"p\">(</span><span class=\"n\">lengths</span><span class=\"p\">(</span><span class=\"n\">grid</span><span class=\"p\">)),</span><span class=\"w\"> </span><span class=\"n\">grid</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"c1\"># Add index</span><span class=\"w\">\n  </span><span class=\"k\">if</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"n\">to</span><span class=\"w\"> </span><span class=\"o\">==</span><span class=\"w\"> </span><span class=\"s2\">\"pixel\"</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"p\">{</span><span class=\"w\">\n    </span><span class=\"n\">cent_merge</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">st_join</span><span class=\"p\">(</span><span class=\"n\">grid</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">initial</span><span class=\"p\">[</span><span class=\"s2\">\"index_target\"</span><span class=\"p\">],</span><span class=\"w\"> </span><span class=\"n\">left</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nb\">F</span><span class=\"p\">)</span><span class=\"w\">\n    </span><span class=\"n\">grid_new</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">st_buffer</span><span class=\"p\">(</span><span class=\"n\">cent_merge</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">gridsize</span><span class=\"w\"> </span><span class=\"o\">/</span><span class=\"w\"> </span><span class=\"m\">2</span><span class=\"p\">)</span><span class=\"w\">\n  </span><span class=\"p\">}</span><span class=\"w\"> </span><span class=\"k\">else</span><span class=\"w\"> </span><span class=\"p\">{</span><span class=\"w\">\n    </span><span class=\"n\">cent_grid</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">st_centroid</span><span class=\"p\">(</span><span class=\"n\">grid</span><span class=\"p\">)</span><span class=\"w\">\n    </span><span class=\"n\">cent_merge</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">st_join</span><span class=\"p\">(</span><span class=\"n\">cent_grid</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">initial</span><span class=\"p\">[</span><span class=\"s2\">\"index_target\"</span><span class=\"p\">],</span><span class=\"w\"> </span><span class=\"n\">left</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nb\">F</span><span class=\"p\">)</span><span class=\"w\">\n    </span><span class=\"n\">grid_new</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">inner_join</span><span class=\"p\">(</span><span class=\"n\">grid</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">st_drop_geometry</span><span class=\"p\">(</span><span class=\"n\">cent_merge</span><span class=\"p\">))</span><span class=\"w\">\n  </span><span class=\"p\">}</span><span class=\"w\">\n  </span><span class=\"k\">if</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"n\">to</span><span class=\"w\"> </span><span class=\"o\">%in%</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"s2\">\"fishnet\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"honeycomb\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"pixel\"</span><span class=\"p\">))</span><span class=\"w\"> </span><span class=\"p\">{</span><span class=\"w\">\n    </span><span class=\"n\">geom</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">aggregate</span><span class=\"p\">(</span><span class=\"w\">\n      </span><span class=\"n\">grid_new</span><span class=\"p\">,</span><span class=\"w\">\n      </span><span class=\"n\">by</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nf\">list</span><span class=\"p\">(</span><span class=\"n\">grid_new</span><span class=\"o\">$</span><span class=\"n\">index_target</span><span class=\"p\">),</span><span class=\"w\">\n      </span><span class=\"n\">FUN</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">min</span><span class=\"p\">,</span><span class=\"w\">\n      </span><span class=\"n\">do_union</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">FALSE</span><span class=\"w\">\n    </span><span class=\"p\">)</span><span class=\"w\">\n  </span><span class=\"p\">}</span><span class=\"w\"> </span><span class=\"k\">else</span><span class=\"w\"> </span><span class=\"p\">{</span><span class=\"w\">\n    </span><span class=\"n\">geom</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">aggregate</span><span class=\"p\">(</span><span class=\"w\">\n      </span><span class=\"n\">st_buffer</span><span class=\"p\">(</span><span class=\"n\">grid_new</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">sliver</span><span class=\"p\">),</span><span class=\"w\">\n      </span><span class=\"n\">by</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nf\">list</span><span class=\"p\">(</span><span class=\"n\">grid_new</span><span class=\"o\">$</span><span class=\"n\">index_target</span><span class=\"p\">),</span><span class=\"w\">\n      </span><span class=\"n\">FUN</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">min</span><span class=\"p\">,</span><span class=\"w\">\n      </span><span class=\"n\">do_union</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">TRUE</span><span class=\"w\">\n    </span><span class=\"p\">)</span><span class=\"w\">\n  </span><span class=\"p\">}</span><span class=\"w\">\n  </span><span class=\"k\">if</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"nf\">class</span><span class=\"p\">(</span><span class=\"n\">initial</span><span class=\"p\">)[</span><span class=\"m\">1</span><span class=\"p\">]</span><span class=\"w\"> </span><span class=\"o\">==</span><span class=\"w\"> </span><span class=\"s2\">\"sf\"</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"p\">{</span><span class=\"w\">\n    </span><span class=\"n\">fin</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">left_join</span><span class=\"p\">(</span><span class=\"w\">\n      </span><span class=\"n\">geom</span><span class=\"w\"> </span><span class=\"o\">%&gt;%</span><span class=\"w\"> </span><span class=\"n\">select</span><span class=\"p\">(</span><span class=\"n\">index_target</span><span class=\"p\">),</span><span class=\"w\">\n      </span><span class=\"n\">st_drop_geometry</span><span class=\"p\">(</span><span class=\"n\">initial</span><span class=\"p\">)</span><span class=\"w\">\n    </span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">%&gt;%</span><span class=\"w\">\n      </span><span class=\"n\">select</span><span class=\"p\">(</span><span class=\"o\">-</span><span class=\"n\">index_target</span><span class=\"p\">)</span><span class=\"w\">\n    </span><span class=\"n\">fin</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">st_cast</span><span class=\"p\">(</span><span class=\"n\">fin</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"MULTIPOLYGON\"</span><span class=\"p\">)</span><span class=\"w\">\n    </span><span class=\"nf\">return</span><span class=\"p\">(</span><span class=\"n\">fin</span><span class=\"p\">)</span><span class=\"w\">\n  </span><span class=\"p\">}</span><span class=\"w\"> </span><span class=\"k\">else</span><span class=\"w\"> </span><span class=\"p\">{</span><span class=\"w\">\n    </span><span class=\"n\">fin</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">st_cast</span><span class=\"p\">(</span><span class=\"n\">geom</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"MULTIPOLYGON\"</span><span class=\"p\">)</span><span class=\"w\">\n    </span><span class=\"nf\">return</span><span class=\"p\">(</span><span class=\"n\">st_geometry</span><span class=\"p\">(</span><span class=\"n\">fin</span><span class=\"p\">))</span><span class=\"w\">\n  </span><span class=\"p\">}</span><span class=\"w\">\n</span><span class=\"p\">}</span><span class=\"w\">\n</span><span class=\"c1\"># End of the function-----</span><span class=\"w\">\n\n</span><span class=\"n\">fish</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">stdh_gridpol</span><span class=\"p\">(</span><span class=\"n\">GB</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">to</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"fishnet\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">gridsize</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">50</span><span class=\"w\"> </span><span class=\"o\">*</span><span class=\"w\"> </span><span class=\"m\">1000</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">puzz</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">stdh_gridpol</span><span class=\"p\">(</span><span class=\"n\">GB</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">to</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"puzzle\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">gridsize</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">50</span><span class=\"w\"> </span><span class=\"o\">*</span><span class=\"w\"> </span><span class=\"m\">1000</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">hon</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">stdh_gridpol</span><span class=\"p\">(</span><span class=\"n\">GB</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">to</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"honeycomb\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">gridsize</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">50</span><span class=\"w\"> </span><span class=\"o\">*</span><span class=\"w\"> </span><span class=\"m\">1000</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">hex</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">stdh_gridpol</span><span class=\"p\">(</span><span class=\"n\">GB</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">to</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"hexbin\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">gridsize</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">50</span><span class=\"w\"> </span><span class=\"o\">*</span><span class=\"w\"> </span><span class=\"m\">1000</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">pix</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">stdh_gridpol</span><span class=\"p\">(</span><span class=\"n\">GB</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">to</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"pixel\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">gridsize</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">50</span><span class=\"w\"> </span><span class=\"o\">*</span><span class=\"w\"> </span><span class=\"m\">1000</span><span class=\"p\">)</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<p><img src=\"https://dieghernan.github.io/assets/img/blog/20190602_functionex-1.webp\" alt=\"Grid of maps of Great Britain comparing square, hexagonal and pixel representations at different grid sizes.\" /></p>\n\n<p>And that’s it! The function <code class=\"language-plaintext highlighter-rouge\">stdh_gridpol</code> has some alert mechanisms, such as\naccepting only <code class=\"language-plaintext highlighter-rouge\">POLYGON</code> or <code class=\"language-plaintext highlighter-rouge\">MULTIPOLYGON</code>, and the default value of <code class=\"language-plaintext highlighter-rouge\">gridsize</code>\nis computed so that the shortest dimension has 40 cells.</p>\n",
      "date_published": "2019-06-02T00:00:00+02:00",
      "image": "https://dieghernan.github.io/assets/img/blog/20190602_imgpost-1.webp",
      "summary": "Turn a map into fishnets, honeycombs or pixels and see how each grid changes the result.",
      "tags": ["r_bloggers","rstats","rspatial","beautiful_maps","maps","sf","giscoR"],
      "authors": [{
        "name": "Diego HH",
        "url": "https://dieghernan.github.io/"
      }]
    },
    {
      "id": "https://dieghernan.github.io/201905_Leaflet_R_Jekyll/",
      "url": "https://dieghernan.github.io/201905_Leaflet_R_Jekyll/",
      "title": "Leaflet, R, Markdown, Jekyll and GitHub",
      "content_html": "<p>Recently, I have been struggling when trying to embed a\n<a href=\"https://rstudio.github.io/leaflet\">leaflet</a> map created with\n<strong>RStudio</strong> on my blog, hosted on GitHub via\n<a href=\"https://jekyllrb.com\">Jekyll</a> (<strong>Spoiler</strong>: <a href=\"https://dieghernan.github.io/201905_Where-in-the-world/\">I succeeded\n<i class=\"fa fa-thumbs-up\"></i></a>).\nIn my case, I use the <a href=\"https://dieghernan.github.io/chulapa/\"><span class=\"chulapa\">Chulapa</span></a>\nremote theme that I created.</p>\n\n<p><strong>Index</strong></p>\n\n<ol>\n  <li>The generated ToC will be an ordered list</li>\n</ol>\n\n<p>Ready? Let’s go!</p>\n\n<h3 id=\"the-githubjekyll-part\">The GitHub/Jekyll part</h3>\n\n<p>The first step is to install the required libraries on your GitHub\npage. As Jekyll basically transforms Markdown into HTML, this step\nis a matter of <strong>what to include</strong> and <strong>where</strong> in your own repository.</p>\n\n<h4 id=\"1-what-to-include\">1. What to include</h4>\n\n<p>This part is not really hard. When looking at the source code of the\n<a href=\"https://rstudio.github.io/leaflet/\">Leaflet for R</a> site, you can see this\nchunk:</p>\n\n<div class=\"language-html highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"nt\">&lt;head&gt;</span>\n  <span class=\"c\">&lt;!--code--&gt;</span>\n\n  <span class=\"nt\">&lt;script </span><span class=\"na\">src=</span><span class=\"s\">\"libs/jquery/jquery.min.js\"</span><span class=\"nt\">&gt;&lt;/script&gt;</span>\n  <span class=\"nt\">&lt;meta</span> <span class=\"na\">name=</span><span class=\"s\">\"viewport\"</span> <span class=\"na\">content=</span><span class=\"s\">\"width=device-width, initial-scale=1\"</span> <span class=\"nt\">/&gt;</span>\n  <span class=\"nt\">&lt;link</span> <span class=\"na\">href=</span><span class=\"s\">\"libs/bootstrap/css/flatly.min.css\"</span> <span class=\"na\">rel=</span><span class=\"s\">\"stylesheet\"</span> <span class=\"nt\">/&gt;</span>\n  <span class=\"nt\">&lt;script </span><span class=\"na\">src=</span><span class=\"s\">\"libs/bootstrap/js/bootstrap.min.js\"</span><span class=\"nt\">&gt;&lt;/script&gt;</span>\n  <span class=\"nt\">&lt;script </span><span class=\"na\">src=</span><span class=\"s\">\"libs/bootstrap/shim/html5shiv.min.js\"</span><span class=\"nt\">&gt;&lt;/script&gt;</span>\n\n  ...\n  <span class=\"c\">&lt;!--more libraries--&gt;</span>\n  ...\n\n  <span class=\"nt\">&lt;link</span> <span class=\"na\">href=</span><span class=\"s\">\"libs/rstudio_leaflet/rstudio_leaflet.css\"</span> <span class=\"na\">rel=</span><span class=\"s\">\"stylesheet\"</span> <span class=\"nt\">/&gt;</span>\n  <span class=\"nt\">&lt;script </span><span class=\"na\">src=</span><span class=\"s\">\"libs/leaflet-binding/leaflet.js\"</span><span class=\"nt\">&gt;&lt;/script&gt;</span>\n\n  <span class=\"c\">&lt;!--code--&gt;</span>\n<span class=\"nt\">&lt;/head&gt;</span>\n</code></pre></div></div>\n\n<p>So now we have it! The only thing to remember is that we need to load\nthe libraries from the <strong>leaflet</strong> server\n(<code class=\"language-plaintext highlighter-rouge\">https://rstudio.github.io/leaflet</code>), meaning that we have to prepend\nthat URL to the libraries in our installation:</p>\n\n<div class=\"language-html highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"nt\">&lt;script </span><span class=\"na\">src=</span><span class=\"s\">\"https://rstudio.github.io/leaflet/libs/jquery/jquery.min.js\"</span><span class=\"nt\">&gt;&lt;/script&gt;</span>\n<span class=\"nt\">&lt;meta</span> <span class=\"na\">name=</span><span class=\"s\">\"viewport\"</span> <span class=\"na\">content=</span><span class=\"s\">\"width=device-width, initial-scale=1\"</span> <span class=\"nt\">/&gt;</span>\n<span class=\"nt\">&lt;link</span>\n  <span class=\"na\">href=</span><span class=\"s\">\"https://rstudio.github.io/leaflet/libs/bootstrap/css/flatly.min.css\"</span>\n  <span class=\"na\">rel=</span><span class=\"s\">\"stylesheet\"</span>\n<span class=\"nt\">/&gt;</span>\n\n...\n<span class=\"c\">&lt;!--more libraries--&gt;</span>\n...\n\n<span class=\"nt\">&lt;link</span>\n  <span class=\"na\">href=</span><span class=\"s\">\"https://rstudio.github.io/leaflet/libs/rstudio_leaflet/rstudio_leaflet.css\"</span>\n  <span class=\"na\">rel=</span><span class=\"s\">\"stylesheet\"</span>\n<span class=\"nt\">/&gt;</span>\n<span class=\"nt\">&lt;script </span><span class=\"na\">src=</span><span class=\"s\">\"https://rstudio.github.io/leaflet/libs/leaflet-binding/leaflet.js\"</span><span class=\"nt\">&gt;&lt;/script&gt;</span>\n</code></pre></div></div>\n\n<p>You can have a look at my implementation in\n<a href=\"https://github.com/dieghernan/dieghernan.github.io/blob/master/_includes/leaflet.html\"><code class=\"language-plaintext highlighter-rouge\">./_includes/leaflet.html</code></a>.</p>\n\n<h4 id=\"2-where-to-include\">2. Where to include</h4>\n\n<p>This is a little more complicated, depending on the structure of your\nJekyll template. The code chunk should be included in the <code class=\"language-plaintext highlighter-rouge\">&lt;head&gt;</code>\nsection of your page, so you would need to find where to put it. In the\ncase of <span class=\"chulapa\">Chulapa</span> it is on\n<a href=\"https://github.com/dieghernan/dieghernan.github.io/blob/master/_includes/custom/custom_head_before_css.html\"><code class=\"language-plaintext highlighter-rouge\">./_includes/custom/custom_head_before_css.html</code></a>.</p>\n\n<p>So now you just have to paste the code that you got in step 1 into the\n<code class=\"language-plaintext highlighter-rouge\">&lt;head&gt;</code>.</p>\n\n<p class=\"alert alert-info p-3 mx-2 mb-3\"><i class=\"fa fa-star\"></i> <strong>Pro tip:</strong> For a better performance of the\nsite, include these libraries only when you need them. In my case, I added\na custom variable in my YAML front matter for those posts with a leaflet\nmap, <code class=\"language-plaintext highlighter-rouge\">leafletmap: true</code>. Go to step 4 for a working example.</p>\n\n<h3 id=\"the-rstudio-part\">The RStudio part</h3>\n\n<h4 id=\"3-creating-the-leaflet-map\">3. Creating the leaflet map</h4>\n\n<p>Now it’s time to create a leaflet map with <strong>RStudio</strong>. I will keep it\nsimple for this post, so I took the first example provided in <a href=\"https://rstudio.github.io/leaflet/\">Leaflet\nfor R - Introduction</a>.</p>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"n\">library</span><span class=\"p\">(</span><span class=\"n\">leaflet</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"n\">m</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">leaflet</span><span class=\"p\">()</span><span class=\"w\"> </span><span class=\"o\">%&gt;%</span><span class=\"w\">\n  </span><span class=\"n\">addTiles</span><span class=\"p\">()</span><span class=\"w\"> </span><span class=\"o\">%&gt;%</span><span class=\"w\">  </span><span class=\"c1\"># Add default OpenStreetMap map tiles</span><span class=\"w\">\n  </span><span class=\"n\">addMarkers</span><span class=\"p\">(</span><span class=\"n\">lng</span><span class=\"o\">=</span><span class=\"m\">174.768</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">lat</span><span class=\"o\">=</span><span class=\"m\">-36.852</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">popup</span><span class=\"o\">=</span><span class=\"s2\">\"The birthplace of R\"</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">m</span><span class=\"w\">  </span><span class=\"c1\"># Print the map</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<p>It is assumed that you are <a href=\"https://rmarkdown.rstudio.com/authoring_quick_tour.html#rendering_output\">creating a post with\n<strong>RStudio</strong></a>,\nso the code presented above should be embedded in an <code class=\"language-plaintext highlighter-rouge\">.Rmd</code> file.</p>\n\n<h4 id=\"4-set-up-the-yaml-front-matter-\">4. Set up the YAML front matter <a name=\"step4\"></a></h4>\n\n<p>Before knitting your <code class=\"language-plaintext highlighter-rouge\">.Rmd</code>, you have to set up the <a href=\"https://bookdown.org/yihui/rmarkdown/markdown-document.html\">YAML front\nmatter</a>.\nHere it is <strong>essential</strong> to set up the option <code class=\"language-plaintext highlighter-rouge\">always_allow_html: yes</code>,\nas well as <code class=\"language-plaintext highlighter-rouge\">output: github_document</code>. As an example, this post was\ncreated with this front matter:</p>\n\n<div class=\"language-yaml highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"nn\">---</span>\n<span class=\"na\">title</span><span class=\"pi\">:</span> <span class=\"s\">Leaflet, &lt;strong&gt;R&lt;/strong&gt;, Markdown, Jekyll and GitHub</span>\n<span class=\"na\">subtitle</span><span class=\"pi\">:</span> <span class=\"s\">Make it work in 6 steps - a short tutorial</span>\n<span class=\"na\">tags</span><span class=\"pi\">:</span> <span class=\"pi\">[</span><span class=\"nv\">R</span><span class=\"pi\">,</span> <span class=\"nv\">leaflet</span><span class=\"pi\">,</span> <span class=\"nv\">Jekyll</span><span class=\"pi\">,</span> <span class=\"nv\">html</span><span class=\"pi\">,</span> <span class=\"nv\">maps</span><span class=\"pi\">]</span>\n<span class=\"na\">header_img</span><span class=\"pi\">:</span> <span class=\"s\">https://dieghernan.github.io/assets/figs/20190520_imgpost.webp</span>\n<span class=\"na\">leafletmap</span><span class=\"pi\">:</span> <span class=\"kc\">true</span>\n<span class=\"na\">always_allow_html</span><span class=\"pi\">:</span> <span class=\"s\">yes</span>\n<span class=\"na\">last_modified_at</span><span class=\"pi\">:</span> <span class=\"s\">2021-05-30</span>\n<span class=\"na\">output</span><span class=\"pi\">:</span>\n  <span class=\"na\">md_document</span><span class=\"pi\">:</span>\n    <span class=\"na\">variant</span><span class=\"pi\">:</span> <span class=\"s\">gfm</span>\n    <span class=\"na\">preserve_yaml</span><span class=\"pi\">:</span> <span class=\"kc\">true</span>\n<span class=\"nn\">---</span>\n</code></pre></div></div>\n\n<p>We are almost there! Now “Knit” your code and get the corresponding\n<code class=\"language-plaintext highlighter-rouge\">.md</code> file.</p>\n\n<h3 id=\"the-markdown-part\">The Markdown part</h3>\n\n<h4 id=\"5-modifying-the-md-file\"><del>5. Modifying the <code class=\"language-plaintext highlighter-rouge\">.md</code> file</del></h4>\n\n<p><strong>Update: This is no longer needed. I have kept it here for reference.\nYou can skip to the next section.</strong></p>\n\n<p>Have a look at the <code class=\"language-plaintext highlighter-rouge\">.md</code> code that you have just created. Although not\ndisplayed in the preview, you can see in the file itself a chunk that\nlooks like this:</p>\n\n<div class=\"language-html highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"nt\">&lt;script </span><span class=\"na\">type=</span><span class=\"s\">\"application/json\"</span> <span class=\"na\">data-for=</span><span class=\"s\">\"7ab57412f7b1df4d5773\"</span><span class=\"nt\">&gt;</span>\n  <span class=\"p\">{</span><span class=\"dl\">\"</span><span class=\"s2\">x</span><span class=\"dl\">\"</span><span class=\"p\">:{</span><span class=\"dl\">\"</span><span class=\"s2\">options</span><span class=\"dl\">\"</span><span class=\"p\">:</span>\n    <span class=\"p\">...</span>\n    <span class=\"dl\">\"</span><span class=\"s2\">jsHooks</span><span class=\"dl\">\"</span><span class=\"p\">:[]}</span>\n<span class=\"nt\">&lt;/script&gt;</span>\n</code></pre></div></div>\n\n<p>Actually that chunk is your leaflet map, created with <strong>RStudio</strong>. You\ncan’t see it now because you are previewing a <code class=\"language-plaintext highlighter-rouge\">markdown</code> file in your\nlocal PC, and the libraries installed in step 1 are installed on GitHub,\nbut we will solve that later.</p>\n\n<p>Now you just need to paste this piece of code before that chunk:</p>\n\n<div class=\"language-html highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"c\">&lt;!--html_preserve--&gt;</span>\n<span class=\"nt\">&lt;div</span> <span class=\"na\">id=</span><span class=\"s\">\"htmlwidget-7ab57412f7b1df4d5773\"</span> <span class=\"na\">style=</span><span class=\"s\">\"width:100%;height:216px;\"</span> <span class=\"na\">class=</span><span class=\"s\">\"leaflet html-widget\"</span><span class=\"nt\">&gt;&lt;/div&gt;</span>\n  <span class=\"nt\">&lt;script </span><span class=\"na\">type=</span><span class=\"s\">\"application/json\"</span> <span class=\"na\">data-for=</span><span class=\"s\">\"htmlwidget-7ab57412f7b1df4d5773\"</span><span class=\"nt\">&gt;</span>\n  <span class=\"p\">...</span>\n</code></pre></div></div>\n\n<p class=\"alert alert-warning p-3 mx-2 my-3\"><i class=\"fa fa-exclamation-triangle\"></i> <strong>Warning:</strong> Be sure that the\nwidget id (<code class=\"language-plaintext highlighter-rouge\">7ab57412f7b1df4d5773</code> in the example) is the same in the\n<code class=\"language-plaintext highlighter-rouge\">&lt;div&gt;</code> and in the <code class=\"language-plaintext highlighter-rouge\">&lt;script&gt;</code> part. If not, your map would not load.</p>\n\n<p>The <code class=\"language-plaintext highlighter-rouge\">style=\"width:100%; height:216px;\"</code> part controls the actual size of\nthe leaflet widget. In this case, the map will adapt to the width of\nthe page with a fixed height of 216px. I put <a href=\"https://dieghernan.github.io/201905_Leaflet_R_Jekyll/#extra\">some examples</a> of\ndifferent size options at the end of the post so you can have a look and see\nwhich one is more suitable for your needs.</p>\n\n<h4 id=\"6-publish-your-post\">6. Publish your post</h4>\n\n<p>Now you just have to publish your post as usual! If everything has been\nproperly set, when Jekyll builds your post it will include the\nlibraries in the header and make the magic happen, just like this:</p>\n\n<div id=\"htmlwidget-60e5339b540855d29db4\" style=\"width:672px;height:480px;\" class=\"leaflet html-widget\"></div>\n<script type=\"application/json\" data-for=\"htmlwidget-60e5339b540855d29db4\">{\"x\":{\"options\":{\"crs\":{\"crsClass\":\"L.CRS.EPSG3857\",\"code\":null,\"proj4def\":null,\"projectedBounds\":null,\"options\":{}}},\"calls\":[{\"method\":\"addTiles\",\"args\":[\"//{s}.tile.openstreetmap.org/{z}/{x}/{y}.png\",null,null,{\"minZoom\":0,\"maxZoom\":18,\"tileSize\":256,\"subdomains\":\"abc\",\"errorTileUrl\":\"\",\"tms\":false,\"noWrap\":false,\"zoomOffset\":0,\"zoomReverse\":false,\"opacity\":1,\"zIndex\":1,\"detectRetina\":false,\"attribution\":\"&copy; <a href=\\\"http://openstreetmap.org\\\">OpenStreetMap<\\/a> contributors, <a href=\\\"http://creativecommons.org/licenses/by-sa/2.0/\\\">CC-BY-SA<\\/a>\"}]},{\"method\":\"addMarkers\",\"args\":[-36.852,174.768,null,null,null,{\"interactive\":true,\"draggable\":false,\"keyboard\":true,\"title\":\"\",\"alt\":\"\",\"zIndexOffset\":0,\"opacity\":1,\"riseOnHover\":false,\"riseOffset\":250},\"The birthplace of R\",null,null,null,null,{\"interactive\":false,\"permanent\":false,\"direction\":\"auto\",\"opacity\":1,\"offset\":[0,0],\"textsize\":\"10px\",\"textOnly\":false,\"className\":\"\",\"sticky\":true},null]}],\"limits\":{\"lat\":[-36.852,-36.852],\"lng\":[174.768,174.768]}},\"evals\":[],\"jsHooks\":[]}</script>\n\n<p class=\"alert alert-warning p-3 mx-2 my-3\"><i class=\"fa fa-exclamation-triangle\"></i> <strong>Warning:</strong> Have you checked\nthe YAML front matter of your <code class=\"language-plaintext highlighter-rouge\">.md</code> file? Have another look, especially\nif you have followed my Pro tip.</p>\n\n<h3 id=\"gallery-size-of-a-leaflet-map-\">Gallery: size of a leaflet map <a name=\"extra\"></a></h3>\n\n<p><strong>A note:</strong> For a complete understanding of this section, it is\nrecommended to access it on multiple devices, so you can see the\ndifferent behavior on different screens. Google Chrome allows you to\nsimulate different devices <a href=\"https://developers.google.com/web/tools/chrome-devtools/device-mode/\">(more info\nhere)</a>.</p>\n\n<h4 id=\"fixed-size\">Fixed size</h4>\n\n<p>With these examples, you can see how to control the absolute size of the\nleaflet map. The disadvantage of this method is that the size would be\nfixed for all the devices, so maps sized for smartphones or tablets\nwouldn’t look as nice on laptops, and vice versa.</p>\n\n<h5 id=\"example-1-672x480px\">Example 1: 672x480px</h5>\n\n<p>Fixed size in pixels. The default on my machine:</p>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"n\">leaflet</span><span class=\"p\">(</span><span class=\"n\">options</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">leafletOptions</span><span class=\"p\">(</span><span class=\"n\">minZoom</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">1.25</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">maxZoom</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">8</span><span class=\"p\">))</span><span class=\"w\"> </span><span class=\"o\">%&gt;%</span><span class=\"w\">\n  </span><span class=\"n\">addTiles</span><span class=\"p\">()</span><span class=\"w\"> </span><span class=\"o\">%&gt;%</span><span class=\"w\">\n  </span><span class=\"n\">setMaxBounds</span><span class=\"p\">(</span><span class=\"m\">-200</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">-90</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">200</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">90</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">%&gt;%</span><span class=\"w\">\n  </span><span class=\"n\">setView</span><span class=\"p\">(</span><span class=\"m\">-3.56948</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">40.49181</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">zoom</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">3</span><span class=\"p\">)</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<div id=\"htmlwidget-0e60ff221279290607a4\" style=\"width:672px;height:480px;\" class=\"leaflet html-widget\"></div>\n<script type=\"application/json\" data-for=\"htmlwidget-0e60ff221279290607a4\">{\"x\":{\"options\":{\"minZoom\":1.25,\"maxZoom\":8,\"crs\":{\"crsClass\":\"L.CRS.EPSG3857\",\"code\":null,\"proj4def\":null,\"projectedBounds\":null,\"options\":{}}},\"calls\":[{\"method\":\"addTiles\",\"args\":[\"//{s}.tile.openstreetmap.org/{z}/{x}/{y}.png\",null,null,{\"minZoom\":0,\"maxZoom\":18,\"tileSize\":256,\"subdomains\":\"abc\",\"errorTileUrl\":\"\",\"tms\":false,\"noWrap\":false,\"zoomOffset\":0,\"zoomReverse\":false,\"opacity\":1,\"zIndex\":1,\"detectRetina\":false,\"attribution\":\"&copy; <a href=\\\"http://openstreetmap.org\\\">OpenStreetMap<\\/a> contributors, <a href=\\\"http://creativecommons.org/licenses/by-sa/2.0/\\\">CC-BY-SA<\\/a>\"}]},{\"method\":\"setMaxBounds\",\"args\":[-90,-200,90,200]}],\"setView\":[[40.49181,-3.56948],3,[]]},\"evals\":[],\"jsHooks\":[]}</script>\n\n<h5 id=\"example-2-200x300px\">Example 2: 200x300px</h5>\n\n<p>Let’s go narrow and long with <code class=\"language-plaintext highlighter-rouge\">html \"width:200px;height:300px;\"</code>:</p>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"n\">leaflet</span><span class=\"p\">(</span><span class=\"w\">\n  </span><span class=\"n\">options</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">leafletOptions</span><span class=\"p\">(</span><span class=\"n\">minZoom</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">1.25</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">maxZoom</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">8</span><span class=\"p\">),</span><span class=\"w\">\n  </span><span class=\"n\">width</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"200px\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">height</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"300px\"</span><span class=\"w\">\n</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">%&gt;%</span><span class=\"w\">\n  </span><span class=\"n\">addTiles</span><span class=\"p\">()</span><span class=\"w\"> </span><span class=\"o\">%&gt;%</span><span class=\"w\">\n  </span><span class=\"n\">setMaxBounds</span><span class=\"p\">(</span><span class=\"m\">-200</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">-90</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">200</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">90</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">%&gt;%</span><span class=\"w\">\n  </span><span class=\"n\">setView</span><span class=\"p\">(</span><span class=\"m\">-3.56948</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">40.49181</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">zoom</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">3</span><span class=\"p\">)</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<div id=\"htmlwidget-fb456eae6cf883f81850\" style=\"width:200px;height:300px;\" class=\"leaflet html-widget\"></div>\n<script type=\"application/json\" data-for=\"htmlwidget-fb456eae6cf883f81850\">{\"x\":{\"options\":{\"minZoom\":1.25,\"maxZoom\":8,\"crs\":{\"crsClass\":\"L.CRS.EPSG3857\",\"code\":null,\"proj4def\":null,\"projectedBounds\":null,\"options\":{}}},\"calls\":[{\"method\":\"addTiles\",\"args\":[\"//{s}.tile.openstreetmap.org/{z}/{x}/{y}.png\",null,null,{\"minZoom\":0,\"maxZoom\":18,\"tileSize\":256,\"subdomains\":\"abc\",\"errorTileUrl\":\"\",\"tms\":false,\"noWrap\":false,\"zoomOffset\":0,\"zoomReverse\":false,\"opacity\":1,\"zIndex\":1,\"detectRetina\":false,\"attribution\":\"&copy; <a href=\\\"http://openstreetmap.org\\\">OpenStreetMap<\\/a> contributors, <a href=\\\"http://creativecommons.org/licenses/by-sa/2.0/\\\">CC-BY-SA<\\/a>\"}]},{\"method\":\"setMaxBounds\",\"args\":[-90,-200,90,200]}],\"setView\":[[40.49181,-3.56948],3,[]]},\"evals\":[],\"jsHooks\":[]}</script>\n\n<h4 id=\"responsive-size\">Responsive size</h4>\n\n<p><strong>Recommended option.</strong> These maps will adapt to the width of your\nscreen, no matter what device you are using.</p>\n\n<h5 id=\"example-3-100-width\">Example 3: 100% width</h5>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"n\">leaflet</span><span class=\"p\">(</span><span class=\"w\">\n  </span><span class=\"n\">options</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">leafletOptions</span><span class=\"p\">(</span><span class=\"n\">minZoom</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">1.25</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">maxZoom</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">8</span><span class=\"p\">),</span><span class=\"w\">\n  </span><span class=\"n\">width</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"100%\"</span><span class=\"w\">\n</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">%&gt;%</span><span class=\"w\">\n  </span><span class=\"n\">addTiles</span><span class=\"p\">()</span><span class=\"w\"> </span><span class=\"o\">%&gt;%</span><span class=\"w\">\n  </span><span class=\"n\">setMaxBounds</span><span class=\"p\">(</span><span class=\"m\">-200</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">-90</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">200</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">90</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">%&gt;%</span><span class=\"w\">\n  </span><span class=\"n\">setView</span><span class=\"p\">(</span><span class=\"m\">-3.56948</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">40.49181</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">zoom</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">3</span><span class=\"p\">)</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<div id=\"htmlwidget-d72518ef7cb92abb839a\" style=\"width:100%;height:480px;\" class=\"leaflet html-widget\"></div>\n<script type=\"application/json\" data-for=\"htmlwidget-d72518ef7cb92abb839a\">{\"x\":{\"options\":{\"minZoom\":1.25,\"maxZoom\":8,\"crs\":{\"crsClass\":\"L.CRS.EPSG3857\",\"code\":null,\"proj4def\":null,\"projectedBounds\":null,\"options\":{}}},\"calls\":[{\"method\":\"addTiles\",\"args\":[\"//{s}.tile.openstreetmap.org/{z}/{x}/{y}.png\",null,null,{\"minZoom\":0,\"maxZoom\":18,\"tileSize\":256,\"subdomains\":\"abc\",\"errorTileUrl\":\"\",\"tms\":false,\"noWrap\":false,\"zoomOffset\":0,\"zoomReverse\":false,\"opacity\":1,\"zIndex\":1,\"detectRetina\":false,\"attribution\":\"&copy; <a href=\\\"http://openstreetmap.org\\\">OpenStreetMap<\\/a> contributors, <a href=\\\"http://creativecommons.org/licenses/by-sa/2.0/\\\">CC-BY-SA<\\/a>\"}]},{\"method\":\"setMaxBounds\",\"args\":[-90,-200,90,200]}],\"setView\":[[40.49181,-3.56948],3,[]]},\"evals\":[],\"jsHooks\":[]}</script>\n\n",
      "date_published": "2019-05-20T00:00:00+02:00",
      "date_modified": "2021-05-30T00:00:00+02:00",
      "image": "https://dieghernan.github.io/assets/img/blog/20190520_imgpost.webp",
      "summary": "Get a Leaflet map made in R onto a Jekyll site in six steps.",
      "tags": ["r_bloggers","rstats","rspatial","leaflet","jekyll","html","maps"],
      "authors": [{
        "name": "Diego HH",
        "url": "https://dieghernan.github.io/"
      }]
    },
    {
      "id": "https://dieghernan.github.io/201905_Where-in-the-world/",
      "url": "https://dieghernan.github.io/201905_Where-in-the-world/",
      "title": "Where in the world?",
      "content_html": "<p>This is a very personal post, where I just show the map of all the places I have\ntraveled to by plane.</p>\n\n<div class=\"leaflet html-widget html-fill-item\" id=\"htmlwidget-da93ff56d02bb57b98a0\" style=\"width:672px;height:480px;\"></div>\n<script type=\"application/json\" data-for=\"htmlwidget-da93ff56d02bb57b98a0\">{\"x\":{\"options\":{\"minZoom\":1.5,\"crs\":{\"crsClass\":\"L.CRS.EPSG3857\",\"code\":null,\"proj4def\":null,\"projectedBounds\":null,\"options\":{}}},\"calls\":[{\"method\":\"addTiles\",\"args\":[\"https://{s}.basemaps.cartocdn.com/dark_nolabels/{z}/{x}/{y}{r}.png?key=cb1_5619_1_b2e6946e6183e8692f337d2e\",null,null,{\"minZoom\":0,\"maxZoom\":18,\"tileSize\":256,\"subdomains\":\"abc\",\"errorTileUrl\":\"\",\"tms\":false,\"noWrap\":false,\"zoomOffset\":0,\"zoomReverse\":false,\"opacity\":1,\"zIndex\":1,\"detectRetina\":false,\"minzoom\":0,\"maxzoom\":19,\"tilesize\":256,\"errortileurl\":\"\",\"nowrap\":false,\"zoomoffset\":0,\"zoomreverse\":false,\"zindex\":1,\"detectretina\":true,\"attribution\":\"&copy; <a href='https://www.openstreetmap.org/copyright'>OpenStreetMap<\\/a> contributors &copy; <a href='https://carto.com/attributions'>CARTO<\\/a>\"}]},{\"method\":\"setMaxBounds\",\"args\":[-90,-180,90,180]},{\"method\":\"addCircleMarkers\",\"args\":[[40.49181,43.3011,51.50528,55.95,41.29708,50.90139,52.36213,48.35378,39.55,52.3103,50.0406,41.2629,-36.832,43.35652,47.58958,51.38267,55.61792,53.42133,51.28066,28.45272,22.31546,28.95027,38.78131,33.94251,45.72717,50.91166,39.8626,25.79343,-17.75539,40.63983,42.77004,8.9192,49.01278,50.10083,18.56737,42.89766,59.652,-43.48936,38.29239,38.77039,45.62754,-45.01837,41.79352,-38.10917],[-3.56948,-2.91061,0.05528,-3.3725,2.07846,4.48444,13.50168,11.78609,2.73333,4.76028,8.55603,28.74242,175.679,-1.79061,7.52991,-2.71909,12.65597,-6.27008,6.76715,-13.86376,113.93372,-13.60556,-9.13592,-118.40897,4.94428,5.77014,4.21865,-80.29004999999999,177.44338,-73.77874,-1.64633,-79.59968000000001,2.55,14.26,-68.36342999999999,-8.41793,17.93132,172.53223,27.15695,35.49543,8.71508,168.74007,12.25259,176.31722],[14.35413170054895,11.55789624365014,9.360856152774288,9.19208143626272,8.705505632961241,7.578582832551991,7.154845405526277,7.154845405526277,7.154845405526277,6.597539553864471,6.597539553864471,6.597539553864471,6.228654698077587,6.228654698077587,5.743491774985175,5.743491774985175,5.743491774985175,5.743491774985175,5.743491774985175,5.743491774985175,5.743491774985175,5.743491774985175,5.743491774985175,5.743491774985175,5.743491774985175,5.743491774985175,5.743491774985175,5.743491774985175,5.743491774985175,5.743491774985175,5.743491774985175,5.743491774985175,5.743491774985175,5.743491774985175,5.743491774985175,5.743491774985175,5.743491774985175,5,5,5,5,5,5,5],null,\"Destinations\",{\"interactive\":true,\"className\":\"\",\"stroke\":true,\"color\":\"#03F\",\"weight\":5,\"opacity\":0.5,\"fill\":true,\"fillColor\":\"#03F\",\"fillOpacity\":0.3},null,null,null,null,null,{\"interactive\":false,\"permanent\":false,\"direction\":\"auto\",\"opacity\":1,\"offset\":[0,0],\"textsize\":\"10px\",\"textOnly\":false,\"className\":\"\",\"sticky\":true},null]},{\"method\":\"addPolygons\",\"args\":[[[[{\"lng\":[177.44338,176.31722,172.53223,168.74007,-79.59968000000001,-118.40897,-3.3725,17.93132,113.93372],\"lat\":[-17.75539,-38.10917,-43.48936,-45.01837,8.9192,33.94251,55.95,59.652,22.31546]}]]],null,\"Outline\",{\"interactive\":true,\"className\":\"\",\"stroke\":false,\"color\":\"#03F\",\"weight\":5,\"opacity\":0.5,\"fill\":true,\"fillColor\":\"white\",\"fillOpacity\":0.05,\"smoothFactor\":1,\"noClip\":false},null,null,null,{\"interactive\":false,\"permanent\":false,\"direction\":\"auto\",\"opacity\":1,\"offset\":[0,0],\"textsize\":\"10px\",\"textOnly\":false,\"className\":\"\",\"sticky\":true},null]},{\"method\":\"addPolylines\",\"args\":[[[[{\"lng\":[-2.917426481116586,-2.924236738394311,-2.931040783464391,-2.9378386279315,-2.944630283373854,-2.951415761343283,-2.958195073365312,-2.964968230939235,-2.97173524553819,-2.978496128609241,-2.985250891573446,-2.991999545825936,-2.998742102735991,-3.005478573647116,-3.012208969877111,-3.018933302718149,-3.02565158343685,-3.032363823274355,-3.039070033446399,-3.045770225143383,-3.052464409530451,-3.059152597747558,-3.065834800909549,-3.072511030106224,-3.079181296402417,-3.085845610838063,-3.092503984428274,-3.099156428163405,-3.105802953009133,-3.112443569906518,-3.119078289772081,-3.125707123497877,-3.132330081951556,-3.138947175976438,-3.145558416391586,-3.152163813991869,-3.158763379548037,-3.165357123806787,-3.171945057490832,-3.17852719129897,-3.185103535906155,-3.191674101963561,-3.198238900098651,-3.204797940915248,-3.211351234993597,-3.217898792890437,-3.224440625139066,-3.230976742249409,-3.237507154708081,-3.244031872978458,-3.250550907500742,-3.257064268692024,-3.263571966946352,-3.270074012634799,-3.276570416105522,-3.283061187683831,-3.289546337672257,-3.296025876350609,-3.302499813976044,-3.308968160783129,-3.315430926983907,-3.321888122767958,-3.328339758302464,-3.334785843732273,-3.341226389179961,-3.347661404745894,-3.354090900508294,-3.360514886523298,-3.366933372825022,-3.373346369425624,-3.379753886315363,-3.386155933462663,-3.392552520814174,-3.398943658294835,-3.405329355807929,-3.411709623235151,-3.418084470436665,-3.424453907251166,-3.430817943495939,-3.437176588966921,-3.443529853438753,-3.449877746664856,-3.456220278377474,-3.462557458287739,-3.468889296085735,-3.475215801440551,-3.481536984000342,-3.487852853392385,-3.494163419223142,-3.500468691078315,-3.506768678522904,-3.513063391101264,-3.519352838337164,-3.525637029733846,-3.531915974774079,-3.538189682920218,-3.544458163614258,-3.550721426277894,-3.556979480312578,-3.56323233509957],\"lat\":[43.27330427676382,43.245508149155,43.21771161793507,43.18991468386385,43.1621173476994,43.13431961019801,43.10652147211427,43.078722934201,43.05092399720928,43.0231246618885,42.99532492898631,42.96752479924864,42.93972427341973,42.91192335224206,42.88412203645647,42.85632032680207,42.82851822401629,42.80071572883488,42.77291284199188,42.74510956421969,42.71730589624902,42.68950183880891,42.66169739262673,42.63389255842825,42.60608733693749,42.5782817288769,42.55047573496727,42.52266935592775,42.49486259247583,42.46705544532742,42.43924791519678,42.41144000279654,42.38363170883773,42.35582303402978,42.32801397908051,42.30020454469611,42.27239473158122,42.24458454043887,42.21677397197051,42.18896302687597,42.16115170585358,42.13334000960001,42.10552793881043,42.07771549417842,42.04990267639599,42.02208948615362,41.99427592414023,41.96646199104318,41.93864768754832,41.91083301433993,41.8830179721008,41.85520256151214,41.82738678325366,41.79957063800357,41.77175412643856,41.74393724923379,41.71612000706291,41.6883024005981,41.66048443051003,41.63266609746787,41.60484740213929,41.57702834519051,41.54920892728623,41.52138914908972,41.49356901126274,41.4657485144656,41.43792765935714,41.41010644659473,41.38228487683432,41.35446295073039,41.32664066893597,41.29881803210263,41.27099504088054,41.24317169591841,41.21534799786353,41.18752394736177,41.15969954505755,41.1318747915939,41.10404968761245,41.07622423375335,41.04839843065542,41.02057227895607,40.99274577929125,40.96491893229559,40.93709173860227,40.90926419884314,40.88143631364863,40.85360808364778,40.82577950946831,40.79795059173651,40.77012133107735,40.74229172811441,40.71446178346991,40.68663149776474,40.6588008716184,40.63096990564908,40.60313860047361,40.57530695670748,40.54747497496484,40.51964265585852]}]],[[{\"lng\":[-3.56323233509957,-3.556979480312578,-3.550721426277895,-3.544458163614258,-3.538189682920217,-3.531915974774079,-3.525637029733846,-3.519352838337164,-3.513063391101264,-3.506768678522904,-3.500468691078315,-3.494163419223142,-3.487852853392385,-3.481536984000342,-3.475215801440551,-3.468889296085735,-3.462557458287739,-3.456220278377474,-3.449877746664856,-3.443529853438753,-3.437176588966921,-3.430817943495939,-3.424453907251166,-3.418084470436665,-3.411709623235151,-3.405329355807929,-3.398943658294835,-3.392552520814174,-3.386155933462663,-3.379753886315363,-3.373346369425624,-3.366933372825022,-3.360514886523298,-3.354090900508294,-3.347661404745894,-3.341226389179961,-3.334785843732273,-3.328339758302464,-3.321888122767958,-3.315430926983907,-3.308968160783129,-3.302499813976044,-3.296025876350609,-3.289546337672257,-3.283061187683832,-3.276570416105522,-3.270074012634799,-3.263571966946352,-3.257064268692024,-3.250550907500742,-3.244031872978458,-3.237507154708081,-3.230976742249409,-3.224440625139066,-3.217898792890438,-3.211351234993597,-3.204797940915248,-3.198238900098652,-3.191674101963561,-3.185103535906155,-3.17852719129897,-3.171945057490832,-3.165357123806787,-3.158763379548037,-3.152163813991869,-3.145558416391586,-3.138947175976439,-3.132330081951556,-3.125707123497878,-3.119078289772082,-3.112443569906518,-3.105802953009133,-3.099156428163405,-3.092503984428274,-3.085845610838063,-3.079181296402417,-3.072511030106224,-3.065834800909549,-3.059152597747558,-3.052464409530451,-3.045770225143383,-3.039070033446399,-3.032363823274355,-3.02565158343685,-3.018933302718149,-3.012208969877111,-3.005478573647116,-2.998742102735991,-2.991999545825936,-2.985250891573446,-2.978496128609241,-2.97173524553819,-2.964968230939235,-2.958195073365312,-2.951415761343283,-2.944630283373853,-2.9378386279315,-2.931040783464391,-2.924236738394311,-2.917426481116586],\"lat\":[40.51964265585852,40.54747497496484,40.57530695670749,40.60313860047361,40.63096990564908,40.6588008716184,40.68663149776474,40.71446178346991,40.74229172811441,40.77012133107735,40.79795059173651,40.82577950946831,40.85360808364778,40.88143631364863,40.90926419884314,40.93709173860227,40.96491893229558,40.99274577929125,41.02057227895607,41.04839843065542,41.07622423375335,41.10404968761245,41.1318747915939,41.15969954505755,41.18752394736177,41.21534799786353,41.24317169591841,41.27099504088054,41.29881803210262,41.32664066893597,41.35446295073039,41.38228487683433,41.41010644659473,41.43792765935713,41.4657485144656,41.49356901126274,41.52138914908972,41.54920892728623,41.57702834519051,41.60484740213929,41.63266609746787,41.66048443051003,41.6883024005981,41.71612000706291,41.74393724923379,41.77175412643856,41.79957063800357,41.82738678325366,41.85520256151214,41.8830179721008,41.91083301433993,41.93864768754832,41.96646199104318,41.99427592414023,42.02208948615363,42.04990267639599,42.07771549417842,42.10552793881044,42.13334000960001,42.16115170585358,42.18896302687597,42.21677397197051,42.24458454043887,42.27239473158122,42.30020454469611,42.32801397908051,42.35582303402978,42.38363170883773,42.41144000279654,42.43924791519678,42.46705544532742,42.49486259247584,42.52266935592775,42.55047573496727,42.5782817288769,42.60608733693749,42.63389255842825,42.66169739262673,42.68950183880891,42.71730589624902,42.74510956421969,42.77291284199189,42.80071572883488,42.82851822401629,42.85632032680207,42.88412203645647,42.91192335224206,42.93972427341973,42.96752479924864,42.99532492898631,43.0231246618885,43.05092399720928,43.078722934201,43.10652147211427,43.13431961019801,43.16211734769939,43.18991468386385,43.21771161793507,43.245508149155,43.27330427676382]}]],[[{\"lng\":[-3.375170822935612,-3.377820734664479,-3.380450017183276,-3.383058947531119,-3.385647797898614,-3.388216835734044,-3.390766323846776,-3.393296520507992,-3.395807679548787,-3.398300050455759,-3.400773878464124,-3.403229404648467,-3.405666866011166,-3.40808649556858,-3.410488522435065,-3.412873171904873,-3.415240665531989,-3.417591221208002,-3.419925053238016,-3.422242372414701,-3.424543386090508,-3.426828298248127,-3.429097309569205,-3.431350617501412,-3.433588416323862,-3.435810897210977,-3.438018248294787,-3.440210654725775,-3.442388298732238,-3.444551359678255,-3.446700014120282,-3.448834435862409,-3.450954796010329,-3.453061263024031,-3.455154002769281,-3.457233178567895,-3.459298951246865,-3.46135147918634,-3.463390918366517,-3.465417422413455,-3.46743114264385,-3.469432228108793,-3.47142082563654,-3.473397079874324,-3.47536113332922,-3.477313126408109,-3.479253197456747,-3.481181482797965,-3.483098116769034,-3.485003231758203,-3.486896958240436,-3.488779424812365,-3.490650758226494,-3.492511083424651,-3.494360523570722,-3.496199200082675,-3.498027232663909,-3.499844739333919,-3.50165183645832,-3.503448638778226,-3.505235259439013,-3.507011810018474,-3.508778400554382,-3.510535139571482,-3.512282134107909,-3.514019489741074,-3.515747310612998,-3.517465699455134,-3.519174757612674,-3.520874585068362,-3.522565280465817,-3.524246941132384,-3.525919663101519,-3.527583541134728,-3.529238668743059,-3.530885138208164,-3.532523040602937,-3.534152465811751,-3.535773502550279,-3.537386238384936,-3.538990759751926,-3.540587151975922,-3.542175499288376,-3.543755884845479,-3.545328390745758,-3.546893098047343,-3.548450086784899,-3.549999435986222,-3.55154122368853,-3.553075526954434,-3.5546024218876,-3.556121983648127,-3.557634286467623,-3.559139403663989,-3.560637407655949,-3.562128369977281,-3.563612361290796,-3.565089451402053,-3.566559709272819,-3.568023203034278],\"lat\":[55.7969505925974,55.64390112776719,55.49085160628383,55.33780202890815,55.18475239638769,55.03170270945695,54.87865296883769,54.7256031752392,54.57255332935858,54.41950343188102,54.26645348347999,54.11340348481758,53.96035343654467,53.80730333930118,53.65425319371634,53.50120300040889,53.34815275998727,53.19510247304989,53.04205214018529,52.88900176197238,52.73595133898061,52.58290087177017,52.4298503608922,52.27679980688895,52.12374921029397,51.9706985716323,51.81764789142057,51.66459717016728,51.51154640837289,51.35849560652998,51.20544476512342,51.05239388463053,50.89934296552121,50.7462920082581,50.59324101329674,50.44018998108563,50.28713891206647,50.1340878066742,49.98103666533718,49.82798548847734,49.67493427651021,49.52188302984514,49.36883174888534,49.21578043402809,49.06272908566473,48.90967770418086,48.75662628995642,48.60357484336577,48.45052336477787,48.29747185455626,48.14442031305929,47.99136874064011,47.83831713764681,47.68526550442251,47.53221384130548,47.37916214862912,47.22611042672221,47.07305867590885,46.9200068965086,46.76695508883657,46.61390325320351,46.46085138991581,46.30779949927569,46.15474758158116,46.0016956371262,45.84864366620074,45.69559166909078,45.54253964607845,45.38948759744208,45.23643552345624,45.08338342439181,44.93033130051611,44.77727915209285,44.62422697938228,44.47117478264119,44.31812256212302,44.1650703180779,44.01201805075262,43.85896576039087,43.70591344723311,43.5528611115167,43.39980875347598,43.24675637334227,43.09370397134392,42.94065154770642,42.78759910265234,42.63454663640152,42.48149414917095,42.32844164117495,42.17538911262518,42.02233656373058,41.86928399469762,41.71623140573012,41.56317879702943,41.41012616879446,41.25707352122162,41.10402085450499,40.95096816883625,40.79791546440482,40.64486274139778]}]],[[{\"lng\":[-3.539886592853561,-3.510196042052219,-3.480407657209682,-3.450520742098378,-3.420534594585617,-3.390448506568939,-3.360261763910633,-3.329973646371418,-3.299583427543272,-3.269090374781393,-3.238493749135285,-3.207792805278952,-3.176986791440184,-3.146074949328935,-3.115056514064752,-3.083930714103283,-3.052696771161794,-3.021353900143742,-2.989901309062333,-2.958338198963097,-2.926663763845422,-2.894877190583077,-2.862977658843654,-2.830964341006979,-2.798836402082403,-2.766592999625024,-2.734233283650764,-2.701756396550338,-2.669161473002053,-2.636447639883448,-2.603614016181731,-2.570659712903038,-2.537583832980437,-2.504385471180703,-2.471063714009833,-2.437617639617266,-2.404046317698812,-2.370348809398251,-2.336524167207587,-2.302571434865935,-2.268489647257029,-2.234277830305315,-2.199935000870608,-2.165460166641305,-2.130852326026112,-2.09611046804428,-2.0612335722143,-2.026220608441067,-1.991070536901459,-1.955782307928318,-1.920354861892809,-1.884787129085126,-1.84907802959352,-1.813226473181623,-1.777231359164037,-1.741091576280164,-1.704806002566249,-1.668373505225598,-1.631792940496952,-1.595063153520987,-1.558182978204891,-1.521151237085013,-1.483966741187535,-1.44662828988714,-1.409134670763635,-1.371484659456512,-1.333677019517397,-1.295710502260354,-1.257583846610023,-1.219295778947532,-1.180845012954162,-1.142230249452735,-1.103450176246656,-1.064503467956606,-1.025388785854823,-0.9861047776969306,-0.9466500775512943,-0.9070233056258328,-0.8672230680922662,-0.8272479569077441,-0.7870965496338149,-0.7467674092526853,-0.7062590839807326,-0.6655701070792108,-0.6246989966621158,-0.5836442555011476,-0.5424043708277304,-0.5009778141320311,-0.4593630409589312,-0.4175584907008965,-0.3755625863876876,-0.3333737344728626,-0.2909903246170106,-0.248410729467662,-0.2056333044358157,-0.1626563874690245,-0.1194782988209801,-0.07609734081753247,-0.03251179761908277,0.01128006502071345],\"lat\":[40.60134688377402,40.71087619013269,40.82039786469453,40.92991185261096,41.03941809856116,41.14891654674675,41.25840714088647,41.36788982421082,41.47736453945653,41.58683122886109,41.69628983415708,41.80574029656646,41.91518255679485,42.02461655502569,42.13404223091426,42.24345952358179,42.35286837160924,42.46226871303123,42.5716604853298,42.68104362542805,42.7904180696837,42.89978375388267,43.0091406132324,43.11848858235528,43.22782759528176,43.33715758544357,43.44647848566674,43.55579022816459,43.6650927445305,43.77438596573072,43.88366982209704,43.99294424331934,44.10220915843795,44.21146449583615,44.3207101832323,44.42994614767198,44.53917231552006,44.64838861245257,44.75759496344853,44.86679129278158,44.9759775240116,45.0851535799761,45.19431938278161,45.30347485379482,45.41261991363369,45.52175448215839,45.63087847846209,45.73999182086173,45.84909442688848,45.9581862132782,46.06726709596175,46.17633699005505,46.28539580984917,46.39444346880012,46.50347987951857,46.61250495375943,46.72151860241123,46.83052073548533,46.93951126210511,47.04849009049479,47.15745712796827,47.26641228091766,47.37535545480186,47.48428655413456,47.59320548247261,47.70211214240375,47.81100643553439,47.91988826247712,48.02875752283814,48.13761411520434,48.24645793713034,48.35528888512523,48.46410685463914,48.57291174004963,48.68170343464783,48.79048183062446,48.89924681905548,49.00799828988765,49.11673613192382,49.22546023280803,49.3341704790103,49.44286675581129,49.55154894728663,49.66021693629103,49.7688706044422,49.87750983210445,49.98613449837208,50.09474448105244,50.20333965664884,50.31191990034306,50.42048508597767,50.52903508603807,50.6375697716342,50.74608901248192,50.85459267688432,50.96308063171233,51.07155274238548,51.18000887285195,51.28844888556859,51.39687264148046]}]],[[{\"lng\":[0.01128006502071349,-0.0325117976190827,-0.07609734081753235,-0.11947829882098,-0.1626563874690243,-0.2056333044358155,-0.2484107294676622,-0.2909903246170109,-0.3333737344728626,-0.3755625863876876,-0.4175584907008965,-0.4593630409589312,-0.5009778141320311,-0.5424043708277304,-0.5836442555011476,-0.6246989966621156,-0.6655701070792106,-0.706259083980732,-0.7467674092526853,-0.7870965496338151,-0.8272479569077442,-0.8672230680922665,-0.9070233056258328,-0.9466500775512943,-0.9861047776969306,-1.025388785854823,-1.064503467956606,-1.103450176246656,-1.142230249452734,-1.180845012954162,-1.219295778947531,-1.257583846610024,-1.295710502260355,-1.333677019517397,-1.371484659456512,-1.409134670763635,-1.44662828988714,-1.483966741187535,-1.521151237085013,-1.558182978204891,-1.595063153520987,-1.631792940496952,-1.668373505225597,-1.704806002566249,-1.741091576280164,-1.777231359164037,-1.813226473181623,-1.84907802959352,-1.884787129085126,-1.920354861892809,-1.955782307928318,-1.991070536901459,-2.026220608441067,-2.0612335722143,-2.09611046804428,-2.130852326026112,-2.165460166641304,-2.199935000870608,-2.234277830305315,-2.268489647257029,-2.302571434865935,-2.336524167207587,-2.370348809398251,-2.404046317698812,-2.437617639617266,-2.471063714009833,-2.504385471180703,-2.537583832980437,-2.570659712903039,-2.603614016181731,-2.636447639883447,-2.669161473002053,-2.701756396550338,-2.734233283650764,-2.766592999625024,-2.798836402082403,-2.830964341006979,-2.862977658843654,-2.894877190583077,-2.926663763845422,-2.958338198963097,-2.989901309062334,-3.021353900143741,-3.052696771161794,-3.083930714103283,-3.115056514064752,-3.146074949328935,-3.176986791440184,-3.207792805278952,-3.238493749135285,-3.269090374781393,-3.299583427543272,-3.329973646371418,-3.360261763910633,-3.390448506568939,-3.420534594585617,-3.450520742098378,-3.480407657209682,-3.510196042052219,-3.539886592853561],\"lat\":[51.39687264148046,51.28844888556859,51.18000887285194,51.07155274238548,50.96308063171233,50.85459267688432,50.74608901248192,50.63756977163419,50.52903508603807,50.42048508597767,50.31191990034306,50.20333965664884,50.09474448105244,49.98613449837208,49.87750983210446,49.7688706044422,49.66021693629103,49.55154894728663,49.44286675581129,49.3341704790103,49.22546023280803,49.11673613192382,49.00799828988764,48.89924681905548,48.79048183062446,48.68170343464783,48.57291174004963,48.46410685463914,48.35528888512523,48.24645793713035,48.13761411520434,48.02875752283814,47.91988826247712,47.81100643553438,47.70211214240375,47.59320548247261,47.48428655413456,47.37535545480186,47.26641228091766,47.15745712796827,47.04849009049479,46.93951126210511,46.83052073548534,46.72151860241123,46.61250495375943,46.50347987951857,46.39444346880012,46.28539580984917,46.17633699005505,46.06726709596175,45.9581862132782,45.84909442688848,45.73999182086173,45.63087847846209,45.52175448215839,45.41261991363369,45.30347485379482,45.19431938278161,45.0851535799761,44.9759775240116,44.86679129278158,44.75759496344853,44.64838861245257,44.53917231552006,44.42994614767198,44.3207101832323,44.21146449583615,44.10220915843794,43.99294424331934,43.88366982209704,43.77438596573072,43.6650927445305,43.55579022816459,43.44647848566674,43.33715758544357,43.22782759528176,43.11848858235528,43.00914061323241,42.89978375388267,42.7904180696837,42.68104362542805,42.57166048532981,42.46226871303123,42.35286837160924,42.2434595235818,42.13404223091426,42.02461655502569,41.91518255679485,41.80574029656646,41.69628983415708,41.58683122886109,41.47736453945653,41.36788982421081,41.25840714088647,41.14891654674675,41.03941809856116,40.92991185261096,40.82039786469453,40.71087619013269,40.60134688377402]}]],[[{\"lng\":[-3.568023203034278,-3.566559709272819,-3.565089451402052,-3.563612361290796,-3.562128369977281,-3.560637407655949,-3.559139403663989,-3.557634286467623,-3.556121983648127,-3.5546024218876,-3.553075526954434,-3.55154122368853,-3.549999435986222,-3.548450086784899,-3.546893098047343,-3.545328390745758,-3.543755884845479,-3.542175499288376,-3.540587151975922,-3.538990759751926,-3.537386238384936,-3.535773502550279,-3.534152465811751,-3.532523040602937,-3.530885138208164,-3.529238668743059,-3.527583541134728,-3.525919663101519,-3.524246941132384,-3.522565280465817,-3.520874585068362,-3.519174757612674,-3.517465699455134,-3.515747310612998,-3.514019489741074,-3.512282134107909,-3.510535139571482,-3.508778400554382,-3.507011810018474,-3.505235259439013,-3.503448638778226,-3.501651836458319,-3.499844739333919,-3.498027232663909,-3.496199200082675,-3.494360523570723,-3.492511083424651,-3.490650758226494,-3.488779424812365,-3.486896958240436,-3.485003231758203,-3.483098116769034,-3.481181482797965,-3.479253197456747,-3.477313126408109,-3.47536113332922,-3.473397079874324,-3.47142082563654,-3.469432228108793,-3.46743114264385,-3.465417422413455,-3.463390918366517,-3.46135147918634,-3.459298951246865,-3.457233178567895,-3.455154002769281,-3.453061263024031,-3.450954796010329,-3.448834435862409,-3.446700014120281,-3.444551359678255,-3.442388298732239,-3.440210654725775,-3.438018248294787,-3.435810897210977,-3.433588416323862,-3.431350617501412,-3.429097309569205,-3.426828298248127,-3.424543386090508,-3.422242372414701,-3.419925053238016,-3.417591221208002,-3.415240665531989,-3.412873171904873,-3.410488522435065,-3.40808649556858,-3.405666866011166,-3.403229404648467,-3.400773878464124,-3.398300050455759,-3.395807679548787,-3.393296520507992,-3.390766323846776,-3.388216835734044,-3.385647797898614,-3.383058947531119,-3.380450017183276,-3.377820734664479,-3.375170822935612],\"lat\":[40.64486274139778,40.79791546440482,40.95096816883625,41.10402085450498,41.25707352122162,41.41012616879446,41.56317879702944,41.71623140573012,41.86928399469762,42.02233656373059,42.17538911262518,42.32844164117495,42.48149414917095,42.63454663640152,42.78759910265234,42.94065154770642,43.09370397134392,43.24675637334227,43.39980875347597,43.5528611115167,43.70591344723311,43.85896576039087,44.01201805075262,44.1650703180779,44.31812256212302,44.47117478264119,44.62422697938228,44.77727915209285,44.93033130051611,45.08338342439181,45.23643552345624,45.38948759744208,45.54253964607845,45.69559166909078,45.84864366620074,46.0016956371262,46.15474758158116,46.30779949927569,46.46085138991581,46.61390325320351,46.76695508883657,46.9200068965086,47.07305867590885,47.22611042672221,47.37916214862913,47.53221384130548,47.68526550442251,47.83831713764681,47.99136874064011,48.14442031305929,48.29747185455626,48.45052336477787,48.60357484336577,48.75662628995642,48.90967770418086,49.06272908566473,49.21578043402809,49.36883174888534,49.52188302984512,49.67493427651021,49.82798548847734,49.98103666533718,50.1340878066742,50.28713891206647,50.44018998108563,50.59324101329674,50.7462920082581,50.89934296552121,51.05239388463053,51.20544476512342,51.35849560652998,51.51154640837289,51.66459717016728,51.81764789142057,51.9706985716323,52.12374921029397,52.27679980688895,52.4298503608922,52.58290087177017,52.73595133898061,52.88900176197238,53.04205214018529,53.19510247304989,53.34815275998727,53.50120300040889,53.65425319371634,53.80730333930118,53.96035343654467,54.11340348481758,54.26645348347999,54.41950343188102,54.57255332935858,54.7256031752392,54.87865296883769,55.03170270945695,55.18475239638769,55.33780202890815,55.49085160628383,55.64390112776719,55.7969505925974]}]],[[{\"lng\":[2.021898138893412,1.965347763205967,1.908808915876133,1.852281639761041,1.795765977636256,1.739261972195536,1.682769666050603,1.626289101730912,1.569820321683413,1.513363368272332,1.456918283778935,1.400485110401304,1.344063890254113,1.287654665368404,1.231257477691361,1.174872369086089,1.1184993813314,1.062138556121585,1.005789935066205,0.9494535596898661,0.8931294714320152,0.8368177116467156,0.7805183216024424,0.7242313424818677,0.6679568153816541,0.6116947813122426,0.5554452811976492,0.499208355875257,0.4429840460956124,0.3867723925222235,0.3305734357313571,0.2743872162118385,0.2182137743648523,0.1620531505037475,0.1059053848538372,0.04977051755220396,-0.006351411352488123,-0.06246036190019291,-0.1185562942196696,-0.1746391685286705,-0.2307089451341344,-0.2867655844323699,-0.3428090469092397,-0.3988392931403502,-0.4548562837912272,-0.5108599796175044,-0.5668503414650976,-0.6228273302703879,-0.6787909070603976,-0.7347410329529658,-0.7906776691569227,-0.8466007769722669,-0.9025103177903309,-0.9584062530939582,-1.01428854445767,-1.070157153547832,-1.126012042122823,-1.181853172033202,-1.237680505221865,-1.293494003724216,-1.349293629668326,-1.405079345275087,-1.460851112858382,-1.516608894825229,-1.572352653675949,-1.628082352004312,-1.683797952497695,-1.73949941793723,-1.795186711197961,-1.850859795248983,-1.906518633153602,-1.962163188069472,-2.017793423248742,-2.073409302038202,-2.129010787879428,-2.184597844308914,-2.240170434958222,-2.295728523554113,-2.351272073918688,-2.406801049969521,-2.462315415719796,-2.51781513527844,-2.57330017285025,-2.628770492736031,-2.684226059332718,-2.739666837133506,-2.795092790727979,-2.850503884802231,-2.905900084138992,-2.961281353617748,-3.016647658214866,-3.07199896300371,-3.12733523315476,-3.182656433935729,-3.23796253071168,-3.293253488945139,-3.348529274196208,-3.403789852122677,-3.459035188480133,-3.514265249122071],\"lat\":[41.29046933697833,41.28383099463076,41.27716498505501,41.27047132039274,41.2637500128295,41.25700107459467,41.2502245179612,41.24342035524571,41.23658859880828,41.22972926105233,41.22284235442463,41.21592789141508,41.20898588455668,41.20201634642541,41.19501928964011,41.18799472686246,41.18094267079677,41.17386313418994,41.16675612983131,41.15962167055268,41.15245976922804,41.1452704387736,41.13805369214761,41.13080954235032,41.12353800242381,41.11623908545191,41.10891280456014,41.10155917291556,41.09417820372668,41.08676991024335,41.07933430575667,41.07187140359885,41.06438121714318,41.05686375980383,41.04931904503582,41.04174708633486,41.03414789723731,41.02652149132001,41.0188678822002,41.01118708353543,41.00347910902341,40.99574397240196,40.98798168744887,40.98019226798177,40.97237572785811,40.96453208097491,40.9566613412688,40.94876352271583,40.9408386393314,40.93288670517011,40.92490773432567,40.91690174093082,40.90886873915718,40.90080874321519,40.89272176735393,40.88460782586107,40.87646693306276,40.86829910332348,40.86010435104598,40.85188269067111,40.8436341366778,40.83535870358283,40.82705640594085,40.81872725834415,40.81037127542264,40.8019884718437,40.79357886231207,40.78514246156973,40.77667928439583,40.76818934560654,40.75967266005495,40.75112924263094,40.74255910826112,40.73396227190867,40.72533874857325,40.71668855329088,40.70801170113381,40.69930820721049,40.6905780866653,40.68182135467864,40.67303802646664,40.66422811728113,40.65539164240953,40.64652861717473,40.63763905693497,40.62872297708369,40.61978039304948,40.61081132029599,40.60181577432166,40.59279377065982,40.58374532487841,40.57467045257994,40.56556916940138,40.55644149101398,40.54728743312329,40.53810701146889,40.52890024182436,40.51966713999717,40.51040772182856,40.50112200319336]}]],[[{\"lng\":[-3.514265249122071,-3.459035188480133,-3.403789852122677,-3.348529274196208,-3.293253488945139,-3.23796253071168,-3.182656433935729,-3.127335233154759,-3.071998963003709,-3.016647658214866,-2.961281353617748,-2.905900084138992,-2.850503884802231,-2.795092790727979,-2.739666837133506,-2.684226059332718,-2.628770492736031,-2.57330017285025,-2.51781513527844,-2.462315415719795,-2.406801049969521,-2.351272073918688,-2.295728523554113,-2.240170434958222,-2.184597844308914,-2.129010787879428,-2.073409302038202,-2.017793423248742,-1.962163188069472,-1.906518633153602,-1.850859795248983,-1.795186711197961,-1.73949941793723,-1.683797952497694,-1.628082352004312,-1.572352653675949,-1.516608894825229,-1.460851112858382,-1.405079345275087,-1.349293629668326,-1.293494003724216,-1.237680505221865,-1.181853172033202,-1.126012042122824,-1.070157153547832,-1.01428854445767,-0.9584062530939582,-0.9025103177903309,-0.8466007769722669,-0.7906776691569227,-0.7347410329529658,-0.6787909070603976,-0.6228273302703879,-0.5668503414650976,-0.5108599796175044,-0.4548562837912272,-0.3988392931403508,-0.3428090469092401,-0.2867655844323699,-0.2307089451341344,-0.1746391685286705,-0.1185562942196696,-0.06246036190019291,-0.006351411352488123,0.04977051755220396,0.1059053848538372,0.162053150503748,0.2182137743648528,0.2743872162118389,0.330573435731357,0.3867723925222232,0.4429840460956121,0.499208355875257,0.5554452811976492,0.6116947813122426,0.6679568153816541,0.7242313424818677,0.7805183216024424,0.8368177116467156,0.8931294714320153,0.9494535596898663,1.005789935066205,1.062138556121585,1.1184993813314,1.174872369086089,1.231257477691361,1.287654665368404,1.344063890254113,1.400485110401304,1.456918283778935,1.513363368272332,1.569820321683413,1.626289101730912,1.682769666050604,1.739261972195535,1.795765977636255,1.85228163976104,1.908808915876133,1.965347763205967,2.021898138893412],\"lat\":[40.50112200319336,40.51040772182856,40.51966713999718,40.52890024182436,40.53810701146889,40.54728743312329,40.55644149101398,40.56556916940138,40.57467045257994,40.58374532487841,40.59279377065982,40.60181577432166,40.61081132029599,40.61978039304948,40.62872297708369,40.63763905693497,40.64652861717473,40.65539164240953,40.66422811728112,40.67303802646664,40.68182135467864,40.6905780866653,40.69930820721049,40.70801170113381,40.71668855329088,40.72533874857325,40.73396227190867,40.74255910826112,40.75112924263094,40.75967266005495,40.76818934560654,40.77667928439583,40.78514246156973,40.79357886231207,40.8019884718437,40.81037127542264,40.81872725834415,40.82705640594085,40.83535870358283,40.8436341366778,40.85188269067111,40.86010435104598,40.86829910332349,40.87646693306276,40.88460782586107,40.89272176735393,40.90080874321519,40.90886873915718,40.91690174093082,40.92490773432567,40.93288670517011,40.9408386393314,40.94876352271583,40.9566613412688,40.96453208097491,40.97237572785811,40.98019226798178,40.98798168744887,40.99574397240196,41.00347910902341,41.01118708353543,41.0188678822002,41.02652149132001,41.03414789723731,41.04174708633486,41.04931904503582,41.05686375980383,41.06438121714317,41.07187140359885,41.07933430575667,41.08676991024335,41.09417820372668,41.10155917291556,41.10891280456014,41.11623908545191,41.12353800242381,41.13080954235032,41.13805369214761,41.1452704387736,41.15245976922804,41.15962167055268,41.16675612983131,41.17386313418994,41.18094267079677,41.18799472686246,41.19501928964011,41.20201634642541,41.20898588455668,41.21592789141508,41.22284235442463,41.22972926105233,41.23658859880828,41.24342035524572,41.25022451796119,41.25700107459467,41.2637500128295,41.27047132039273,41.27716498505501,41.28383099463076,41.29046933697833]}]],[[{\"lng\":[4.388120952356902,4.292213216861255,4.196713903917826,4.101620146194283,4.006929098457124,3.912637937408006,3.818743861520515,3.725244090877383,3.6321358670082,3.539416452727627,3.447083131974159,3.355133209649424,3.263564011458088,3.17237288374834,3.081557193353007,2.991114327431319,2.901041693311317,2.811336718332955,2.721996849691883,2.633019554283955,2.544402318550442,2.456142648324012,2.368238068675441,2.280686123761103,2.193484376671239,2.106630409279016,2.020121822090379,1.933956234094737,1.848131282616454,1.762644623167171,1.677493929298989,1.592676892458471,1.50819122184153,1.424034644249154,1.340204903944024,1.256699762507984,1.173516998700423,1.090654408317514,1.008109804052357,0.9258810153560282,0.8439658882995106,0.7623622854365378,0.6810680856673437,0.600081184103321,0.5193994919325884,0.4390209362864763,0.3589434601069231,0.2791650220147923,0.1996835961791037,0.1204971721871855,0.04160375491574811,-0.03699863559712983,-0.1153119642790876,-0.1933381811496566,-0.2710792214455098,-0.3485370057447971,-0.4257134400905637,-0.5026104161132545,-0.5792298111522942,-0.6555734883767699,-0.7316432969051919,-0.8074410719243504,-0.8829686348072637,-0.9582277932302217,-1.033220341288932,-1.107948059613763,-1.182412715484088,-1.256616062941744,-1.330559842903597,-1.404245783273213,-1.477675599051662,-1.550850992447424,-1.623773652985431,-1.696445257615231,-1.768867470818288,-1.841041944714406,-1.912970319167314,-1.984654221889363,-2.056095268545405,-2.127295062855792,-2.198255196698561,-2.268977250210752,-2.339462791888912,-2.409713378688759,-2.479730556124021,-2.549515858364457,-2.619070808333061,-2.68839691780245,-2.757495687490461,-2.826368607154917,-2.895017155687632,-2.963442801207597,-3.031647001153396,-3.099631202374825,-3.167396841223753,-3.234945343644198,-3.302278125261636,-3.369396591471568,-3.436302137527301,-3.502996148627001],\"lat\":[50.80144692176285,50.701424876323,50.6013244800906,50.50114634376361,50.40089107238816,50.30055926541826,50.20015151677482,50.09966841490417,49.99911054283569,49.89847847823913,49.79777279348104,49.69699405568067,49.59614282676539,49.49521966352528,49.39422511766724,49.29315973586858,49.19202405982983,49.0908186263272,48.98954396726418,48.88820060972294,48.78678907601474,48.68530988373019,48.58376354578867,48.48215057048732,48.38047146154946,48.27872671817253,48.1769168350754,48.07504230254524,47.97310360648388,47.87110122845354,47.76903564572218,47.66690733130833,47.56471675402533,47.46246437852516,47.36015066534181,47.25777607093406,47.15534104772789,47.05284604415837,46.95029150471108,46.84767786996306,46.74500557662342,46.64227505757327,46.53948674190546,46.43664105496367,46.33373841838121,46.2307792501193,46.12776396450501,46.02469297226864,45.92156668058081,45.81838549308913,45.7151498099544,45.6118600278864,45.50851654017939,45.40511973674707,45.30167000415729,45.19816772566629,45.09461328125252,44.99100704765023,44.88734939838255,44.7836407037943,44.67988133108429,44.57607164433749,44.47221200455659,44.36830276969344,44.26434429467999,44.16033693145889,44.05628102901385,43.95217693339963,43.84802498777158,43.74382553241505,43.63957890477431,43.53528543948124,43.43094546838368,43.32655932057344,43.22212732241407,43.11764979756822,43.0131270670248,42.9085594491258,42.80394725959281,42.69929081155318,42.59459041556613,42.48984637964819,42.38505900929879,42.28022860752517,42.17535547486735,42.07043990942262,41.96548220686979,41.86048266049322,41.75544156120667,41.65035919757663,41.5452358558457,41.4400718199555,41.33486737156937,41.22962279009496,41.1243383527064,41.01901433436628,40.91365100784747,40.80824864375462,40.70280751054538,40.59732787455158]}]],[[{\"lng\":[-3.502996148627001,-3.436302137527301,-3.369396591471569,-3.302278125261637,-3.234945343644198,-3.167396841223753,-3.099631202374825,-3.031647001153396,-2.963442801207597,-2.895017155687632,-2.826368607154917,-2.757495687490461,-2.68839691780245,-2.619070808333061,-2.549515858364457,-2.479730556124021,-2.409713378688759,-2.339462791888912,-2.268977250210752,-2.198255196698561,-2.127295062855792,-2.056095268545405,-1.984654221889363,-1.912970319167314,-1.841041944714406,-1.768867470818288,-1.696445257615231,-1.623773652985431,-1.550850992447424,-1.477675599051663,-1.404245783273213,-1.330559842903596,-1.256616062941744,-1.182412715484087,-1.107948059613763,-1.033220341288932,-0.9582277932302217,-0.8829686348072637,-0.8074410719243504,-0.7316432969051919,-0.6555734883767699,-0.5792298111522947,-0.5026104161132545,-0.4257134400905644,-0.3485370057447968,-0.2710792214455094,-0.1933381811496566,-0.1153119642790876,-0.03699863559712983,0.04160375491574811,0.1204971721871855,0.1996835961791037,0.2791650220147923,0.3589434601069235,0.4390209362864767,0.5193994919325888,0.60008118410332,0.6810680856673432,0.7623622854365372,0.8439658882995106,0.9258810153560282,1.008109804052357,1.090654408317514,1.173516998700423,1.256699762507984,1.340204903944024,1.424034644249155,1.50819122184153,1.592676892458473,1.677493929298988,1.762644623167171,1.848131282616454,1.933956234094737,2.020121822090379,2.106630409279016,2.193484376671239,2.280686123761103,2.368238068675441,2.456142648324012,2.544402318550442,2.633019554283955,2.721996849691883,2.811336718332954,2.901041693311317,2.991114327431319,3.081557193353007,3.17237288374834,3.263564011458088,3.355133209649424,3.447083131974159,3.539416452727627,3.6321358670082,3.725244090877384,3.818743861520516,3.912637937408006,4.006929098457124,4.101620146194283,4.196713903917826,4.292213216861255,4.388120952356902],\"lat\":[40.59732787455158,40.70280751054538,40.80824864375462,40.91365100784748,41.01901433436628,41.1243383527064,41.22962279009496,41.33486737156937,41.4400718199555,41.5452358558457,41.65035919757663,41.75544156120667,41.86048266049322,41.96548220686979,42.07043990942262,42.17535547486735,42.28022860752517,42.38505900929879,42.48984637964819,42.59459041556613,42.69929081155318,42.80394725959281,42.9085594491258,43.0131270670248,43.11764979756822,43.22212732241407,43.32655932057344,43.43094546838368,43.53528543948124,43.63957890477431,43.74382553241505,43.84802498777159,43.95217693339963,44.05628102901386,44.16033693145889,44.26434429467999,44.36830276969344,44.47221200455659,44.57607164433749,44.67988133108429,44.7836407037943,44.88734939838256,44.99100704765022,45.09461328125251,45.19816772566628,45.30167000415729,45.40511973674708,45.50851654017939,45.6118600278864,45.7151498099544,45.81838549308913,45.92156668058081,46.02469297226864,46.12776396450501,46.23077925011931,46.33373841838121,46.43664105496367,46.53948674190546,46.64227505757327,46.74500557662342,46.84767786996306,46.95029150471108,47.05284604415837,47.15534104772789,47.25777607093406,47.36015066534181,47.46246437852516,47.56471675402533,47.66690733130834,47.76903564572218,47.87110122845354,47.97310360648388,48.07504230254524,48.1769168350754,48.27872671817253,48.38047146154946,48.48215057048732,48.58376354578867,48.68530988373019,48.78678907601474,48.88820060972293,48.98954396726418,49.0908186263272,49.19202405982983,49.29315973586858,49.39422511766724,49.49521966352528,49.59614282676539,49.69699405568067,49.79777279348104,49.89847847823913,49.99911054283569,50.09966841490417,50.20015151677483,50.30055926541826,50.40089107238816,50.50114634376361,50.6013244800906,50.701424876323,50.80144692176285]}]],[[{\"lng\":[-3.436828836122539,-3.303832270540787,-3.170488947983417,-3.036797513611684,-2.902756613120678,-2.768364892842349,-2.633620999850343,-2.498523582066654,-2.363071288370123,-2.22726276870678,-2.091096674202064,-1.954571657274953,-1.81768637175397,-1.680439472995154,-1.54282961800195,-1.404855465547075,-1.266515676296358,-1.127808912934586,-0.9887338402933575,-0.8492891254809714,-0.7094734380143694,-0.569285449953134,-0.4287238360355831,-0.2877872738169478,-0.1464744438096808,-0.004784029625890245,0.1372852818780887,0.2797348004549418,0.4225658323174569,0.5657796799874115,0.7093776421422516,0.8533610134595426,0.99773108445919,1.142489141343407,1.287636465834416,1.433174335009883,1.579104021136036,1.725426791498512,1.872143908230873,2.019256628140787,2.16676620253389,2.314673877035277,2.462980891408665,2.611688479373144,2.76079786841759,2.910310279612662,3.060226927420408,3.210549019501487,3.361277756519948,3.51241433194561,3.663959931854012,3.815915734723939,3.968282911232495,4.121062624047761,4.274256027618988,4.427864267964361,4.581888482456288,4.736329799604289,4.891189338835377,5.046468210272022,5.202167514507666,5.358288342379766,5.514831774740428,5.671798882224563,5.829190725015642,5.987008352608969,6.145252803572582,6.303925105305704,6.463026273794794,6.622557313367174,6.782519216442304,6.94291296328065,7.103739521730188,7.264999846970545,7.426694881254834,7.58882555364911,7.751392779769582,7.914397461517485,8.077840486811699,8.241722729319129,8.406045048182845,8.570808287748022,8.736013277285702,8.9016608307144,9.067751746319574,9.234286806471017,9.401266777338176,9.568692408603409,9.736564433173278,9.904883566887838,10.07365050822802,10.24286593802111,10.41253051914434,10.58264489622673,10.75320969534911,10.92422552374238,11.09569296948421,11.26761260119393,11.43998496772598,11.61281059786176],\"lat\":[40.57886856382267,40.66577500048056,40.75252844472775,40.83912802692388,40.92557287302161,41.01186210455421,41.0979948386235,41.183970187888,41.26978726055132,41.35544516035085,41.44094298654667,41.52627983391076,41.61145479271651,41.69646694872844,41.78131538319238,41.86599917282575,41.95051738980829,42.03486910177308,42.11905337179785,42.20306925839668,42.28691581551197,42.37059209250684,42.45409713415781,42.53742998064795,42.62058966756027,42.70357522587157,42.78638568194675,42.86902005753336,42.95147736975665,43.03375663111508,43.11585684947617,43.19777702807281,43.27951616550007,43.36107325571236,43.44244728802116,43.52363724709314,43.60464211294881,43.68546086096167,43.76609246185776,43.84653588171588,43.92679008196823,44.00685401940153,44.08672664615884,44.1664069097418,44.24589375301345,44.32518611420165,44.40428292690311,44.48318312008792,44.56188561810478,44.64038934068677,44.71869320295782,44.79679611543968,44.87469698405971,44.95239471015925,45.02988819050258,45.10717631728664,45.18425797815152,45.26113205619145,45.3377974299667,45.41425297351604,45.49049755637009,45.5665300435653,45.64234929565875,45.71795416874369,45.79334351446591,45.86851618004081,45.94347100827138,46.01820683756696,46.09272250196281,46.16701683114052,46.24108865044933,46.31493678092824,46.38856003932906,46.4619572381403,46.53512718561202,46.6080686857815,46.68078053849999,46.7532615394602,46.82551048022495,46.89752614825657,46.96930732694744,47.0408527956515,47.11216132971661,47.1832317005181,47.25406267549326,47.32465301817685,47.3950014882377,47.46510684151636,47.53496783006374,47.60458320218093,47.67395170246017,47.74307207182667,47.81194304758183,47.88056336344743,47.94893174961096,48.01704693277221,48.0849076361909,48.15251257973546,48.21986047993322,48.28695005002149]}]],[[{\"lng\":[-3.506265723041038,-3.44306585628973,-3.379880457348116,-3.316709583692866,-3.253553292674904,-3.190411641519029,-3.127284687323538,-3.06417248705985,-3.001075097572134,-2.937992575576945,-2.87492497766285,-2.811872360290067,-2.748834779790104,-2.685812292365396,-2.622804954088952,-2.559812820903995,-2.49683594862362,-2.433874392930429,-2.370928209376197,-2.307997453381522,-2.245082180235482,-2.182182445095297,-2.119298302985992,-2.056429808800058,-1.993577017297125,-1.93073998310363,-1.867918760712489,-1.80511340448277,-1.742323968639378,-1.679550507272725,-1.616793074338421,-1.554051723656953,-1.491326508913378,-1.428617483657009,-1.365924701301109,-1.303248215122584,-1.240588078261686,-1.177944343721705,-1.115317064368681,-1.052706292931099,-0.9901120819996061,-0.9275344840267142,-0.8649735513265158,-0.8024293360743996,-0.7399018903067662,-0.6773912659207502,-0.6148975146739415,-0.5524206881841108,-0.4899608379289364,-0.4275180152457361,-0.365092271331199,-0.302683657241119,-0.2402922238901358,-0.1779180220514724,-0.1155611023566787,-0.05322151529537701,0.009100688784990417,0.07140545967941281,0.1336927473255557,0.1959625018040054,0.2582146733385139,0.3204492122962386,0.3826660691879745,0.4448651946683959,0.5070465395362841,0.5692100547347588,0.6313556913515046,0.693483400618996,0.7555931339147206,0.8176848427613955,0.8797584788271919,0.9418139939259407,1.00385134001735,1.065870469207214,1.127871333747621,1.189853886037157,1.251818078621106,1.313763864191657,1.375691195588091,1.437600025796987,1.499490307952403,1.561361995336076,1.623215041377601,1.685049399654626,1.746865023893022,1.808661867967075,1.870439885899652,1.932199031862387,1.993939260175848,2.055660525309706,2.117362781882906,2.179045984663831,2.240710088570464,2.302355048670549,2.363980820181748,2.425587358471803,2.487174619058676,2.548742557610712,2.610291129946781,2.671820292036425],\"lat\":[40.48417580934598,40.47650718681949,40.46880414961558,40.46106671499604,40.45329490028929,40.44548872289016,40.4376482002598,40.4297733499254,40.42186418948008,40.41392073658277,40.40594300895791,40.39793102439534,40.3898848007502,40.38180435594262,40.37368970795766,40.36554087484505,40.3573578747191,40.34914072575841,40.34088944620581,40.33260405436814,40.32428456861603,40.31593100738379,40.30754338916918,40.29912173253328,40.29066605610026,40.28217637855724,40.27365271865411,40.26509509520329,40.25650352707967,40.24787803322028,40.23921863262425,40.23052534435254,40.22179818752776,40.21303718133403,40.2042423450168,40.19541369788264,40.18655125929902,40.17765504869422,40.16872508555708,40.15976138943682,40.15076397994291,40.14173287674479,40.13266809957176,40.12356966821278,40.11443760251629,40.10527192238999,40.09607264780066,40.08683979877404,40.07757339539455,40.06827345780517,40.0589400062072,40.04957306086013,40.04017264208142,40.03073877024629,40.02127146578757,40.0117707491955,40.00223664101754,39.99266916185817,39.98306833237869,39.9734341732971,39.96376670538781,39.95406594948155,39.94433192646505,39.93456465728099,39.92476416292773,39.91493046445913,39.90506358298437,39.89516353966775,39.88523035572847,39.87526405244054,39.86526465113242,39.85523217318698,39.84516664004126,39.83506807318624,39.82493649416664,39.81477192458083,39.80457438608053,39.79434390037064,39.7840804892091,39.77378417440656,39.76345497782642,39.75309292138437,39.74269802704838,39.73227031683843,39.72180981282633,39.71131653713554,39.70079051194094,39.69023175946865,39.67964030199587,39.6690161618506,39.65835936141155,39.64766992310786,39.63694786941895,39.62619322287427,39.61540600605318,39.60458624158475,39.5937339521474,39.58284916046897,39.57193188932631,39.56098216154517]}]],[[{\"lng\":[11.61281059786176,11.43998496772598,11.26761260119393,11.09569296948421,10.92422552374239,10.75320969534911,10.58264489622673,10.41253051914434,10.24286593802111,10.07365050822802,9.904883566887838,9.736564433173278,9.568692408603409,9.401266777338176,9.234286806471017,9.067751746319574,8.9016608307144,8.736013277285704,8.570808287748021,8.406045048182845,8.241722729319129,8.077840486811699,7.914397461517483,7.751392779769582,7.58882555364911,7.426694881254834,7.264999846970545,7.103739521730188,6.94291296328065,6.782519216442306,6.622557313367174,6.463026273794793,6.303925105305704,6.145252803572582,5.987008352608969,5.829190725015642,5.671798882224563,5.514831774740428,5.358288342379766,5.202167514507666,5.046468210272022,4.891189338835378,4.73632979960429,4.581888482456288,4.427864267964359,4.274256027618988,4.121062624047761,3.968282911232495,3.815915734723939,3.663959931854012,3.51241433194561,3.361277756519948,3.210549019501487,3.060226927420408,2.910310279612661,2.76079786841759,2.611688479373145,2.462980891408666,2.314673877035277,2.16676620253389,2.019256628140787,1.872143908230873,1.725426791498512,1.579104021136036,1.433174335009883,1.287636465834416,1.142489141343406,0.9977310844591896,0.853361013459541,0.7093776421422522,0.5657796799874125,0.4225658323174574,0.2797348004549418,0.1372852818780887,-0.004784029625890245,-0.1464744438096808,-0.2877872738169478,-0.4287238360355831,-0.5692854499531346,-0.7094734380143698,-0.8492891254809725,-0.9887338402933575,-1.127808912934585,-1.266515676296357,-1.404855465547074,-1.54282961800195,-1.680439472995154,-1.81768637175397,-1.954571657274953,-2.091096674202065,-2.22726276870678,-2.363071288370124,-2.498523582066655,-2.633620999850343,-2.768364892842348,-2.902756613120677,-3.036797513611684,-3.170488947983416,-3.303832270540787,-3.436828836122539],\"lat\":[48.28695005002149,48.21986047993322,48.15251257973546,48.0849076361909,48.01704693277221,47.94893174961096,47.88056336344742,47.81194304758183,47.74307207182667,47.67395170246017,47.60458320218094,47.53496783006374,47.46510684151636,47.3950014882377,47.32465301817685,47.25406267549326,47.1832317005181,47.11216132971661,47.0408527956515,46.96930732694744,46.89752614825657,46.82551048022495,46.7532615394602,46.68078053849999,46.6080686857815,46.53512718561202,46.4619572381403,46.38856003932906,46.31493678092824,46.24108865044933,46.16701683114052,46.0927225019628,46.01820683756696,45.94347100827138,45.86851618004081,45.79334351446591,45.71795416874369,45.64234929565875,45.5665300435653,45.49049755637009,45.41425297351604,45.3377974299667,45.26113205619146,45.18425797815152,45.10717631728664,45.02988819050258,44.95239471015926,44.87469698405971,44.79679611543968,44.71869320295782,44.64038934068677,44.56188561810478,44.48318312008792,44.40428292690311,44.32518611420165,44.24589375301344,44.1664069097418,44.08672664615885,44.00685401940153,43.92679008196823,43.84653588171588,43.76609246185776,43.68546086096167,43.60464211294881,43.52363724709314,43.44244728802116,43.36107325571236,43.27951616550007,43.19777702807281,43.11585684947618,43.03375663111508,42.95147736975665,42.86902005753336,42.78638568194675,42.70357522587157,42.62058966756027,42.53742998064795,42.45409713415781,42.37059209250684,42.28691581551197,42.20306925839668,42.11905337179785,42.03486910177308,41.95051738980829,41.86599917282575,41.78131538319238,41.69646694872844,41.61145479271651,41.52627983391076,41.44094298654667,41.35544516035085,41.26978726055132,41.183970187888,41.0979948386235,41.01186210455421,40.92557287302161,40.83912802692389,40.75252844472775,40.66577500048056,40.57886856382267]}]],[[{\"lng\":[2.671820292036425,2.610291129946781,2.548742557610713,2.487174619058676,2.425587358471803,2.363980820181748,2.302355048670548,2.240710088570463,2.179045984663831,2.117362781882906,2.055660525309706,1.993939260175848,1.932199031862387,1.870439885899652,1.808661867967075,1.746865023893023,1.685049399654626,1.623215041377602,1.561361995336075,1.499490307952403,1.437600025796987,1.375691195588091,1.313763864191657,1.251818078621106,1.189853886037157,1.127871333747621,1.065870469207214,1.00385134001735,0.941813993925941,0.8797584788271922,0.8176848427613959,0.7555931339147196,0.6934834006189954,0.6313556913515037,0.5692100547347588,0.5070465395362841,0.4448651946683959,0.3826660691879745,0.3204492122962386,0.2582146733385139,0.1959625018040054,0.1336927473255559,0.07140545967941331,0.009100688784990938,-0.05322151529537727,-0.1155611023566789,-0.1779180220514726,-0.2402922238901358,-0.302683657241119,-0.365092271331199,-0.4275180152457361,-0.4899608379289364,-0.5524206881841108,-0.6148975146739419,-0.6773912659207503,-0.7399018903067667,-0.8024293360743993,-0.8649735513265148,-0.9275344840267141,-0.9901120819996061,-1.052706292931099,-1.115317064368681,-1.177944343721705,-1.240588078261686,-1.303248215122584,-1.365924701301109,-1.428617483657009,-1.491326508913378,-1.554051723656953,-1.61679307433842,-1.679550507272725,-1.742323968639378,-1.80511340448277,-1.867918760712489,-1.93073998310363,-1.993577017297125,-2.056429808800058,-2.119298302985992,-2.182182445095297,-2.245082180235482,-2.307997453381522,-2.370928209376197,-2.433874392930428,-2.49683594862362,-2.559812820903995,-2.622804954088952,-2.685812292365396,-2.748834779790104,-2.811872360290067,-2.87492497766285,-2.937992575576945,-3.001075097572134,-3.06417248705985,-3.127284687323538,-3.190411641519029,-3.253553292674904,-3.316709583692866,-3.379880457348115,-3.44306585628973,-3.506265723041037],\"lat\":[39.56098216154517,39.57193188932631,39.58284916046897,39.5937339521474,39.60458624158474,39.61540600605319,39.62619322287426,39.63694786941894,39.64766992310786,39.65835936141155,39.6690161618506,39.67964030199587,39.69023175946865,39.70079051194094,39.71131653713554,39.72180981282633,39.73227031683842,39.74269802704837,39.75309292138437,39.76345497782642,39.77378417440656,39.7840804892091,39.79434390037065,39.80457438608053,39.81477192458083,39.82493649416664,39.83506807318624,39.84516664004126,39.85523217318698,39.86526465113242,39.87526405244054,39.88523035572848,39.89516353966775,39.90506358298437,39.91493046445913,39.92476416292773,39.93456465728099,39.94433192646505,39.95406594948155,39.96376670538781,39.9734341732971,39.98306833237869,39.99266916185816,40.00223664101754,40.0117707491955,40.02127146578757,40.03073877024629,40.04017264208142,40.04957306086013,40.0589400062072,40.06827345780517,40.07757339539455,40.08683979877404,40.09607264780066,40.10527192238999,40.1144376025163,40.12356966821278,40.13266809957175,40.14173287674479,40.15076397994291,40.15976138943682,40.16872508555708,40.17765504869422,40.18655125929902,40.19541369788264,40.2042423450168,40.21303718133404,40.22179818752775,40.23052534435253,40.23921863262426,40.24787803322028,40.25650352707967,40.26509509520329,40.27365271865411,40.28217637855724,40.29066605610026,40.29912173253328,40.30754338916918,40.31593100738379,40.32428456861603,40.33260405436814,40.34088944620581,40.3491407257584,40.3573578747191,40.36554087484505,40.37368970795766,40.38180435594262,40.3898848007502,40.39793102439534,40.40594300895791,40.41392073658277,40.42186418948008,40.4297733499254,40.4376482002598,40.44548872289016,40.45329490028929,40.46106671499604,40.46880414961558,40.47650718681949,40.48417580934598]}]],[[{\"lng\":[4.657418322535825,4.555081383045755,4.453264780323286,4.351964155303357,4.25117519064186,4.150893610298216,4.051115179121096,3.951835702437235,3.853051025643468,3.7547570338019,3.656949651238327,3.559624841143848,3.462778605179733,3.366406983085542,3.270506052290506,3.175071927528176,3.080100760454365,2.985588739268358,2.891532088337433,2.797927067824654,2.704769973319974,2.612057135474625,2.519784919638798,2.427949725502609,2.33654798674036,2.245576170658065,2.155030777844255,2.064908341824045,1.975205428716455,1.885918636894978,1.797044596651379,1.708579969862722,1.620521449661601,1.53286576010957,1.44560965587376,1.358749921906653,1.272283373129024,1.186206854116009,1.10051723878629,1.015211430094396,0.9302863597260765,0.8457389877967453,0.7615663025529767,0.6777653200770201,0.5943330839943392,0.5112666651841249,0.4285631614927862,0.346219697450387,0.2642334239900077,0.1826015181700197,0.1013211828992372,0.02038964666493311,-0.06019583673629876,-0.1404379884648698,-0.2203395049017225,-0.2999030579090836,-0.3791312950884639,-0.4580268400359375,-0.5365922925947011,-0.6148302291049687,-0.6927432026511875,-0.770333743306638,-0.8476043583754035,-0.9245575326317601,-1.001195728556997,-1.077521386573692,-1.153536925277472,-1.229244741666268,-1.304647211367111,-1.379746688860457,-1.454545507702112,-1.529045980742727,-1.603250400344928,-1.677161038598089,-1.75078014753076,-1.824109959320794,-1.89715268650318,-1.969910522175614,-2.042385640201822,-2.114580195412666,-2.186496323805056,-2.258136142738674,-2.32950175113056,-2.400595229647555,-2.471418640896645,-2.541974029613205,-2.612263422847191,-2.682288830147283,-2.752052243743004,-2.821555638724836,-2.890800973222371,-2.959790188580484,-3.02852520953358,-3.097007944377924,-3.165240285142073,-3.233224107755433,-3.300961272214959,-3.368453622750024,-3.435702987985471,-3.50271118110287],\"lat\":[52.19668004265798,52.08297110712912,51.96917400841227,51.85528955248157,51.74131853640232,51.62726174844541,51.51311996820031,51.39889396668619,51.28458450646179,51.17019234173362,51.05571821846282,50.94116287447034,50.8265270395409,50.71181143552536,50.59701677644177,50.48214376857499,50.36719311057493,50.25216549355347,50.13706160118007,50.02188210977596,49.90662768840716,49.79129899897615,49.67589669631225,49.5604214282609,49.44487383577155,49.32925455298436,49.21356420731588,49.09780341954333,48.98197280388788,48.8660729680967,48.75010451352392,48.63406803521048,48.51796412196291,48.40179335643095,48.28555631518421,48.1692535687877,48.05288568187638,47.93645321322862,47.81995671583879,47.70339673698872,47.58677381831823,47.47008849589473,47.35334130028189,47.23653275660725,47.11966338462906,47.00273369880214,46.88574420834283,46.76869541729307,46.65158782458369,46.5344219240967,46.41719820472684,46.29991715044227,46.18257924034445,46.06518494872714,45.94773474513475,45.83022909441976,45.7126684567994,45.59505328791167,45.47738403887043,45.35966115631994,45.2418850824885,45.1240562552415,45.00617510813363,44.88824207046059,44.77025756730983,44.65222201961094,44.53413584418502,44.41599945379371,44.29781325718736,44.17957765915261,44.06129306055941,43.94295985840733,43.82457844587127,43.70614921234662,43.58767254349377,43.469148821282,43.35057842403292,43.23196172646322,43.11329909972686,42.99459091145681,42.87583752580612,42.7570393034885,42.63819660181841,42.51930977475057,42.40037917291897,42.28140514367539,42.16238803112734,42.04332817617566,41.92422591655148,41.80508158685278,41.68589551858047,41.56666804017394,41.44739947704626,41.32809015161883,41.20874038335564,41.08935048879702,40.9699207815931,40.85045157253666,40.73094316959565,40.61139587794536]}]],[[{\"lng\":[13.29183683392754,13.08297036421454,12.87507587308307,12.66814861615968,12.46218382400166,12.25717670359038,12.05312243979175,11.85001619678447,11.64785311945609,11.44662833476736,11.24633695308532,11.04697406948525,10.84853476502212,10.65101410797171,10.45440715504186,10.25870895255432,10.06391453759742,9.870018939150098,9.677017179177671,9.48490427369966,9.293675233830207,9.103325066791404,8.91384877689997,8.72524136652774,8.537497837036272,8.35061318968612,8.164582426521086,7.979400551227922,7.795062569971876,7.611563492208505,7.428898331472173,7.247062106141648,7.066049840183195,6.885856563871568,6.706477314489378,6.527907137005114,6.350141084730363,6.173174219956509,5.997001614571393,5.821618350656274,5.647019521063487,5.473200229975238,5.300155593443837,5.12788073991381,4.956370810726238,4.785620960605701,4.615626358130193,4.446382186184383,4.277883642396532,4.11012593955951,3.943104306036154,3.776813986149409,3.611250240557521,3.44640834661467,3.282283598717323,3.118871308636684,2.956166805837531,2.794165437783751,2.632862570230918,2.472253587506197,2.312333892775857,2.153098908300744,1.994544075679957,1.836664856083032,1.679456730470932,1.522915199806081,1.367035785251764,1.211814028361127,1.057245491256054,0.903325756796164,0.7500504287382063,0.5974151318860996,0.4454155122318288,0.2940472370874773,0.1433059952086164,-0.006812503090729016,-0.1563125258312917,-0.3051983192697436,-0.4534741078076238,-0.6011440939077962,-0.7482124580182357,-0.894683358502937,-1.040560931579735,-1.185849291264863,-1.330552529324018,-1.474674715229799,-1.618219896125273,-1.761192096793552,-1.903595319633134,-2.045433544638917,-2.186710729388632,-2.327430809034602,-2.467597696300617,-2.607215281483796,-2.746287432461267,-2.884817994701518,-3.022810791280273,-3.160269622900746,-3.297198267918141,-3.433600482368246],\"lat\":[52.25886513606259,52.1552300016607,52.05122769403528,51.94686128773171,51.84213383461594,51.73704836389606,51.63160788214925,51.52581537335367,51.41967379892541,51.31318609776017,51.20635518627951,51.09918395848162,50.9916752859964,50.88383201814459,50.77565698200102,50.66715298246172,50.55832280231461,50.44916920231398,50.33969492125823,50.22990267607101,50.11979516188558,50.00937505213216,49.89864499862815,49.78760763167138,49.67626556013585,49.56462137157006,49.45267763229793,49.34043688752199,49.22790166142878,49.1150744572965,49.00195775760454,48.88855402414515,48.77486569813675,48.66089520033911,48.54664493117019,48.43211727082447,48.31731457939274,48.20223919698344,48.08689344384516,47.97127962049034,47.85540000782031,47.73925686725119,47.62285244084092,47.50618895141719,47.3892686027062,47.27209357946225,47.15466604759799,47.03698815431544,46.91906202823752,46.80088977954011,46.68247350008467,46.56381526355125,46.44491712557183,46.32578112386402,46.20640927836507,46.08680359136594,45.9669660476458,45.84689861460635,45.72660324240651,45.60608186409689,45.48533639575448,45.36436873661714,45.24318076921806,45.12177435952014,45.0001513570501,44.87831359503257,44.75626289052376,44.63400104454506,44.51152984221622,44.38885105288829,44.26596643027613,44.14287771259068,44.01958662267072,43.89609486811421,43.77240414140929,43.64851612006466,43.52443246673964,43.40015482937346,43.27568484131434,43.15102412144778,43.02617427432433,42.9011368902868,42.77591354559693,42.65050580256122,42.5249152096564,42.39914330165404,42.2731915997446,42.14706161166076,42.02075483180006,41.89427274134687,41.76761680839365,41.64078848806138,41.51378922261944,41.38662044160458,41.25928356193928,41.13177998804922,41.00411111198008,40.87627831351351,40.74828296028241,40.6201264078853]}]],[[{\"lng\":[8.41401194603662,8.272509770031395,8.131521011368179,7.991043212354726,7.851073918431322,7.711610678374243,7.572651044494211,7.434192572829872,7.296232823336383,7.158769360069202,7.021799751363126,6.885321570006687,6.749332393411949,6.613829803779811,6.478811388260858,6.344274739111864,6.21021745384799,6.076637135390776,5.943531392211976,5.810897838473332,5.678734094162311,5.547037785223939,5.415806543688737,5.285038007796878,5.154729822118588,5.024879637670898,4.89548511203077,4.76654390944472,4.638053700934925,4.510012164401952,4.38241698472412,4.255265853853589,4.12855647090922,4.002286542266251,3.876453781642912,3.751055910183944,3.626090656541168,3.501555756951097,3.377448955309697,3.253768003244312,3.130510660182836,3.007674693420167,2.885257878182018,2.763257997686119,2.641672843200871,2.520500214101499,2.39973791792376,2.279383770415248,2.159435595584361,2.03989122574696,1.920748501570772,1.802005272117601,1.683659394883363,1.565708735836021,1.44815116945145,1.33098457874727,1.214206855314709,1.097815899348517,0.9818096196749956,0.8661859337781684,0.7509427678241365,0.6360780566836678,0.521589743953044,0.4074757819732211,0.2937341318473339,0.1803627634565729,0.06735965547449174,-0.04527720462024037,-0.1575498205325881,-0.269460187141373,-0.3810102904909495,-0.4922021077842685,-0.6030376073773216,-0.7135187487749273,-0.8236474826278181,-0.9334257507310088,-1.042855486023405,-1.151938612588631,-1.26067704565703,-1.369072691608835,-1.477127447978451,-1.584843203459842,-1.692221837912985,-1.799265222371371,-1.905975219050505,-2.012353681357418,-2.118402453901119,-2.224123372504007,-2.32951826421417,-2.434588947318597,-2.539337231357236,-2.643764917137902,-2.747873796751997,-2.851665653591034,-2.955142262363918,-3.058305389114998,-3.161156791242825,-3.263698217519646,-3.365931408111557,-3.467858094599352],\"lat\":[49.95306267159093,49.8653525880609,49.77747091058299,49.68941879256726,49.60119737969679,49.51280780996412,49.42425121370794,49.33552871365014,49.24664142493317,49.15759045515768,49.06837690442035,48.97900186535216,48.88946642315666,48.7997716556487,48.70991863329323,48.61990841924429,48.52974206938434,48.43942063236359,48.34894514963958,48.25831665551695,48.16753617718723,48.07660473476887,47.98552334134736,47.89429300301545,47.80291471891338,47.71138948126939,47.61971827544018,47.52790207995134,47.43594186653809,47.34383860018587,47.251593239171,47.15920673510144,47.06668003295752,46.97401407113267,46.88120978147421,46.7882680893241,46.69518991355964,46.60197616663429,46.50862775461827,46.41514557723932,46.32153052792328,46.22778349383472,46.13390535591743,46.03989698893494,45.94575926151094,45.85149303616961,45.75709916937589,45.66257851157566,45.56793190723594,45.47316019488476,45.3782642071512,45.28324477080518,45.18810270679713,45.09283883029765,44.99745395073696,44.90194887184435,44.80632439168731,44.71058130271076,44.614720391776,44.51874244019956,44.42264822379197,44.3264385128963,44.23011407242662,44.1336756619063,44.03712403550612,43.9404599420823,43.84368412521432,43.74679732324259,43.64980026930598,43.55269369137918,43.45547831230984,43.35815484985567,43.2607240167212,43.16318652059455,43.06554306418389,42.96779434525372,42.86994105666113,42.77198388639172,42.67392351759532,42.57576062862176,42.47749589305614,42.37912997975421,42.28066355287727,42.18209727192721,42.08343179178106,41.98466776272555,41.88580583049139,41.78684663628738,41.68779081683433,41.58863900439879,41.48939182682657,41.3900499075761,41.29061386575155,41.19108431613579,41.09146186922313,40.99174713125192,40.89194070423682,40.79204318600109,40.6920551702084,40.59197724639477]}]],[[{\"lng\":[-3.50271118110287,-3.435702987985471,-3.368453622750024,-3.300961272214959,-3.233224107755433,-3.165240285142073,-3.097007944377924,-3.02852520953358,-2.959790188580484,-2.890800973222371,-2.821555638724836,-2.752052243743004,-2.682288830147283,-2.612263422847191,-2.541974029613205,-2.471418640896645,-2.400595229647556,-2.32950175113056,-2.258136142738673,-2.186496323805056,-2.114580195412666,-2.042385640201822,-1.969910522175613,-1.89715268650318,-1.824109959320794,-1.75078014753076,-1.677161038598089,-1.603250400344928,-1.529045980742727,-1.454545507702112,-1.379746688860457,-1.30464721136711,-1.229244741666268,-1.153536925277471,-1.077521386573692,-1.001195728556997,-0.9245575326317601,-0.8476043583754035,-0.770333743306638,-0.6927432026511875,-0.6148302291049687,-0.5365922925947021,-0.458026840035938,-0.3791312950884641,-0.2999030579090829,-0.2203395049017219,-0.1404379884648692,-0.06019583673629876,0.02038964666493311,0.1013211828992372,0.1826015181700197,0.2642334239900077,0.346219697450387,0.4285631614927862,0.5112666651841253,0.5943330839943398,0.6777653200770198,0.7615663025529759,0.8457389877967452,0.9302863597260765,1.015211430094396,1.10051723878629,1.186206854116009,1.272283373129024,1.358749921906653,1.44560965587376,1.532865760109572,1.620521449661602,1.708579969862723,1.797044596651379,1.885918636894977,1.975205428716455,2.064908341824045,2.155030777844255,2.245576170658065,2.33654798674036,2.427949725502609,2.519784919638798,2.612057135474625,2.704769973319975,2.797927067824654,2.891532088337433,2.985588739268358,3.080100760454364,3.175071927528176,3.270506052290505,3.366406983085542,3.462778605179733,3.559624841143848,3.656949651238328,3.7547570338019,3.853051025643468,3.951835702437235,4.051115179121096,4.150893610298216,4.25117519064186,4.351964155303357,4.453264780323286,4.555081383045755,4.657418322535825],\"lat\":[40.61139587794536,40.73094316959566,40.85045157253666,40.9699207815931,41.08935048879702,41.20874038335563,41.32809015161884,41.44739947704626,41.56666804017394,41.68589551858047,41.80508158685279,41.92422591655148,42.04332817617566,42.16238803112734,42.28140514367538,42.40037917291897,42.51930977475057,42.63819660181841,42.7570393034885,42.87583752580612,42.99459091145682,43.11329909972686,43.23196172646322,43.35057842403292,43.469148821282,43.58767254349377,43.70614921234662,43.82457844587127,43.94295985840733,44.06129306055941,44.1795776591526,44.29781325718735,44.41599945379371,44.53413584418502,44.65222201961094,44.77025756730983,44.88824207046059,45.00617510813363,45.1240562552415,45.2418850824885,45.35966115631994,45.47738403887043,45.59505328791166,45.71266845679939,45.83022909441976,45.94773474513475,46.06518494872714,46.18257924034445,46.29991715044227,46.41719820472684,46.5344219240967,46.65158782458369,46.76869541729307,46.88574420834282,47.00273369880215,47.11966338462907,47.23653275660725,47.35334130028188,47.47008849589473,47.58677381831823,47.70339673698872,47.81995671583879,47.93645321322862,48.05288568187638,48.1692535687877,48.28555631518421,48.40179335643096,48.51796412196291,48.63406803521048,48.75010451352392,48.8660729680967,48.98197280388788,49.09780341954333,49.21356420731588,49.32925455298436,49.44487383577155,49.5604214282609,49.67589669631225,49.79129899897615,49.90662768840716,50.02188210977597,50.13706160118008,50.25216549355347,50.36719311057492,50.48214376857499,50.59701677644177,50.71181143552536,50.8265270395409,50.94116287447034,51.05571821846282,51.17019234173362,51.28458450646179,51.39889396668619,51.51311996820031,51.62726174844541,51.74131853640232,51.85528955248157,51.96917400841228,52.08297110712912,52.19668004265798]}]],[[{\"lng\":[-3.433600482368246,-3.297198267918142,-3.160269622900747,-3.022810791280273,-2.884817994701518,-2.746287432461267,-2.607215281483795,-2.467597696300616,-2.327430809034601,-2.186710729388632,-2.045433544638917,-1.903595319633134,-1.761192096793552,-1.618219896125273,-1.474674715229799,-1.330552529324019,-1.185849291264863,-1.040560931579736,-0.8946833585029366,-0.7482124580182349,-0.6011440939077957,-0.4534741078076238,-0.3051983192697436,-0.1563125258312917,-0.006812503090729016,0.1433059952086164,0.2940472370874773,0.4454155122318288,0.5974151318860992,0.7500504287382057,0.9033257567961634,1.057245491256055,1.211814028361129,1.367035785251765,1.522915199806081,1.679456730470932,1.836664856083032,1.994544075679957,2.153098908300744,2.312333892775857,2.472253587506197,2.632862570230917,2.794165437783749,2.95616680583753,3.118871308636684,3.282283598717323,3.446408346614672,3.611250240557521,3.776813986149409,3.943104306036154,4.11012593955951,4.277883642396532,4.446382186184383,4.615626358130194,4.785620960605701,4.956370810726238,5.12788073991381,5.300155593443836,5.473200229975238,5.647019521063487,5.821618350656274,5.997001614571393,6.173174219956509,6.350141084730363,6.527907137005114,6.706477314489378,6.885856563871569,7.066049840183197,7.24706210614165,7.428898331472173,7.611563492208504,7.795062569971876,7.979400551227922,8.164582426521086,8.35061318968612,8.537497837036272,8.72524136652774,8.91384877689997,9.103325066791404,9.293675233830209,9.484904273699662,9.677017179177671,9.870018939150096,10.06391453759742,10.25870895255432,10.45440715504186,10.65101410797171,10.84853476502212,11.04697406948525,11.24633695308532,11.44662833476736,11.64785311945609,11.85001619678448,12.05312243979175,12.25717670359038,12.46218382400166,12.66814861615968,12.87507587308307,13.08297036421453,13.29183683392754],\"lat\":[40.6201264078853,40.74828296028241,40.87627831351351,41.00411111198008,41.13177998804922,41.25928356193928,41.38662044160458,41.51378922261944,41.64078848806138,41.76761680839365,41.89427274134687,42.02075483180006,42.14706161166076,42.2731915997446,42.39914330165404,42.5249152096564,42.65050580256122,42.77591354559692,42.9011368902868,43.02617427432433,43.15102412144778,43.27568484131434,43.40015482937346,43.52443246673964,43.64851612006466,43.77240414140929,43.89609486811421,44.01958662267072,44.14287771259068,44.26596643027613,44.38885105288829,44.51152984221622,44.63400104454506,44.75626289052376,44.87831359503257,45.0001513570501,45.12177435952014,45.24318076921806,45.36436873661714,45.48533639575448,45.60608186409689,45.7266032424065,45.84689861460635,45.96696604764579,46.08680359136594,46.20640927836507,46.32578112386403,46.44491712557183,46.56381526355125,46.68247350008467,46.80088977954011,46.91906202823752,47.03698815431544,47.15466604759799,47.27209357946225,47.3892686027062,47.50618895141719,47.62285244084092,47.73925686725118,47.85540000782031,47.97127962049034,48.08689344384516,48.20223919698344,48.31731457939274,48.43211727082447,48.54664493117019,48.66089520033911,48.77486569813675,48.88855402414516,49.00195775760455,49.1150744572965,49.22790166142878,49.34043688752199,49.45267763229793,49.56462137157006,49.67626556013585,49.78760763167138,49.89864499862815,50.00937505213216,50.11979516188558,50.22990267607101,50.33969492125823,50.44916920231397,50.55832280231461,50.66715298246171,50.77565698200102,50.88383201814459,50.9916752859964,51.09918395848162,51.2063551862795,51.31318609776017,51.41967379892541,51.52581537335367,51.63160788214925,51.73704836389606,51.84213383461594,51.94686128773171,52.05122769403528,52.15523000166069,52.25886513606259]}]],[[{\"lng\":[-3.467858094599352,-3.365931408111557,-3.263698217519646,-3.161156791242825,-3.058305389114998,-2.955142262363919,-2.851665653591033,-2.747873796751997,-2.643764917137902,-2.539337231357236,-2.434588947318597,-2.32951826421417,-2.224123372504007,-2.118402453901119,-2.012353681357418,-1.905975219050505,-1.799265222371371,-1.692221837912986,-1.584843203459841,-1.477127447978451,-1.369072691608835,-1.26067704565703,-1.151938612588631,-1.042855486023405,-0.9334257507310088,-0.8236474826278181,-0.7135187487749273,-0.6030376073773216,-0.4922021077842693,-0.3810102904909499,-0.2694601871413733,-0.1575498205325872,-0.04527720462024037,0.0673596554744923,0.1803627634565729,0.2937341318473339,0.4074757819732211,0.521589743953044,0.6360780566836678,0.7509427678241365,0.8661859337781684,0.9818096196749951,1.097815899348515,1.214206855314708,1.33098457874727,1.44815116945145,1.565708735836021,1.683659394883363,1.802005272117601,1.920748501570772,2.03989122574696,2.159435595584361,2.279383770415248,2.39973791792376,2.5205002141015,2.641672843200872,2.763257997686118,2.885257878182016,3.007674693420164,3.130510660182836,3.253768003244312,3.377448955309697,3.501555756951097,3.626090656541168,3.751055910183944,3.876453781642912,4.002286542266251,4.12855647090922,4.255265853853592,4.38241698472412,4.510012164401952,4.638053700934925,4.76654390944472,4.89548511203077,5.024879637670898,5.154729822118588,5.285038007796878,5.415806543688737,5.547037785223939,5.678734094162311,5.810897838473332,5.943531392211977,6.076637135390774,6.21021745384799,6.344274739111864,6.478811388260858,6.613829803779811,6.749332393411949,6.885321570006687,7.021799751363126,7.158769360069202,7.296232823336383,7.434192572829872,7.572651044494212,7.711610678374243,7.851073918431322,7.991043212354726,8.131521011368177,8.272509770031393,8.41401194603662],\"lat\":[40.59197724639477,40.6920551702084,40.79204318600109,40.89194070423682,40.99174713125192,41.09146186922313,41.19108431613579,41.29061386575155,41.3900499075761,41.48939182682657,41.58863900439879,41.68779081683433,41.78684663628738,41.88580583049139,41.98466776272555,42.08343179178106,42.18209727192721,42.28066355287726,42.3791299797542,42.47749589305614,42.57576062862176,42.67392351759532,42.77198388639172,42.86994105666113,42.96779434525372,43.06554306418389,43.16318652059455,43.2607240167212,43.35815484985566,43.45547831230984,43.55269369137917,43.64980026930598,43.74679732324258,43.84368412521432,43.9404599420823,44.03712403550612,44.1336756619063,44.23011407242662,44.3264385128963,44.42264822379197,44.51874244019956,44.61472039177599,44.71058130271076,44.80632439168731,44.90194887184435,44.99745395073697,45.09283883029765,45.18810270679713,45.28324477080518,45.3782642071512,45.47316019488476,45.56793190723594,45.66257851157566,45.75709916937588,45.85149303616961,45.94575926151094,46.03989698893493,46.13390535591743,46.22778349383472,46.32153052792328,46.41514557723932,46.50862775461827,46.60197616663429,46.69518991355964,46.7882680893241,46.88120978147421,46.97401407113267,47.06668003295752,47.15920673510144,47.25159323917099,47.34383860018587,47.43594186653809,47.52790207995134,47.61971827544018,47.71138948126939,47.80291471891338,47.89429300301545,47.98552334134736,48.07660473476887,48.16753617718723,48.25831665551695,48.34894514963958,48.43942063236359,48.52974206938434,48.61990841924429,48.70991863329323,48.7997716556487,48.88946642315666,48.97900186535216,49.06837690442035,49.15759045515768,49.24664142493317,49.33552871365014,49.42425121370794,49.51280780996412,49.60119737969679,49.68941879256726,49.777470910583,49.8653525880609,49.95306267159093]}]],[[{\"lng\":[-3.552628045963011,-3.535761760609574,-3.518881118534645,-3.501986094282786,-3.485076662348054,-3.468152797173873,-3.451214473152915,-3.434261664626975,-3.417294345886853,-3.400312491172225,-3.383316074671522,-3.36630507052181,-3.349279452808663,-3.332239195566038,-3.315184272776153,-3.298114658369361,-3.281030326224025,-3.263931250166392,-3.246817403970468,-3.229688761357894,-3.212545295997814,-3.195386981506755,-3.178213791448495,-3.161025699333939,-3.14382267862099,-3.126604702714419,-3.109371744965743,-3.092123778673088,-3.074860777081068,-3.057582713380651,-3.040289560709029,-3.022981292149492,-3.005657880731296,-2.988319299429531,-2.970965521164993,-2.953596518804048,-2.936212265158509,-2.918812732985494,-2.901397894987302,-2.883967723811275,-2.866522192049669,-2.849061272239522,-2.831584936862514,-2.814093158344838,-2.796585909057067,-2.779063161314018,-2.761524887374613,-2.743971059441754,-2.726401649662175,-2.708816630126318,-2.691215972868186,-2.673599649865218,-2.655967633038142,-2.638319894250843,-2.620656405310224,-2.602977137966072,-2.585282063910914,-2.567571154779878,-2.549844382150564,-2.532101717542893,-2.514343132418975,-2.496568598182964,-2.478778086180923,-2.46097156770068,-2.443149013971689,-2.425310396164883,-2.407455685392543,-2.389584852708147,-2.37169786910623,-2.353794705522245,-2.335875332832413,-2.317939721853587,-2.299987843343103,-2.282019667998638,-2.264035166458067,-2.246034309299314,-2.228017067040211,-2.209983410138351,-2.191933308990942,-2.173866733934659,-2.155783655245501,-2.137684043138644,-2.119567867768288,-2.101435099227515,-2.083285707548139,-2.065119662700559,-2.046936934593609,-2.028737493074408,-2.010521307928209,-1.992288348878258,-1.974038585585632,-1.955771987649097,-1.937488524604949,-1.919188165926874,-1.900870881025785,-1.882536639249678,-1.864185409883473,-1.845817162148867,-1.827431865204177,-1.809029488144188],\"lat\":[40.52030390351038,40.54879535691038,40.5772843556454,40.60577089515109,40.63425497085326,40.66273657816787,40.69121571250105,40.71969236924895,40.74816654379786,40.7766382315241,40.80510742779399,40.83357412796387,40.86203832738003,40.89050002137872,40.91895920528608,40.94741587441814,40.97587002408079,41.00432164956976,41.03277074617056,41.06121730915849,41.0896613337986,41.11810281534568,41.14654174904415,41.17497813012816,41.20341195382147,41.23184321533743,41.260271909879,41.28869803263869,41.31712157879851,41.34554254352998,41.37396092199409,41.40237670934126,41.43078990071133,41.45920049123352,41.48760847602637,41.51601385019782,41.54441660884499,41.57281674705438,41.60121425990167,41.62960914245173,41.65800138975862,41.68639099686559,41.71477795880496,41.74316227059816,41.77154392725566,41.79992292377698,41.82829925515062,41.85667291635409,41.88504390235378,41.91341220810502,41.94177782855203,41.97014075862786,41.99850099325439,42.02685852734228,42.05521335579093,42.08356547348852,42.11191487531185,42.14026155612645,42.16860551078645,42.19694673413458,42.22528522100217,42.25362096620906,42.28195396456361,42.31028421086266,42.33861169989149,42.36693642642378,42.39525838522163,42.42357757103545,42.45189397860401,42.4802076026543,42.50851843790163,42.53682647904952,42.56513172078965,42.59343415780187,42.62173378475417,42.65003059630261,42.67832458709132,42.70661575175244,42.73490408490614,42.76318958116052,42.79147223511162,42.81975204134334,42.8480289944275,42.87630308892369,42.90457431937934,42.93284268032961,42.96110816629739,42.98937077179325,43.01763049131546,43.04588731934987,43.07414125036994,43.1023922788367,43.13064039919863,43.15888560589182,43.18712789333967,43.21536725595313,43.24360368813043,43.2718371842572,43.30006773870638,43.32829534583816]}]],[[{\"lng\":[175.7001222477038,175.7211412319877,175.7420581591629,175.7628742195193,175.7835905876083,175.8042084225206,175.824728868158,175.8451530534995,175.8654820928621,175.8857170861567,175.9058591191383,175.9259092636515,175.9458685778707,175.9657381065365,175.9855188811859,176.0052119203794,176.0248182299227,176.0443388030844,176.0637746208092,176.0831266519277,176.1023958533606,176.121583170321,176.1406895365107,176.1597158743143,176.1786630949892,176.1975320988508,176.2163237754565,176.2350390037838,176.2536786524067,176.2722435796681,176.2907346338488,176.3091526533343,176.327498466777,176.3457728932569,176.3639767424382,176.3821108147239,176.4001759014069,176.4181727848184,176.4361022384745,176.4539650272186,176.4717619073627,176.4894936268253,176.5071609252671,176.5247645342242,176.5423051772392,176.5597835699895,176.5772004204138,176.594556428836,176.6118522880875,176.6290886836264,176.6462662936559,176.6633857892394,176.6804478344145,176.6974530863046,176.714402195229,176.7312958048103,176.7481345520813,176.7649190675887,176.7816499754961,176.7983278936844,176.8149534338516,176.8315272016099,176.8480497965819,176.8645218124946,176.8809438372729,176.8973164531298,176.9136402366574,176.9299157589145,176.9461435855137,176.962324276707,176.9784583874702,176.9945464675852,177.010589061722,177.0265867095187,177.0425399456607,177.0584492999583,177.0743152974232,177.0901384583441,177.1059192983604,177.1216583285361,177.137356055431,177.153012981172,177.1686296035226,177.184206415952,177.1997439077025,177.2152425638563,177.2307028654016,177.2461252892969,177.2615103085348,177.2768583922056,177.2921700055582,177.3074456100624,177.3226856634679,177.3378906198649,177.3530609297415,177.3681970400423,177.3832993942249,177.3983684323158,177.4134045909663,177.4284083035066],\"lat\":[-36.64325389049153,-36.45450407030248,-36.26575058285227,-36.07699347098209,-35.88823277696516,-35.69946854251677,-35.51070080880412,-35.32192961645597,-35.13315500557202,-34.94437701573224,-34.75559568600585,-34.56681105496024,-34.37802316066969,-34.18923204072386,-34.00043773223612,-33.8116402718518,-33.6228396957562,-33.43403603968245,-33.24522933891922,-33.05641962831827,-32.86760694230192,-32.67879131487027,-32.48997277960839,-32.30115136969322,-32.11232711790051,-31.92350005661157,-31.73467021781978,-31.54583763313712,-31.35700233380054,-31.16816435067815,-30.97932371427536,-30.79048045474089,-30.60163460187266,-30.41278618512352,-30.22393523360699,-30.03508177610282,-29.84622584106239,-29.65736745661419,-29.46850665056897,-29.27964345042499,-29.0907778833731,-28.90190997630168,-28.71303975580159,-28.5241672481709,-28.33529247941976,-28.14641547527488,-27.95753626118421,-27.76865486232135,-27.57977130358998,-27.39088560962819,-27.20199780481268,-27.01310791326303,-26.82421595884569,-26.63532196517809,-26.44642595563258,-26.25752795334034,-26.06862798119515,-25.87972606185724,-25.69082221775695,-25.50191647109836,-25.31300884386288,-25.12409935781276,-24.93518803449457,-24.74627489524259,-24.55735996118216,-24.36844325323297,-24.17952479211229,-23.99060459833819,-23.80168269223264,-23.61275909392463,-23.42383382335312,-23.23490690027017,-23.04597834424374,-22.85704817466068,-22.66811641072951,-22.47918307148329,-22.29024817578233,-22.10131174231691,-21.91237378960994,-21.72343433601971,-21.53449339974229,-21.34555099881426,-21.15660715111511,-20.96766187436979,-20.77871518615112,-20.58976710388217,-20.40081764483869,-20.21186682615139,-20.02291466480828,-19.83396117765689,-19.64500638140655,-19.45605029263056,-19.26709292776839,-19.07813430312779,-18.88917443488689,-18.70021333909633,-18.51125103168127,-18.3222875284434,-18.13332284506299,-17.94435699710079]}]],[[{\"lng\":[7.501688198998904,7.473430568576543,7.445137029012065,7.416807500387878,7.388441902589134,7.36004015530325,7.331602178019374,7.303127890027906,7.274617210419973,7.246070058086944,7.217486351719896,7.188866009809133,7.160208950643653,7.131515092310662,7.102784352695037,7.074016649478843,7.045211900140801,7.016370021955785,6.987490931994297,6.95857454712197,6.929620783999042,6.900629559079841,6.871600788612272,6.842534388637289,6.813430274988401,6.784288363291123,6.75510856896248,6.725890807210473,6.696634993033567,6.667341041220166,6.638008866348089,6.608638382784045,6.579229504683124,6.549782145988245,6.52029622042966,6.490771641524412,6.461208322575813,6.431606176672913,6.401965116689978,6.37228505528596,6.342565904903961,6.312807577770722,6.283009985896068,6.253173041072395,6.223296654874131,6.19338073865721,6.163425203558529,6.133429960495427,6.10339492016514,6.073319993044278,6.043205089388275,6.013050119230868,5.982854992383556,5.95261961843506,5.922343906750788,5.892027766472302,5.861671106516768,5.831273835576433,5.800835862118072,5.770357094382455,5.739837440383807,5.709276807909265,5.678675104518343,5.648032237542376,5.617348114083994,5.586622641016574,5.555855724983694,5.525047272398593,5.494197189443625,5.463305382069716,5.432371755995827,5.40139621670839,5.370378669460786,5.339319019272783,5.308217170929997,5.277073028983347,5.245886497748501,5.214657481305337,5.183385883497398,5.152071607931332,5.120714557976355,5.089314636763705,5.057871747186083,5.026385791897115,4.994856673310796,4.963284293600948,4.931668554700666,4.90000935830177,4.868306605854259,4.836560198565753,4.804770037400955,4.77293602308109,4.741058056083364,4.709136036640411,4.677169864739737,4.645159440123182,4.613104662286355,4.5810054304781,4.548861643699931,4.516673200705492],\"lat\":[47.6227466528409,47.65590637548982,47.68905915107349,47.72220496266994,47.7553437933084,47.78847562596903,47.82160044358286,47.85471822903154,47.88782896514725,47.92093263471247,47.95402922045982,47.98711870507195,48.02020107118126,48.05327630136987,48.08634437816935,48.11940528406058,48.15245900147357,48.18550551278731,48.21854480032958,48.25157684637676,48.28460163315371,48.31761914283354,48.35062935753748,48.38363225933465,48.41662783024193,48.44961605222379,48.48259690719206,48.51557037700584,48.54853644347118,48.58149508834106,48.61444629331511,48.64739004003945,48.68032631010654,48.71325508505494,48.74617634636919,48.77909007547958,48.811996253762,48.84489486253775,48.87778588307329,48.91066929658019,48.9435450842148,48.97641322707815,49.00927370621575,49.04212650261738,49.07497159721692,49.10780897089212,49.1406386044645,49.17346047869905,49.20627457430412,49.23908087193119,49.27187935217469,49.30466999557177,49.33745278260221,49.37022769368806,49.40299470919359,49.43575380942507,49.46850497463045,49.50124818499936,49.53398342066275,49.56671066169275,49.59942988810247,49.63214107984582,49.66484421681727,49.69753927885167,49.73022624572405,49.76290509714939,49.79557581278246,49.82823837221757,49.86089275498839,49.89353894056774,49.92617690836742,49.9588066377379,49.99142810796823,50.02404129828574,50.05664618785592,50.08924275578209,50.1218309811053,50.15441084280408,50.18698231979423,50.21954539092854,50.25210003499669,50.28464623072497,50.31718395677608,50.34971319174889,50.38223391417826,50.41474610253476,50.4472497352246,50.47974479058918,50.51223124690508,50.54470908238372,50.57717827517119,50.60963880334799,50.64209064492887,50.67453377786253,50.70696818003141,50.73939382925156,50.77181070327227,50.80421877977592,50.83661803637778,50.86900845062571]}]],[[{\"lng\":[13.42280215859794,13.34396660513868,13.26517348579999,13.18642294608745,13.10771513083352,13.02905018419658,12.95042824966002,12.87184947003134,12.79331398744126,12.71482194334289,12.63637347851088,12.55796873304063,12.4796078463475,12.40129095716605,12.32301820354929,12.244789722868,12.16660565180999,12.08846612637948,12.0103712818964,11.93232125299581,11.85431617362729,11.77635617705431,11.69844139585375,11.6205719619153,11.542748006441,11.46496965994469,11.3872370522516,11.30955031249784,11.23190956913002,11.15431494990485,11.07676658188873,10.99926459145738,10.92180910429554,10.84440024539664,10.76703813906246,10.68972290890294,10.61245467783584,10.53523356808656,10.4580597011879,10.3809331979799,10.30385417860964,10.2268227625311,10.14983906850504,10.07290321459888,9.996015318186648,9.919175495948849,9.842383863872476,9.765640537250961,9.688945630684168,9.612299258078412,9.535701532646502,9.459152566907775,9.382652472688195,9.306201361120419,9.229799342643933,9.153446527005187,9.077143023257726,9.000888939762378,8.924684384187453,8.848529463508925,8.7724242840107,8.696368951284832,8.620363570231806,8.544408245060822,8.468503079290103,8.392648175747208,8.316843636569393,8.241089563203952,8.1653860564086,8.089733216251885,8.014131142113589,7.938579932685155,7.863079685970156,7.787630499284757,7.712232469258185,7.636885691833264,7.561590262266905,7.486346275130669,7.411153824311308,7.336013003011337,7.260923903749645,7.185886618362066,7.11090123800204,7.035967853141232,6.961086553570185,6.886257428399012,6.811480566058075,6.736756054298684,6.662083980193836,6.587464430138937,6.512897489852567,6.438383244377244,6.363921778080215,6.289513174654249,6.215157517118461,6.140854887819142,6.066605368430602,5.992409039956041,5.918265982728419,5.844176276411346],\"lat\":[52.35030404417147,52.33842559911326,52.3264947155044,52.3145114441838,52.30247583614929,52.29038794255663,52.27824781471863,52.26605550410411,52.25381106233696,52.24151454119517,52.22916599260994,52.2167654686646,52.20431302159373,52.19180870378221,52.17925256776416,52.16664466622207,52.15398505198579,52.14127377803158,52.12851089748113,52.11569646360061,52.10283052979971,52.08991314963062,52.07694437678715,52.06392426510369,52.05085286855427,52.03773024125161,52.02455643744613,52.01133151152497,51.99805551801108,51.98472851156217,51.97135054696984,51.9579216791585,51.94444196318452,51.93091145423521,51.91733020762781,51.90369827880859,51.89001572335188,51.87628259695907,51.86249895545764,51.84866485480026,51.83478035106377,51.82084550044822,51.80686035927592,51.79282498399049,51.77873943115586,51.76460375745535,51.7504180196907,51.73618227478106,51.72189657976212,51.70756099178507,51.6931755681157,51.6787403661334,51.66425544333021,51.64972085730992,51.63513666578704,51.62050292658586,51.60581969763956,51.5910870369892,51.57630500278277,51.56147365327423,51.54659304682265,51.53166324189112,51.51668429704594,51.50165627095559,51.48657922238978,51.47145321021859,51.45627829341145,51.4410545310362,51.42578198225821,51.41046070633939,51.39509076263726,51.37967221060403,51.36420510978567,51.34868951982094,51.33312550044051,51.31751311146598,51.301852412809,51.28614346447031,51.27038632653881,51.25458105919064,51.23872772268833,51.22282637737972,51.20687708369722,51.19087990215677,51.17483489335697,51.15874211797814,51.14260163678146,51.126413510608,51.11017780037784,51.09389456708918,51.07756387181738,51.06118577571412,51.04476034000644,51.0282876259959,51.01176769505764,50.99520060863946,50.97858642826099,50.96192521551279,50.9452170320554,50.92846193961849]}]],[[{\"lng\":[-2.729387194670057,-2.739636182800446,-2.749837373773503,-2.759991172498184,-2.770097979471567,-2.780158190839358,-2.790172198455396,-2.800140389940198,-2.810063148738546,-2.819940854176142,-2.829773881515345,-2.839562602010006,-2.849307382959433,-2.859008587761472,-2.868666575964755,-2.878281703320102,-2.887854321831111,-2.897384779803946,-2.906873421896329,-2.916320589165768,-2.925726619117015,-2.935091845748792,-2.944416599599768,-2.953701207793832,-2.962945994084652,-2.972151278899545,-2.981317379382664,-2.99044460943752,-2.999533279768842,-3.008583697923806,-3.017596168332612,-3.02657099234846,-3.035508468286899,-3.044408891464583,-3.053272554237446,-3.062099746038284,-3.07089075341378,-3.079645860060964,-3.088365346863132,-3.097049491925217,-3.105698570608638,-3.114312855565625,-3.122892616773036,-3.13143812156567,-3.139949634669082,-3.148427418231923,-3.156871731857798,-3.165282832636646,-3.173660975175683,-3.182006411629866,-3.190319391731929,-3.198600162821982,-3.206848969876663,-3.215066055537893,-3.223251660141193,-3.231406021743603,-3.239529376151205,-3.247621956946231,-3.255683995513809,-3.263715721068307,-3.271717360679308,-3.279689139297222,-3.287631279778523,-3.29554400291064,-3.303427527436487,-3.311282070078659,-3.319107845563279,-3.326905066643513,-3.334673944122756,-3.3424146868775,-3.350127501879874,-3.357812594219884,-3.36547016712733,-3.373100421993434,-3.38070355839216,-3.388279774101248,-3.395829265122953,-3.403352225704506,-3.410848848358292,-3.418319323881753,-3.425763841377025,-3.433182588270302,-3.440575750330941,-3.447943511690314,-3.455286054860397,-3.462603560752114,-3.46989620869344,-3.47716417644725,-3.484407640228941,-3.491626774723815,-3.49882175310423,-3.505992747046522,-3.513139926747713,-3.520263460941987,-3.527363516916953,-3.534440260529696,-3.54149385622262,-3.548524467039077,-3.555532254638796,-3.562517379313113],\"lat\":[51.27487470794431,51.16707851691896,51.05928143456565,50.95148346844245,50.84368462602496,50.7358849147075,50.62808434180413,50.52028291454983,50.41248064010152,50.30467752553915,50.19687357786673,50.08906880401339,49.98126321083431,49.87345680511182,49.76564959355629,49.65784158280714,49.55003277943375,49.44222318993643,49.33441282074735,49.22660167823134,49.1187897686869,49.01097709834703,48.90316367338006,48.79534949989053,48.68753458392001,48.57971893144794,48.47190254839241,48.364085440611,48.25626761390146,48.14844907400264,48.0406298265951,47.93280987730196,47.82498923168959,47.71716789526828,47.60934587349311,47.50152317176451,47.39369979542899,47.28587574977987,47.17805104005786,47.07022567145182,46.96239964909938,46.85457297808751,46.74674566345326,46.6389177101843,46.5310891232196,46.42325990745002,46.31543006771884,46.20759960882238,46.09976853551067,45.9919368524879,45.88410456441301,45.7762716759003,45.6684381915199,45.56060411579834,45.45276945321911,45.34493420822312,45.23709838520926,45.12926198853491,45.0214250225164,44.91358749142955,44.80574939951009,44.69791075095424,44.59007154991907,44.48223180052305,44.37439150684646,44.26655067293184,44.15870930278453,44.05086740037296,43.94302496962915,43.8351820144492,43.72733853869361,43.61949454618779,43.51165004072236,43.40380502605367,43.29595950590411,43.18811348396254,43.08026696388468,42.97241994929351,42.86457244377958,42.75672445090147,42.64887597418606,42.54102701712898,42.43317758319495,42.32532767581807,42.21747729840223,42.10962645432144,42.00177514692016,41.89392337951363,41.7860711553882,41.67821847780167,41.57036534998362,41.46251177513565,41.35465775643178,41.24680329701877,41.1389484000163,41.03109306851739,40.92323730558867,40.81538111427064,40.70752449757796,40.59966745849979]}]],[[{\"lng\":[172.5666353828458,172.6009664273869,172.6352234520766,172.6694067737662,172.7035167077151,172.7375535676003,172.7715176655267,172.8054093120361,172.8392288161173,172.8729764852154,172.9066526252414,172.9402575405817,172.9737915341071,173.0072549071826,173.0406479596761,173.0739709899681,173.1072242949604,173.1404081700852,173.1735229093143,173.2065688051676,173.2395461487227,173.2724552296228,173.305296336086,173.338069754914,173.3707757715002,173.4034146698391,173.435986732534,173.468492240806,173.5009314745018,173.533304712103,173.5656122307333,173.5978543061675,173.6300312128391,173.6621432238489,173.694190610973,173.7261736446702,173.7580925940908,173.789947727084,173.8217393102057,173.8534676087265,173.8851328866396,173.916735406668,173.9482754302724,173.9797532176588,174.0111690277862,174.0425231183738,174.0738157459083,174.1050471656518,174.1362176316488,174.1673273967334,174.1983767125368,174.2293658294943,174.2602949968525,174.2911644626765,174.3219744738566,174.3527252761159,174.3834171140165,174.4140502309671,174.4446248692295,174.4751412699253,174.5055996730431,174.5360003174448,174.5663434408725,174.5966292799553,174.6268580702152,174.6570300460747,174.6871454408625,174.71720448682,174.7472074151083,174.777154455814,174.8070458379558,174.8368817894907,174.8666625373204,174.8963883072974,174.926059324231,174.9556758118939,174.9852379930277,175.0147460893497,175.0442003215579,175.073600909338,175.1029480713688,175.1322420253279,175.1614829878983,175.1906711747733,175.219806800663,175.2488900792998,175.2779212234439,175.3069004448892,175.3358279544691,175.3647039620616,175.3935286765954,175.4223023060548,175.451025057486,175.4796971370018,175.5083187497873,175.5368901001056,175.5654113913026,175.5938828258126,175.6223046051636,175.6506769299824],\"lat\":[-43.42389345019505,-43.35841660830872,-43.29292952003778,-43.22743223083583,-43.16192478591496,-43.09640723024733,-43.03087960856679,-42.96534196537037,-42.89979434491998,-42.83423679124382,-42.76866934813806,-42.70309205916823,-42.63750496767085,-42.57190811675492,-42.50630154930331,-42.44068530797442,-42.37505943520349,-42.30942397320416,-42.24377896396991,-42.17812444927544,-42.11246047067818,-42.04678706951964,-41.98110428692689,-41.91541216381386,-41.84971074088288,-41.78400005862583,-41.71828015732576,-41.65255107705807,-41.5868128576919,-41.5210655388915,-41.45530916011752,-41.38954376062838,-41.32376937948149,-41.25798605553462,-41.19219382744716,-41.12639273368141,-41.06058281250383,-40.99476410198631,-40.92893664000741,-40.86310046425366,-40.79725561222069,-40.73140212121454,-40.66554002835282,-40.59966937056593,-40.53379018459832,-40.46790250700952,-40.40200637417551,-40.33610182228976,-40.27018888736442,-40.20426760523151,-40.13833801154402,-40.07240014177707,-40.00645403122903,-39.94049971502266,-39.87453722810618,-39.80856660525443,-39.7425878810699,-39.67660108998388,-39.6106062662575,-39.54460344398281,-39.4785926570839,-39.41257393931783,-39.34654732427583,-39.28051284538422,-39.21447053590551,-39.14842042893942,-39.08236255742387,-39.01629695413605,-38.95022365169335,-38.8841426825544,-38.81805407902008,-38.75195787323446,-38.68585409718581,-38.61974278270754,-38.55362396147921,-38.48749766502744,-38.42136392472686,-38.3552227718011,-38.28907423732366,-38.22291835221889,-38.15675514726294,-38.09058465308456,-38.02440690016611,-37.95822191884446,-37.89202973931184,-37.82583039161675,-37.75962390566487,-37.69341031121989,-37.62718963790444,-37.56096191520091,-37.49472717245231,-37.42848543886317,-37.36223674350035,-37.29598111529385,-37.22971858303774,-37.16344917539092,-37.09717292087793,-37.03088984788986,-36.96459998468504,-36.89830335938996]}]],[[{\"lng\":[12.43949588367862,12.22451726427227,12.01102033324075,11.79899136738244,11.58841673041597,11.37928287445545,11.17157634138297,10.96528376412216,10.76039186781638,10.55688747091495,10.35475748617108,10.15398892155452,9.954568881082453,9.756484565571581,9.559723273314534,9.364272400683612,9.170119442664687,8.977251993324101,8.785657746211246,8.595324494699534,8.406240132268254,8.218392652727788,8.031770150390674,7.846360820190754,7.662152957752705,7.479134959414132,7.297295322202359,7.116622643767891,6.937105622276627,6.758733056262637,6.581493844443429,6.405376985499435,6.230371577819483,6.056466819213871,5.883652006596725,5.711916535639105,5.541249900394432,5.371641692897622,5.20308160273937,5.035559416616873,4.86906501786233,4.703588385950446,4.539119595986127,4.375648818173551,4.213166317267701,4.05166245200944,3.891127674545156,3.731552529831955,3.572927655029398,3.415243778878611,3.258491721069739,3.102662391598539,2.947746790112894,2.793736005250109,2.640621213965648,2.488393680854079,2.337044757462898,2.186565881599872,2.036948576634579,1.888184450794682,1.740265196457575,1.593182589437902,1.446928488271528,1.301494833496424,1.156873646930971,1.013057030950142,0.8700371677599988,0.7278063186709283,0.5863568233700157,0.4456810991929396,0.3057716403957433,0.1666210174268625,0.02822187619969319,-0.1094330626339542,-0.2463510044092159,-0.3825390811720917,-0.5180043524016069,-0.6527538057300118,-0.7867943576607365,-0.9201328542838837,-1.052776071989057,-1.184730718175295,-1.31600343195793,-1.446600784872192,-1.576529281573369,-1.705795360533371,-1.834405394733555,-1.962365692353644,-2.089682497456618,-2.216361990669456,-2.342410289859597,-2.467833450807021,-2.59263746787184,-2.71682827465731,-2.840411744668165,-2.963393691964214,-3.085779871809083,-3.207575981314088,-3.328787660077125,-3.449420490816553],\"lat\":[55.48152259279838,55.34474594977515,55.20759460672592,55.07007304087663,54.93218567155525,54.79393686086251,54.65533091434132,54.51637208164454,54.37706455720068,54.23741248087735,54.09741993864206,53.95709096322008,53.8164295347492,53.67543958143102,53.53412498017866,53.3924895572605,53.25053708893999,53.10827130211106,52.96569587492915,52.82281443743771,52.67963057218983,52.53614781486499,52.39236965488083,52.24829953599973,52.10394085693009,51.95929697192237,51.8143711913595,51.66916678234187,51.52368696926666,51.37793493440145,51.23191381845219,51.08562672112522,50.93907670168356,50.79226677949724,50.64519993458779,50.49787910816669,50.35030720316792,50.20248708477448,50.05442158093891,49.90611348289788,49.75756554568065,49.60878048861159,49.45976099580674,49.31050971666428,49.16102926634907,49.01132222627128,48.86139114455894,48.71123853652475,48.56086688512683,48.41027864142367,48.25947622502329,48.10846202452652,47.95723839796455,47.80580767323075,47.65417214850677,47.502334092683,47.35029574577349,47.19805931932515,47.04562699682162,46.89300093408144,46.7401832596511,46.58717607519234,46.43398145586448,46.28060145070119,46.12703808298224,45.97329335059994,45.81936922642052,45.66526765864045,45.51099057113771,45.35653986381815,45.20191741295685,45.04712507153477,44.8921646695705,44.7370380144473,44.58174689123545,44.42629306301002,44.27067827116399,44.11490423571688,43.95897265561899,43.80288520905113,43.64664355372007,43.49024932714963,43.33370414696765,43.17700961118861,43.02016729849226,42.86317876849812,42.70604556203597,42.54876920141234,42.3913511906731,42.23379301586223,42.07609614527679,41.91826202971799,41.76029210273877,41.60218778088758,41.44395046394859,41.28558153517837,41.12708236153912,40.96845429392827,40.80969866740494,40.65081680141286]}]],[[{\"lng\":[-6.235775657979218,-6.201675741358796,-6.167778108043881,-6.134080644807679,-6.100581266806601,-6.067277917105068,-6.03416856620975,-6.001251211612992,-5.968523877345259,-5.935984613536347,-5.903631495985223,-5.871462625738228,-5.839476128675506,-5.807670155105469,-5.776042879367082,-5.744592499439847,-5.713317236561254,-5.682215334851595,-5.651285060945932,-5.620524703633082,-5.58993257350145,-5.559507002591588,-5.529246344055303,-5.499148971821173,-5.469213280266363,-5.439437683894565,-5.409820617019953,-5.380360533457017,-5.35105590621615,-5.321905227204858,-5.292907006934493,-5.264059774232364,-5.235362075959131,-5.20681247673136,-5.178409558649141,-5.150151921028649,-5.122038180139553,-5.094066968947165,-5.066236936859243,-5.038546749477327,-5.010995088352542,-4.983580650745755,-4.956302149392005,-4.929158312269108,-4.90214788237038,-4.875269617481342,-4.848522289960382,-4.821904686523257,-4.795415608031363,-4.769053869283715,-4.742818298812527,-4.716707738682365,-4.690721044292752,-4.664857084184204,-4.639114739847584,-4.613492905536741,-4.58799048808435,-4.562606406720906,-4.537339592896783,-4.512188990107323,-4.48715355372089,-4.462232250809822,-4.437424059984225,-4.412727971228566,-4.388142985740997,-4.363668115775365,-4.339302384485854,-4.315044825774193,-4.290894484139427,-4.266850414530134,-4.242911682199092,-4.219077362560351,-4.195346541048605,-4.171718312980911,-4.14819178342062,-4.124766067043546,-4.101440288006303,-4.078213579816749,-4.055085085206543,-4.032053956005748,-4.009119353019428,-3.986280445906243,-3.963536413058965,-3.940886441486898,-3.918329726700169,-3.895865472595854,-3.873492891345883,-3.851211203286738,-3.829019636810855,-3.806917428259754,-3.784903821818818,-3.762978069413723,-3.741139430608473,-3.719387172505022,-3.697720569644438,-3.676138903909603,-3.6546414644294,-3.63322754748438,-3.611896456413862,-3.59064750152446],\"lat\":[53.29367640554166,53.1660130276767,53.03833996965958,52.91065733334004,52.78296521918683,52.65526372631119,52.52755295248972,52.39983299418684,52.27210394657681,52.14436590356527,52.01661895781041,51.88886320074367,51.76109872259008,51.63332561238813,51.50554395800931,51.37775384617729,51.24995536248664,51.12214859142127,50.99433361637243,50.86651051965649,50.73867938253218,50.61084028521775,50.48299330690763,50.35513852578872,50.22727601905659,50.09940586293119,49.9715281326723,49.84364290259477,49.71575024608337,49.58785023560739,49.45994294273503,49.33202843814746,49.20410679165261,49.07617807219876,48.94824234788784,48.8202996859885,48.69235015294893,48.56439381440943,48.43643073521483,48.30846097942658,48.18048461033468,48.0525016904694,47.92451228161274,47.79651644480976,47.66851424037962,47.54050572792649,47.41249096635025,47.28447001385696,47.15644292796923,47.02840976553634,46.90037058274413,46.7723254351249,46.64427437756692,46.51621746432392,46.38815474902438,46.26008628468063,46.13201212369781,46.00393231788267,45.87584691845228,45.74775597604246,45.61965954071621,45.49155766197185,45.36345038875121,45.23533776944748,45.10721985191304,44.97909668346716,44.85096831090357,44.72283478049778,44.5946961380145,44.46655242871475,44.3384036973629,44.21024998823369,44.08209134511895,43.9539278113344,43.8257594297262,43.6975862426775,43.56940829211471,43.44122561951394,43.31303826590707,43.18484627188788,43.056649677618,42.92844852283282,42.8002428468473,42.67203268856159,42.54381808646675,42.41559907865019,42.2873757028011,42.15914799621584,42.03091599580314,41.90267973808935,41.77443925922346,41.64619459498217,41.5179457807748,41.38969285164814,41.26143584229127,41.1331747870402,41.00490971988262,40.87664067446233,40.74836768408382,40.6200907817167]}]],[[{\"lng\":[6.642611015505553,6.518620398958411,6.395174458295535,6.272269524439179,6.149901951258875,6.028068115529742,5.906764416887228,5.785987277778439,5.665733143410144,5.54599848169359,5.42677978318624,5.308073561030537,5.18987635088981,5.07218471088143,4.954995221507319,4.838304485581894,4.72210912815757,4.606405796447912,4.491191159748509,4.376461909355693,4.262214758483158,4.148446442176594,4.035153717226398,3.922333362078557,3.809982176743781,3.698096982704953,3.586674622822989,3.475711961241151,3.365205883287935,3.255153295378543,3.145551124915057,3.036396320185343,2.927685850260779,2.81941670489285,2.711585894408668,2.604190449605496,2.497227421644314,2.390693881942485,2.284586922065583,2.178903653618425,2.07364120813537,1.968796736969918,1.864367411183673,1.760350421434702,1.656742977865352,1.553542309989545,1.450745666579615,1.348350315552718,1.246353543856866,1.144752657356586,1.043544980718305,0.9427278572954383,0.8422986490132416,0.7422547362534705,0.6425935177388573,0.5433124104174508,0.4444088493468524,0.3458802875783619,0.2477241960410931,0.1499380634260427,0.05251939607018386,-0.04453428215942003,-0.1412254299814418,-0.2375564888160341,-0.3335298829004745,-0.4291480194046792,-0.52441328854657,-0.6193280637072701,-0.7138947015461085,-0.8081155421154201,-0.9019929089751105,-0.9955291093069747,-1.088726434028752,-1.1815871579079,-1.274113539675067,-1.366307822137258,-1.458172232290655,-1.54970898143312,-1.640920265276314,-1.731808264057462,-1.822375142650726,-1.912623050678188,-2.002554122620421,-2.092170477926643,-2.181474221124439,-2.270467441929045,-2.359152215352179,-2.447530601810416,-2.535604647233093,-2.623376383169734,-2.710847826896994,-2.798020981525109,-2.88489783610384,-2.971480365727916,-3.057770531641959,-3.143770281344893,-3.22948154869382,-3.314906254007362,-3.400046304168482,-3.484903592726734],\"lat\":[51.17900507651649,51.07721852127607,50.97530138882956,50.87325472417973,50.77107956287111,50.6687769310791,50.5663478456984,50.46379331443082,50.36111433587243,50.25831189959999,50.15538698625689,50.05234056763811,49.94917360677489,49.84588705801838,49.74248186712296,49.63895897132856,49.5353192994426,49.43156377192104,49.32769330094894,49.2237087905202,49.11961113651675,49.01540122678701,48.91107994122372,48.80664815184105,48.70210672285116,48.59745651073996,48.49269836434233,48.3878331249166,48.28286162621841,48.17778469457395,48.07260314895254,47.96731780103842,47.86192945530214,47.75643890907116,47.65084695259976,47.54515436913849,47.43936193500281,47.33347041964118,47.22748058570259,47.12139318910328,47.01520897909304,46.90892869832077,46.80255308289945,46.69608286247053,46.58951876026771,46.48286149318004,46.37611177181455,46.26927030055818,46.16233777763917,46.05531489518783,45.94820233929678,45.84100079008055,45.7337109217346,45.62633340259386,45.5188688951906,45.4113180563118,45.30368153705589,45.19595998288908,45.0881540337009,44.98026432385948,44.87229148226606,44.76423613240904,44.65609889241755,44.54788037511442,44.4395811880686,44.33120193364721,44.22274320906686,44.11420560644459,44.00558971284836,43.89689611034682,43.78812537605882,43.67927808220229,43.57035479614261,43.46135608044061,43.35228249289997,43.24313458661419,43.13391291001312,43.02461800690896,42.91525041654181,42.80581067362478,42.69629930838864,42.58671684662599,42.47706380973503,42.3673407147628,42.25754807444807,42.14768639726378,42.03775618745897,41.92775794510038,41.81769216611355,41.70755934232357,41.59735996149534,41.48709450737346,41.37676345972175,41.26636729436228,41.15590648321403,41.04538149433117,40.934792791941,40.8241408364814,40.71342608463792,40.60264898938053]}]],[[{\"lng\":[-13.77499823411112,-13.68602878734659,-13.59685020738796,-13.50746103371934,-13.41785979756668,-13.32804502183689,-13.23801522105666,-13.14776890131103,-13.05730456018168,-12.96662068668505,-12.87571576121013,-12.7845882554561,-12.6932366323696,-12.60165934608191,-12.50985484184584,-12.41782155597233,-12.32555791576693,-12.23306233946601,-12.14033323617276,-12.04736900579293,-11.9541680389705,-11.86072871702299,-11.76704941187668,-11.67312848600157,-11.57896429234622,-11.48455517427238,-11.3898994654894,-11.29499548998854,-11.19984156197709,-11.10443598581235,-11.0087770559354,-10.91286305680482,-10.8166922628302,-10.72026293830553,-10.62357333734256,-10.52662170380391,-10.42940627123614,-10.3319252628028,-10.23417689121724,-10.13615935867548,-10.03787085678891,-9.939309566517032,-9.840473658100045,-9.741361290991481,-9.641970613790773,-9.542299764175796,-9.442346868835445,-9.342110043402181,-9.241587392384609,-9.140777009100088,-9.039676975607394,-8.938285362639432,-8.836600229536009,-8.734619624176707,-8.632341582913856,-8.52976413050561,-8.426885280049165,-8.323703032914111,-8.220215378675956,-8.116420295049823,-8.012315747824347,-7.907899690795776,-7.803170065702306,-7.69812480215869,-7.592761817591063,-7.487079017172116,-7.38107429375654,-7.274745527816814,-7.168090587379334,-7.061107327960935,-6.953793592505781,-6.846147211322705,-6.738166002022967,-6.62984776945848,-6.521190305660552,-6.412191389779117,-6.302848788022521,-6.193160253597887,-6.083123526652058,-5.972736334213199,-5.861996390133014,-5.750901395029688,-5.639449036231519,-5.527636987721309,-5.415462910081536,-5.302924450440335,-5.190019242418324,-5.076744906076325,-4.963099047863979,-4.84907926056934,-4.734683123269436,-4.619908201281883,-4.504752046117539,-4.389212195434292,-4.27328617299198,-4.156971488608506,-4.040265638117192,-3.923166103325403,-3.805670351974491,-3.687775837701122],\"lat\":[28.57566933634308,28.69856077670313,28.82139388863623,28.94416823679413,29.06688338289714,29.18953888570682,29.31213430099836,29.4346691815327,29.55714307702848,29.67955553413367,29.80190609639697,29.92419430423899,30.04641969492311,30.16858180252613,30.29068015790862,30.41271428868505,30.53468371919362,30.6565879704658,30.77842656019574,30.90019900270915,31.02190480893215,31.14354348635973,31.2651145390239,31.38661746746168,31.50805176868263,31.62941693613628,31.75071245967911,31.87193782554135,31.99309251629342,32.11417601081209,32.23518778424638,32.35612730798309,32.47699404961205,32.5977874728911,32.7185070377107,32.83915220005833,32.95972241198242,33.08021712155608,33.20063577284051,33.32097780584802,33.44124265650479,33.56142975661324,33.68153853381418,33.80156841154849,33.92151880901859,34.04138914114939,34.16117881854925,34.28088724747017,34.40051382976797,34.52005796286193,34.63951903969421,34.75889644868877,34.87818957371015,34.99739779402166,35.11652048424337,35.23555701430971,35.35450674942665,35.47336905002861,35.59214327173487,35.71082876530578,35.82942487659845,35.94793094652213,36.06634631099323,36.18467030088993,36.30290224200644,36.42104145500679,36.53908725537841,36.65703895338514,36.77489585401995,36.89265725695727,37.01032245650485,37.12789074155536,37.24536139553749,37.3627336963666,37.4800069163952,37.59718032236276,37.71425317534527,37.83122473070436,37.94809423803603,38.06486094111894,38.18152407786229,38.2980828802534,38.41453657430463,38.5308843800002,38.64712551124234,38.76325917579713,38.87928457523998,38.99520090490059,39.11100735380749,39.22670310463228,39.34228733363334,39.45775921059916,39.57311789879122,39.6883625548865,39.80349232891952,39.91850636422401,40.0334037973741,40.14818375812511,40.26284536935395,40.37738774699908]}]],[[{\"lng\":[114.5617545671259,115.1847373994571,115.8028365530702,116.4162180257682,117.0250457704191,117.6294817147039,118.2296857866836,118.8258159456438,119.4180282177113,120.0064767357835,120.5913137833422,121.1726898417629,121.7507536407612,122.3256522116487,122.8975309431001,123.4665336391577,124.0328025792278,124.5964785798421,125.1577010579822,125.7166080957809,126.2733365064381,126.8280219011981,127.3807987572574,127.9318004864819,128.4811595048265,129.0290073023627,129.5754745138291,130.12069098963,130.6647858672162,131.2078876427892,131.7501242432778,132.2916230985414,132.8325112137607,133.3729152419789,133.912961556764,134.4527763249618,134.9924855795151,135.5322152923239,136.0720914471255,136.6122401123693,137.1527875140671,137.6938601085934,138.2355846554115,138.7780882897,139.3214985948489,139.8659436747931,140.4115522261469,140.9584536100976,141.5067779240102,142.0566560726911,142.6082198392487,143.1616019554827,143.7169361717238,144.2743573260367,144.834001412686,145.3960056497559,145.9605085457984,146.527649965371,147.0975711933106,147.6704149975711,148.2463256904347,148.825449187887,149.4079330669232,149.9939266205307,150.5835809100662,151.1770488147205,151.7744850777337,152.3760463489909,152.9818912235997,153.5921802760091,154.2070760891968,154.8267432784081,155.4513485088884,156.0810605070064,156.7160500641156,157.3564900324538,158.0025553123266,158.6544228297654,159.3122715037944,159.9762822023814,160.6466376860858,161.3235225383544,162.0071230813529,162.6976272761551,163.3952246060468,164.1001059416386,164.8124633864167,165.5324901013007,166.2603801067198,166.9963280606638,167.7405290111201,168.4931781212649,169.2544703657477,170.0246001963874,170.8037611755924,171.5921455758267,172.3899439434716,173.1973446254829,174.0145332573181,174.8416922107104],\"lat\":[21.73631637010705,21.15482364977241,20.57106897339253,19.98513751820262,19.39711257697195,18.80707562959735,18.21510641355954,17.62128299321697,17.0256818279207,16.42837783894259,15.82944447521604,15.22895377789526,14.62697644374492,14.0235818873773,13.41883830235867,12.81281272121084,12.20557107433732,11.5971782479069,10.9876981407302,10.37719372016719,9.765727077105941,9.153359480054588,8.54015142839029,7.926162704810213,7.311452427030896,6.696079098783302,6.080100660151823,5.463574537306141,4.846557691675643,4.229106668616405,3.611277645621449,2.993126480125088,2.374708756952674,1.756079835467195,1.137294896464401,0.5184089888682611,-0.10052292372123,-0.7194459165760514,-1.338305057431638,-1.957045360070072,-2.575611737842578,-3.193948957079503,-3.812001590335703,-4.429713969419359,-5.047030138152605,-5.663893804812226,-6.280248294199057,-6.896036499284961,-7.511200832386527,-8.125683175815052,-8.73942483195289,-9.35236647270669,-9.964448088288789,-10.57560893527885,-11.18578748391875,-11.79492136459458,-12.40294731346146,-13.00980111716752,-13.61541755663603,-14.2197303498657,-14.82267209371229,-15.42417420461654,-16.02416685824681,-16.62257892802813,-17.21933792253271,-17.81436992171215,-18.40759951195533,-18.99894971996236,-19.58834194543051,-20.17569589255505,-20.76092950035574,-21.34395887184773,-21.92469820208581,-22.50305970512078,-23.07895353991862,-23.65228773530607,-24.22296811402013,-24.79089821595471,-25.35597922071444,-25.9181098696049,-26.47718638720816,-27.03310240271524,-27.58574887121126,-28.13501399513489,-28.68078314616232,-29.22293878779658,-29.76136039897543,-30.29592439904705,-30.82650407449946,-31.35296950787072,-31.87518750930864,-32.39302155129432,-32.90633170709088,-33.41497459352855,-33.9188033187888,-34.41766743590382,-34.91141290274263,-35.39988204931166,-35.8829135532543,-36.36034242449124]}]],[[{\"lng\":[28.81170069079137,28.88093321628072,28.95011756075566,29.01925370889827,29.08834164578386,29.15738135687983,29.22637282804446,29.29531604552568,29.3642109959599,29.43305766637078,29.50185604416803,29.57060611714624,29.6393078734836,29.70796130174072,29.77656639085944,29.84512313016152,29.91363150934755,29.9820915184956,30.05050314806008,30.11886638887047,30.18718123213008,30.2554476694149,30.32366569267223,30.39183529421956,30.4599564667433,30.5280292032975,30.59605349730267,30.66402934254447,30.73195673317256,30.79983566369923,30.8676661289983,30.93544812430371,31.00318164520841,31.07086668766303,31.13850324797464,31.20609132280551,31.27363090917184,31.34112200444252,31.40856460633788,31.47595871292836,31.54330432263337,31.61060143421991,31.6778500468014,31.74505015983635,31.81220177312715,31.87930488681878,31.94635950139753,32.01336561768975,32.08032323686061,32.14723236041279,32.21409299018523,32.28090512835187,32.34766877742036,32.41438394023082,32.48105061995455,32.54766882009277,32.61423854447532,32.68075979725946,32.7472325829285,32.81365690629065,32.88003277247761,32.94636018694342,33.01263915546313,33.07886968413153,33.1450517793619,33.21118544788471,33.27727069674637,33.34330753330799,33.409295965244,33.47523600054102,33.5411276474965,33.60697091471747,33.67276581111928,33.73851234592432,33.80421052866075,33.86986036916122,33.93546187756166,34.00101506429995,34.06651994011465,34.13197651604379,34.19738480342356,34.26274481388704,34.32805655936298,34.39332005207446,34.45853530453774,34.52370232956088,34.58882114024253,34.6538917499707,34.71891417242145,34.78388842155762,34.84881451162768,34.91369245716432,34.9785222729833,35.04330397418217,35.10803757613898,35.17272309451108,35.23736054523387,35.30194994451946,35.36649130885555,35.43098465500407],\"lat\":[41.24019449823202,41.21744749926244,41.19465906515641,41.17182925797946,41.14895813979698,41.12604577267367,41.10309221867308,41.08009753985704,41.0570617982852,41.0339850560145,41.01086737509867,40.98770881758773,40.9645094455275,40.94126932095907,40.91798850591834,40.89466706243554,40.87130505253467,40.84790253823308,40.82445958154096,40.80097624446088,40.77745258898726,40.75388867710592,40.73028457079361,40.70664033201754,40.68295602273486,40.65923170489226,40.63546744042547,40.61166329125876,40.58781931930455,40.56393558646288,40.540012154621,40.51604908565288,40.4920464414188,40.46800428376485,40.4439226745225,40.41980167550816,40.39564134852274,40.37144175535117,40.34720295776203,40.32292501750705,40.29860799632065,40.27425195591965,40.24985695800265,40.22542306424974,40.20095033632201,40.17643883586113,40.15188862448898,40.12729976380715,40.10267231539657,40.0780063408171,40.05330190160711,40.02855905928304,40.00377787533903,39.9789584112465,39.95410072845375,39.92920488838556,39.90427095244274,39.87929898200186,39.8542890384147,39.82924118300796,39.80415547708283,39.77903198191463,39.75387075875241,39.72867186881853,39.70343537330835,39.67816133338977,39.65284981020294,39.62750086485982,39.60211455844381,39.57669095200941,39.55123010658188,39.52573208315676,39.50019694269964,39.4746247461457,39.44901555439941,39.42336942833415,39.39768642879184,39.37196661658263,39.3462100524845,39.32041679724295,39.29458691157063,39.268720456147,39.24281749161801,39.21687807859573,39.19090227765802,39.16489014934821,39.13884175417476,39.1127571526109,39.08663640509438,39.06047957202701,39.03428671377448,39.00805789066596,38.98179316299375,38.95549259101308,38.92915623494162,38.90278415495934,38.87637641120808,38.84993306379133,38.82345417277379,38.7969397981812]}]],[[{\"lng\":[28.42606158499888,28.10934718155112,27.79228438567678,27.47488087085916,27.15714438666715,26.83908275733899,26.52070388032811,26.20201572481139,25.88302633016041,25.56374380437631,25.24417632248876,24.92433212491975,24.60421951581286,24.28384686132862,23.96322258790682,23.64235518049651,23.32125318075431,22.99992518521215,22.67837984341507,22.35662585603003,22.0346719729267,21.7125269912311,21.39019975335316,21.06769914498902,20.74503409309931,20.42221356386439,20.09924656061743,19.77614212175681,19.4529093186386,19.12955725345043,18.80609505706793,18.48253188689481,18.1588769246879,17.83513937436821,17.51132845981949,17.18745342267508,16.86352352009496,16.53954802253356,16.21553621150009,15.89149737731256,15.56744081684656,15.24337583128042,14.91931172383786,14.59525779752936,14.27122335289381,13.94721768574147,13.62325008489972,13.29932982996272,12.97546618904657,12.65166841655085,12.32794575092825,12.00430741246318,11.68076260106088,11.35732049404815,11.03399024398703,10.71078097650253,10.38770178812576,10.0647617441535,9.741969876525552,9.419335181720911,9.096866618673898,8.774573106711433,8.452463523512488,8.130546703090809,7.808831433801972,7.487326456375738,7.166040461974764,6.844982090280581,6.524159927607853,6.203582505047751,5.883258296641351,5.563195717583936,5.24340312246099,4.923888803516689,4.604660988955622,4.285727841278532,3.96709745565267,3.648777858317523,3.330777005026478,3.013102779525022,2.695762992066062,2.378765377962864,2.062117596180106,1.745827227963485,1.429901775508349,1.114348660667655,0.7991752236996678,0.4843887220557008,0.1699963292081428,-0.1439948664809269,-0.4575778628503798,-0.7707457449897164,-1.083491686247668,-1.395808949199595,-1.70769088657361,-2.019130942135401,-2.330122651531688,-2.640659643092413,-2.95073563859165,-3.260344453967345],\"lat\":[41.3000072282039,41.33624736664598,41.37161834262826,41.40611812736758,41.4397447365143,41.47249623066212,41.50437071584888,41.53536634404799,41.56548131365017,41.59471386993529,41.62306230553395,41.65052496087849,41.6771002246433,41.70278653417405,41.72758237590546,41.75148628576766,41.77449684958061,41.79661270343637,41.81783253406916,41.83815507921274,41.85757912794501,41.87610352101964,41.89372715118438,41.91044896348599,41.92626795556145,41.94118317791546,41.95519373418376,41.96829878138244,41.98049753014271,41.99178924493137,42.00217324425641,42.01164890085798,42.02021564188436,42.02787294905293,42.034620358796,42.0404574623913,42.04538390607736,42.04939939115322,42.05250367406286,42.05469656646401,42.05597793528143,42.05634770274451,42.05580584640931,42.0543523991649,42.05198744922404,42.04871114009826,42.04452367055721,42.03942529457252,42.033416321246,42.02649711472235,42.01866809408644,42.00992973324509,42.00028256079373,41.98972715986762,41.97826416797808,41.96589427683372,41.95261823214662,41.93843683342394,41.92335093374479,41.9073614395226,41.89046931025331,41.87267555824913,41.85398124835869,41.83438749767306,41.81389547521832,41.79250640163472,41.77022154884263,41.74704223969542,41.72296984761972,41.69800579624308,41.67215155900933,41.64540865878184,41.61777866743513,41.5892632054348,41.55986394140619,41.5295825916921,41.49842091989972,41.46638073643707,41.43346389803933,41.39967230728517,41.36500791210356,41.32947270527136,41.29306872390156,41.25579804892322,41.21766280455274,41.1786651577571,41.13880731770935,41.09809153523655,41.05652010226057,41.01409535123204,40.97081965455779,40.92669542402197,40.88172511020137,40.83591120187506,40.78925622542881,40.74176274425454,40.69343335814507,40.64427070268463,40.59427744863527,40.54345630131957]}]],[[{\"lng\":[27.17199642431328,27.1870551048253,27.20212606371579,27.21720932320898,27.23230490557372,27.24741283312363,27.26253312821718,27.27766581325779,27.29281091069397,27.30796844301943,27.32313843277322,27.33832090253978,27.3535158749491,27.36872337267683,27.38394341844442,27.39917603501917,27.41442124521439,27.42967907188955,27.44494953795032,27.46023266634874,27.47552848008335,27.49083700219924,27.50615825578823,27.52149226398899,27.53683904998711,27.55219863701525,27.56757104835329,27.58295630732837,27.59835443731511,27.61376546173563,27.62918940405975,27.64462628780509,27.66007613653714,27.67553897386947,27.69101482346379,27.70650370903007,27.72200565432671,27.73752068316064,27.75304881938741,27.76859008691138,27.78414450968578,27.79971211171287,27.81529291704406,27.83088694978003,27.84649423407088,27.86211479411621,27.87774865416526,27.8933958385171,27.90905637152064,27.92473027757488,27.94041758112895,27.95611830668227,27.97183247878469,27.98756012203659,28.00330126108905,28.01905592064393,28.03482412545403,28.05060590032322,28.06640127010658,28.0822102597105,28.09803289409282,28.11386919826298,28.12971919728216,28.14558291626338,28.16146038037163,28.17735161482404,28.19325664489001,28.2091754958913,28.22510819320219,28.24105476224965,28.25701522851341,28.27298961752616,28.28897795487361,28.30498026619471,28.32099657718174,28.33702691358041,28.35307130119011,28.36912976586394,28.38520233350888,28.40128903008595,28.41738988161032,28.43350491415149,28.44963415383337,28.46577762683447,28.48193535938804,28.49810737778215,28.51429370835991,28.53049437751957,28.54670941171466,28.56293883745415,28.57918268130258,28.5954409698802,28.61171372986313,28.62800098798349,28.64430277102956,28.66061910584589,28.67695001933347,28.69329553844992,28.70965569020952,28.72603050168348],\"lat\":[38.32190346030156,38.35141499680558,38.38092460590487,38.41043228398451,38.43993802742191,38.46944183258671,38.49894369584079,38.52844361353826,38.55794158202544,38.58743759764081,38.616931656715,38.64642375557079,38.67591389052307,38.7054020578788,38.73488825393705,38.76437247498891,38.79385471731749,38.82333497719793,38.85281325089732,38.88228953467474,38.9117638247812,38.94123611745959,38.97070640894476,39.00017469546338,39.02964097323398,39.05910523846693,39.08856748736438,39.1180277161203,39.14748592092037,39.17694209794202,39.20639624335445,39.23584835331847,39.26529842398659,39.29474645150297,39.3241924320034,39.35363636161523,39.38307823645744,39.41251805264051,39.44195580626647,39.47139149342887,39.50082511021269,39.53025665269445,39.55968611694204,39.58911349901476,39.61853879496333,39.64796200082982,39.67738311264763,39.7068021264415,39.73621903822739,39.76563384401263,39.79504653979571,39.82445712156639,39.85386558530558,39.8832719269854,39.91267614256908,39.94207822801098,39.97147817925657,40.00087599224238,40.03027166289596,40.05966518713594,40.0890565608719,40.11844578000437,40.1478328404249,40.17721773801589,40.20660046865066,40.2359810281934,40.26535941249914,40.29473561741375,40.32410963877386,40.35348147240686,40.38285111413092,40.4122185597549,40.44158380507835,40.4709468458915,40.50030767797518,40.52966629710085,40.55902269903058,40.58837687951696,40.61772883430314,40.64707855912273,40.67642604969986,40.70577130174911,40.73511431097547,40.76445507307432,40.79379358373141,40.82312983862288,40.85246383341511,40.88179556376484,40.91112502531902,40.94045221371486,40.96977712457976,40.99909975353132,41.02842009617729,41.0577381481155,41.08705390493396,41.11636736221065,41.14567851551367,41.17498736040108,41.20429389242093,41.23359810711126]}]],[[{\"lng\":[-13.51866033086742,-13.43156174210667,-13.34426290660871,-13.25676249006431,-13.16905915091412,-13.08115154029856,-12.99303830200754,-12.90471807243,-12.81618948050327,-12.72745114766231,-12.63850168778868,-12.54933970715949,-12.45996380439606,-12.37037257041251,-12.28056458836417,-12.19053843359582,-12.10029267358982,-12.00982586791408,-11.91913656816993,-11.82822331793975,-11.73708465273464,-11.64571909994179,-11.5541251787719,-11.46230140020631,-11.37024626694419,-11.27795827334949,-11.18543590539789,-11.09267764062359,-10.99968194806605,-10.90644728821663,-10.81297211296517,-10.71925486554646,-10.62529398048675,-10.53108788355004,-10.43663499168448,-10.34193371296864,-10.24698244655777,-10.15177958263002,-10.05632350233266,-9.960612577728252,-9.864645171740911,-9.768419638102428,-9.671934321298528,-9.575187556515099,-9.478177669584461,-9.380902976931683,-9.28336178552094,-9.185552392801934,-9.087473086656413,-8.98912214534473,-8.890497837452534,-8.791598421837534,-8.692422147576419,-8.59296725391186,-8.493231970199696,-8.39321451585624,-8.292913100305784,-8.192325922928244,-8.091451173007039,-7.990287029677152,-7.888831661873419,-7.787083228279055,-7.685039877274434,-7.582699746886139,-7.480060964736277,-7.377121647992118,-7.273879903316034,-7.170333826815779,-7.066481503995109,-6.962321009704793,-6.857850408093981,-6.753067752562003,-6.647971085710583,-6.542558439296506,-6.436827834184738,-6.330777280302043,-6.224404776591111,-6.117708310965204,-6.010685860263366,-5.903335390206206,-5.795654855352276,-5.687642199055074,-5.579295353420702,-5.470612239266183,-5.36159076607849,-5.252228831974298,-5.142524323660475,-5.032475116395379,-4.922079073950936,-4.81133404857557,-4.700237880958001,-4.588788400191937,-4.476983423741684,-4.364820757408745,-4.252298195299363,-4.139413519793146,-4.026164501512702,-3.9125488992944,-3.798564460160243,-3.684208919290909],\"lat\":[29.06813618173305,29.18594626630684,29.30369985247194,29.4213965363681,29.53903591150097,29.65661756871864,29.77414109618786,29.89160607937021,30.00901210099802,30.12635874104998,30.24364557672675,30.36087218242611,30.47803812971815,30.59514298732009,30.71218632107087,30.82916769390569,30.94608666583016,31.06294279389432,31.1797356321664,31.29646473170642,31.41312964053947,31.52972990362885,31.64626506284897,31.76273465695795,31.87913822157009,31.99547528912803,32.11174538887472,32.22794804682515,32.34408278573777,32.46014912508582,32.57614658102828,32.69207466638062,32.80793289058532,32.92372075968215,33.03943777627818,33.15508343951752,33.27065724505087,33.38615868500477,33.50158724795057,33.61694241887322,33.73222367913972,33.84743050646741,33.96256237489183,34.07761875473452,34.19259911257035,34.3075029111948,34.42232960959077,34.5370786628952,34.65174952236546,34.76634163534542,34.8808544452312,34.99528739143673,35.109639909359,35.22391143034296,35.33810138164623,35.45220918640352,35.56623426359064,35.68017602798841,35.7940338901461,35.90780725634475,36.02149552856002,36.13509810442488,36.24861437719193,36.36204373569553,36.47538556431343,36.58863924292833,36.70180414688894,36.81487964697089,36.92786510933727,37.04075989549881,37.15356336227387,37.26627486174804,37.37889374123344,37.49141934322773,37.60385100537283,37.71618806041322,37.82842983615408,37.94057565541902,38.05262483600747,38.16457669065185,38.27643052697434,38.38818564744339,38.49984134932982,38.61139692466273,38.72285166018499,38.83420483730843,38.94545573206874,39.05660361508001,39.16764775148899,39.27858740092901,39.38942181747347,39.50015024958926,39.61077194008961,39.72128612608673,39.83169203894408,39.94198890422845,40.05217594166142,40.16225236507093,40.27221738234209,40.382070195368]}]],[[{\"lng\":[-9.701746957014885,-10.27065661873723,-10.84264206805311,-11.41769473324403,-11.99580434888525,-12.57695891766214,-13.16114467323138,-13.74834604425692,-14.33854561975404,-14.93172411587743,-15.52786034429183,-16.12693118226547,-16.72891154462824,-17.33377435773711,-17.94149053559221,-18.55202895824613,-19.16535645264861,-19.78143777606703,-20.40023560222083,-21.02171051026524,-21.64582097675567,-22.27252337071988,-22.9017719519596,-23.53351887269728,-24.16771418267666,-24.80430583781826,-25.44323971252228,-26.08445961570217,-26.72790731062202,-27.37352253860028,-28.02124304663023,-28.67100461895648,-29.32274111263262,-29.97638449707279,-30.63186489759555,-31.28911064294399,-31.94804831675141,-32.60860281290687,-33.27069739475942,-33.93425375808462,-34.5991920977213,-35.26543117777134,-35.93288840523985,-36.60147990697809,-37.27112060977709,-37.94172432344548,-38.61320382669173,-39.28547095561763,-39.95843669461805,-40.63201126947045,-41.30610424238713,-41.98062460879382,-42.65548089558997,-43.33058126063871,-44.00583359322822,-44.68114561524227,-45.35642498277307,-46.03157938790832,-46.70651666042303,-47.3811448691071,-48.05537242246177,-48.72910816850108,-49.40226149339835,-50.07474241872444,-50.74646169703026,-51.4173309055349,-52.08726253768939,-52.75617009239657,-53.42396816067824,-54.09057250959349,-54.75590016322374,-55.41986948055469,-56.08240023009836,-56.74341366111344,-57.40283257129723,-58.06058137083684,-58.71658614272367,-59.37077469924977,-60.02307663462093,-60.67342337363574,-61.321748216396,-61.967986379028,-62.61207503040882,-63.25395332490645,-63.89356243115505,-64.53084555690074,-65.16574796996507,-65.79821701538512,-66.42820212880063,-67.05565484616811,-67.68052880989228,-68.30277977147296,-68.9223655907746,-69.53924623203152,-70.15338375670935,-70.76474231334804,-71.37328812451668,-71.97898947101433,-72.58181667345453,-73.18174207137289],\"lat\":[38.97507346639419,39.16608965172932,39.35432476256292,39.53974501486986,39.72231665258747,39.90200596678966,40.07877931548273,40.25260314401313,40.423444006076,40.59126858531063,40.75604371746729,40.91773641312728,41.07631388095611,41.23174355146687,41.38399310126924,41.53303047777637,41.67882392434009,41.821342005782,41.96055363428598,42.0964280956149,42.22893507561219,42.35804468694639,42.48372749605465,42.60595455023896,42.72469740486662,42.83992815062457,42.9516194407752,43.05974451835955,43.16427724329231,43.26519211929106,43.36246432058157,43.45606971831947,43.54598490666758,43.63218722846811,43.71465480044767,43.79336653789343,43.86830217873869,43.93944230699605,44.0067683754774,44.07026272774046,44.12990861920274,44.18569023736531,44.23759272109007,44.28560217887649,44.32970570608564,44.36989140106201,44.40614838010605,44.43846679125352,44.46683782682063,44.49125373467753,44.5117078282162,44.52819449498239,44.54070920394552,44.54924851138397,44.55381006536793,44.55439260882581,44.55099598118486,44.54362111858072,44.53227005263556,44.51694590780833,44.49765289732538,44.47439631770403,44.44718254188608,44.41601901100203,44.38091422479138,44.3418777307081,44.29892011174402,44.25205297300678,44.20128892709228,44.14664157829451,44.08812550569931,44.02575624521051,43.95955027056008,43.8895249733558,43.81569864222197,43.73809044109064,43.65672038670182,43.5716093253729,43.48277890909767,43.39025157103679,43.29405050046109,43.19419961720985,43.09072354572569,42.98364758872744,42.87299770058164,42.75880046043279,42.64108304515083,42.5198732021539,42.39519922216218,42.26708991193757,42.13557456706225,42.00068294480678,41.862445237137,41.72089204390655,41.57605434627974,41.42796348042724,41.27665111153475,41.12214920816233,40.96449001698987,40.80370603798157]}]],[[{\"lng\":[1.230876269683916,2.429859361533259,3.652402088168757,4.898619697612713,6.168563835965668,7.462216426800463,8.779483549260988,10.12018941048767,11.48407052136112,12.87077019708182,14.27983351511679,15.71070287179553,17.16271428453286,18.63509458849066,20.12695967370147,21.6373139006011,23.16505081805754,24.70895528807432,26.26770709541432,27.83988608880567,29.42397886389642,31.01838695784002,32.62143648278614,34.23138908238317,35.84645405362184,37.46480143800073,39.08457585304182,40.70391080939753,42.32094324159412,43.9338279728215,45.54075183654028,47.13994718990123,48.72970457536286,50.30838431625232,51.87442686774476,53.4263617849497,54.96281521247705,56.48251584299372,57.98429933399906,59.46711121071094,60.93000831725561,62.37215890734697,63.79284148876278,65.19144255297239,66.56745333235793,67.92046573298646,69.25016759141224,70.55633740023862,71.83883863993454,73.09761384448777,74.33267851666277,75.54411499563005,76.73206636617306,77.8967304850911,79.0383541872262,80.15722772107897,81.25367945247257,82.32807086433007,83.38079187142426,84.41225646096697,85.4228986631002,86.41316884967995,87.38353035512272,88.33445640941933,89.26642737060909,90.17992824193942,91.07544645751355,91.95346991934834,92.81448526833694,93.65897637155329,94.48742300857157,95.30029973994141,96.09807494160096,96.88120998977618,97.65015858176913,98.40536617894327,99.14726955914708,99.87629646675335,100.5928653494163,101.2973851715475,101.9902552953765,102.6718654212844,103.3425955798753,104.0028161689792,104.6528880294578,105.2931625543128,105.923981826176,106.5456787787924,107.158577378594,107.7629928229036,108.3592317517142,108.9475924703489,109.5283651806412,110.1018322185671,110.6682682965306,111.227940748741,111.781109778336,112.3280287050929,112.8689442127443,113.4040965950602],\"lat\":[51.95289747875216,52.38857390937575,52.8118805580342,53.22238155336422,53.61963497454079,54.00319410090849,54.37260882893079,54.72742726005826,55.06719746049357,55.39146939073338,55.69979699920739,55.9917404703534,56.26686861312947,56.52476137136574,56.76501243262624,56.98723190754001,57.19104904705386,57.37611496095795,57.54210529755395,57.68872284168639,57.81569998674369,57.92280103582655,58.0098242882105,58.07660386957131,58.12301126820633,58.14895654460816,58.15438918809335,58.13929860154855,58.10371420346424,58.04770514496622,57.97137964818655,57.87488398069364,57.75840108849349,57.62214891702698,57.46637845538026,57.2913715434219,57.09743848467851,56.8849155094321,56.65416213280886,56.40555845163388,56.13950242170114,55.85640715404156,55.55669826497164,55.24081131038717,54.90918933013883,54.56228052358511,54.20053607273018,53.82440812486534,53.43434794245213,53.03080422419595,52.61422159791319,52.18503928292012,51.7436899172726,51.29059854324996,50.82618174297691,50.35084691497926,49.86499168172791,49.36900341779826,48.86325888811012,48.34812398577188,47.8239535592915,47.29109131929291,46.74986981535913,46.20061047417936,45.64362369078135,45.07920896526157,44.50765507806403,43.9292402974929,43.34423261375977,42.75288999445827,42.15546065691848,41.55218335341907,40.94328766572248,40.32899430584774,39.70951542040613,39.08505489619808,38.45580866510629,37.82196500662209,37.18370484661224,36.54120205117214,35.89462371462407,35.24413044090416,34.58987661774501,33.93201068320274,33.27067538419978,32.60600802686008,31.93814071850473,31.26720060125229,30.59331007723367,29.91658702548591,29.23714501063472,28.55509348351274,27.87053797389119,27.18358027552646,26.49431862374256,25.80284786578433,25.10925962418762,24.41364245341916,23.71608199004394,23.01666109667991]}]],[[{\"lng\":[-117.8793613140179,-117.3414387244749,-116.7948967449703,-116.2394197690012,-115.6746817379547,-115.1003458121284,-114.5160640472099,-113.9214770790451,-113.3162138199794,-112.6998911705591,-112.0721137509517,-111.4324736570724,-110.7805502471117,-110.1159099649401,-109.4381062077269,-108.7466792460615,-108.0411562059051,-107.3210511228328,-106.5858650802533,-105.8350864446151,-105.0681912120154,-104.2846434821239,-103.4838960768908,-102.6653913231301,-101.8285620197057,-100.9728326116924,-100.0976205954733,-99.20233818022184,-98.28639423254273,-97.34919653210574,-96.39015436682472,-95.40868149637248,-94.40419951245447,-93.37614162312646,-92.32395688636011,-91.24711491483863,-90.14511106939968,-89.0174721524161,-87.86376260451227,-86.68359119815281,-85.47661820965156,-84.24256303691577,-82.98121221372531,-81.69242775261421,-80.37615572766252,-79.03243498608063,-77.66140585391244,-76.26331867725605,-74.83854201707034,-73.38757029409889,-71.91103066208817,-70.40968887384636,-68.88445389740455,-67.33638104020255,-65.7666733492815,-64.17668107608515,-62.56789902636913,-60.94196165901217,-59.30063585162274,-57.64581131434207,-55.97948870395479,-54.30376556535898,-52.62082030303507,-50.93289445740399,-49.24227362578342,-47.55126742115463,-45.862188900804,-44.17733391861004,-42.49896085788991,-40.82927118609484,-39.17039123927148,-37.52435559524742,-35.89309233303612,-34.27841040572893,-32.68198927921188,-31.1053709134642,-29.54995409071481,-28.01699102854131,-26.50758615857001,-25.02269690443801,-23.56313625696802,-22.12957692018389,-20.72255678833047,-19.34248551042076,-17.98965190364639,-16.66423198868638,-15.36629743690766,-14.09582424009164,-12.85270143619644,-11.63673974851342,-10.44768001934933,-9.285201342239031,-8.148928818054952,-7.03844087981623,-5.953276148266601,-4.892939795282876,-3.856909404902969,-2.844640332314754,-1.855570569675552,-0.8891251343230544],\"lat\":[34.5907079413121,35.23658206370219,35.88003811882178,36.52097793587614,37.15929922157878,37.79489535049832,38.42765514546642,39.05746264773477,39.68419687659463,40.30773157820736,40.92793496343765,41.54466943453679,42.15779130059136,42.76715048173573,43.372590202228,43.97394667260843,44.57104876130349,45.16371765620639,45.75176651696317,46.33500011892274,46.91321448997634,47.48619654181742,48.0537236975041,48.61556351760512,49.171473327661,49.72119985019948,50.26447884511023,50.80103476281132,51.33058041533022,51.85281667117522,52.36743218068569,52.8741031394186,53.37249309804417,53.86225282817443,54.34302025451738,54.81442046471456,55.27606580915104,55.72755610388857,56.16847895062175,56.59841018813857,57.01691449012409,57.42354612420699,57.8178498868416,58.19936222786186,58.56761257725763,58.92212488483073,59.26241938081573,59.58801456224408,59.89842940575552,60.19318580271236,60.4718112068862,60.73384147874192,60.97882390357486,61.20632035365288,61.41591055732263,61.60719543105746,61.7798004239951,61.93337881900498,62.06761493011165,62.18222713353756,62.2769706690196,62.35164014962719,62.40607172218875,62.44014482661445,62.45378351074952,62.44695726762467,62.41968137368728,62.37201671929208,62.30406913582699,62.21598823674523,62.10796580187763,61.98023374517611,61.83306171505141,61.66675438339156,61.48164848400083,61.27810966353142,61.05652920807776,60.81732070665953,60.56091670911873,60.28776543083708,59.99832755051636,59.69307314042612,59.37247876136582,59.03702474742446,58.68719269871659,58.32346319383637,57.94631372795498,57.55621687738669,57.15363868711529,56.73903727421288,56.31286163727172,55.87555065985762,55.42753229451417,54.96922291292271,54.50102680737594,54.02333582866981,53.53652914578515,53.04097311324385,52.5370212327251,52.02501419635546]}]],[[{\"lng\":[4.852557972595654,4.760995122421804,4.669591142447197,4.578345724719099,4.487258560381305,4.396329339692021,4.305557752041578,4.214943485970013,4.124486229184503,4.034185668576642,3.944041490239587,3.854053379485051,3.764221020860149,3.674544098164106,3.585022294464822,3.495655292115286,3.406442772769853,3.317384417400381,3.228479906312222,3.139728919160071,3.051131134963679,2.962686232123426,2.874393888435749,2.786253781108438,2.698265586775785,2.610428981513605,2.522743640854121,2.435209239800691,2.347825452842429,2.260591953968673,2.173508416683319,2.086574514019028,1.999789918551291,1.913154302412369,1.826667337305095,1.740328694516545,1.654138044931584,1.568095059046273,1.482199406981156,1.396450758494401,1.310848782994837,1.225393149554846,1.140083526923124,1.054919583537339,0.9699009875366356,0.885027406774034,0.8002985088286926,0.7157139610180587,0.6312734304098848,0.5469765838341267,0.4628230878947274,0.3788126089812641,0.2949448132804944,0.2112193667877638,0.127635935318308,0.04419418451843673,-0.03910622012341299,-0.1222656132657249,-0.2052843297030759,-0.2881627043554186,-0.3709010722574871,-0.453499768548304,-0.5359591284608145,-0.6182794873116221,-0.7004611804908391,-0.7825045434520518,-0.8644099117023907,-0.9461776207927138,-1.027808006307897,-1.109301403857233,-1.19065814906494,-1.271878577560771,-1.352963024970737,-1.433911826907928,-1.514725318963445,-1.595403836697431,-1.675947715630206,-1.756357291233511,-1.836632898921839,-1.916774874043886,-1.996783551874082,-2.076659267604241,-2.156402356335296,-2.236013153069138,-2.31549199270055,-2.394839210009241,-2.474055139651971,-2.55314011615478,-2.6320944739053,-2.710918547145167,-2.78961266996253,-2.868177176284648,-2.946612399870575,-3.024918674303944,-3.103096332985836,-3.181145709127744,-3.259067135744616,-3.336860945648002,-3.414527471439268,-3.492067045502922],\"lat\":[45.6786119817024,45.62998069467634,45.58127639015097,45.53249931864976,45.48364972999033,45.43472787328433,45.38573399693723,45.33666834864831,45.28753117541056,45.23832272351068,45.18904323852912,45.13969296534,45.09027214811133,45.04078103030498,44.99121985467691,44.94158886327722,44.89188829745042,44.84211839783559,44.79227940436668,44.74237155627269,44.69239509207805,44.64235024960287,44.59223726596337,44.54205637757218,44.49180782013877,44.44149182866988,44.39110863746996,44.34065848014168,44.29014158958639,44.23955819800464,44.18890853689678,44.13819283706349,44.08741132860636,44.0365642409286,43.98565180273554,43.93467424203543,43.88363178614001,43.83252466166534,43.78135309453241,43.73011730996794,43.67881753250519,43.62745398598466,43.576026893555,43.52453647767376,43.4729829601083,43.42136656193658,43.36968750354816,43.31794600464502,43.26614228424253,43.21427656067033,43.1623490515734,43.11035997391294,43.05830954396741,43.00619797733353,42.95402548892734,42.90179229298521,42.84949860306489,42.7971446320467,42.74473059213443,42.69225669485663,42.63972315106764,42.58713017094878,42.53447796400945,42.48176673908834,42.42899670435463,42.3761680673091,42.32328103478547,42.27033581295152,42.21733260731035,42.16427162270168,42.11115306330308,42.0579771326312,42.00474403354314,41.95145396823772,41.89810713825678,41.84470374448647,41.79124398715869,41.73772806585237,41.68415617949474,41.63052852636292,41.5768453040851,41.52310670964199,41.46931293936825,41.41546418895388,41.36156065344564,41.30760252724846,41.25359000412692,41.19952327720666,41.14540253897585,41.09122798128664,41.03699979535671,40.98271817177062,40.92838330048141,40.87399537081206,40.819554571457,40.76506109048359,40.71051511533373,40.65591683282531,40.60126642915376,40.54656408989359]}]],[[{\"lng\":[5.844176276411345,5.918265982728418,5.992409039956043,6.066605368430602,6.140854887819142,6.215157517118462,6.289513174654249,6.363921778080215,6.438383244377244,6.512897489852567,6.587464430138937,6.662083980193836,6.736756054298684,6.811480566058075,6.886257428399012,6.961086553570185,7.035967853141232,7.11090123800204,7.185886618362068,7.260923903749645,7.336013003011337,7.411153824311308,7.486346275130669,7.561590262266905,7.636885691833264,7.712232469258185,7.787630499284757,7.863079685970156,7.938579932685153,8.014131142113589,8.089733216251886,8.165386056408602,8.241089563203952,8.316843636569393,8.392648175747208,8.468503079290103,8.544408245060822,8.620363570231806,8.696368951284832,8.7724242840107,8.848529463508925,8.924684384187451,9.000888939762378,9.077143023257724,9.153446527005187,9.229799342643933,9.306201361120419,9.382652472688195,9.459152566907775,9.535701532646502,9.612299258078412,9.688945630684168,9.765640537250961,9.842383863872476,9.919175495948849,9.996015318186648,10.07290321459888,10.14983906850504,10.2268227625311,10.30385417860964,10.3809331979799,10.4580597011879,10.53523356808656,10.61245467783584,10.68972290890294,10.76703813906246,10.84440024539664,10.92180910429554,10.99926459145738,11.07676658188873,11.15431494990485,11.23190956913002,11.30955031249784,11.3872370522516,11.46496965994469,11.542748006441,11.6205719619153,11.69844139585375,11.77635617705431,11.85431617362729,11.93232125299581,12.0103712818964,12.08846612637948,12.16660565180999,12.244789722868,12.32301820354929,12.40129095716605,12.4796078463475,12.55796873304063,12.63637347851088,12.71482194334289,12.79331398744126,12.87184947003134,12.95042824966002,13.02905018419658,13.10771513083352,13.18642294608745,13.26517348579999,13.34396660513868,13.42280215859794],\"lat\":[50.92846193961849,50.9452170320554,50.96192521551279,50.97858642826099,50.99520060863946,51.01176769505763,51.02828762599591,51.04476034000644,51.06118577571411,51.07756387181738,51.09389456708918,51.11017780037784,51.126413510608,51.14260163678146,51.15874211797814,51.17483489335697,51.19087990215677,51.20687708369723,51.22282637737973,51.23872772268833,51.25458105919064,51.27038632653881,51.28614346447031,51.301852412809,51.31751311146598,51.33312550044051,51.34868951982094,51.36420510978567,51.37967221060403,51.39509076263726,51.41046070633939,51.42578198225821,51.4410545310362,51.45627829341144,51.47145321021859,51.48657922238978,51.50165627095559,51.51668429704594,51.53166324189112,51.54659304682265,51.56147365327423,51.57630500278277,51.5910870369892,51.60581969763957,51.62050292658586,51.63513666578703,51.64972085730992,51.66425544333021,51.6787403661334,51.6931755681157,51.70756099178507,51.72189657976212,51.73618227478106,51.7504180196907,51.76460375745535,51.77873943115586,51.79282498399049,51.80686035927592,51.82084550044822,51.83478035106377,51.84866485480026,51.86249895545764,51.87628259695907,51.89001572335188,51.90369827880859,51.91733020762781,51.93091145423521,51.94444196318453,51.9579216791585,51.97135054696983,51.98472851156217,51.99805551801108,52.01133151152497,52.02455643744613,52.03773024125161,52.05085286855427,52.06392426510369,52.07694437678715,52.08991314963063,52.10283052979971,52.11569646360062,52.12851089748114,52.14127377803158,52.15398505198579,52.16664466622207,52.17925256776416,52.19180870378221,52.20431302159373,52.2167654686646,52.22916599260994,52.24151454119518,52.25381106233696,52.26605550410411,52.27824781471863,52.29038794255664,52.30247583614928,52.3145114441838,52.3264947155044,52.33842559911326,52.35030404417147]}]],[[{\"lng\":[-3.471959509101669,-3.374219930370337,-3.27626042990034,-3.17808017218029,-3.079678320111476,-2.981054035026696,-2.882206476709499,-2.783134803413883,-2.683838171884431,-2.584315737376887,-2.484566653679199,-2.384590073133007,-2.284385146655609,-2.183951023762388,-2.083286852589722,-1.982391779918375,-1.881264951197378,-1.779905510568397,-1.678312600890613,-1.576485363766105,-1.474422939565736,-1.372124467455575,-1.269589085423832,-1.166815930308321,-1.063804137824477,-0.9605528425939026,-0.8570611781734681,-0.7533282770849713,-0.6493532708453553,-0.5451352899974976,-0.4406734641415831,-0.3359669219670436,-0.2310147912851002,-0.1258161990618925,-0.02037027145221626,0.08532386616613663,0.1912670891574164,0.2974602735923392,0.4039042962118712,0.5106000343903926,0.6175483660982002,0.72475016986338,0.8322063247330154,0.9399177102337207,1.047885206331535,1.156109693391107,1.264592052134218,1.373333163597603,1.482333909090093,1.591595170149018,1.701117828495939,1.810902765991637,1.920950864590385,2.03126300629348,2.141840073102061,2.25268294696914,2.363792509750921,2.475169643157334,2.586815228701812,2.698730147650289,2.810915280969422,2.923371509274027,3.036099712773705,3.14910077121869,3.26237556384487,3.375924969318004,3.489749865677102,3.603851130276993,3.718229639730045,3.832886269847046,3.94782189557724,4.063037390947493,4.17853362900061,4.294311481732771,4.410371820030107,4.526715513604362,4.643343430927701,4.760256439166604,4.877455404114844,4.994941190125586,5.112714660042544,5.230776675130234,5.349128095003278,5.46776977755481,5.586702578883894,5.705927353222031,5.82544495285871,5.945256228065976,6.065362027022072,6.185763195734068,6.306460577959558,6.427455015127349,6.548747346257167,6.670338407878374,6.792229033947702,6.914420055765955,7.036912301893743,7.159706598066167,7.282803767106512,7.406204628838914],\"lat\":[40.56694439302392,40.64199660090299,40.7169662202087,40.79185284557374,40.86665606968378,40.94137548326933,41.01601067509726,41.09056123196288,41.16502673868155,41.23940677808053,41.31370093099083,41.38790877623901,41.4620298906391,41.53606384898435,41.61001022403923,41.6838685865313,41.75763850514313,41.83131954650426,41.90491127518314,41.97841325367916,42.05182504241468,42.12514619972705,42.19837628186065,42.2715148429591,42.3445614350573,42.41751560807361,42.49037690980206,42.56314488590461,42.63581907990335,42.7083990331729,42.78088428493264,42.85327437223917,42.92556882997871,42.99776719085958,43.06986898540472,43.14187374194417,43.21378098660779,43.28559024331783,43.35730103378168,43.42891287748459,43.50042529168253,43.571837791395,43.64314988939801,43.71436109621702,43.78547092012003,43.85647886711063,43.92738444092124,43.9981871430063,44.06888647253559,44.13948192638762,44.20997299914307,44.28035918307836,44.35063996815915,44.42081484203415,44.49088329002878,44.56084479513902,44.63069883802543,44.70044489700707,44.77008244805565,44.83961096478971,44.90902991846888,44.97833877798836,45.04753700987327,45.11662407827335,45.18559944495759,45.25446256930901,45.3232129083196,45.39184991658526,45.46037304630103,45.5287817472562,45.59707546682975,45.66525364998581,45.73331573926919,45.80126117480121,45.86908939427544,45.93679983295375,46.0043919236624,46.07186509678827,46.13921878027529,46.20645239962091,46.27356537787282,46.34055713562577,46.40742709101848,46.47417465973086,46.54079925498119,46.60730028752364,46.67367716564582,46.73992929516657,46.80605607943387,46.87205691932299,46.93793121323469,47.0036783570938,47.06929774434775,47.13478876596541,47.20015081043618,47.26538326376909,47.33048550949223,47.39545692865242,47.46029689981487,47.52500479906328]}]],[[{\"lng\":[-3.562517379313113,-3.555532254638795,-3.548524467039077,-3.54149385622262,-3.534440260529696,-3.527363516916953,-3.520263460941987,-3.513139926747713,-3.505992747046522,-3.49882175310423,-3.491626774723815,-3.484407640228941,-3.47716417644725,-3.46989620869344,-3.462603560752114,-3.455286054860397,-3.447943511690314,-3.440575750330942,-3.433182588270302,-3.425763841377025,-3.418319323881753,-3.410848848358292,-3.403352225704506,-3.395829265122953,-3.388279774101248,-3.38070355839216,-3.373100421993434,-3.36547016712733,-3.357812594219884,-3.350127501879873,-3.342414686877499,-3.334673944122756,-3.326905066643513,-3.319107845563279,-3.311282070078659,-3.303427527436487,-3.29554400291064,-3.287631279778523,-3.279689139297222,-3.271717360679308,-3.263715721068307,-3.255683995513809,-3.247621956946231,-3.239529376151205,-3.231406021743603,-3.223251660141192,-3.215066055537893,-3.206848969876663,-3.198600162821982,-3.190319391731929,-3.182006411629866,-3.173660975175683,-3.165282832636646,-3.156871731857798,-3.148427418231924,-3.139949634669082,-3.13143812156567,-3.122892616773036,-3.114312855565625,-3.105698570608638,-3.097049491925217,-3.088365346863132,-3.079645860060964,-3.07089075341378,-3.062099746038284,-3.053272554237446,-3.044408891464583,-3.035508468286899,-3.02657099234846,-3.017596168332612,-3.008583697923807,-2.999533279768842,-2.99044460943752,-2.981317379382664,-2.972151278899545,-2.962945994084652,-2.953701207793832,-2.944416599599768,-2.935091845748792,-2.925726619117014,-2.916320589165768,-2.906873421896329,-2.897384779803946,-2.887854321831112,-2.878281703320102,-2.868666575964755,-2.859008587761472,-2.849307382959433,-2.839562602010006,-2.829773881515345,-2.819940854176142,-2.810063148738546,-2.800140389940198,-2.790172198455396,-2.780158190839358,-2.770097979471567,-2.759991172498184,-2.749837373773503,-2.739636182800446,-2.729387194670057],\"lat\":[40.59966745849979,40.70752449757796,40.81538111427064,40.92323730558867,41.03109306851739,41.13894840001629,41.24680329701877,41.35465775643178,41.46251177513565,41.57036534998362,41.67821847780168,41.7860711553882,41.89392337951363,42.00177514692016,42.10962645432144,42.21747729840223,42.32532767581807,42.43317758319494,42.54102701712898,42.64887597418605,42.75672445090147,42.86457244377958,42.97241994929351,43.08026696388468,43.18811348396254,43.29595950590411,43.40380502605367,43.51165004072236,43.61949454618779,43.72733853869361,43.8351820144492,43.94302496962915,44.05086740037296,44.15870930278454,44.26655067293184,44.37439150684646,44.48223180052305,44.59007154991907,44.69791075095424,44.80574939951009,44.91358749142955,45.0214250225164,45.12926198853491,45.23709838520926,45.34493420822312,45.4527694532191,45.56060411579834,45.6684381915199,45.7762716759003,45.88410456441301,45.9919368524879,46.09976853551067,46.20759960882238,46.31543006771884,46.42325990745002,46.5310891232196,46.6389177101843,46.74674566345326,46.8545729780875,46.96239964909938,47.07022567145182,47.17805104005786,47.28587574977987,47.39369979542899,47.50152317176451,47.60934587349311,47.71716789526828,47.82498923168959,47.93280987730196,48.04062982659511,48.14844907400264,48.25626761390146,48.364085440611,48.47190254839241,48.57971893144794,48.68753458392001,48.79534949989053,48.90316367338006,49.01097709834703,49.1187897686869,49.22660167823134,49.33441282074735,49.44222318993644,49.55003277943375,49.65784158280714,49.76564959355629,49.87345680511182,49.98126321083431,50.08906880401339,50.19687357786673,50.30467752553915,50.41248064010152,50.52028291454983,50.62808434180413,50.7358849147075,50.84368462602496,50.95148346844245,51.05928143456565,51.16707851691896,51.27487470794431]}]],[[{\"lng\":[-3.449420490816553,-3.328787660077125,-3.207575981314088,-3.085779871809084,-2.963393691964214,-2.840411744668166,-2.716828274657309,-2.592637467871839,-2.46783345080702,-2.342410289859596,-2.216361990669456,-2.089682497456618,-1.962365692353644,-1.834405394733555,-1.705795360533371,-1.576529281573369,-1.446600784872193,-1.316003431957931,-1.184730718175294,-1.052776071989056,-0.9201328542838837,-0.7867943576607365,-0.6527538057300118,-0.5180043524016069,-0.3825390811720917,-0.2463510044092159,-0.1094330626339542,0.02822187619969319,0.1666210174268619,0.3057716403957422,0.4456810991929385,0.5863568233700175,0.7278063186709289,0.8700371677599988,1.013057030950142,1.156873646930971,1.301494833496424,1.446928488271528,1.593182589437902,1.740265196457575,1.888184450794682,2.036948576634578,2.186565881599871,2.337044757462897,2.48839368085408,2.640621213965649,2.793736005250109,2.947746790112894,3.102662391598539,3.258491721069739,3.415243778878611,3.572927655029398,3.731552529831955,3.891127674545156,4.051662452009442,4.213166317267702,4.375648818173549,4.539119595986126,4.703588385950444,4.86906501786233,5.035559416616873,5.20308160273937,5.371641692897622,5.541249900394432,5.711916535639105,5.883652006596725,6.056466819213871,6.230371577819483,6.405376985499437,6.581493844443426,6.758733056262636,6.937105622276624,7.116622643767891,7.297295322202359,7.479134959414132,7.662152957752705,7.846360820190754,8.031770150390676,8.218392652727788,8.406240132268254,8.595324494699536,8.785657746211248,8.977251993324101,9.170119442664687,9.364272400683612,9.559723273314534,9.756484565571581,9.954568881082453,10.15398892155452,10.35475748617108,10.55688747091495,10.76039186781638,10.96528376412216,11.17157634138297,11.37928287445544,11.58841673041597,11.79899136738244,12.01102033324075,12.22451726427227,12.43949588367862],\"lat\":[40.65081680141286,40.80969866740494,40.96845429392827,41.12708236153912,41.28558153517837,41.44395046394858,41.60218778088759,41.76029210273877,41.91826202971799,42.07609614527678,42.23379301586224,42.3913511906731,42.54876920141234,42.70604556203597,42.86317876849812,43.02016729849226,43.1770096111886,43.33370414696765,43.49024932714963,43.64664355372008,43.80288520905113,43.95897265561899,44.11490423571688,44.27067827116399,44.42629306301002,44.58174689123545,44.7370380144473,44.8921646695705,45.04712507153477,45.20191741295685,45.35653986381814,45.51099057113771,45.66526765864045,45.81936922642052,45.97329335059994,46.12703808298224,46.28060145070119,46.43398145586448,46.58717607519234,46.7401832596511,46.89300093408144,47.04562699682161,47.19805931932515,47.35029574577349,47.502334092683,47.65417214850677,47.80580767323075,47.95723839796455,48.10846202452652,48.25947622502329,48.41027864142367,48.56086688512683,48.71123853652475,48.86139114455894,49.01132222627128,49.16102926634907,49.31050971666427,49.45976099580674,49.60878048861159,49.75756554568065,49.90611348289788,50.05442158093891,50.20248708477448,50.35030720316792,50.49787910816669,50.64519993458779,50.79226677949724,50.93907670168356,51.08562672112523,51.23191381845219,51.37793493440145,51.52368696926666,51.66916678234187,51.8143711913595,51.95929697192237,52.10394085693009,52.24829953599973,52.39236965488083,52.53614781486499,52.67963057218983,52.82281443743771,52.96569587492915,53.10827130211106,53.25053708893999,53.3924895572605,53.53412498017866,53.67543958143102,53.8164295347492,53.95709096322008,54.09741993864206,54.23741248087735,54.37706455720068,54.51637208164454,54.65533091434132,54.79393686086251,54.93218567155525,55.07007304087663,55.20759460672591,55.34474594977515,55.48152259279838]}]],[[{\"lng\":[-3.59064750152446,-3.611896456413862,-3.63322754748438,-3.6546414644294,-3.676138903909602,-3.697720569644438,-3.719387172505022,-3.741139430608474,-3.762978069413723,-3.784903821818818,-3.806917428259754,-3.829019636810855,-3.851211203286738,-3.873492891345883,-3.895865472595854,-3.91832972670017,-3.940886441486898,-3.963536413058965,-3.986280445906245,-4.009119353019428,-4.032053956005748,-4.055085085206543,-4.078213579816748,-4.101440288006303,-4.124766067043546,-4.14819178342062,-4.171718312980911,-4.195346541048605,-4.219077362560351,-4.242911682199093,-4.266850414530134,-4.290894484139428,-4.315044825774194,-4.339302384485853,-4.363668115775365,-4.388142985740997,-4.412727971228566,-4.437424059984225,-4.462232250809822,-4.48715355372089,-4.512188990107323,-4.537339592896783,-4.562606406720906,-4.58799048808435,-4.613492905536741,-4.639114739847584,-4.664857084184204,-4.690721044292752,-4.716707738682365,-4.742818298812527,-4.769053869283715,-4.795415608031363,-4.821904686523257,-4.848522289960382,-4.875269617481342,-4.90214788237038,-4.929158312269108,-4.956302149392005,-4.983580650745754,-5.010995088352542,-5.038546749477327,-5.066236936859243,-5.094066968947165,-5.122038180139553,-5.150151921028649,-5.178409558649141,-5.20681247673136,-5.235362075959132,-5.264059774232364,-5.292907006934493,-5.321905227204857,-5.35105590621615,-5.380360533457017,-5.409820617019953,-5.439437683894565,-5.469213280266363,-5.499148971821173,-5.529246344055303,-5.559507002591589,-5.58993257350145,-5.620524703633082,-5.651285060945933,-5.682215334851595,-5.713317236561254,-5.744592499439847,-5.776042879367083,-5.807670155105469,-5.839476128675506,-5.871462625738228,-5.903631495985223,-5.935984613536347,-5.968523877345259,-6.001251211612992,-6.03416856620975,-6.067277917105068,-6.100581266806601,-6.134080644807679,-6.167778108043882,-6.201675741358795,-6.235775657979218],\"lat\":[40.6200907817167,40.74836768408382,40.87664067446232,41.00490971988262,41.1331747870402,41.26143584229127,41.38969285164814,41.5179457807748,41.64619459498217,41.77443925922346,41.90267973808935,42.03091599580314,42.15914799621584,42.2873757028011,42.41559907865019,42.54381808646676,42.67203268856159,42.8002428468473,42.92844852283282,43.056649677618,43.18484627188788,43.31303826590707,43.44122561951394,43.56940829211471,43.6975862426775,43.8257594297262,43.9539278113344,44.08209134511895,44.21024998823369,44.3384036973629,44.46655242871475,44.5946961380145,44.72283478049778,44.85096831090357,44.97909668346716,45.10721985191304,45.23533776944748,45.36345038875121,45.49155766197185,45.61965954071621,45.74775597604246,45.87584691845228,46.00393231788267,46.13201212369781,46.26008628468063,46.38815474902439,46.51621746432392,46.64427437756692,46.7723254351249,46.90037058274413,47.02840976553634,47.15644292796923,47.28447001385696,47.41249096635024,47.54050572792649,47.66851424037962,47.79651644480976,47.92451228161275,48.0525016904694,48.18048461033468,48.30846097942658,48.43643073521483,48.56439381440943,48.69235015294893,48.8202996859885,48.94824234788784,49.07617807219876,49.20410679165261,49.33202843814745,49.45994294273503,49.58785023560739,49.71575024608337,49.84364290259477,49.9715281326723,50.09940586293119,50.22727601905659,50.35513852578872,50.48299330690763,50.61084028521776,50.73867938253218,50.86651051965648,50.99433361637244,51.12214859142127,51.24995536248665,51.37775384617729,51.50554395800931,51.63332561238813,51.76109872259008,51.88886320074367,52.01661895781041,52.14436590356527,52.27210394657681,52.39983299418684,52.52755295248972,52.65526372631119,52.78296521918683,52.91065733334004,53.03833996965958,53.1660130276767,53.29367640554166]}]],[[{\"lng\":[-3.484903592726734,-3.400046304168482,-3.314906254007362,-3.22948154869382,-3.143770281344894,-3.057770531641959,-2.971480365727915,-2.88489783610384,-2.798020981525109,-2.710847826896994,-2.623376383169734,-2.535604647233093,-2.447530601810416,-2.359152215352179,-2.270467441929045,-2.18147422112444,-2.092170477926643,-2.002554122620421,-1.912623050678187,-1.822375142650725,-1.731808264057462,-1.640920265276314,-1.54970898143312,-1.458172232290655,-1.366307822137258,-1.274113539675067,-1.1815871579079,-1.088726434028752,-0.9955291093069751,-0.901992908975111,-0.8081155421154205,-0.7138947015461077,-0.6193280637072692,-0.5244132885465695,-0.4291480194046792,-0.3335298829004745,-0.2375564888160341,-0.1412254299814418,-0.04453428215942003,0.05251939607018386,0.1499380634260427,0.2477241960410923,0.3458802875783616,0.4444088493468512,0.5433124104174508,0.6425935177388576,0.7422547362534709,0.8422986490132416,0.9427278572954383,1.043544980718305,1.144752657356586,1.246353543856866,1.348350315552718,1.450745666579615,1.553542309989545,1.656742977865352,1.760350421434702,1.864367411183672,1.968796736969918,2.07364120813537,2.178903653618425,2.284586922065583,2.390693881942485,2.497227421644314,2.604190449605496,2.711585894408668,2.81941670489285,2.92768585026078,3.036396320185345,3.145551124915057,3.255153295378543,3.365205883287935,3.475711961241151,3.586674622822989,3.698096982704953,3.809982176743781,3.922333362078557,4.035153717226398,4.148446442176594,4.262214758483158,4.376461909355694,4.491191159748509,4.606405796447911,4.72210912815757,4.838304485581894,4.954995221507319,5.07218471088143,5.18987635088981,5.308073561030537,5.426779783186241,5.545998481693591,5.665733143410144,5.785987277778439,5.906764416887229,6.028068115529741,6.149901951258875,6.272269524439178,6.395174458295535,6.518620398958411,6.642611015505553],\"lat\":[40.60264898938053,40.71342608463792,40.8241408364814,40.934792791941,41.04538149433116,41.15590648321403,41.26636729436228,41.37676345972176,41.48709450737346,41.59735996149534,41.70755934232357,41.81769216611355,41.92775794510038,42.03775618745897,42.14768639726378,42.25754807444807,42.3673407147628,42.47706380973503,42.586716846626,42.69629930838864,42.80581067362478,42.9152504165418,43.02461800690896,43.13391291001312,43.24313458661419,43.35228249289997,43.46135608044061,43.57035479614261,43.67927808220229,43.78812537605882,43.89689611034682,44.00558971284836,44.11420560644459,44.22274320906686,44.33120193364721,44.4395811880686,44.54788037511442,44.65609889241755,44.76423613240904,44.87229148226606,44.98026432385948,45.0881540337009,45.19595998288908,45.30368153705589,45.4113180563118,45.5188688951906,45.62633340259386,45.7337109217346,45.84100079008055,45.94820233929678,46.05531489518783,46.16233777763917,46.26927030055818,46.37611177181455,46.48286149318004,46.58951876026771,46.69608286247053,46.80255308289945,46.90892869832078,47.01520897909304,47.12139318910328,47.22748058570259,47.33347041964118,47.43936193500281,47.54515436913849,47.65084695259976,47.75643890907116,47.86192945530214,47.96731780103842,48.07260314895254,48.17778469457395,48.28286162621841,48.3878331249166,48.49269836434233,48.59745651073996,48.70210672285116,48.80664815184105,48.91107994122372,49.01540122678701,49.11961113651675,49.2237087905202,49.32769330094894,49.43156377192105,49.5353192994426,49.63895897132856,49.74248186712296,49.84588705801838,49.94917360677489,50.05234056763811,50.15538698625689,50.2583118996,50.36111433587242,50.46379331443082,50.5663478456984,50.6687769310791,50.77107956287111,50.87325472417972,50.97530138882956,51.07721852127607,51.17900507651649]}]],[[{\"lng\":[-3.687775837701122,-3.805670351974491,-3.923166103325403,-4.040265638117192,-4.156971488608506,-4.27328617299198,-4.389212195434292,-4.50475204611754,-4.619908201281883,-4.734683123269437,-4.84907926056934,-4.963099047863979,-5.076744906076325,-5.190019242418324,-5.302924450440335,-5.415462910081537,-5.52763698772131,-5.63944903623152,-5.750901395029688,-5.861996390133013,-5.972736334213199,-6.083123526652058,-6.193160253597887,-6.302848788022521,-6.412191389779117,-6.521190305660552,-6.62984776945848,-6.738166002022967,-6.846147211322704,-6.953793592505781,-7.061107327960933,-7.168090587379336,-7.274745527816814,-7.381074293756542,-7.487079017172116,-7.592761817591063,-7.69812480215869,-7.803170065702306,-7.907899690795776,-8.012315747824347,-8.116420295049823,-8.220215378675954,-8.323703032914111,-8.426885280049165,-8.52976413050561,-8.632341582913854,-8.734619624176707,-8.836600229536009,-8.938285362639432,-9.039676975607394,-9.140777009100088,-9.241587392384609,-9.342110043402181,-9.442346868835447,-9.542299764175796,-9.641970613790773,-9.741361290991483,-9.840473658100043,-9.93930956651703,-10.03787085678891,-10.13615935867548,-10.23417689121724,-10.3319252628028,-10.42940627123614,-10.52662170380391,-10.62357333734256,-10.72026293830553,-10.8166922628302,-10.91286305680483,-11.0087770559354,-11.10443598581235,-11.19984156197709,-11.29499548998854,-11.3898994654894,-11.48455517427238,-11.57896429234622,-11.67312848600157,-11.76704941187668,-11.86072871702299,-11.9541680389705,-12.04736900579293,-12.14033323617276,-12.23306233946602,-12.32555791576693,-12.41782155597233,-12.50985484184584,-12.60165934608191,-12.6932366323696,-12.7845882554561,-12.87571576121013,-12.96662068668505,-13.05730456018168,-13.14776890131103,-13.23801522105666,-13.32804502183689,-13.41785979756668,-13.50746103371934,-13.59685020738796,-13.68602878734659,-13.77499823411112],\"lat\":[40.37738774699908,40.26284536935395,40.14818375812511,40.0334037973741,39.91850636422402,39.80349232891952,39.6883625548865,39.57311789879122,39.45775921059916,39.34228733363334,39.22670310463228,39.11100735380749,38.99520090490059,38.87928457523998,38.76325917579713,38.64712551124234,38.53088438000021,38.41453657430464,38.2980828802534,38.18152407786229,38.06486094111894,37.94809423803603,37.83122473070436,37.71425317534527,37.59718032236276,37.4800069163952,37.3627336963666,37.24536139553749,37.12789074155536,37.01032245650485,36.89265725695726,36.77489585401996,36.65703895338514,36.53908725537841,36.42104145500679,36.30290224200644,36.18467030088993,36.06634631099323,35.94793094652213,35.82942487659845,35.71082876530578,35.59214327173488,35.47336905002861,35.35450674942665,35.23555701430971,35.11652048424337,34.99739779402166,34.87818957371015,34.75889644868877,34.63951903969421,34.52005796286193,34.40051382976797,34.28088724747017,34.16117881854924,34.04138914114939,33.92151880901859,33.8015684115485,33.68153853381419,33.56142975661324,33.44124265650479,33.32097780584802,33.20063577284051,33.08021712155608,32.95972241198242,32.83915220005833,32.7185070377107,32.5977874728911,32.47699404961205,32.35612730798309,32.23518778424639,32.11417601081209,31.99309251629342,31.87193782554135,31.75071245967911,31.62941693613628,31.50805176868263,31.38661746746168,31.26511453902391,31.14354348635973,31.02190480893215,30.90019900270915,30.77842656019574,30.6565879704658,30.53468371919362,30.41271428868505,30.29068015790862,30.16858180252613,30.04641969492311,29.92419430423899,29.80190609639697,29.67955553413367,29.55714307702848,29.4346691815327,29.31213430099836,29.18953888570682,29.06688338289714,28.94416823679413,28.82139388863623,28.69856077670313,28.57566933634308]}]],[[{\"lng\":[-3.260344453967345,-2.95073563859165,-2.640659643092413,-2.330122651531689,-2.019130942135403,-1.707690886573612,-1.395808949199594,-1.083491686247666,-0.7707457449897152,-0.4575778628503792,-0.1439948664809264,0.1699963292081428,0.4843887220557008,0.7991752236996678,1.114348660667654,1.429901775508349,1.745827227963483,2.062117596180103,2.378765377962866,2.695762992066064,3.013102779525024,3.33077700502648,3.648777858317525,3.96709745565267,4.285727841278532,4.604660988955622,4.923888803516689,5.24340312246099,5.563195717583933,5.883258296641348,6.203582505047751,6.524159927607855,6.844982090280581,7.166040461974767,7.487326456375738,7.808831433801972,8.130546703090809,8.452463523512488,8.774573106711433,9.096866618673898,9.419335181720911,9.741969876525548,10.06476174415349,10.38770178812576,10.71078097650254,11.03399024398703,11.35732049404815,11.68076260106088,12.00430741246318,12.32794575092825,12.65166841655085,12.97546618904657,13.29932982996272,13.62325008489972,13.94721768574148,14.27122335289381,14.59525779752935,14.91931172383785,15.24337583128042,15.56744081684656,15.89149737731256,16.21553621150009,16.53954802253356,16.86352352009496,17.18745342267508,17.51132845981949,17.83513937436822,18.1588769246879,18.48253188689482,18.80609505706793,19.12955725345043,19.45290931863859,19.77614212175681,20.09924656061743,20.42221356386439,20.74503409309931,21.06769914498902,21.39019975335316,21.7125269912311,22.0346719729267,22.35662585603003,22.67837984341507,22.99992518521215,23.3212531807543,23.64235518049651,23.96322258790682,24.28384686132862,24.60421951581286,24.92433212491975,25.24417632248876,25.56374380437632,25.88302633016041,26.20201572481139,26.52070388032811,26.83908275733899,27.15714438666715,27.47488087085916,27.79228438567678,28.10934718155112,28.42606158499888],\"lat\":[40.54345630131957,40.59427744863527,40.64427070268463,40.69343335814507,40.74176274425453,40.78925622542881,40.83591120187505,40.88172511020137,40.92669542402197,40.97081965455779,41.01409535123204,41.05652010226057,41.09809153523655,41.13880731770935,41.1786651577571,41.21766280455274,41.25579804892322,41.29306872390156,41.32947270527136,41.36500791210357,41.39967230728517,41.43346389803933,41.46638073643708,41.49842091989972,41.5295825916921,41.55986394140619,41.5892632054348,41.61777866743513,41.64540865878184,41.67215155900932,41.69800579624308,41.72296984761972,41.74704223969542,41.77022154884263,41.79250640163472,41.81389547521832,41.83438749767306,41.85398124835869,41.87267555824913,41.89046931025331,41.9073614395226,41.92335093374479,41.93843683342394,41.95261823214662,41.96589427683372,41.97826416797808,41.98972715986762,42.00028256079373,42.00992973324509,42.01866809408644,42.02649711472235,42.033416321246,42.03942529457252,42.04452367055721,42.04871114009826,42.05198744922404,42.05435239916489,42.05580584640931,42.05634770274451,42.05597793528143,42.05469656646401,42.05250367406286,42.04939939115322,42.04538390607736,42.0404574623913,42.034620358796,42.02787294905293,42.02021564188436,42.01164890085798,42.00217324425641,41.99178924493137,41.98049753014271,41.96829878138244,41.95519373418376,41.94118317791546,41.92626795556145,41.91044896348599,41.89372715118438,41.87610352101964,41.85757912794501,41.83815507921274,41.81783253406916,41.79661270343637,41.77449684958061,41.75148628576766,41.72758237590546,41.70278653417405,41.6771002246433,41.65052496087849,41.62306230553395,41.5947138699353,41.56548131365017,41.53536634404799,41.50437071584887,41.47249623066212,41.4397447365143,41.40611812736758,41.37161834262826,41.33624736664598,41.3000072282039]}]],[[{\"lng\":[-3.684208919290909,-3.798564460160243,-3.912548899294399,-4.026164501512701,-4.139413519793145,-4.252298195299362,-4.364820757408745,-4.476983423741685,-4.588788400191937,-4.700237880958001,-4.81133404857557,-4.922079073950936,-5.032475116395379,-5.142524323660475,-5.252228831974298,-5.36159076607849,-5.470612239266182,-5.5792953534207,-5.687642199055074,-5.795654855352276,-5.903335390206206,-6.010685860263366,-6.117708310965204,-6.224404776591111,-6.330777280302043,-6.436827834184738,-6.542558439296506,-6.647971085710583,-6.753067752562002,-6.857850408093981,-6.962321009704793,-7.066481503995112,-7.170333826815779,-7.273879903316035,-7.377121647992118,-7.480060964736277,-7.582699746886139,-7.685039877274434,-7.787083228279055,-7.888831661873419,-7.990287029677152,-8.091451173007037,-8.192325922928244,-8.292913100305784,-8.393214515856242,-8.493231970199696,-8.59296725391186,-8.692422147576419,-8.791598421837534,-8.890497837452534,-8.98912214534473,-9.087473086656413,-9.185552392801934,-9.28336178552094,-9.380902976931685,-9.478177669584465,-9.575187556515097,-9.671934321298526,-9.768419638102424,-9.864645171740911,-9.960612577728252,-10.05632350233266,-10.15177958263002,-10.24698244655777,-10.34193371296864,-10.43663499168448,-10.53108788355004,-10.62529398048675,-10.71925486554646,-10.81297211296517,-10.90644728821663,-10.99968194806605,-11.09267764062359,-11.18543590539789,-11.27795827334949,-11.37024626694419,-11.46230140020631,-11.5541251787719,-11.64571909994179,-11.73708465273464,-11.82822331793975,-11.91913656816993,-12.00982586791408,-12.10029267358982,-12.19053843359582,-12.28056458836417,-12.37037257041251,-12.45996380439606,-12.54933970715949,-12.63850168778868,-12.72745114766231,-12.81618948050327,-12.90471807243,-12.99303830200754,-13.08115154029855,-13.16905915091412,-13.25676249006431,-13.34426290660871,-13.43156174210667,-13.51866033086742],\"lat\":[40.382070195368,40.2722173823421,40.16225236507093,40.05217594166142,39.94198890422844,39.83169203894408,39.72128612608673,39.61077194008962,39.50015024958927,39.38942181747347,39.27858740092901,39.16764775148899,39.05660361508001,38.94545573206874,38.83420483730843,38.72285166018499,38.61139692466273,38.49984134932981,38.38818564744339,38.27643052697434,38.16457669065185,38.05262483600746,37.94057565541901,37.82842983615408,37.71618806041322,37.60385100537283,37.49141934322773,37.37889374123344,37.26627486174804,37.15356336227387,37.04075989549881,36.92786510933726,36.81487964697089,36.70180414688893,36.58863924292833,36.47538556431343,36.36204373569553,36.24861437719193,36.13509810442488,36.02149552856002,35.90780725634475,35.7940338901461,35.68017602798841,35.56623426359064,35.45220918640351,35.33810138164623,35.22391143034296,35.109639909359,34.99528739143673,34.8808544452312,34.76634163534542,34.65174952236546,34.5370786628952,34.42232960959077,34.3075029111948,34.19259911257035,34.07761875473452,33.96256237489182,33.84743050646741,33.73222367913972,33.61694241887322,33.50158724795057,33.38615868500477,33.27065724505087,33.15508343951752,33.03943777627818,32.92372075968215,32.80793289058533,32.69207466638062,32.57614658102829,32.46014912508583,32.34408278573777,32.22794804682515,32.11174538887472,31.99547528912803,31.87913822157009,31.76273465695795,31.64626506284897,31.52972990362885,31.41312964053947,31.29646473170642,31.17973563216641,31.06294279389432,30.94608666583016,30.82916769390569,30.71218632107087,30.59514298732009,30.47803812971815,30.36087218242611,30.24364557672675,30.12635874104998,30.00901210099802,29.89160607937021,29.77414109618786,29.65661756871864,29.53903591150097,29.4213965363681,29.30369985247194,29.18594626630684,29.06813618173305]}]],[[{\"lng\":[-3.625932413846137,-3.682358561549124,-3.73875842376284,-3.795131981296127,-3.851479215112571,-3.90780010633029,-3.964094636221723,-4.020362786213401,-4.076604537885744,-4.132819872972826,-4.189008773362164,-4.245171221094493,-4.301307198363539,-4.357416687515804,-4.413499671050322,-4.469556131618452,-4.525586052023636,-4.581589415221168,-4.637566204317975,-4.693516402572372,-4.749439993393835,-4.805336960342767,-4.861207287130251,-4.91705095761783,-4.972867955817258,-5.028658265890257,-5.084421872148288,-5.140158759052298,-5.195868911212486,-5.251552313388049,-5.307208950486949,-5.362838807565656,-5.418441869828903,-5.474018122629441,-5.529567551467789,-5.585090141991977,-5.640585879997307,-5.696054751426082,-5.75149674236737,-5.806911839056737,-5.862300027875999,-5.917661295352956,-5.972995628161146,-6.028303013119578,-6.083583437192466,-6.138836887488991,-6.194063351263009,-6.249262815912808,-6.304435268980846,-6.359580698153472,-6.41469909126067,-6.46979043627579,-6.524854721315281,-6.579891934638424,-6.634902064647061,-6.68988509988532,-6.744841029039357,-6.799769840937069,-6.854671524547832,-6.909546068982221,-6.964393463491739,-7.019213697468543,-7.074006760445159,-7.128772642094219,-7.183511332228172,-7.238222820799009,-7.29290709789798,-7.347564153755326,-7.402193978739984,-7.45679656335931,-7.511371898258798,-7.565919974221801,-7.620440782169236,-7.674934313159309,-7.729400558387222,-7.783839509184895,-7.838251157020678,-7.892635493499052,-7.946992510360354,-8.001322199480486,-8.055624552870617,-8.109899562676906,-8.164147221180198,-8.218367520795741,-8.272560454072888,-8.326726013694815,-8.38086419247821,-8.434974983372994,-8.489058379462024,-8.54311437396079,-8.597142960217127,-8.651144131710913,-8.705117882053777,-8.759064204988803,-8.812983094390221,-8.866874544263121,-8.920738548743143,-8.974575102096193,-9.028384198718118,-9.082165833134434],\"lat\":[40.47620038363294,40.4605633153302,40.44489882303473,40.42920693470426,40.41348767831104,40.39774108184173,40.38196717329721,40.36616598069241,40.35033753205617,40.33448185543094,40.31859897887276,40.30268893045102,40.28675173824831,40.27078743036017,40.25479603489502,40.23877757997397,40.2227320937306,40.20665960431079,40.19056013987265,40.17443372858623,40.1582803986334,40.14210017820771,40.12589309551417,40.10965917876912,40.09339845620004,40.07711095604541,40.06079670655451,40.04445573598724,40.02808807261408,40.01169374471571,39.99527278058306,39.97882520851701,39.96235105682825,39.94585035383716,39.9293231278736,39.91276940727681,39.89618922039514,39.879582595586,39.86294956121563,39.84629014565896,39.82960437729947,39.81289228452897,39.79615389574751,39.7793892393632,39.76259834379199,39.74578123745762,39.72893794879138,39.71206850623196,39.69517293822531,39.67825127322453,39.66130353968962,39.64432976608737,39.62732998089124,39.61030421258111,39.59325248964326,39.57617484057006,39.55907129385997,39.54194187801726,39.52478662155193,39.50760555297953,39.49039870082105,39.47316609360266,39.45590775985573,39.43862372811648,39.42131402692602,39.40397868483004,39.38661773037879,39.36923119212683,39.35181909863294,39.33438147845997,39.31691836017465,39.29942977234752,39.28191574355266,39.26437630236768,39.24681147737349,39.22922129715418,39.21160579029688,39.19396498539158,39.17629891103103,39.1586075958106,39.14089106832808,39.12314935718359,39.10538249097942,39.0875904983199,39.06977340781122,39.05193124806134,39.03406404767981,39.01617183527769,38.9982546394673,38.98031248886217,38.96234541207691,38.94435343772701,38.92633659442873,38.908294910799,38.89022841545518,38.87213713701509,38.85402110409667,38.83588034531802,38.81771488929718,38.799524764652]}]],[[{\"lng\":[-3.492067045502922,-3.414527471439268,-3.336860945648002,-3.259067135744616,-3.181145709127744,-3.103096332985836,-3.024918674303943,-2.946612399870575,-2.868177176284648,-2.78961266996253,-2.710918547145167,-2.6320944739053,-2.55314011615478,-2.474055139651971,-2.394839210009241,-2.31549199270055,-2.236013153069138,-2.156402356335296,-2.076659267604241,-1.996783551874081,-1.916774874043886,-1.836632898921839,-1.756357291233511,-1.675947715630206,-1.595403836697431,-1.514725318963445,-1.433911826907928,-1.352963024970737,-1.271878577560771,-1.19065814906494,-1.109301403857233,-1.027808006307896,-0.9461776207927134,-0.8644099117023895,-0.7825045434520518,-0.7004611804908391,-0.6182794873116221,-0.5359591284608145,-0.453499768548304,-0.3709010722574871,-0.2881627043554186,-0.2052843297030768,-0.1222656132657263,-0.03910622012341353,0.04419418451843699,0.127635935318308,0.2112193667877638,0.2949448132804944,0.3788126089812641,0.4628230878947274,0.5469765838341267,0.6312734304098848,0.7157139610180587,0.8002985088286926,0.885027406774034,0.9699009875366361,1.054919583537339,1.140083526923123,1.225393149554844,1.310848782994837,1.396450758494401,1.482199406981156,1.568095059046273,1.654138044931584,1.740328694516545,1.826667337305095,1.91315430241237,1.999789918551292,2.086574514019028,2.173508416683319,2.260591953968672,2.347825452842428,2.435209239800691,2.522743640854121,2.610428981513605,2.698265586775785,2.786253781108438,2.874393888435749,2.962686232123427,3.051131134963679,3.139728919160071,3.228479906312223,3.317384417400381,3.406442772769853,3.495655292115286,3.585022294464822,3.674544098164106,3.764221020860149,3.854053379485051,3.944041490239587,4.034185668576643,4.124486229184503,4.214943485970013,4.305557752041578,4.39632933969202,4.487258560381304,4.578345724719099,4.669591142447196,4.760995122421803,4.852557972595654],\"lat\":[40.54656408989359,40.60126642915375,40.65591683282531,40.71051511533373,40.76506109048359,40.81955457145699,40.87399537081206,40.92838330048141,40.98271817177062,41.03699979535671,41.09122798128664,41.14540253897585,41.19952327720666,41.25359000412692,41.30760252724846,41.36156065344564,41.41546418895388,41.46931293936824,41.52310670964199,41.5768453040851,41.63052852636292,41.68415617949474,41.73772806585237,41.79124398715869,41.84470374448647,41.89810713825678,41.95145396823772,42.00474403354314,42.0579771326312,42.11115306330308,42.16427162270168,42.21733260731035,42.27033581295152,42.32328103478547,42.3761680673091,42.42899670435463,42.48176673908834,42.53447796400945,42.58713017094878,42.63972315106764,42.69225669485663,42.74473059213443,42.7971446320467,42.8494986030649,42.90179229298521,42.95402548892734,43.00619797733353,43.05830954396741,43.11035997391294,43.1623490515734,43.21427656067033,43.26614228424253,43.31794600464502,43.36968750354816,43.42136656193657,43.47298296010829,43.52453647767376,43.576026893555,43.62745398598466,43.67881753250519,43.73011730996794,43.78135309453241,43.83252466166534,43.88363178614001,43.93467424203543,43.98565180273554,44.03656424092861,44.08741132860636,44.13819283706349,44.18890853689678,44.23955819800464,44.29014158958639,44.34065848014168,44.39110863746996,44.44149182866988,44.49180782013877,44.54205637757218,44.59223726596337,44.64235024960287,44.69239509207805,44.7423715562727,44.79227940436669,44.8421183978356,44.89188829745042,44.94158886327722,44.99121985467691,45.04078103030498,45.09027214811133,45.13969296534,45.18904323852912,45.23832272351069,45.28753117541056,45.33666834864831,45.38573399693723,45.43472787328432,45.48364972999033,45.53249931864976,45.58127639015096,45.62998069467633,45.6786119817024]}]],[[{\"lng\":[-3.491753975077541,-3.414036474171334,-3.336327615764359,-3.258627518223,-3.180936299795495,-3.103254078610405,-3.02558097267506,-2.947917099874045,-2.870262577967656,-2.792617524590381,-2.714982057249377,-2.637356293322954,-2.559740350059057,-2.482134344573764,-2.404538393849772,-2.326952614734903,-2.249377123940604,-2.171812038040451,-2.094257473468668,-2.016713546518638,-1.939180373341423,-1.86165806994429,-1.784146752189242,-1.706646535791547,-1.629157536318281,-1.551679869186869,-1.474213649663632,-1.396758992862341,-1.319316013742769,-1.241884827109259,-1.164465547609286,-1.087058289732032,-1.009663167806956,-0.9322802960023824,-0.8549097883240826,-0.7775517586138652,-0.7002063205481754,-0.6228735876366945,-0.5455536732209437,-0.4682466904729001,-0.3909527523936098,-0.3136719718118104,-0.2364044613825564,-0.1591503335858566,-0.08190970072530489,-0.004682674926728741,0.07253063186316624,0.14973010787814,0.2269156415337607,0.3040871214287391,0.3812444363462578,0.4583874752552976,0.5355161273119518,0.6126302818607456,0.6897298284359357,0.766814656762818,0.8438846567590206,0.9209397185357959,0.9979797323993037,1.075004588851886,1.152014178593346,1.229008392522213,1.305987121737001,1.382950257537463,1.459897691425843,1.536829315108118,1.613745020495235,1.690644699704339,1.76752824506,1.844395549095432,1.921246504553706,1.998081004388954,2.074898941767567,2.151700210069396,2.228484702888933,2.305252314036495,2.382002937539399,2.458736467643129,2.535452798812499,2.61215182573281,2.688833443311,2.765497546676783,2.842144031183787,2.918772792410691,2.995383726162339,3.071976728470858,3.148551695596777,3.225108524030121,3.301647110491514,3.378167351933272,3.454669145540475,3.531152388732062,3.607616979161886,3.684062814719788,3.760489793532649,3.836897813965446,3.913286774622288,3.98965657434746,4.066007112226452,4.142338287586979],\"lat\":[40.48815578143181,40.48444950046076,40.48069116965516,40.47688080175612,40.47301840967734,40.4691040065049,40.46513760549703,40.46111922008397,40.45704886386774,40.45292655062189,40.44875229429131,40.44452610899205,40.44024800901105,40.43591800880595,40.43153612300485,40.42710236640611,40.42261675397809,40.41807930085896,40.4134900223564,40.40884893394746,40.40415605127821,40.39941139016363,40.39461496658723,40.38976679670092,40.38486689682468,40.37991528344639,40.37491197322148,40.36985698297278,40.36475032969015,40.35959203053035,40.35438210281666,40.34912056403869,40.34380743185208,40.33844272407826,40.33302645870413,40.32755865388184,40.32203932792849,40.31646849932584,40.31084618672005,40.3051724089214,40.29944718490399,40.29367053380545,40.28784247492667,40.2819630277315,40.27603221184645,40.2700500470604,40.2640165533243,40.25793175075086,40.25179565961429,40.24560830034994,40.23936969355399,40.23307985998322,40.22673882055464,40.22034659634515,40.21390320859127,40.20740867868883,40.2008630281926,40.19426627881603,40.1876184524309,40.18091957106695,40.17416965691163,40.1673687323097,40.16051681976299,40.15361394192994,40.14666012162538,40.13965538182011,40.1325997456406,40.12549323636867,40.1183358774411,40.11112769244929,40.10386870513895,40.09655893940972,40.08919841931479,40.08178716906065,40.0743252130066,40.06681257566448,40.05924928169832,40.05163535592391,40.04397082330851,40.03625570897042,40.02849003817866,40.0206738363526,40.01280712906158,40.00488994202452,39.99692230110955,39.9889042323337,39.98083576186242,39.97271691600929,39.96454772123559,39.95632820414993,39.94805839150786,39.93973831021152,39.93136798730919,39.92294744999497,39.91447672560834,39.90595584163379,39.89738482570041,39.88876370558153,39.8800925091943,39.87137126459925]}]],[[{\"lng\":[-4.382963935251749,-5.199689850634892,-6.019543701397403,-6.842406977020252,-7.668156804407561,-8.496666064812436,-9.327803524460307,-10.16143397875566,-10.99741840987998,-11.83561415750949,-12.67587510230087,-13.51805186171349,-14.36199199765692,-15.20754023537508,-16.05453869290299,-16.9028271203597,-17.75224314827276,-18.60262254406598,-19.45379947578397,-20.30560678207449,-21.15787624740422,-22.0104388814452,-22.86312520153797,-23.71576551711491,-24.56819021495266,-25.42023004411585,-26.27171639945747,-27.12248160255122,-27.97235917895063,-28.82118413069722,-29.66879320303438,-30.5150251443267,-31.35972095823324,-32.20272414723934,-33.04388094671222,-33.88304054871244,-34.72005531486381,-35.55478097765757,-36.38707682964468,-37.21680590004769,-38.04383511840378,-38.86803546493118,-39.68928210739023,-40.50745452428964,-41.32243661436532,-42.13411679233365,-42.94238807099279,-43.74714812981376,-44.54829937022748,-45.34574895787373,-46.13940885213382,-46.92919582331911,-47.71503145793331,-48.49684215246717,-49.27455909621945,-50.04811824366843,-50.81746027694345,-51.58253055896623,-52.34327907784704,-53.09966038313178,-53.85163351450241,-54.59916192353521,-55.34221338912012,-56.08075992713883,-56.81477769499106,-57.54424689154703,-58.26915165308957,-58.9894799457935,-59.70522345527094,-60.41637747369075,-61.12294078495934,-61.82491554842618,-62.52230718155427,-63.2151242419711,-63.90337830929022,-64.58708386706921,-65.2662581852439,-65.9409212033538,-66.61109541484919,-67.27680575274567,-67.93807947686805,-68.59494606290311,-69.24743709345731,-69.89558615129491,-70.53942871491097,-71.17900205657396,-71.81434514295411,-72.44549853843613,-73.07250431119769,-73.69540594212016,-74.31424823658266,-74.92907723917757,-75.53994015137258,-76.14688525213255,-76.74996182150458,-77.34922006715853,-77.94471105386764,-78.53648663590502,-79.12459939232461,-79.70910256508891],\"lat\":[40.62749069681664,40.75744072058218,40.88161122468418,40.99995506540511,41.11242687867274,41.21898315524821,41.31958231407636,41.414184773522,41.50275302021742,41.58525167524932,41.66164755741878,41.73190974331428,41.79600962394642,41.85392095770366,41.90561991940027,41.95108514520206,41.99029777323062,42.02324147966412,42.04990251017147,42.07026970653629,42.08433452834826,42.09209106966189,42.09353607054486,42.08866892346248,42.07749167446833,42.06000901919544,42.03622829366695,42.00615945996881,41.9698150868515,41.92721032535049,41.87836287953778,41.82329297253849,41.76202330796711,41.69457902695641,41.62098766097118,41.54127908061398,41.45548544064555,41.36364112145542,41.26578266722925,41.16194872106927,41.05217995733126,40.9365190114482,40.81501040751348,40.68770048389991,40.5546373171905,40.41587064469598,40.27145178583118,40.12143356261831,39.96587021957888,39.80481734326967,39.63833178170938,39.46647156393376,39.28929581990654,39.10686470100259,38.91923930126811,38.72648157965018,38.52865428337575,38.32582087264662,38.11804544680424,37.90539267210446,37.68792771122943,37.46571615465039,37.23882395394211,37.00731735713711,36.77126284619523,36.53072707665217,36.28577681949882,36.03647890533247,35.78290017081007,35.52510740742361,35.26316731260887,34.99714644318895,34.72711117114665,34.45312764171165,34.17526173374134,33.89357902236829,33.60814474388048,33.31902376279658,33.02628054109223,32.72997910953075,32.43018304104667,32.12695542612852,31.82035885014355,31.51045537254609,31.19730650790821,30.88097320871095,30.56151584983284,30.23899421467198,29.91346748283738,29.5849942193456,29.25363236525845,28.91943922969809,28.58247148317697,28.24278515218011,27.90043561493884,27.5554775983361,27.20796517588468,26.85795176672106,26.50549013555942,26.15063239355152]}]],[[{\"lng\":[-3.457792431855648,-3.345914982096875,-3.233847307313077,-3.12158906632068,-3.009139920196551,-2.896499532311649,-2.7836675683649,-2.670643696417307,-2.557427586926293,-2.444018912780261,-2.330417349333413,-2.216622574440763,-2.102634268493399,-1.988452114453969,-1.874075797892393,-1.759505007021794,-1.644739432734669,-1.529778768639267,-1.414622711096199,-1.299270959255271,-1.183723215092533,-1.067979183447548,-0.952038572060884,-0.8359010916118181,-0.7195664557562542,-0.6030343811648647,-0.4863045875614342,-0.3693767977614217,-0.252250737710729,-0.1349261365246771,-0.0174027265271927,0.1003197567098032,0.2182415743268093,0.3363629841369394,0.4546842405859452,0.5732055947120185,0.6919272941054055,0.8108495828678353,0.9299727015717515,1.049296887219352,1.168822373201448,1.288549389256139,1.408478161427305,1.528608912022918,1.64894185957318,1.769477218788482,1.890215200517207,2.011156011703342,2.132299855343943,2.253646930446433,2.375197431985736,2.496951550861257,2.618909473853717,2.741071383581823,2.863437458458802,2.986007872648795,3.108782796023098,3.231762394116281,3.354946828082165,3.478336254649676,3.601930826078569,3.725730690115033,3.849735989947184,3.973946864160436,4.098363446692771,4.222985866789894,4.347814248960297,4.472848712930226,4.59808937359855,4.723536340991543,4.8491897202176,4.975049611421842,5.101116109740682,5.227389305256296,5.35386928295106,5.480556122661888,5.607449899034553,5.734550681477947,5.861858534118289,5.989373515753313,6.117095679806403,6.245025074280726,6.373161741713316,6.501505719129176,6.630057037995334,6.75881572417493,6.887781797881273,7.016955273631935,7.146336160202845,7.275924460582399,7.405720171925611,7.535723285508295,7.66593378668127,7.796351654824631,7.926976863302071,8.057809379415255,8.188849164358258,8.3200961731721,8.451550354699322,8.583211651538701],\"lat\":[40.54874324855321,40.60556876843721,40.66228615964466,40.71889502114563,40.77539495089021,40.83178554581139,40.88806640182786,40.94423711384703,41.00029727576808,41.05624648048504,41.11208431989012,41.16781038487695,41.22342426534403,41.27892555019825,41.33431382735846,41.38958868375925,41.44474970535465,41.49979647712203,41.55472858306616,41.60954560622324,41.66424712866515,41.71883273150358,41.77330199489462,41.82765449804315,41.88188981920739,41.93600753570369,41.99000722391126,42.04388845927712,42.09765081632108,42.15129386864089,42.20481718891742,42.25822034892007,42.31150291951213,42.36466447065641,42.41770457142085,42.47062278998435,42.52341869364263,42.57609184881423,42.62864182104667,42.68106817502267,42.73337047456644,42.78554828265028,42.83760116140108,42.88952867210703,42.94133037522447,42.99300583038482,43.04455459640169,43.09597623127802,43.14727029221344,43.19843633561167,43.24947391708812,43.30038259147752,43.35116191284184,43.4018114344781,43.45233070892654,43.50271928797878,43.55297672268615,43.60310256336817,43.65309635962106,43.70295766032657,43.75268601366074,43.80228096710294,43.85174206744496,43.90106886080027,43.9502608926134,43.99931770766948,44.04823885010388,44.09702386341199,44.14567229045922,44.19418367349098,44.24255755414295,44.29079347345142,44.33889097186375,44.38684958924907,44.43466886490894,44.48234833758837,44.52988754548679,44.57728602626933,44.62454331707806,44.67165895454358,44.71863247479657,44.76546341347959,44.81215130575902,44.85869568633707,44.90509608946407,44.9513520489507,44.99746309818064,45.04342877012311,45.08924859734574,45.13492211202745,45.1804488459716,45.22582833061921,45.27106009706231,45.31614367605756,45.3610785980399,45.40586439313634,45.45050059118005,45.4949867217244,45.53932231405734,45.58350689721572]}]],[[{\"lng\":[-3.551090704138055,-3.532688947911953,-3.514274714471061,-3.495847986941376,-3.47740874842549,-3.45895698200256,-3.440492670728273,-3.422015797634809,-3.403526345730813,-3.385024298001354,-3.366509637407897,-3.347982346888267,-3.329442409356612,-3.310889807703375,-3.292324524795253,-3.27374654347517,-3.255155846562239,-3.236552416851725,-3.217936237115019,-3.199307290099593,-3.18066555852898,-3.162011025102724,-3.143343672496357,-3.124663483361361,-3.105970440325132,-3.087264525990953,-3.068545722937947,-3.049814013721055,-3.031069380870994,-3.012311806894228,-2.993541274272927,-2.97475776546494,-2.955961262903755,-2.937151748998467,-2.918329206133745,-2.899493616669792,-2.880644962942315,-2.861783227262493,-2.842908391916934,-2.82402043916765,-2.805119351252014,-2.786205110382732,-2.767277698747803,-2.74833709851049,-2.729383291809279,-2.710416260757851,-2.691435987445042,-2.67244245393481,-2.653435642266201,-2.634415534453314,-2.615382112485266,-2.596335358326157,-2.577275253915034,-2.55820178116586,-2.539114921967475,-2.520014658183565,-2.500900971652623,-2.481773844187915,-2.462633257577451,-2.443479193583941,-2.424311633944766,-2.405130560371942,-2.385935954552084,-2.366727798146373,-2.347506072790516,-2.328270760094719,-2.309021841643645,-2.289759298996384,-2.270483113686413,-2.251193267221565,-2.231889741083991,-2.21257251673013,-2.193241575590667,-2.173896899070503,-2.154538468548717,-2.135166265378534,-2.115780270887285,-2.09638046637638,-2.076966833121261,-2.057539352371379,-2.038098005350152,-2.018642773254929,-1.99917363725696,-1.979690578501355,-1.960193578107055,-1.94068261716679,-1.921157676747052,-1.901618737888049,-1.88206578160368,-1.862498788881495,-1.842917740682658,-1.823322617941918,-1.803713401567566,-1.784090072441404,-1.764452611418714,-1.74480099932821,-1.725135216972017,-1.705455245125627,-1.685761064537867,-1.666052655930862],\"lat\":[40.51452000770394,40.53722709847469,40.55993126799204,40.58263251192865,40.60533082595002,40.62802620571451,40.65071864687324,40.6734081450702,40.69609469594215,40.71877829511858,40.7414589382218,40.76413662086684,40.78681133866145,40.80948308720613,40.83215186209404,40.85481765891107,40.87748047323578,40.90014030063936,40.92279713668567,40.94545097693119,40.96810181692504,40.9907496522089,41.01339447831709,41.03603629077644,41.05867508510642,41.08131085681894,41.10394360141852,41.12657331440219,41.14919999125944,41.17182362747226,41.19444421851513,41.21706175985495,41.23967624695108,41.26228767525532,41.28489604021185,41.30750133725724,41.33010356182049,41.35270270932292,41.37529877517822,41.3978917547924,41.42048164356379,41.44306843688306,41.46565213013311,41.48823271868918,41.5108101979187,41.53338456318141,41.55595580982923,41.57852393320631,41.60108892864901,41.62365079148585,41.64620951703754,41.66876510061692,41.69131753752897,41.71386682307079,41.73641295253162,41.75895592119274,41.78149572432751,41.80403235720136,41.82656581507179,41.84909609318829,41.87162318679234,41.89414709111749,41.9166678013892,41.93918531282493,41.96169962063405,41.98421072001791,42.00671860616975,42.02922327427471,42.05172471950981,42.07422293704396,42.09671792203788,42.11920966964416,42.14169817500722,42.16418343326324,42.18666543954023,42.20914418895793,42.23161967662787,42.2540918976533,42.27656084712921,42.29902652014226,42.32148891177083,42.34394801708497,42.36640383114636,42.38885634900838,42.41130556571596,42.43375147630567,42.4561940758057,42.47863335923576,42.50106932160715,42.5235019579227,42.54593126317678,42.56835723235522,42.59077986043541,42.61319914238615,42.63561507316773,42.65802764773188,42.68043686102173,42.70284270797185,42.72524518350816,42.747644282548]}]],[[{\"lng\":[-3.517014702038783,-3.464414649299659,-3.411679122886333,-3.358807399630823,-3.305798752062885,-3.252652448379223,-3.199367752412471,-3.145943923599951,-3.092380216952203,-3.038675883021285,-2.984830167868845,-2.930842313033959,-2.876711555500738,-2.822437127665698,-2.768018257304897,-2.713454167540831,-2.658744076809097,-2.603887198824807,-2.548882742548768,-2.493729912153416,-2.438427906988502,-2.382975921546541,-2.327373145428006,-2.271618763306273,-2.215711954892318,-2.159651894899166,-2.103437753006082,-2.047068693822507,-1.990543876851741,-1.933862456454368,-1.877023581811426,-1.820026396887307,-1.762870040392407,-1.705553645745508,-1.648076341035896,-1.590437248985212,-1.532635486909043,-1.474670166678241,-1.416540394679968,-1.358245271778481,-1.299783893275632,-1.241155348871114,-1.182358722622406,-1.123393092904475,-1.064257532369167,-1.00495110790435,-0.9454728805927616,-0.8858219056705749,-0.8259972324856936,-0.7659979044557594,-0.7058229590258711,-0.6454714276260272,-0.5849423356282772,-0.524234702303591,-0.4633475407784327,-0.4022798579910546,-0.3410306546474961,-0.279598925177293,-0.2179836576888967,-0.1561838339248016,-0.0941984292163717,-0.03202641243838521,0.03033325403672256,0.09288161438491298,0.1556197193768911,0.2185486264247506,0.2816693996289157,0.3449831098253833,0.4084908346332581,0.4721936585025958,0.5360926727625411,0.6001889756697606,0.6644836724571861,0.7289778753830521,0.7936727037802369,0.8585692841059045,0.9236687499914459,0.9889722422927253,1.054480909140627,1.120195905991899,1.18611839568031,1.252249548468092,1.318590542097698,1.385142561843854,1.45190680056591,1.518884458760497,1.58607674461448,1.65348487405821,1.721110070819079,1.788953566475365,1.857016600510386,1.925300420366933,1.993806281502021,2.062535447441915,2.131489189837453,2.200668788519677,2.270075531555731,2.339710715305063,2.409575644475912,2.479671632182083],\"lat\":[40.57762774757194,40.66342169878968,40.7491917200482,40.83493767687573,40.92065943392679,41.00635685497507,41.09202980290634,41.17767813971126,41.26330172647807,41.34890042338526,41.43447408969427,41.52002258374188,41.60554576293283,41.6910434837321,41.77651560165734,41.86196197127108,41.94738244617292,42.0327768789917,42.11814512137749,42.20348702399364,42.28880243650861,42.37409120758787,42.45935318488564,42.54458821503654,42.62979614364726,42.714976815288,42.80013007348401,42.88525576070697,42.97035371836619,43.05542378679992,43.14046580526646,43.22547961193519,43.31046504387758,43.39542193705809,43.4803501263249,43.5652494454007,43.65011972687337,43.73496080218638,43.81977250162943,43.90455465432871,43.98930708823722,44.07402963012499,44.15872210556914,44.24338433894397,44.32801615341081,44.41261737090789,44.49718781214007,44.58172729656849,44.66623564240012,44.75071266657718,44.83515818476654,44.91957201134889,45.00395395940805,45.08830384071985,45.17262146574116,45.25690664359879,45.34115918207815,45.42537888761194,45.50956556526866,45.59371901874106,45.67783905033448,45.76192546095502,45.84597805009766,45.92999661583428,46.0139809548015,46.0979308621885,46.18184613172463,46.26572655566694,46.34957192478768,46.43338202836153,46.51715665415282,46.60089558840261,46.6845986158156,46.76826551954701,46.85189608118926,46.9354900807585,47.01904729668118,47.10256750578024,47.18605048326146,47.26949600269941,47.35290383602344,47.43627375350349,47.51960552373576,47.60289891362829,47.68615368838633,47.76936961149762,47.85254644471751,47.93568394805406,48.01878187975272,48.10183999628123,48.18485805231406,48.26783580071687,48.35077299253089,48.4336693769569,48.51652470133935,48.59933871115015,48.68211114997232,48.76484175948362,48.84753027943987,48.93017644765816]}]],[[{\"lng\":[-3.420883609084421,-3.271809900594709,-3.122256384962871,-2.97222056849203,-2.821699953529733,-2.670692038645941,-2.519194318815712,-2.367204285606717,-2.214719427371613,-2.061737229445384,-1.908255174347702,-1.75427074199041,-1.599781409890182,-1.444784653386449,-1.289277945864673,-1.133258758985037,-0.9767245629166431,-0.819672826577287,-0.6621010178788921,-0.5040066039786922,-0.3453870515362242,-0.186239826976228,-0.02656239675753554,0.1336477723519959,0.2943932129943889,0.4556764569342419,0.6175000347651077,0.7798664756095005,0.9427783068124301,1.106238053628391,1.27024823890173,1.434811382740307,1.599930002182378,1.765606610856597,1.931843718635109,2.098643831279593,2.266009450080223,2.433943071487461,2.602447186736589,2.771524281464929,2.941176835321665,3.11140732157018,3.282218206682868,3.453611949928323,3.625591002950846,3.798157809342198,3.971314804205532,4.145064413711443,4.31940905464607,4.494351133951175,4.669893048256162,4.846037183401943,5.022785913956647,5.200141602723047,5.378106600237711,5.556683244261801,5.735873859263469,5.915680755891816,6.096106230442351,6.277152564313946,6.458822023457195,6.641116857814207,6.824039300749729,7.007591568473646,7.191775859454753,7.376594353825872,7.562049212780185,7.748142577958859,7.934876570829933,8.122253292058392,8.310274820867551,8.498943214391621,8.68826050701955,8.878228709730115,9.068849809418307,9.260125768212975,9.45205852278581,9.6446499836517,9.837902034460418,10.03181653127981,10.2263953018704,10.42164014495155,10.61755282945919,10.8141350937953,11.01138864506892,11.2093151583292,11.40791627579014,11.60719360604746,11.8071487232875,12.00778316648824,12.20909843861277,12.41109600579504,12.61377729651827,12.81714370078597,13.02119656928586,13.22593721254676,13.43136690008858,13.63748685956573,13.84429827590392,14.05180229043072],\"lat\":[40.59910070078279,40.70620036685845,40.81310765779805,40.91982122426344,41.02633970796114,41.13266174159664,41.23878594882898,41.34471094422565,41.450435333218,41.55595771205682,41.6612766677686,41.76639077811196,41.87129861153466,41.97599872713108,42.08048967460017,42.18476999420388,42.28883821672611,42.39269286343237,42.49633244602975,42.59975546662773,42.70296041769946,42.80594578204375,42.90871003274776,43.01125163315029,43.11356903680588,43.21566068744961,43.31752501896265,43.41916045533873,43.52056541065125,43.62173828902141,43.72267748458714,43.82338138147291,43.92384835376061,44.02407676546127,44.12406497048782,44.22381131262894,44.32331412552386,44.42257173263839,44.52158244724192,44.62034457238578,44.71885640088257,44.81711621528692,44.91512228787737,45.01287288063961,45.11036624525109,45.20760062306688,45.30457424510709,45.40128533204556,45.49773209420025,45.59391273152492,45.68982543360254,45.78546837964016,45.88083973846565,45.97593766852576,46.07076031788623,46.16530582423346,46.25957231487815,46.35355790676056,46.4472607064579,46.54067881019347,46.63381030384784,46.72665326297207,46.819205752803,46.91146582828056,47.00343153406736,47.09510090457038,47.18647196396495,47.27754272622104,47.36831119513183,47.45877536434479,47.548933217395,47.63878272774117,47.72832185880404,47.81754856400745,47.90646078682196,47.99505646081124,48.08333350968115,48.17128984733159,48.25892337791113,48.3462319958747,48.433213586044,48.51986602367102,48.60618717450451,48.69217489485965,48.77782703169075,48.86314142266711,48.94811589625228,49.03274827178644,49.11703635957213,49.20097796096351,49.28457086845886,49.36781286579676,49.45070172805566,49.53323522175709,49.61541110497252,49.69722712743393,49.77868103064799,49.85977054801426,49.94049340494689,50.02084731900055]}]],[[{\"lng\":[-4.33831384831804,-5.106719086822263,-5.874579984454849,-6.641781529182279,-7.408209577223979,-8.173750999606305,-8.938293825608108,-9.701727382681888,-10.46394243245448,-11.2248313024332,-11.98428801306715,-12.74220839983895,-13.4984902300888,-14.25303331430081,-15.00573961161067,-15.75651332932304,-16.50526101625745,-17.25189164977168,-17.99631671634188,-18.73845028560929,-19.47820907783233,-20.21551252471297,-20.95028282359376,-21.6824449850498,-22.41192687392594,-23.1386592438946,-23.8625757656332,-24.5836130487423,-25.30171065754618,-26.01681112093651,-26.72885993643714,-27.43780556868348,-28.14359944252381,-28.84619593096207,-29.54555233817212,-30.24162887782185,-30.93438864695305,-31.62379759566814,-32.30982449287872,-32.99244088837369,-33.67162107146537,-34.34734202647199,-35.0195833852935,-35.68832737733462,-36.35355877702599,-37.01526484918892,-37.67343529248434,-38.32806218117963,-38.97913990546078,-39.62666511050882,-40.27063663455235,-40.91105544609853,-41.54792458053684,-42.18124907630016,-42.81103591075882,-43.43729393601343,-44.06003381474312,-44.67926795625587,-45.29501045287854,-45.90727701681427,-46.5160849175862,-47.12145292017665,-47.72340122396275,-48.32195140254013,-48.9171263445183,-49.50895019536287,-50.09744830035233,-50.68264714870919,-51.26457431895806,-51.84325842555695,-52.41872906684064,-52.99101677430953,-53.56015296329124,-54.12616988499659,-54.68910057998664,-55.24897883306268,-55.80583912958608,-56.35971661323153,-56.9106470451724,-57.45866676469414,-58.00381265122792,-58.5461220877938,-59.08563292584002,-59.62238345146259,-60.15641235298681,-60.68775868989089,-61.21646186304936,-61.74256158627313,-62.26609785912102,-62.78711094095677,-63.30564132622458,-63.82172972091497,-64.33541702019247,-64.84674428715573,-65.35575273270072,-65.86248369645661,-66.36697862876436,-66.86927907366777,-67.36942665288656,-67.86746305074129],\"lat\":[40.4756346213335,40.45436779364324,40.42801656298893,40.39658964373495,40.36009740533488,40.31855185666971,40.27196662799567,40.22035695056706,40.16373963400557,40.10213304149652,40.03555706289804,39.96403308585619,39.88758396502458,39.80623398949196,39.72000884852608,39.62893559574588,39.53304261183735,39.43235956593092,39.32691737576059,39.21674816672586,39.10188522997878,38.98236297965824,38.85821690939336,38.7294835481968,38.59620041586729,38.45840597801867,38.31613960085028,38.16944150577049,38.01835272398209,37.86291505113432,37.70317100214234,37.539163766271,37.37093716257478,37.19853559578138,37.02200401270125,36.84138785924066,36.65673303809068,36.46808586715877,36.27549303880539,36.07900157994207,35.87865881304241,35.67451231811246,35.46660989566204,35.25499953071287,35.03972935787585,34.8208476275237,34.59840267308191,34.37244287945579,34.14301665260771,33.91017239029433,33.67395845397015,33.43442314185995,33.19161466319942,32.94558111364,32.69637045181142,32.44403047703202,32.18860880815528,31.93015286353778,31.66870984211253,31.40432670554913,31.13705016148079,30.86692664777658,30.59400231783603,30.31832302688195,30.03993431922649,29.75888141648403,29.47520920670484,29.18896223440175,28.90018469144227,28.60892040877816,28.31521284898423,28.019105099578,27.72063986709174,27.41985947186897,27.11680584355699,26.81152051726776,26.50404463037967,26.19441891995294,25.88268372073191,25.5688789637081,25.25304417521835,24.93521847655261,24.61544058404727,24.29374880963959,23.97018106186046,23.64477484724239,23.31756727212111,22.9885950448094,22.65789447812253,22.32550149223565,21.99145161785369,21.65577999967572,21.31852140013556,20.97971020340201,20.63938041962212,20.29756568939188,19.95429928843938,19.60961413250602,19.26354278241214,18.91611744929407]}]],[[{\"lng\":[-3.615727806216225,-3.662009817314329,-3.708326063048274,-3.754676573114372,-3.801061377150847,-3.847480504737404,-3.893933985394789,-3.940421848584354,-3.986944123707619,-4.033500840105828,-4.080092027059511,-4.126717713788037,-4.173377929449172,-4.220072703138634,-4.266802063889634,-4.313566040672446,-4.360364662393937,-4.407197957897123,-4.454065955960724,-4.500968685298688,-4.54790617455975,-4.594878452326972,-4.641885547117276,-4.688927487380992,-4.736004301501386,-4.7831160177942,-4.830262664507193,-4.877444269819656,-4.924660861841962,-4.971912468615085,-5.019199118110135,-5.066520838227873,-5.113877656798251,-5.161269601579928,-5.208696700259789,-5.256158980452476,-5.303656469699896,-5.351189195470748,-5.398757185160034,-5.446360466088575,-5.493999065502524,-5.541673010572882,-5.589382328395003,-5.637127045988105,-5.684907190294779,-5.73272278818049,-5.780573866433089,-5.828460451762311,-5.876382570799279,-5.924340250095999,-5.972333516124865,-6.020362395278154,-6.068426913867523,-6.116527098123495,-6.164662974194965,-6.212834568148684,-6.261041905968743,-6.309285013556076,-6.357563916727934,-6.405878641217377,-6.454229212672757,-6.502615656657196,-6.551037998648073,-6.599496264036503,-6.647990478126813,-6.696520666136016,-6.745086853193293,-6.793689064339468,-6.842327324526465,-6.891001658616801,-6.939712091383039,-6.988458647507263,-7.037241351580543,-7.086060228102401,-7.134915301480278,-7.183806596028989,-7.232734135970188,-7.281697945431826,-7.330698048447624,-7.379734468956499,-7.428807230802048,-7.477916357731986,-7.52706187339761,-7.576243801353236,-7.625462165055665,-7.674716987863614,-7.724008293037183,-7.773336103737276,-7.822700443025076,-7.872101333861454,-7.921538799106441,-7.971012861518642,-8.020523543754702,-8.070070868368717,-8.119654857811687,-8.169275534430943,-8.218932920469586,-8.268627038065912,-8.31835790925285,-8.368125555957388],\"lat\":[40.51660344854454,40.54137844648945,40.56613496401616,40.59087297127042,40.61559243836234,40.64029333536642,40.6649756323215,40.68963929923087,40.71428430606225,40.73891062274777,40.7635182191841,40.78810706523235,40.81267713071816,40.83722838543174,40.86176079912784,40.88627434152582,40.91076898230963,40.93524469112789,40.95970143759387,40.98413919128553,41.00855792174556,41.03295759848137,41.05733819096519,41.08169966863403,41.10604200088971,41.13036515709894,41.1546691065933,41.17895381866931,41.20321926258841,41.22746540757706,41.25169222282668,41.27589967749381,41.30008774069999,41.32425638153191,41.3484055690414,41.37253527224546,41.39664546012634,41.42073610163146,41.4448071656736,41.46885862113083,41.49289043684657,41.51690258162963,41.54089502425429,41.56486773346024,41.58882067795273,41.61275382640252,41.636667147446,41.66056060968513,41.68443418168761,41.70828783198679,41.73212152908178,41.75593524143753,41.7797289374848,41.8035025856202,41.82725615420632,41.8509896115717,41.87470292601088,41.89839606578449,41.92206899911924,41.94572169420803,41.96935411920992,41.99296624225028,42.01655803142073,42.04012945477925,42.06368048035024,42.08721107612452,42.11072121005945,42.13421085007891,42.1576799640734,42.18112851990007,42.20455648538279,42.2279638283122,42.25135051644575,42.27471651750775,42.29806179918948,42.32138632914918,42.34469007501216,42.36797300437077,42.39123508478463,42.41447628378046,42.43769656885234,42.46089590746165,42.4840742670372,42.50723161497524,42.53036791863955,42.55348314536149,42.57657726244007,42.59965023714203,42.62270203670187,42.64573262832193,42.66874197917247,42.69173005639171,42.71469682708594,42.73764225832954,42.76056631716507,42.78346897060334,42.80635018562344,42.82920992917293,42.85204816816775,42.87486486949241]}]],[[{\"lng\":[-3.42700012550669,-3.283642397636824,-3.139395764791999,-2.994249024550121,-2.848190821300732,-2.701209643847605,-2.553293822978445,-2.404431529001628,-2.254610769249886,-2.10381938555088,-1.952045051664673,-1.799275270688087,-1.645497372425999,-1.490698510729658,-1.334865660802141,-1.177985616471106,-1.020044987429045,-0.8610301964412848,-0.7009274765220305,-0.5397228680788091,-0.3774022160257097,-0.2139511668658799,-0.04935516574382369,0.1164005465319346,0.2833309364951342,0.4514511810562822,0.6207766705645732,0.7913230118963009,0.9631060315687878,1.13614177887877,1.310446529064016,1.486036786486918,1.662929287838683,1.84114100536256,2.020689150094505,2.201591175119524,2.383864778841758,2.567527908266297,2.752598762290504,2.93909579500251,3.127037718984319,3.316443508616864,3.507332403384086,3.69972391117295,3.89363781156612,4.089094159123779,4.286113286650846,4.484715808445582,4.684922623525427,4.886754918825508,5.090234172365047,5.295382156376686,5.502220940393229,5.710772894286268,5.921060691250555,6.13310731072783,6.346936041263342,6.562570483287969,6.780034551818382,6.999352479067441,7.220548816956313,7.443648439519632,7.668676545194326,7.8956586589824,8.124620634477338,8.355588655743331,8.58858923903593,8.823649234352192,9.060795826797763,9.300056537757669,9.541459225857096,9.785032087697527,10.0308036583532,10.27880281161186,10.52905875994322,10.7816010541777,11.03645958287727,11.2936645713793,11.55324658049368,11.81523650483238,12.07966557074983,12.34656533387178,12.61596767618888,12.88790480269093,13.16240923751606,13.43951381958875,13.71925169771918,14.00165632513541,14.28676145341921,14.57460112581462,14.8652096698781,15.15862168943733,15.45487205582505,15.75399589835319,16.05602859399138,16.36100575621306,16.66896322297105,16.97993704376378,17.29396346575219,17.61107891888636],\"lat\":[40.69650043605989,40.90101463246772,41.1053502155897,41.30950477521576,41.51347586386898,41.71726099610083,41.92085764777201,42.12426325531854,42.32747521500294,42.53049088214997,42.73330757036675,42.93592255074689,43.13833305105841,43.3405362549148,43.54252930092932,43.74430928185179,43.9458732436879,44.1472181848002,44.3483410549909,44.54923875456582,44.74990813337917,44.95034598985883,45.15054907001166,45.35051406640865,45.55023761714908,45.74971630480394,45.94894665533759,46.14792513700761,46.34664815924226,46.54511207149532,46.74331316207765,46.94124765696524,47.13891171858325,47.33630144456555,47.53341286648948,47.73024194858529,47.9267845864198,48.12303660555398,48.31899376017383,48.51465173169436,48.71000612733594,48.90505247867289,49.09978624015377,49.29420278759268,49.48829741663172,49.6820653411736,49.87550169178442,50.06860151406593,50.26135976699709,50.4537713212444,50.64583095744069,50.83753336443204,51.02887313749232,51.21984477650528,51.41044268411365,51.60066116383508,51.79049441814455,51.97993654652312,52.16898154347263,52.3576232964964,52.54585558404542,52.73367207343022,52.92106631869817,53.10803175847605,53.29456171377814,53.48064938577954,53.66628785355505,53.85147007178364,54.03618886841856,54.22043694232359,54.40420686087553,54.58749105753338,54.77028182937462,54.95257133459928,55.13435159000199,55.31561446841337,55.49635169611086,55.67655485020035,55.85621535596944,56.03532448421351,56.21387334853571,56.39185290262243,56.56925393749561,56.74606707874355,56.92228278373209,57.09789133879808,57.27288285642721,57.44724727241866,57.62097434303885,57.79405364216721,57.96647455843666,58.13822629237209,58.30929785353012,58.47967805764363,58.6493555237751,58.81831867148266,58.98655571800339,59.1540546754584,59.3208033480847,59.48678932949912]}]],[[{\"lng\":[4.142338287586979,4.066007112226452,3.98965657434746,3.913286774622288,3.836897813965446,3.760489793532649,3.684062814719787,3.607616979161886,3.531152388732061,3.454669145540475,3.378167351933271,3.301647110491514,3.225108524030121,3.148551695596777,3.071976728470858,2.995383726162339,2.918772792410692,2.842144031183788,2.765497546676783,2.688833443311,2.61215182573281,2.535452798812499,2.458736467643129,2.382002937539399,2.305252314036495,2.228484702888933,2.151700210069396,2.074898941767567,1.998081004388954,1.921246504553707,1.844395549095432,1.76752824506,1.690644699704338,1.613745020495235,1.536829315108118,1.459897691425843,1.382950257537463,1.305987121737001,1.229008392522213,1.152014178593346,1.075004588851886,0.9979797323993038,0.9209397185357968,0.843884656759021,0.7668146567628178,0.6897298284359353,0.612630281860745,0.5355161273119518,0.4583874752552976,0.3812444363462578,0.3040871214287391,0.2269156415337607,0.14973010787814,0.07253063186316598,-0.004682674926729262,-0.0819097007253054,-0.1591503335858561,-0.2364044613825557,-0.3136719718118091,-0.3909527523936098,-0.4682466904729001,-0.5455536732209437,-0.6228735876366945,-0.7002063205481754,-0.7775517586138652,-0.8549097883240826,-0.9322802960023828,-1.009663167806956,-1.087058289732032,-1.164465547609286,-1.241884827109259,-1.319316013742769,-1.396758992862341,-1.474213649663632,-1.551679869186869,-1.629157536318281,-1.706646535791547,-1.784146752189242,-1.86165806994429,-1.939180373341423,-2.016713546518639,-2.094257473468669,-2.17181203804045,-2.249377123940604,-2.326952614734903,-2.404538393849772,-2.482134344573764,-2.559740350059057,-2.637356293322954,-2.714982057249377,-2.792617524590381,-2.870262577967657,-2.947917099874047,-3.025580972675061,-3.103254078610404,-3.180936299795495,-3.258627518222999,-3.336327615764358,-3.414036474171334,-3.491753975077541],\"lat\":[39.87137126459926,39.8800925091943,39.88876370558153,39.89738482570041,39.90595584163379,39.91447672560834,39.92294744999496,39.93136798730919,39.93973831021152,39.94805839150786,39.95632820414993,39.96454772123559,39.97271691600929,39.98083576186242,39.9889042323337,39.99692230110955,40.00488994202451,40.01280712906158,40.0206738363526,40.02849003817866,40.03625570897042,40.04397082330851,40.05163535592391,40.05924928169832,40.06681257566448,40.0743252130066,40.08178716906065,40.08919841931479,40.09655893940972,40.10386870513895,40.11112769244929,40.1183358774411,40.12549323636867,40.1325997456406,40.13965538182011,40.14666012162538,40.15361394192994,40.16051681976299,40.1673687323097,40.17416965691163,40.18091957106695,40.1876184524309,40.19426627881604,40.2008630281926,40.20740867868883,40.21390320859127,40.22034659634514,40.22673882055464,40.23307985998322,40.23936969355399,40.24560830034994,40.25179565961429,40.25793175075086,40.2640165533243,40.2700500470604,40.27603221184645,40.28196302773151,40.28784247492668,40.29367053380545,40.29944718490399,40.3051724089214,40.31084618672005,40.31646849932584,40.32203932792849,40.32755865388184,40.33302645870413,40.33844272407826,40.34380743185208,40.34912056403869,40.35438210281666,40.35959203053035,40.36475032969015,40.36985698297278,40.37491197322148,40.37991528344639,40.38486689682468,40.38976679670092,40.39461496658723,40.39941139016363,40.40415605127821,40.40884893394746,40.4134900223564,40.41807930085896,40.42261675397809,40.42710236640611,40.43153612300485,40.43591800880595,40.44024800901105,40.44452610899205,40.44875229429131,40.45292655062189,40.45704886386775,40.46111922008398,40.46513760549703,40.46910400650489,40.47301840967734,40.47688080175612,40.48069116965516,40.48444950046076,40.48815578143181]}]],[[{\"lng\":[-80.28245125556596,-80.27487373706349,-80.26731722742686,-80.25978151150308,-80.25226637602508,-80.24477160958541,-80.23729700261022,-80.2298423473337,-80.22240743777282,-80.21499206970246,-80.20759604063096,-80.2002191497759,-80.19286119804033,-80.18552198798923,-80.17820132382649,-80.17089901137187,-80.1636148580388,-80.1563486728119,-80.14910026622532,-80.14186945034101,-80.13465603872757,-80.12745984643915,-80.12028068999486,-80.11311838735821,-80.10597275791714,-80.098843622464,-80.09173080317601,-80.08463412359593,-80.07755340861294,-80.07048848444386,-80.06343917861449,-80.05640531994129,-80.04938673851336,-80.04238326567445,-80.03539473400541,-80.02842097730674,-80.02146183058144,-80.01451713001802,-80.0075867129737,-80.00067041795796,-79.99376808461616,-79.98687955371339,-79.98000466711859,-79.97314326778877,-79.96629519975349,-79.95946030809949,-79.95263843895559,-79.94582943947762,-79.93903315783368,-79.93224944318946,-79.92547814569386,-79.91871911646469,-79.91197220757448,-79.90523727203662,-79.89851416379155,-79.89180273769308,-79.88510284949503,-79.87841435583773,-79.87173711423506,-79.86507098306123,-79.85841582153807,-79.85177148972217,-79.84513784849234,-79.83851475953713,-79.83190208534256,-79.82529968917981,-79.8187074350933,-79.81212518788865,-79.80555281312091,-79.79899017708286,-79.79243714679347,-79.78589358998643,-79.77935937509882,-79.7728343712599,-79.76631844827997,-79.75981147663944,-79.75331332747787,-79.74682387258325,-79.74034298438129,-79.73387053592479,-79.72740640088332,-79.72095045353267,-79.71450256874462,-79.70806262197682,-79.70163048926261,-79.69520604720105,-79.68878917294701,-79.6823797442013,-79.67597763920097,-79.66958273670961,-79.66319491600784,-79.6568140568837,-79.65044003962333,-79.64407274500161,-79.63771205427277,-79.6313578491614,-79.62501001185319,-79.61866842498587,-79.61233297164031,-79.60600353533157],\"lat\":[25.62637250954878,25.45931462720844,25.29225635698753,25.12519770285924,24.95813866876192,24.79107925859955,24.62401947624225,24.45695932552671,24.28989881025671,24.1228379342035,23.95577670110636,23.78871511467295,23.62165317857981,23.45459089647275,23.28752827196733,23.12046530864923,22.9534020100747,22.78633837977096,22.6192744212366,22.45221013794197,22.2851455333296,22.11808061081458,21.95101537378491,21.78394982560193,21.61688396960064,21.44981780909012,21.28275134735383,21.11568458765004,20.94861753321212,20.78155018724893,20.61448255294512,20.44741463346153,20.28034643193547,20.11327795148106,19.94620919518959,19.7791401661298,19.61207086734823,19.44500130186952,19.27793147269669,19.1108613828115,18.94379103517473,18.77672043272646,18.60964957838637,18.44257847505408,18.27550712560934,18.10843553291242,17.94136369980432,17.77429162910705,17.60721932362394,17.44014678613991,17.27307401942167,17.10600102621807,16.93892780926031,16.77185437126222,16.60478071492048,16.43770684291492,16.27063275790876,16.10355846254878,15.93648395946569,15.76940925127429,15.6023343405737,15.43525922994765,15.26818392196466,15.1011084191783,14.93403272412742,14.76695683933635,14.59988076731513,14.43280451055978,14.26572807155244,14.09865145276162,13.93157465664243,13.76449768563679,13.59742054217361,13.43034322866901,13.26326574752654,13.09618810113737,12.92911029188051,12.76203232212296,12.59495419421996,12.42787591051518,12.26079747334087,12.0937188850181,11.92664014785692,11.75956126415658,11.59248223620567,11.42540306628234,11.25832375665448,11.0912443095799,10.92416472730649,10.75708501207242,10.59000516610632,10.42292519162744,10.25584509084582,10.08876486596249,9.921684519169611,9.754604052650674,9.587523468580635,9.420442769126112,9.253361956445534,9.08628103268931]}]],[[{\"lng\":[178.0718752631657,178.696852767035,179.3184311700645,180],\"lat\":[-17.23813909825134,-16.71894785574764,-16.19788858704894,-15.67503246613152]}],[{\"lng\":[-180,-178.8360517222303,-178.2268966288007,-177.62055750723,-177.0169197812597,-176.4158695483483,-175.8172935699458,-175.2210792592938,-174.627114666935,-174.0352884641021,-173.4454899241476,-172.8576089021682,-172.2715358129649,-171.687161607474,-171.1043777477975,-170.5230761809491,-169.9431493114309,-169.3644899727454,-168.7869913979435,-168.2105471893024,-167.6350512872235,-167.0603979384351,-166.4864816635805,-165.9131972242695,-165.340439589666,-164.7681039026837,-164.1960854458587,-163.6242796069647,-163.0525818444368,-162.4808876526675,-161.9090925272377,-161.3370919301458,-160.764781255097,-160.1920557929165,-159.6188106971496,-159.0449409499146,-158.4703413280741,-157.8949063697937,-157.3185303415595,-156.741107205727,-156.1625305886796,-155.5826937496757,-155.0014895504711,-154.4188104258045,-153.8345483548401,-153.2485948336684,-152.6608408489695,-152.0711768529507,-151.4794927396787,-150.8856778229313,-150.2896208157024,-149.6912098115049,-149.0903322676202,-148.4868749904572,-147.8807241231905,-147.2717651358599,-146.6598828181224,-146.0449612748617,-145.4268839248701,-144.8055335028316,-144.1807920648469,-143.552540997756,-142.9206610325252,-142.2850322619823,-141.6455341631969,-141.002045624816,-140.3544449796835,-139.702610043083,-139.046418156961,-138.385746240501,-137.7204708474344,-137.0504682304859,-136.3756144133675,-135.6957852707451,-135.0108566166146,-134.3207043015335,-133.6252043191642,-132.9242329225899,-132.2176667508695,-131.5053829663009,-130.787259402859,-130.0631747262711,-129.333008606186,-128.5966419008765,-127.8539568549023,-127.104837310134,-126.3491689305116,-125.5868394408754,-124.8177388801656,-124.0417598692352,-123.2587978934641,-122.4687516002929,-121.6715231117213,-120.8670183517247,-120.0551473884495,-119.235824790936],\"lat\":[-15.15044956607356,-14.62420889865747,-14.09637845385297,-13.56702523915056,-13.03621531871895,-12.50401385236461,-11.97048513427574,-11.43569263153615,-10.89969902239826,-10.36256623430755,-9.824355481673351,-9.285127303383932,-8.744941600065838,-8.203857671089978,-7.661934251328733,-7.119229547670463,-6.575801275299171,-6.031706693748839,-5.487002642743305,-4.941745577833603,-4.395991605846092,-3.849796520155452,-3.303215835797622,-2.756304824438583,-2.209118549215403,-1.661711899466703,-1.114139625370127,-0.5664563725048096,-0.01871671635709265,0.529024803211824,1.076713647517729,1.624295244605864,2.171714954785231,2.718918036126028,3.265849609901695,3.812454625957103,4.358677827985048,4.904463718693261,5.44975652484496,5.994500162156209,6.538638200034385,7.082113826142473,7.624869810775058,8.166848471032765,8.707991634782845,9.248240604395287,9.787536120244608,10.32581832396956,10.86302672148418,11.39910014573593,11.933976719208,12.46759381616612,12.99988802465113,13.53079510822292,14.06024996746255,14.58818660124376,15.11453806778744,15.63923644551723,16.1622127937372,16.68339711315813,17.20271830630221,17.72010413782184,18.23548119477313,18.74877484689027,19.2599092069134,19.76880709102874,20.27538997948708,20.77957797747375,21.2812897763116,21.78044261508642,22.2769522427935,22.7707328811134,23.26169718793473,23.74975622175261,24.23481940708218,24.71679450103836,25.19558756124486,25.67110291524824,26.14324313162601,26.61190899299076,27.07699947110689,27.5384117043505,27.99604097775751,28.44978070592015,28.89952241900692,29.34515575219586,29.78656843882644,30.22364630758945,30.65627328408936,31.0843313971267,31.50770079006188,31.92625973763307,32.3398846686127,32.74845019469578,33.15182914602151,33.54989261373506]}]],[[{\"lng\":[-73.16132070068478,-72.53999733483053,-71.91477973077706,-71.28568029355748,-70.65271407412261,-70.01589883679075,-69.37525512464428,-68.73080632258615,-68.08257871776169,-67.43060155704451,-66.77490710127938,-66.11553067597119,-65.45251071810611,-64.78588881878947,-64.11570976138562,-63.44202155484659,-62.76487546192102,-62.08432602193944,-61.40043106788146,-60.71325173743885,-60.02285247780173,-59.32930104390881,-58.63266848991948,-57.9330291536842,-57.23046063401058,-56.52504376054596,-55.81686255612252,-55.1060041914379,-54.39255893197424,-53.67662007708935,-52.95828389124595,-52.23764952738014,-51.51481894244471,-50.78989680519999,-50.0629903963621,-49.33420950125609,-48.60366629516012,-47.87147522156413,-47.13775286360478,-46.40261780897542,-45.66619050864589,-44.92859312976191,-44.18994940312716,-43.45038446570275,-42.71002469858777,-41.96899756097185,-41.22743142057466,-40.48545538110859,-39.74319910731906,-39.00079264817189,-38.25836625876818,-37.51605022157577,-36.77397466756958,-36.03226939787482,-35.2910637065029,-34.55048620476389,-33.8106646479286,-33.07172576469952,-32.333795090033,-31.59699680183434,-30.86145356202429,-30.12728636244931,-29.39461437607956,-28.66355481390716,-27.93422278792547,-27.20673118053446,-26.48119052068242,-25.75770886701713,-25.03639169828147,-24.31734181115153,-23.60065922567597,-22.88644109843844,-22.17478164352663,-21.4657720613552,-20.75950047535387,-20.05605187649733,-19.35550807562051,-18.65794766343106,-17.96344597810133,-17.27207508029359,-16.58390373544702,-15.8989974031307,-15.21741823324521,-14.53922506883611,-13.86447345526532,-13.1932156554712,-12.52550067103566,-11.86137426876573,-11.20087901248856,-10.54405429975261,-9.89093640312289,-9.241558515755854,-8.595950800938587,-7.954140445277718,-7.316151715226002,-6.682006016638223,-6.051721957053383,-5.425315410406255,-4.80279958387898,-4.184185086611652],\"lat\":[40.85031713215382,41.05749158263948,41.26130805833096,41.46172126761811,41.65868595154663,41.85215691614804,42.04208906594389,42.22843743860427,42.41115724073543,42.59020388476695,42.76553302690265,42.93710060609533,43.10486288399899,43.26877648584679,43.42879844219795,43.58488623148994,43.73699782332775,43.88509172243519,44.02912701318845,44.16906340464581,44.30486127598233,44.43648172223291,44.56388660024192,44.68703857471313,44.80590116424867,44.92043878726206,45.03061680764599,45.13640158007303,45.23776049480381,45.33466202187511,45.42707575453901,45.51497245182229,45.59832408007544,45.67710385338033,45.7512862726865,45.82084716354767,45.88576371233211,45.94601450078352,46.00157953881273,46.05244029540488,46.09857972753182,46.13998230696536,46.17663404489316,46.20852251424631,46.23563686965552,46.25796786496032,46.27550786820545,46.28825087406663,46.29619251365859,46.29933006168704,46.29766244091741,46.29119022394258,46.27991563224317,46.26384253254374,46.24297643047915,46.21732446159557,46.18689537972082,46.15169954274881,46.11174889589231,46.06705695246786,46.01763877228509,45.96351093772151,45.90469152757139,45.8412000887648,45.77305760605905,45.70028646981158,45.62291044194773,45.54095462024206,45.4544454010354,45.3634104405132,45.26787861467307,45.16787997811108,45.06344572175748,44.95460812969288,44.84140053517537,44.72385727600851,44.60201364937787,44.47590586628235,44.3455710056835,44.2110469684925,44.07237243151181,43.92958680144316,43.78273016907036,43.63184326371975,43.47696740809668,43.31814447359077,43.15541683613778,42.98882733271958,42.81841921857887,42.64423612521912,42.46632201925427,42.28472116216768,42.09947807103323,41.91063748024656,41.7182443043086,41.52234360169813,41.32298053986498,41.12020036137034,40.91404835119574,40.70456980523763]}]],[[{\"lng\":[-1.666052655930862,-1.685761064537867,-1.705455245125627,-1.725135216972017,-1.74480099932821,-1.764452611418713,-1.784090072441405,-1.803713401567566,-1.823322617941918,-1.842917740682659,-1.862498788881495,-1.88206578160368,-1.901618737888049,-1.921157676747052,-1.940682617166791,-1.960193578107055,-1.979690578501355,-1.999173637256959,-2.018642773254928,-2.038098005350152,-2.057539352371379,-2.076966833121261,-2.09638046637638,-2.115780270887285,-2.135166265378534,-2.154538468548717,-2.173896899070503,-2.193241575590667,-2.21257251673013,-2.231889741083991,-2.251193267221565,-2.270483113686413,-2.289759298996384,-2.309021841643645,-2.328270760094719,-2.347506072790516,-2.366727798146373,-2.385935954552084,-2.405130560371942,-2.424311633944766,-2.443479193583941,-2.46263325757745,-2.481773844187915,-2.500900971652623,-2.520014658183565,-2.539114921967476,-2.55820178116586,-2.577275253915034,-2.596335358326157,-2.615382112485266,-2.634415534453314,-2.653435642266201,-2.67244245393481,-2.691435987445042,-2.710416260757852,-2.729383291809279,-2.748337098510489,-2.767277698747803,-2.786205110382731,-2.805119351252014,-2.82402043916765,-2.842908391916934,-2.861783227262493,-2.880644962942315,-2.899493616669792,-2.918329206133745,-2.937151748998467,-2.955961262903755,-2.97475776546494,-2.993541274272927,-3.012311806894227,-3.031069380870994,-3.049814013721055,-3.068545722937947,-3.087264525990953,-3.105970440325132,-3.124663483361361,-3.143343672496357,-3.162011025102724,-3.18066555852898,-3.199307290099594,-3.217936237115019,-3.236552416851725,-3.255155846562239,-3.27374654347517,-3.292324524795253,-3.310889807703375,-3.329442409356612,-3.347982346888267,-3.366509637407897,-3.385024298001355,-3.403526345730813,-3.422015797634809,-3.440492670728273,-3.45895698200256,-3.47740874842549,-3.495847986941376,-3.514274714471061,-3.532688947911953,-3.551090704138055],\"lat\":[42.747644282548,42.72524518350816,42.70284270797185,42.68043686102173,42.65802764773188,42.63561507316773,42.61319914238615,42.59077986043541,42.56835723235522,42.54593126317678,42.5235019579227,42.50106932160715,42.47863335923576,42.4561940758057,42.43375147630568,42.41130556571596,42.38885634900838,42.36640383114637,42.34394801708496,42.32148891177083,42.29902652014226,42.27656084712921,42.2540918976533,42.23161967662787,42.20914418895793,42.18666543954023,42.16418343326324,42.14169817500722,42.11920966964416,42.09671792203788,42.07422293704396,42.0517247195098,42.02922327427471,42.00671860616975,41.98421072001791,41.96169962063405,41.93918531282493,41.9166678013892,41.89414709111749,41.87162318679234,41.84909609318829,41.82656581507179,41.80403235720136,41.78149572432751,41.75895592119273,41.73641295253162,41.71386682307079,41.69131753752897,41.66876510061692,41.64620951703754,41.62365079148585,41.60108892864901,41.57852393320631,41.55595580982923,41.53338456318141,41.5108101979187,41.48823271868918,41.46565213013311,41.44306843688306,41.42048164356379,41.3978917547924,41.37529877517822,41.35270270932292,41.33010356182049,41.30750133725724,41.28489604021185,41.26228767525532,41.23967624695109,41.21706175985494,41.19444421851513,41.17182362747226,41.14919999125944,41.12657331440219,41.10394360141852,41.08131085681894,41.05867508510642,41.03603629077644,41.01339447831709,40.9907496522089,40.96810181692504,40.9454509769312,40.92279713668567,40.90014030063936,40.87748047323579,40.85481765891107,40.83215186209404,40.80948308720613,40.78681133866145,40.76413662086684,40.7414589382218,40.71877829511859,40.69609469594215,40.6734081450702,40.65071864687323,40.6280262057145,40.60533082595003,40.58263251192865,40.55993126799204,40.53722709847469,40.51452000770394]}]],[[{\"lng\":[-79.03139392157992,-78.46158182640227,-77.89016554742271,-77.3170667120435,-76.74220673988368,-76.1655068417175,-75.58688801965818,-75.00627106866757,-74.42357657947493,-73.83872494299183,-73.25163635631353,-72.66223083040026,-72.07042819953604,-71.47614813266529,-70.87931014671233,-70.27983362199122,-69.67763781981778,-69.07264190243912,-68.46476495539909,-67.85392601246191,-67.24004408321927,-66.62303818350954,-66.0028273687802,-65.37933077052801,-64.75246763595284,-64.12215737096427,-63.48831958668057,-62.85087414956173,-62.20974123531845,-61.56484138673905,-60.91609557557577,-60.2634252686308,-59.60675249817955,-58.94599993686622,-58.28109097720243,-57.61194981579429,-56.93850154241687,-56.2606722340476,-55.57838905396061,-54.89158035597355,-54.20017579392591,-53.50410643645405,-52.80330488711193,-52.09770540986889,-51.38724405999572,-50.67185882032793,-49.95148974287147,-49.22607909568847,-48.49557151497226,-47.75991416218885,-47.01905688612852,-46.27295238967395,-45.52155640105304,-44.76482784930248,-44.00272904362461,-43.23522585627393,-42.46228790856112,-41.68388875951228,-40.90000609666948,-40.11062192846413,-39.31572277754151,-38.51529987435797,-37.70934935031748,-36.89787242965782,-36.080875619242,-35.25837089535647,-34.43037588656567,-33.5969140516229,-32.75801485139141,-31.91371391368712,-31.06405318991741,-30.20908110235811,-29.34885268088616,-28.48342968796708,-27.6128807306867,-26.7372813586161,-25.85671414630722,-24.97126875923638,-24.08104200204317,-23.18613784795445,-22.28666744833739,-21.38274912139204,-20.47450831907277,-19.56207757142046,-18.64559640759033,-17.72521125297735,-16.80107530196844,-15.87334836598936,-14.9421966966624,-14.00779278404813,-13.07031513010889,-12.12994799770212,-11.18688113558606,-10.24130948009733,-9.293432834337365,-8.343455525880341,-7.391586044187445,-6.438036659078417,-5.483023021769889,-4.52676375013809],\"lat\":[9.384494535605443,9.848879857374198,10.31230746941355,10.7747284513899,11.23609343801316,11.69635259852449,12.15545561619646,12.61335166785598,13.06998940344173,13.5253169256094,13.97928176939956,14.43183088198475,14.88291060251417,15.33246664207627,15.78044406380146,16.22678726312942,16.67143994826776,17.11434512087078,17.55544505697023,17.99468128819175,18.43199458329417,18.86732493007109,19.30061151765753,19.73179271928726,20.1608060755499,20.58758827819987,21.01207515457319,21.43420165267108,21.85390182697371,22.27110882505055,22.68575487503802,23.09777127405904,23.50708837766291,23.91363559036834,24.3173413573961,24.71813315768236,25.11593749826754,25.51067991015987,25.9022849457765,26.29067617806958,26.67577620144774,27.05750663460791,27.43578812539522,27.81054035781238,28.1816820613027,28.54913102243364,28.91280409910978,29.27261723744614,29.62848549143388,29.98032304553099,30.3280432403109,30.67155860130084,31.01078087114071,31.34562104519054,31.67598941071163,32.00179558974177,32.32294858578004,32.63935683438974,32.95092825782036,33.25757032374052,33.55919010816316,33.85569436263248,34.14698958572907,34.43298209893426,34.71357812687896,34.988683881984,35.25820565347988,35.52204990077229,35.78012335109819,36.03233310139265,36.27858672426176,36.51879237793055,36.75285892000699,36.980696024875,37.20221430449966,37.41732543239799,37.62594227049873,37.82797899858321,38.02335124597013,38.21197622507637,38.39377286645734,38.56866195490206,38.73656626613143,38.89741070362379,39.05112243506835,39.19763102792739,39.33686858357036,39.46876986942858,39.59327244860857,39.71031680639471,39.81984647306874,39.9218081424748,40.0161517857639,40.10283075976226,40.18180190942144,40.25302566382886,40.3164661252797,40.37209115094042,40.41987242666644,40.45978553257306]}]],[[{\"lng\":[2.479671632182083,2.409575644475912,2.339710715305063,2.270075531555732,2.200668788519678,2.131489189837453,2.062535447441914,1.993806281502021,1.925300420366933,1.857016600510385,1.788953566475365,1.721110070819079,1.65348487405821,1.58607674461448,1.518884458760497,1.45190680056591,1.385142561843854,1.318590542097698,1.252249548468092,1.18611839568031,1.120195905991899,1.054480909140626,0.9889722422927253,0.9236687499914459,0.8585692841059045,0.7936727037802369,0.7289778753830521,0.6644836724571861,0.6001889756697607,0.5360926727625414,0.472193658502596,0.4084908346332577,0.3449831098253825,0.2816693996289152,0.2185486264247506,0.1556197193768911,0.09288161438491298,0.03033325403672256,-0.03202641243838521,-0.0941984292163717,-0.1561838339248016,-0.2179836576888967,-0.2795989251772923,-0.3410306546474952,-0.4022798579910546,-0.4633475407784327,-0.5242347023035913,-0.5849423356282772,-0.6454714276260272,-0.7058229590258711,-0.7659979044557594,-0.8259972324856936,-0.8858219056705749,-0.9454728805927616,-1.00495110790435,-1.064257532369167,-1.123393092904474,-1.182358722622406,-1.241155348871114,-1.299783893275632,-1.358245271778481,-1.416540394679968,-1.474670166678241,-1.532635486909043,-1.590437248985212,-1.648076341035896,-1.705553645745508,-1.762870040392408,-1.820026396887307,-1.877023581811426,-1.933862456454368,-1.99054387685174,-2.047068693822507,-2.103437753006082,-2.159651894899166,-2.215711954892318,-2.271618763306273,-2.327373145428006,-2.382975921546541,-2.438427906988502,-2.493729912153416,-2.548882742548768,-2.603887198824807,-2.658744076809097,-2.713454167540831,-2.768018257304897,-2.822437127665698,-2.876711555500738,-2.930842313033959,-2.984830167868845,-3.038675883021285,-3.092380216952203,-3.145943923599951,-3.199367752412471,-3.252652448379223,-3.305798752062885,-3.358807399630823,-3.411679122886333,-3.464414649299659,-3.517014702038783],\"lat\":[48.93017644765816,48.84753027943987,48.76484175948362,48.68211114997232,48.59933871115015,48.51652470133935,48.43366937695691,48.35077299253089,48.26783580071687,48.18485805231405,48.10183999628123,48.01878187975272,47.93568394805406,47.85254644471751,47.76936961149762,47.68615368838633,47.60289891362829,47.51960552373576,47.43627375350348,47.35290383602344,47.26949600269941,47.18605048326147,47.10256750578024,47.01904729668118,46.9354900807585,46.85189608118926,46.76826551954701,46.6845986158156,46.60089558840261,46.51715665415283,46.43338202836153,46.34957192478768,46.26572655566694,46.18184613172463,46.0979308621885,46.0139809548015,45.92999661583428,45.84597805009766,45.76192546095502,45.67783905033448,45.59371901874106,45.50956556526865,45.42537888761193,45.34115918207815,45.25690664359879,45.17262146574116,45.08830384071985,45.00395395940805,44.91957201134889,44.83515818476654,44.75071266657718,44.66623564240012,44.58172729656849,44.49718781214007,44.41261737090789,44.32801615341081,44.24338433894397,44.15872210556914,44.07402963012499,43.98930708823722,43.90455465432871,43.81977250162943,43.73496080218638,43.65011972687337,43.5652494454007,43.4803501263249,43.3954219370581,43.31046504387758,43.22547961193519,43.14046580526646,43.05542378679992,42.97035371836619,42.88525576070697,42.80013007348401,42.714976815288,42.62979614364726,42.54458821503654,42.45935318488564,42.37409120758787,42.28880243650861,42.20348702399364,42.11814512137749,42.0327768789917,41.94738244617292,41.86196197127109,41.77651560165734,41.6910434837321,41.60554576293283,41.52002258374188,41.43447408969426,41.34890042338525,41.26330172647806,41.17767813971126,41.09202980290634,41.00635685497507,40.92065943392679,40.83493767687573,40.7491917200482,40.66342169878968,40.57762774757194]}]],[[{\"lng\":[14.05180229043072,13.84429827590392,13.63748685956573,13.43136690008859,13.22593721254676,13.02119656928586,12.81714370078596,12.61377729651827,12.41109600579504,12.20909843861277,12.00778316648824,11.8071487232875,11.60719360604746,11.40791627579014,11.2093151583292,11.01138864506892,10.8141350937953,10.61755282945919,10.42164014495155,10.2263953018704,10.03181653127981,9.837902034460418,9.644649983651696,9.45205852278581,9.260125768212975,9.068849809418307,8.878228709730115,8.68826050701955,8.498943214391621,8.310274820867551,8.122253292058392,7.934876570829929,7.748142577958858,7.562049212780181,7.376594353825872,7.191775859454753,7.007591568473646,6.824039300749729,6.641116857814207,6.458822023457195,6.277152564313946,6.096106230442351,5.915680755891818,5.73587385926347,5.556683244261801,5.378106600237711,5.200141602723045,5.022785913956647,4.846037183401943,4.669893048256162,4.494351133951175,4.31940905464607,4.145064413711443,3.971314804205531,3.798157809342198,3.625591002950846,3.453611949928325,3.282218206682868,3.11140732157018,2.941176835321665,2.771524281464929,2.602447186736589,2.433943071487461,2.266009450080223,2.098643831279593,1.931843718635109,1.765606610856596,1.599930002182377,1.434811382740306,1.270248238901731,1.106238053628391,0.9427783068124314,0.7798664756095005,0.6175000347651077,0.4556764569342419,0.2943932129943889,0.1336477723519959,-0.02656239675753609,-0.1862398269762285,-0.3453870515362248,-0.5040066039786928,-0.662101017878893,-0.8196728265772868,-0.9767245629166423,-1.133258758985037,-1.289277945864673,-1.444784653386449,-1.599781409890182,-1.75427074199041,-1.908255174347702,-2.061737229445384,-2.214719427371614,-2.367204285606717,-2.519194318815713,-2.67069203864594,-2.821699953529733,-2.972220568492028,-3.122256384962871,-3.271809900594709,-3.420883609084421],\"lat\":[50.02084731900055,49.94049340494689,49.85977054801426,49.77868103064799,49.69722712743393,49.61541110497253,49.53323522175708,49.45070172805566,49.36781286579676,49.28457086845886,49.20097796096351,49.11703635957213,49.03274827178644,48.94811589625228,48.86314142266711,48.77782703169074,48.69217489485965,48.60618717450451,48.51986602367102,48.433213586044,48.34623199587471,48.25892337791113,48.17128984733158,48.08333350968115,47.99505646081124,47.90646078682196,47.81754856400745,47.72832185880404,47.63878272774117,47.548933217395,47.45877536434479,47.36831119513183,47.27754272622104,47.18647196396494,47.09510090457038,47.00343153406736,46.91146582828056,46.819205752803,46.72665326297207,46.63381030384784,46.54067881019347,46.4472607064579,46.35355790676056,46.25957231487815,46.16530582423346,46.07076031788623,45.97593766852575,45.88083973846565,45.78546837964016,45.68982543360254,45.59391273152492,45.49773209420025,45.40128533204556,45.30457424510708,45.20760062306688,45.11036624525109,45.01287288063961,44.91512228787737,44.81711621528692,44.71885640088257,44.62034457238578,44.52158244724192,44.42257173263839,44.32331412552386,44.22381131262894,44.12406497048782,44.02407676546127,43.92384835376061,43.82338138147291,43.72267748458714,43.62173828902141,43.52056541065125,43.41916045533873,43.31752501896265,43.21566068744961,43.11356903680588,43.01125163315029,42.90871003274776,42.80594578204376,42.70296041769946,42.59975546662774,42.49633244602975,42.39269286343237,42.28883821672611,42.18476999420388,42.08048967460017,41.97599872713108,41.87129861153466,41.76639077811196,41.6612766677686,41.55595771205682,41.450435333218,41.34471094422565,41.23878594882898,41.13266174159664,41.02633970796114,40.91982122426343,40.81310765779805,40.70620036685845,40.59910070078279]}]],[[{\"lng\":[-67.86746305074129,-67.36942665288656,-66.86927907366777,-66.36697862876436,-65.86248369645661,-65.35575273270072,-64.84674428715572,-64.33541702019245,-63.82172972091497,-63.30564132622458,-62.78711094095677,-62.26609785912102,-61.74256158627313,-61.21646186304936,-60.68775868989089,-60.15641235298681,-59.62238345146259,-59.08563292584003,-58.5461220877938,-58.00381265122792,-57.45866676469414,-56.9106470451724,-56.35971661323153,-55.80583912958608,-55.24897883306268,-54.68910057998664,-54.12616988499659,-53.56015296329124,-52.99101677430954,-52.41872906684064,-51.84325842555695,-51.26457431895805,-50.68264714870918,-50.09744830035233,-49.50895019536287,-48.9171263445183,-48.32195140254013,-47.72340122396275,-47.12145292017665,-46.5160849175862,-45.90727701681427,-45.29501045287854,-44.67926795625587,-44.06003381474312,-43.43729393601343,-42.81103591075882,-42.18124907630015,-41.54792458053684,-40.91105544609853,-40.27063663455235,-39.62666511050882,-38.97913990546078,-38.32806218117963,-37.67343529248434,-37.01526484918892,-36.35355877702598,-35.68832737733462,-35.0195833852935,-34.347342026472,-33.67162107146537,-32.99244088837369,-32.30982449287872,-31.62379759566814,-30.93438864695305,-30.24162887782185,-29.54555233817212,-28.84619593096206,-28.1435994425238,-27.43780556868347,-26.72885993643714,-26.01681112093651,-25.30171065754618,-24.5836130487423,-23.8625757656332,-23.1386592438946,-22.41192687392594,-21.6824449850498,-20.95028282359376,-20.21551252471297,-19.47820907783233,-18.73845028560929,-17.99631671634188,-17.25189164977168,-16.50526101625745,-15.75651332932304,-15.00573961161067,-14.25303331430081,-13.4984902300888,-12.74220839983895,-11.98428801306715,-11.2248313024332,-10.46394243245448,-9.701727382681883,-8.938293825608104,-8.173750999606307,-7.408209577223983,-6.641781529182281,-5.874579984454851,-5.106719086822265,-4.338313848318041],\"lat\":[18.91611744929407,19.26354278241214,19.60961413250602,19.95429928843938,20.29756568939188,20.63938041962212,20.97971020340201,21.31852140013556,21.65577999967572,21.99145161785369,22.32550149223565,22.65789447812253,22.9885950448094,23.31756727212111,23.64477484724239,23.97018106186045,24.29374880963959,24.61544058404726,24.93521847655261,25.25304417521835,25.5688789637081,25.88268372073191,26.19441891995294,26.50404463037967,26.81152051726776,27.11680584355699,27.41985947186897,27.72063986709174,28.01910509957799,28.31521284898423,28.60892040877816,28.90018469144227,29.18896223440175,29.47520920670484,29.75888141648403,30.03993431922649,30.31832302688195,30.59400231783603,30.86692664777658,31.13705016148079,31.40432670554913,31.66870984211253,31.93015286353778,32.18860880815528,32.44403047703202,32.69637045181142,32.94558111364,33.19161466319942,33.43442314185995,33.67395845397015,33.91017239029433,34.14301665260771,34.37244287945579,34.59840267308191,34.8208476275237,35.03972935787585,35.25499953071287,35.46660989566204,35.67451231811246,35.87865881304241,36.07900157994207,36.27549303880539,36.46808586715877,36.65673303809068,36.84138785924066,37.02200401270125,37.19853559578138,37.37093716257479,37.539163766271,37.70317100214234,37.86291505113432,38.01835272398209,38.16944150577049,38.31613960085028,38.45840597801867,38.59620041586729,38.7294835481968,38.85821690939336,38.98236297965824,39.10188522997878,39.21674816672586,39.32691737576059,39.43235956593092,39.53304261183735,39.62893559574588,39.72000884852607,39.80623398949196,39.88758396502458,39.96403308585619,40.03555706289804,40.10213304149652,40.16373963400557,40.22035695056705,40.27196662799567,40.31855185666971,40.36009740533489,40.39658964373494,40.42801656298893,40.45436779364324,40.4756346213335]}]],[[{\"lng\":[12.09367012997411,11.93476130432367,11.77586460693686,11.61698112099771,11.45811192892342,11.29925811230186,11.14042075182913,10.98160092724723,10.82279971728187,10.66401819958049,10.50525745065033,10.34651854579667,10.18780255906132,10.02911056316116,9.870443629426978,9.711802827742403,9.553189226483095,9.394603892456109,9.236047890839496,9.077522285122097,8.919028137043595,8.760566506534792,8.602138451658115,8.443745028548415,8.285387291353979,8.127066292177846,7.968783081019386,7.810538705716154,7.652334211886054,7.494170642869777,7.33604903967357,7.177970440912291,7.01993588275281,6.86194639885771,6.704003020329353,6.546106775654246,6.388258690647795,6.230459788399388,6.072711089217838,5.915013610577215,5.757368367063023,5.599776370318777,5.442238628992955,5.284756148686356,5.127329931899836,4.969960977982463,4.812650283080085,4.655398840084297,4.498207638581848,4.34107766480446,4.184009901579095,4.027005328278648,3.870064920773084,3.713189651381033,3.556380488821829,3.39963839816801,3.242964340798286,3.086359274350962,2.929824152677856,2.773359925798673,2.616967539855865,2.460647937069993,2.304402055695554,2.148230829977327,1.992135190107192,1.836116062181479,1.680174368158792,1.524311025818374,1.36852694871896,1.212823046158162,1.057200223132355,0.901659380297115,0.7462014139281584,0.5908272158828147,0.4355376735620399,0.280333669872956,0.1252160831919307,-0.02981421267180421,-0.1847563485119915,-0.3396094597606461,-0.4943726865228004,-0.6490451736107081,-0.8036260705774936,-0.9581145317502515,-1.112509716262589,-1.266810788086615,-1.421016916064373,-1.575127273938721,-1.729141040383636,-1.883057399033975,-2.036875538514669,-2.190594652469346,-2.344213939588405,-2.497732603636515,-2.65114985347955,-2.804464903110977,-2.95767697167764,-3.110785283505023,-3.263789068121913,-3.416687560284516],\"lat\":[41.79140201519488,41.78906503025232,41.78650907911534,41.78373419889984,41.78074042989233,41.777527815547,41.77409640248288,41.77044624048072,41.76657738247959,41.76248988457328,41.75818380600667,41.75365920917153,41.74891615960253,41.74395472597268,41.73877498008881,41.7333769968867,41.72776085442613,41.72192663388552,41.71587441955662,41.70960429883878,41.70311636223319,41.69641070333674,41.68948741883587,41.68234660850006,41.67498837517518,41.66741282477671,41.65962006628263,41.65161021172625,41.64338337618869,41.63493967779135,41.62627923768805,41.61740218005701,41.60830863209269,41.59899872399735,41.58947258897255,41.57973036321032,41.56977218588426,41.55959819914043,41.54920854808793,41.5386033807896,41.52778284825216,41.51674710441649,41.50549630614759,41.49403061322432,41.4823501883291,41.47045519703737,41.45834580780681,41.44602219196656,41.43348452370613,41.42073298006417,41.40776774091713,41.39458898896772,41.38119690973323,41.36759169153369,41.35377352547981,41.33974260546087,41.32549912813241,41.31104329290376,41.2963753019254,41.28149536007624,41.26640367495072,41.25110045684572,41.23558591874743,41.21986027631798,41.20392374788199,41.18777655441297,41.17141891951962,41.1548510694319,41.1380732329871,41.12108564161569,41.10388852932706,41.08648213269517,41.06886669084407,41.05104244543325,41.03300964064297,41.01476852315933,40.99631934215943,40.97766234929616,40.95879779868317,40.93972594687947,40.9204470528741,40.90096137807063,40.88126918627152,40.86137074366253,40.84126631879681,40.82095618257914,40.80044060824982,40.77971987136873,40.75879424979911,40.7376640236913,40.71632947546652,40.69479088980034,40.67304855360628,40.65110275601917,40.62895378837865,40.6066019442123,40.58404751921896,40.56129081125183,40.53833212030163,40.51517174847947]}]],[[{\"lng\":[176.2496802943186,176.1820094835874,176.1142070518805,176.0462724814816,175.97820525288,175.9100048447658,175.8416707340264,175.7732023957413,175.704599303179,175.6358609277918,175.5669867392128,175.4979762052509,175.4288287918874,175.359543963272,175.2901211817186,175.2205599077019,175.1508595998533,175.0810197149574,175.0110397079479,174.9409190319048,174.8706571380501,174.8002534757445,174.7297074924842,174.6590186338973,174.5881863437406,174.5172100638962,174.4460892343687,174.3748232932817,174.3034116768747,174.2318538195008,174.160149153623,174.0882971098117,174.0162971167423,173.9441486011918,173.8718509880368,173.7994037002509,173.726806158902,173.65405778315,173.5811579902449,173.5081061955241,173.4349018124109,173.3615442524116,173.2880329251147,173.2143672381883,173.1405465973783,173.0665704065074,172.9924380674731,172.9181489802464,172.8437025428703,172.7690981514587,172.6943352001955,172.619413081333,172.5443311851917,172.4690889001587,172.3936856126878,172.3181207072984,172.2423935665751,172.1665035711676,172.0904500997902,172.014232529222,171.9378502343065,171.8613025879521,171.7845889611325,171.7077087228867,171.6306612403195,171.5534458786029,171.4760620009761,171.398508968747,171.3207861412929,171.242892876062,171.1648285285748,171.0865924524257,171.0081839992843,170.9296025188976,170.8508473590921,170.7719178657756,170.6928133829399,170.613533252663,170.5340768151118,170.4544434085452,170.3746323693167,170.2946430318782,170.2144747287824,170.1341267906874,170.0535985463594,169.9728893226775,169.8919984446374,169.8109252353554,169.7296690160735,169.6482291061636,169.5666048231327,169.4847954826277,169.4028003984409,169.3206188825154,169.238250244951,169.1556937940098,169.0729488361228,168.9900146758958,168.9068906161164,168.8235759577606],\"lat\":[-38.17983968150136,-38.25047060309203,-38.32106259083591,-38.39161546997889,-38.46212906494458,-38.53260319932973,-38.60303769589998,-38.67343237658525,-38.74378706247535,-38.81410157381541,-38.88437573000146,-38.9546093495758,-39.02480225022246,-39.09495424876264,-39.16506516115012,-39.23513480246661,-39.30516298691708,-39.37514952782518,-39.44509423762845,-39.51499692787373,-39.58485740921237,-39.65467549139544,-39.72445098326906,-39.79418369276956,-39.86387342691868,-39.93351999181874,-40.00312319264778,-40.07268283365475,-40.1421987181545,-40.211670648523,-40.28109842619232,-40.35048185164574,-40.41982072441271,-40.48911484306393,-40.55836400520628,-40.62756800747781,-40.69672664554268,-40.7658397140861,-40.8349070068092,-40.90392831642399,-40.97290343464811,-41.04183215219977,-41.11071425879255,-41.17954954313016,-41.24833779290132,-41.31707879477439,-41.38577233439225,-41.45441819636692,-41.52301616427435,-41.59156602064903,-41.6600675469787,-41.72852052369897,-41.79692473018797,-41.86527994476094,-41.93358594466484,-42.00184250607289,-42.07004940407911,-42.13820641269292,-42.20631330483355,-42.27436985232462,-42.34237582588857,-42.41033099514109,-42.47823512858565,-42.54608799360783,-42.61388935646973,-42.68163898230439,-42.74933663511017,-42.81698207774497,-42.88457507192074,-42.95211537819766,-43.0196027559785,-43.08703696350285,-43.15441775784139,-43.22174489489021,-43.28901812936493,-43.35623721479494,-43.42340190351763,-43.49051194667254,-43.55756709419553,-43.62456709481294,-43.69151169603568,-43.75840064415338,-43.8252336842285,-43.89201056009038,-43.95873101432932,-44.02539478829067,-44.09200162206886,-44.15855125450139,-44.22504342316292,-44.29147786435917,-44.35785431312104,-44.42417250319847,-44.49043216705447,-44.55663303585905,-44.6227748394832,-44.68885730649271,-44.75488016414228,-44.82084313836921,-44.88674595378745,-44.95258833368145]}]],[[{\"lng\":[-1.809029488144188,-1.827431865204177,-1.845817162148867,-1.864185409883473,-1.882536639249678,-1.900870881025785,-1.919188165926874,-1.93748852460495,-1.955771987649097,-1.974038585585633,-1.992288348878258,-2.010521307928209,-2.028737493074408,-2.046936934593609,-2.065119662700559,-2.083285707548139,-2.101435099227514,-2.119567867768288,-2.137684043138644,-2.155783655245502,-2.173866733934659,-2.191933308990942,-2.209983410138351,-2.228017067040211,-2.246034309299314,-2.264035166458067,-2.282019667998638,-2.299987843343103,-2.317939721853587,-2.335875332832413,-2.353794705522245,-2.371697869106231,-2.389584852708147,-2.407455685392543,-2.425310396164883,-2.443149013971689,-2.46097156770068,-2.478778086180923,-2.496568598182964,-2.514343132418975,-2.532101717542893,-2.549844382150564,-2.567571154779878,-2.585282063910913,-2.602977137966073,-2.620656405310224,-2.638319894250842,-2.655967633038142,-2.673599649865218,-2.691215972868186,-2.708816630126318,-2.726401649662175,-2.743971059441754,-2.761524887374614,-2.779063161314018,-2.796585909057067,-2.814093158344838,-2.831584936862513,-2.849061272239522,-2.866522192049669,-2.883967723811275,-2.901397894987302,-2.918812732985494,-2.936212265158509,-2.953596518804048,-2.970965521164993,-2.988319299429532,-3.005657880731296,-3.022981292149491,-3.040289560709029,-3.05758271338065,-3.074860777081068,-3.092123778673088,-3.109371744965743,-3.126604702714419,-3.14382267862099,-3.161025699333939,-3.178213791448495,-3.195386981506755,-3.212545295997814,-3.229688761357894,-3.246817403970469,-3.263931250166391,-3.281030326224025,-3.298114658369361,-3.315184272776153,-3.332239195566038,-3.349279452808663,-3.36630507052181,-3.383316074671522,-3.400312491172225,-3.417294345886853,-3.434261664626976,-3.451214473152915,-3.468152797173873,-3.485076662348054,-3.501986094282786,-3.518881118534645,-3.535761760609574,-3.552628045963011],\"lat\":[43.32829534583816,43.30006773870638,43.2718371842572,43.24360368813043,43.21536725595313,43.18712789333968,43.1588856058918,43.13064039919863,43.1023922788367,43.07414125036994,43.04588731934987,43.01763049131546,42.98937077179325,42.96110816629739,42.93284268032961,42.90457431937934,42.87630308892369,42.84802899442751,42.81975204134334,42.79147223511162,42.76318958116052,42.73490408490613,42.70661575175244,42.67832458709132,42.65003059630261,42.62173378475417,42.59343415780187,42.56513172078965,42.53682647904952,42.50851843790163,42.4802076026543,42.451893978604,42.42357757103545,42.39525838522163,42.36693642642378,42.33861169989149,42.31028421086266,42.28195396456361,42.25362096620906,42.22528522100217,42.19694673413458,42.16860551078645,42.14026155612645,42.11191487531185,42.08356547348852,42.05521335579093,42.02685852734228,41.99850099325439,41.97014075862786,41.94177782855203,41.91341220810502,41.88504390235378,41.85667291635409,41.82829925515063,41.79992292377698,41.77154392725566,41.74316227059816,41.71477795880496,41.6863909968656,41.65800138975862,41.62960914245173,41.60121425990167,41.57281674705438,41.54441660884499,41.51601385019782,41.48760847602637,41.45920049123352,41.43078990071133,41.40237670934126,41.37396092199409,41.34554254352998,41.31712157879851,41.28869803263869,41.260271909879,41.23184321533743,41.20341195382147,41.17497813012816,41.14654174904415,41.11810281534568,41.0896613337986,41.06121730915849,41.03277074617056,41.00432164956975,40.97587002408078,40.94741587441814,40.91895920528608,40.89050002137872,40.86203832738003,40.83357412796387,40.80510742779398,40.7766382315241,40.74816654379786,40.71969236924895,40.69121571250104,40.66273657816787,40.63425497085326,40.60577089515109,40.5772843556454,40.54879535691038,40.52030390351038]}]],[[{\"lng\":[-8.368125555957388,-8.31835790925285,-8.268627038065912,-8.218932920469586,-8.169275534430943,-8.119654857811687,-8.070070868368717,-8.020523543754702,-7.971012861518642,-7.921538799106441,-7.872101333861454,-7.822700443025076,-7.773336103737276,-7.724008293037183,-7.674716987863616,-7.625462165055665,-7.576243801353236,-7.527061873397608,-7.477916357731986,-7.428807230802046,-7.379734468956499,-7.330698048447624,-7.281697945431826,-7.232734135970188,-7.183806596028989,-7.134915301480278,-7.086060228102401,-7.037241351580543,-6.988458647507263,-6.939712091383039,-6.891001658616802,-6.842327324526466,-6.793689064339467,-6.745086853193293,-6.696520666136016,-6.647990478126813,-6.599496264036503,-6.551037998648073,-6.502615656657196,-6.454229212672757,-6.405878641217377,-6.357563916727936,-6.309285013556076,-6.261041905968742,-6.212834568148683,-6.164662974194965,-6.116527098123495,-6.068426913867523,-6.020362395278154,-5.972333516124865,-5.924340250095999,-5.876382570799279,-5.828460451762311,-5.780573866433089,-5.73272278818049,-5.684907190294779,-5.637127045988105,-5.589382328395004,-5.541673010572882,-5.493999065502524,-5.446360466088575,-5.398757185160034,-5.351189195470748,-5.303656469699896,-5.256158980452476,-5.208696700259789,-5.161269601579926,-5.113877656798251,-5.066520838227872,-5.019199118110135,-4.971912468615087,-4.924660861841962,-4.877444269819656,-4.830262664507193,-4.7831160177942,-4.736004301501386,-4.688927487380992,-4.641885547117276,-4.594878452326972,-4.54790617455975,-4.500968685298687,-4.454065955960724,-4.407197957897124,-4.360364662393937,-4.313566040672446,-4.266802063889634,-4.220072703138634,-4.173377929449172,-4.126717713788037,-4.080092027059511,-4.033500840105828,-3.986944123707619,-3.940421848584353,-3.893933985394789,-3.847480504737404,-3.801061377150847,-3.754676573114372,-3.708326063048274,-3.662009817314329,-3.615727806216225],\"lat\":[42.87486486949241,42.85204816816775,42.82920992917293,42.80635018562344,42.78346897060334,42.76056631716507,42.73764225832955,42.71469682708595,42.69173005639171,42.66874197917247,42.64573262832193,42.62270203670187,42.59965023714203,42.57657726244007,42.55348314536149,42.53036791863955,42.50723161497524,42.4840742670372,42.46089590746165,42.43769656885233,42.41447628378046,42.39123508478463,42.36797300437077,42.34469007501216,42.32138632914918,42.29806179918948,42.27471651750775,42.25135051644575,42.2279638283122,42.20455648538279,42.18112851990007,42.1576799640734,42.13421085007891,42.11072121005945,42.08721107612452,42.06368048035024,42.04012945477925,42.01655803142073,41.99296624225028,41.96935411920992,41.94572169420803,41.92206899911924,41.89839606578449,41.87470292601088,41.85098961157169,41.82725615420632,41.8035025856202,41.7797289374848,41.75593524143753,41.73212152908178,41.70828783198679,41.68443418168761,41.66056060968513,41.636667147446,41.61275382640252,41.58882067795273,41.56486773346024,41.54089502425429,41.51690258162963,41.49289043684657,41.46885862113083,41.4448071656736,41.42073610163146,41.39664546012634,41.37253527224546,41.3484055690414,41.3242563815319,41.30008774069999,41.27589967749381,41.25169222282669,41.22746540757706,41.20321926258841,41.17895381866931,41.1546691065933,41.13036515709894,41.10604200088971,41.08169966863403,41.05733819096519,41.03295759848137,41.00855792174555,40.98413919128552,40.95970143759386,40.93524469112789,40.91076898230963,40.88627434152582,40.86176079912784,40.83722838543174,40.81267713071816,40.78810706523235,40.7635182191841,40.73891062274777,40.71428430606225,40.68963929923087,40.6649756323215,40.64029333536642,40.61559243836234,40.59087297127042,40.56613496401616,40.54137844648945,40.51660344854454]}]],[[{\"lng\":[17.61107891888636,17.29396346575219,16.97993704376378,16.66896322297105,16.36100575621306,16.05602859399139,15.75399589835319,15.45487205582505,15.15862168943733,14.8652096698781,14.57460112581462,14.28676145341921,14.00165632513541,13.71925169771918,13.43951381958876,13.16240923751606,12.88790480269093,12.61596767618888,12.34656533387178,12.07966557074983,11.81523650483238,11.55324658049368,11.2936645713793,11.03645958287727,10.7816010541777,10.52905875994322,10.27880281161186,10.0308036583532,9.785032087697527,9.541459225857098,9.300056537757669,9.060795826797763,8.823649234352192,8.588589239035928,8.355588655743331,8.124620634477338,7.8956586589824,7.668676545194326,7.443648439519632,7.220548816956313,6.999352479067441,6.780034551818384,6.56257048328797,6.346936041263344,6.13310731072783,5.921060691250553,5.710772894286267,5.502220940393229,5.295382156376686,5.090234172365047,4.886754918825508,4.684922623525427,4.484715808445582,4.286113286650846,4.089094159123779,3.893637811566118,3.699723911172951,3.507332403384086,3.316443508616865,3.127037718984319,2.93909579500251,2.752598762290504,2.567527908266297,2.383864778841758,2.201591175119524,2.020689150094505,1.841141005362558,1.662929287838683,1.486036786486917,1.310446529064016,1.13614177887877,0.9631060315687888,0.7913230118963009,0.6207766705645732,0.4514511810562822,0.2833309364951342,0.1164005465319346,-0.04935516574382427,-0.2139511668658799,-0.3774022160257097,-0.5397228680788098,-0.7009274765220308,-0.8610301964412835,-1.020044987429044,-1.177985616471106,-1.33486566080214,-1.490698510729658,-1.645497372425999,-1.799275270688087,-1.952045051664673,-2.10381938555088,-2.254610769249886,-2.404431529001629,-2.553293822978446,-2.701209643847603,-2.848190821300732,-2.99424902455012,-3.139395764791999,-3.283642397636823,-3.42700012550669],\"lat\":[59.48678932949912,59.3208033480847,59.1540546754584,58.98655571800339,58.81831867148266,58.6493555237751,58.47967805764363,58.30929785353012,58.13822629237209,57.96647455843666,57.79405364216721,57.62097434303885,57.44724727241866,57.27288285642721,57.09789133879809,56.9222827837321,56.74606707874355,56.56925393749562,56.39185290262243,56.2138733485357,56.03532448421351,55.85621535596944,55.67655485020035,55.49635169611086,55.31561446841337,55.13435159000199,54.95257133459928,54.77028182937462,54.58749105753338,54.40420686087554,54.22043694232359,54.03618886841856,53.85147007178364,53.66628785355505,53.48064938577954,53.29456171377814,53.10803175847605,52.92106631869817,52.73367207343022,52.54585558404542,52.3576232964964,52.16898154347263,51.97993654652312,51.79049441814455,51.60066116383508,51.41044268411365,51.21984477650528,51.02887313749232,50.83753336443204,50.64583095744069,50.4537713212444,50.26135976699709,50.06860151406593,49.87550169178442,49.6820653411736,49.48829741663172,49.29420278759268,49.09978624015377,48.90505247867289,48.71000612733594,48.51465173169436,48.31899376017383,48.12303660555398,47.9267845864198,47.73024194858529,47.53341286648948,47.33630144456554,47.13891171858324,46.94124765696524,46.74331316207765,46.54511207149532,46.34664815924226,46.14792513700761,45.94894665533759,45.74971630480394,45.55023761714908,45.35051406640865,45.15054907001167,44.95034598985883,44.74990813337917,44.54923875456582,44.3483410549909,44.1472181848002,43.9458732436879,43.74430928185179,43.54252930092932,43.3405362549148,43.13833305105841,42.93592255074689,42.73330757036675,42.53049088214997,42.32747521500293,42.12426325531854,41.92085764777201,41.71726099610084,41.51347586386899,41.30950477521576,41.1053502155897,40.90101463246773,40.69650043605989]}]]],null,\"Flights\",{\"interactive\":true,\"className\":\"\",\"stroke\":true,\"color\":\"green\",\"weight\":[23.97904536879888,23.97904536879888,17.38737163679022,17.38737163679022,16.81551055796427,16.81551055796427,15.47664925007901,15.47664925007901,11.31776616671934,9.591673732008658,9.591673732008658,9.591673732008658,9.591673732008658,9.591673732008658,7.158883083359671,7.158883083359671,7.158883083359671,7.158883083359671,7.158883083359671,7.158883083359671,7.158883083359671,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3],\"opacity\":0.3,\"fill\":false,\"fillColor\":\"green\",\"fillOpacity\":0.2,\"smoothFactor\":1,\"noClip\":false},null,null,null,{\"interactive\":false,\"permanent\":false,\"direction\":\"auto\",\"opacity\":1,\"offset\":[0,0],\"textsize\":\"10px\",\"textOnly\":false,\"className\":\"\",\"sticky\":true},null]},{\"method\":\"addEasyButton\",\"args\":[{\"icon\":\"fa-globe\",\"title\":\"Zoom to Level 1\",\"onClick\":\"function(btn, map){ map.setView([ 40.49181,-3.56948],1.25); }\",\"position\":\"topleft\"}]},{\"method\":\"addHeatmap\",\"args\":[[[40.49181,-3.56948,2.870826340109791],[43.3011,-2.91061,2.311579248730029],[51.50528,0.05528,1.872171230554857],[55.95,-3.3725,1.838416287252544],[41.29708,2.07846,1.741101126592248],[50.90139,4.48444,1.515716566510398],[52.36213,13.50168,1.430969081105256],[48.35378,11.78609,1.430969081105256],[39.55,2.73333,1.430969081105256],[52.3103,4.76028,1.319507910772894],[50.0406,8.55603,1.319507910772894],[41.2629,28.74242,1.319507910772894],[-36.832,175.679,1.245730939615517],[43.35652,-1.79061,1.245730939615517],[47.58958,7.52991,1.148698354997035],[51.38267,-2.71909,1.148698354997035],[55.61792,12.65597,1.148698354997035],[53.42133,-6.27008,1.148698354997035],[51.28066,6.76715,1.148698354997035],[28.45272,-13.86376,1.148698354997035],[22.31546,113.93372,1.148698354997035],[28.95027,-13.60556,1.148698354997035],[38.78131,-9.13592,1.148698354997035],[33.94251,-118.40897,1.148698354997035],[45.72717,4.94428,1.148698354997035],[50.91166,5.77014,1.148698354997035],[39.8626,4.21865,1.148698354997035],[25.79343,-80.29004999999999,1.148698354997035],[-17.75539,177.44338,1.148698354997035],[40.63983,-73.77874,1.148698354997035],[42.77004,-1.64633,1.148698354997035],[8.9192,-79.59968000000001,1.148698354997035],[49.01278,2.55,1.148698354997035],[50.10083,14.26,1.148698354997035],[18.56737,-68.36342999999999,1.148698354997035],[42.89766,-8.41793,1.148698354997035],[59.652,17.93132,1.148698354997035],[-43.48936,172.53223,1],[38.29239,27.15695,1],[38.77039,35.49543,1],[45.62754,8.71508,1],[-45.01837,168.74007,1],[41.79352,12.25259,1],[-38.10917,176.31722,1]],null,\"Heatmap\",{\"minOpacity\":0.3,\"max\":2.870826340109791,\"radius\":35,\"blur\":30}]},{\"method\":\"addLayersControl\",\"args\":[[],[\"Heatmap\",\"Destinations\",\"Flights\",\"Outline\"],{\"collapsed\":true,\"autoZIndex\":true,\"position\":\"topright\"}]},{\"method\":\"hideGroup\",\"args\":[[\"Destinations\",\"Flights\",\"Outline\"]]}],\"setView\":[[40.49181,-3.56948],3,[]],\"limits\":{\"lat\":[-45.01837,62.45378351074952],\"lng\":[-180,180]}},\"evals\":[\"calls.5.args.0.onClick\"],\"jsHooks\":[]}</script>\n\n<p class=\"alert alert-info p-3 mx-2 my-3 lead\"><strong>✈️ 255,622.0 km flown so far.</strong></p>\n\n<h2 id=\"top-cities\">Top cities</h2>\n\n<table>\n  <thead>\n    <tr>\n      <th style=\"text-align: left\">City</th>\n      <th style=\"text-align: left\">Country</th>\n      <th style=\"text-align: right\">N</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <td style=\"text-align: left\">Bilbao</td>\n      <td style=\"text-align: left\">Spain</td>\n      <td style=\"text-align: right\">66</td>\n    </tr>\n    <tr>\n      <td style=\"text-align: left\">London</td>\n      <td style=\"text-align: left\">United Kingdom</td>\n      <td style=\"text-align: right\">23</td>\n    </tr>\n    <tr>\n      <td style=\"text-align: left\">Edinburgh</td>\n      <td style=\"text-align: left\">United Kingdom</td>\n      <td style=\"text-align: right\">21</td>\n    </tr>\n    <tr>\n      <td style=\"text-align: left\">Barcelona</td>\n      <td style=\"text-align: left\">Spain</td>\n      <td style=\"text-align: right\">16</td>\n    </tr>\n    <tr>\n      <td style=\"text-align: left\">Brussels</td>\n      <td style=\"text-align: left\">Belgium</td>\n      <td style=\"text-align: right\">8</td>\n    </tr>\n    <tr>\n      <td style=\"text-align: left\">Berlin</td>\n      <td style=\"text-align: left\">Germany</td>\n      <td style=\"text-align: right\">6</td>\n    </tr>\n    <tr>\n      <td style=\"text-align: left\">Munich</td>\n      <td style=\"text-align: left\">Germany</td>\n      <td style=\"text-align: right\">6</td>\n    </tr>\n    <tr>\n      <td style=\"text-align: left\">Palma de Mallorca</td>\n      <td style=\"text-align: left\">Spain</td>\n      <td style=\"text-align: right\">6</td>\n    </tr>\n    <tr>\n      <td style=\"text-align: left\">Amsterdam</td>\n      <td style=\"text-align: left\">Netherlands</td>\n      <td style=\"text-align: right\">4</td>\n    </tr>\n    <tr>\n      <td style=\"text-align: left\">Frankfurt</td>\n      <td style=\"text-align: left\">Germany</td>\n      <td style=\"text-align: right\">4</td>\n    </tr>\n  </tbody>\n</table>\n\n<h2 id=\"top-countries\">Top countries</h2>\n\n<table>\n  <thead>\n    <tr>\n      <th style=\"text-align: left\">Country</th>\n      <th style=\"text-align: left\">Continent</th>\n      <th style=\"text-align: right\">N</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <td style=\"text-align: left\">Spain</td>\n      <td style=\"text-align: left\">Europe</td>\n      <td style=\"text-align: right\">101</td>\n    </tr>\n    <tr>\n      <td style=\"text-align: left\">United Kingdom</td>\n      <td style=\"text-align: left\">Europe</td>\n      <td style=\"text-align: right\">46</td>\n    </tr>\n    <tr>\n      <td style=\"text-align: left\">Germany</td>\n      <td style=\"text-align: left\">Europe</td>\n      <td style=\"text-align: right\">18</td>\n    </tr>\n    <tr>\n      <td style=\"text-align: left\">Belgium</td>\n      <td style=\"text-align: left\">Europe</td>\n      <td style=\"text-align: right\">8</td>\n    </tr>\n    <tr>\n      <td style=\"text-align: left\">France</td>\n      <td style=\"text-align: left\">Europe</td>\n      <td style=\"text-align: right\">6</td>\n    </tr>\n  </tbody>\n</table>\n\n<h2 id=\"top-continents\">Top continents</h2>\n\n<table>\n  <thead>\n    <tr>\n      <th style=\"text-align: left\">Continent</th>\n      <th style=\"text-align: left\">Region</th>\n      <th style=\"text-align: right\">N</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <td style=\"text-align: left\">Europe</td>\n      <td style=\"text-align: left\">Southern Europe</td>\n      <td style=\"text-align: right\">105</td>\n    </tr>\n    <tr>\n      <td style=\"text-align: left\">Europe</td>\n      <td style=\"text-align: left\">Northern Europe</td>\n      <td style=\"text-align: right\">52</td>\n    </tr>\n    <tr>\n      <td style=\"text-align: left\">Europe</td>\n      <td style=\"text-align: left\">Western Europe</td>\n      <td style=\"text-align: right\">38</td>\n    </tr>\n    <tr>\n      <td style=\"text-align: left\">Asia</td>\n      <td style=\"text-align: left\">Western Asia</td>\n      <td style=\"text-align: right\">6</td>\n    </tr>\n    <tr>\n      <td style=\"text-align: left\">North America</td>\n      <td style=\"text-align: left\">Northern America</td>\n      <td style=\"text-align: right\">6</td>\n    </tr>\n  </tbody>\n</table>\n\n<iframe class=\"d-block w-100 border-0 rounded my-3\" title=\"Around the World by Daft Punk on Spotify\" src=\"https://open.spotify.com/embed/track/1pKYYY0dkg23sQQXi0Q5zN?theme=0\" height=\"152\" loading=\"lazy\" allow=\"autoplay; clipboard-write; encrypted-media; fullscreen; picture-in-picture\" allowfullscreen=\"\">\n</iframe>\n",
      "date_published": "2019-05-13T00:00:00+02:00",
      "image": "https://dieghernan.github.io/assets/img/blog/201905_Where-in-the-world.webp",
      "summary": "Explore the places I’ve flown to on an interactive Leaflet map.",
      "tags": ["music","rstats","rspatial","maps","leaflet"],
      "authors": [{
        "name": "Diego HH",
        "url": "https://dieghernan.github.io/"
      }]
    },
    {
      "id": "https://dieghernan.github.io/201905_Cast-to-subsegments/",
      "url": "https://dieghernan.github.io/201905_Cast-to-subsegments/",
      "title": "Cast a line to subsegments in R",
      "content_html": "<p>This post introduces a user-defined function for casting <strong>sf</strong> objects of class\n<code class=\"language-plaintext highlighter-rouge\">LINESTRING</code> or <code class=\"language-plaintext highlighter-rouge\">POLYGON</code> into substrings.</p>\n\n<h2 id=\"required-r-packages\">Required <strong>R</strong> packages</h2>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"n\">library</span><span class=\"p\">(</span><span class=\"n\">sf</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">library</span><span class=\"p\">(</span><span class=\"n\">rnaturalearth</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">library</span><span class=\"p\">(</span><span class=\"n\">dplyr</span><span class=\"p\">)</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<h2 id=\"the-problem\">The problem</h2>\n\n<p>The <strong>sf</strong> package includes <a href=\"https://r-spatial.github.io/sf/reference/st_cast.html\"><code class=\"language-plaintext highlighter-rouge\">st_cast</code></a>,\na powerful function that transforms geometries into other types of geometries\n(i.e. <code class=\"language-plaintext highlighter-rouge\">LINESTRING</code> to <code class=\"language-plaintext highlighter-rouge\">POLYGON</code>, etc.).</p>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"n\">italy</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">ne_countries</span><span class=\"p\">(</span><span class=\"n\">country</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"italy\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">returnclass</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"sf\"</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">italy_pol</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">italy</span><span class=\"w\"> </span><span class=\"o\">%&gt;%</span><span class=\"w\"> </span><span class=\"n\">st_cast</span><span class=\"p\">(</span><span class=\"s2\">\"POLYGON\"</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">italy_lin</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">italy_pol</span><span class=\"w\"> </span><span class=\"o\">%&gt;%</span><span class=\"w\"> </span><span class=\"n\">st_cast</span><span class=\"p\">(</span><span class=\"s2\">\"LINESTRING\"</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">italy_pt</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">italy_lin</span><span class=\"w\"> </span><span class=\"o\">%&gt;%</span><span class=\"w\"> </span><span class=\"n\">st_cast</span><span class=\"p\">(</span><span class=\"s2\">\"POINT\"</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">par</span><span class=\"p\">(</span><span class=\"n\">mfrow</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"m\">2</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">2</span><span class=\"p\">),</span><span class=\"w\"> </span><span class=\"n\">mar</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"m\">1</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">1</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">1</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">1</span><span class=\"p\">),</span><span class=\"w\"> </span><span class=\"n\">bg</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">NA</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">plot</span><span class=\"p\">(</span><span class=\"n\">st_geometry</span><span class=\"p\">(</span><span class=\"n\">italy</span><span class=\"p\">),</span><span class=\"w\"> </span><span class=\"n\">col</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"s2\">\"red\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"yellow\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"blue\"</span><span class=\"p\">),</span><span class=\"w\"> </span><span class=\"n\">main</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"MULTIPOLYGON\"</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">plot</span><span class=\"p\">(</span><span class=\"n\">st_geometry</span><span class=\"p\">(</span><span class=\"n\">italy_pol</span><span class=\"p\">),</span><span class=\"w\"> </span><span class=\"n\">col</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"s2\">\"red\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"yellow\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"blue\"</span><span class=\"p\">),</span><span class=\"w\"> </span><span class=\"n\">main</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"POLYGON\"</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">plot</span><span class=\"p\">(</span><span class=\"n\">st_geometry</span><span class=\"p\">(</span><span class=\"n\">italy_lin</span><span class=\"p\">),</span><span class=\"w\"> </span><span class=\"n\">col</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"s2\">\"red\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"yellow\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"blue\"</span><span class=\"p\">),</span><span class=\"w\"> </span><span class=\"n\">main</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"LINE\"</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">plot</span><span class=\"p\">(</span><span class=\"n\">st_geometry</span><span class=\"p\">(</span><span class=\"n\">italy_pt</span><span class=\"p\">),</span><span class=\"w\"> </span><span class=\"n\">col</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"s2\">\"red\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"yellow\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"blue\"</span><span class=\"p\">),</span><span class=\"w\"> </span><span class=\"n\">main</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"POINT\"</span><span class=\"p\">)</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<p><img src=\"https://dieghernan.github.io/assets/img/blog/20190505_italycast-1.webp\" alt=\"Four maps of Italy comparing multipolygon, polygon, line and point representations. Separate polygons and boundary vertices become visible as the geometry is converted.\" /></p>\n\n<p>What I missed when using <code class=\"language-plaintext highlighter-rouge\">st_cast</code> was the possibility of breaking\n<code class=\"language-plaintext highlighter-rouge\">LINESTRING</code> objects into subsegments:</p>\n\n<p><img src=\"https://dieghernan.github.io/assets/img/blog/20190505_italycastsub-1.webp\" alt=\"Outline of Italy split into short line segments, with alternating colors distinguishing adjacent segments.\" /></p>\n\n<iframe class=\"d-block w-100 border-0 rounded my-3\" title=\"Hold the Line by Toto on Spotify\" src=\"https://open.spotify.com/embed/track/2UasQGaawqY6ncetMd2LNw?theme=0\" height=\"152\" loading=\"lazy\" allow=\"autoplay; clipboard-write; encrypted-media; fullscreen; picture-in-picture\" allowfullscreen=\"\">\n</iframe>\n\n<h2 id=\"an-approach\">An approach</h2>\n\n<p>One possible solution is to create <code class=\"language-plaintext highlighter-rouge\">LINESTRING</code> objects for each consecutive\npair of <code class=\"language-plaintext highlighter-rouge\">POINT</code> objects across the original geometry. Let’s check it:</p>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"n\">par</span><span class=\"p\">(</span><span class=\"n\">mfrow</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"m\">1</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">2</span><span class=\"p\">),</span><span class=\"w\"> </span><span class=\"n\">mar</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"m\">1</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">1</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">1</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">1</span><span class=\"p\">))</span><span class=\"w\">\n</span><span class=\"n\">test</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">ne_countries</span><span class=\"p\">(</span><span class=\"n\">country</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"spain\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">returnclass</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"sf\"</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">%&gt;%</span><span class=\"w\">\n  </span><span class=\"n\">st_cast</span><span class=\"p\">(</span><span class=\"s2\">\"POLYGON\"</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">%&gt;%</span><span class=\"w\">\n  </span><span class=\"n\">st_cast</span><span class=\"p\">(</span><span class=\"s2\">\"LINESTRING\"</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">plot</span><span class=\"p\">(</span><span class=\"n\">st_geometry</span><span class=\"p\">(</span><span class=\"n\">test</span><span class=\"p\">),</span><span class=\"w\"> </span><span class=\"n\">col</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"s2\">\"red\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"yellow\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"blue\"</span><span class=\"p\">),</span><span class=\"w\"> </span><span class=\"n\">main</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"LINESTRING\"</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"n\">geom</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">lapply</span><span class=\"p\">(</span><span class=\"w\">\n  </span><span class=\"m\">1</span><span class=\"o\">:</span><span class=\"p\">(</span><span class=\"nf\">length</span><span class=\"p\">(</span><span class=\"n\">st_coordinates</span><span class=\"p\">(</span><span class=\"n\">test</span><span class=\"p\">)[,</span><span class=\"w\"> </span><span class=\"m\">1</span><span class=\"p\">])</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"w\"> </span><span class=\"m\">1</span><span class=\"p\">),</span><span class=\"w\">\n  </span><span class=\"k\">function</span><span class=\"p\">(</span><span class=\"n\">i</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"p\">{</span><span class=\"w\">\n    </span><span class=\"n\">rbind</span><span class=\"p\">(</span><span class=\"w\">\n      </span><span class=\"nf\">as.numeric</span><span class=\"p\">(</span><span class=\"n\">st_coordinates</span><span class=\"p\">(</span><span class=\"n\">test</span><span class=\"p\">)[</span><span class=\"n\">i</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">1</span><span class=\"o\">:</span><span class=\"m\">2</span><span class=\"p\">]),</span><span class=\"w\">\n      </span><span class=\"nf\">as.numeric</span><span class=\"p\">(</span><span class=\"n\">st_coordinates</span><span class=\"p\">(</span><span class=\"n\">test</span><span class=\"p\">)[</span><span class=\"n\">i</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"m\">1</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">1</span><span class=\"o\">:</span><span class=\"m\">2</span><span class=\"p\">])</span><span class=\"w\">\n    </span><span class=\"p\">)</span><span class=\"w\">\n  </span><span class=\"p\">}</span><span class=\"w\">\n</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">%&gt;%</span><span class=\"w\">\n  </span><span class=\"n\">st_multilinestring</span><span class=\"p\">()</span><span class=\"w\"> </span><span class=\"o\">%&gt;%</span><span class=\"w\">\n  </span><span class=\"n\">st_sfc</span><span class=\"p\">(</span><span class=\"n\">crs</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">st_crs</span><span class=\"p\">(</span><span class=\"n\">test</span><span class=\"p\">))</span><span class=\"w\"> </span><span class=\"o\">%&gt;%</span><span class=\"w\">\n  </span><span class=\"n\">st_cast</span><span class=\"p\">(</span><span class=\"s2\">\"LINESTRING\"</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">plot</span><span class=\"p\">(</span><span class=\"n\">st_geometry</span><span class=\"p\">(</span><span class=\"n\">geom</span><span class=\"p\">),</span><span class=\"w\"> </span><span class=\"n\">col</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"s2\">\"red\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"yellow\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"blue\"</span><span class=\"p\">),</span><span class=\"w\"> </span><span class=\"n\">main</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"AFTER FUNCTION\"</span><span class=\"p\">)</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<p><img src=\"https://dieghernan.github.io/assets/img/blog/20190505_testspain-1.webp\" alt=\"Two outlines of Spain comparing the original boundary with a version split into short, individually colored segments.\" /></p>\n\n<h2 id=\"the-function-stdh_cast_substring\">The function <code class=\"language-plaintext highlighter-rouge\">stdh_cast_substring</code></h2>\n\n<p>Finally, I wrapped the solution into a function and extended it a little bit:</p>\n\n<ul>\n  <li>\n    <p>When the input is not a <code class=\"language-plaintext highlighter-rouge\">LINESTRING</code> or a <code class=\"language-plaintext highlighter-rouge\">POLYGON</code>, it returns an error and\nstops.</p>\n  </li>\n  <li>\n    <p>The function accepts <strong>sf</strong> objects with several rows or <code class=\"language-plaintext highlighter-rouge\">sfc</code> objects with\nseveral geometries, and returns the same class as the input. In the case of\n<strong>sf</strong> objects, the input <code class=\"language-plaintext highlighter-rouge\">data.frame</code> is added.</p>\n  </li>\n  <li>\n    <p>By default, the output is a <code class=\"language-plaintext highlighter-rouge\">MULTILINESTRING</code> geometry. This has the benefit\nthat the output has the same number of geometries as the input. This can be\nmodified by setting the <code class=\"language-plaintext highlighter-rouge\">to</code> parameter to <code class=\"language-plaintext highlighter-rouge\">LINESTRING</code>, which only casts the\n<code class=\"language-plaintext highlighter-rouge\">MULTILINESTRING</code> object into <code class=\"language-plaintext highlighter-rouge\">LINESTRING</code>.</p>\n  </li>\n</ul>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"n\">stdh_cast_substring</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"k\">function</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">to</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"MULTILINESTRING\"</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"p\">{</span><span class=\"w\">\n  </span><span class=\"n\">ggg</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">st_geometry</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">)</span><span class=\"w\">\n\n  </span><span class=\"k\">if</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"o\">!</span><span class=\"n\">unique</span><span class=\"p\">(</span><span class=\"n\">st_geometry_type</span><span class=\"p\">(</span><span class=\"n\">ggg</span><span class=\"p\">))</span><span class=\"w\"> </span><span class=\"o\">%in%</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"s2\">\"POLYGON\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"LINESTRING\"</span><span class=\"p\">))</span><span class=\"w\"> </span><span class=\"p\">{</span><span class=\"w\">\n    </span><span class=\"n\">stop</span><span class=\"p\">(</span><span class=\"s2\">\"Input should be LINESTRING or POLYGON\"</span><span class=\"p\">)</span><span class=\"w\">\n  </span><span class=\"p\">}</span><span class=\"w\">\n  </span><span class=\"k\">for</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"n\">k</span><span class=\"w\"> </span><span class=\"k\">in</span><span class=\"w\"> </span><span class=\"m\">1</span><span class=\"o\">:</span><span class=\"nf\">length</span><span class=\"p\">(</span><span class=\"n\">st_geometry</span><span class=\"p\">(</span><span class=\"n\">ggg</span><span class=\"p\">)))</span><span class=\"w\"> </span><span class=\"p\">{</span><span class=\"w\">\n    </span><span class=\"n\">sub</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">ggg</span><span class=\"p\">[</span><span class=\"n\">k</span><span class=\"p\">]</span><span class=\"w\">\n    </span><span class=\"n\">geom</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">lapply</span><span class=\"p\">(</span><span class=\"w\">\n      </span><span class=\"m\">1</span><span class=\"o\">:</span><span class=\"p\">(</span><span class=\"nf\">length</span><span class=\"p\">(</span><span class=\"n\">st_coordinates</span><span class=\"p\">(</span><span class=\"n\">sub</span><span class=\"p\">)[,</span><span class=\"w\"> </span><span class=\"m\">1</span><span class=\"p\">])</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"w\"> </span><span class=\"m\">1</span><span class=\"p\">),</span><span class=\"w\">\n      </span><span class=\"k\">function</span><span class=\"p\">(</span><span class=\"n\">i</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"p\">{</span><span class=\"w\">\n        </span><span class=\"n\">rbind</span><span class=\"p\">(</span><span class=\"w\">\n          </span><span class=\"nf\">as.numeric</span><span class=\"p\">(</span><span class=\"n\">st_coordinates</span><span class=\"p\">(</span><span class=\"n\">sub</span><span class=\"p\">)[</span><span class=\"n\">i</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">1</span><span class=\"o\">:</span><span class=\"m\">2</span><span class=\"p\">]),</span><span class=\"w\">\n          </span><span class=\"nf\">as.numeric</span><span class=\"p\">(</span><span class=\"n\">st_coordinates</span><span class=\"p\">(</span><span class=\"n\">sub</span><span class=\"p\">)[</span><span class=\"n\">i</span><span class=\"w\"> </span><span class=\"o\">+</span><span class=\"w\"> </span><span class=\"m\">1</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">1</span><span class=\"o\">:</span><span class=\"m\">2</span><span class=\"p\">])</span><span class=\"w\">\n        </span><span class=\"p\">)</span><span class=\"w\">\n      </span><span class=\"p\">}</span><span class=\"w\">\n    </span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">%&gt;%</span><span class=\"w\">\n      </span><span class=\"n\">st_multilinestring</span><span class=\"p\">()</span><span class=\"w\"> </span><span class=\"o\">%&gt;%</span><span class=\"w\">\n      </span><span class=\"n\">st_sfc</span><span class=\"p\">()</span><span class=\"w\">\n\n    </span><span class=\"k\">if</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"n\">k</span><span class=\"w\"> </span><span class=\"o\">==</span><span class=\"w\"> </span><span class=\"m\">1</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"p\">{</span><span class=\"w\">\n      </span><span class=\"n\">endgeom</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">geom</span><span class=\"w\">\n    </span><span class=\"p\">}</span><span class=\"w\">\n    </span><span class=\"k\">else</span><span class=\"w\"> </span><span class=\"p\">{</span><span class=\"w\">\n      </span><span class=\"n\">endgeom</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">rbind</span><span class=\"p\">(</span><span class=\"n\">endgeom</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">geom</span><span class=\"p\">)</span><span class=\"w\">\n    </span><span class=\"p\">}</span><span class=\"w\">\n  </span><span class=\"p\">}</span><span class=\"w\">\n  </span><span class=\"n\">endgeom</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">endgeom</span><span class=\"w\"> </span><span class=\"o\">%&gt;%</span><span class=\"w\"> </span><span class=\"n\">st_sfc</span><span class=\"p\">(</span><span class=\"n\">crs</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">st_crs</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">))</span><span class=\"w\">\n  </span><span class=\"k\">if</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"nf\">class</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">)[</span><span class=\"m\">1</span><span class=\"p\">]</span><span class=\"w\"> </span><span class=\"o\">==</span><span class=\"w\"> </span><span class=\"s2\">\"sf\"</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"p\">{</span><span class=\"w\">\n    </span><span class=\"n\">endgeom</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">st_set_geometry</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">endgeom</span><span class=\"p\">)</span><span class=\"w\">\n  </span><span class=\"p\">}</span><span class=\"w\">\n\n  </span><span class=\"k\">if</span><span class=\"w\"> </span><span class=\"p\">(</span><span class=\"n\">to</span><span class=\"w\"> </span><span class=\"o\">==</span><span class=\"w\"> </span><span class=\"s2\">\"LINESTRING\"</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"p\">{</span><span class=\"w\">\n    </span><span class=\"n\">endgeom</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">endgeom</span><span class=\"w\"> </span><span class=\"o\">%&gt;%</span><span class=\"w\"> </span><span class=\"n\">st_cast</span><span class=\"p\">(</span><span class=\"s2\">\"LINESTRING\"</span><span class=\"p\">)</span><span class=\"w\">\n  </span><span class=\"p\">}</span><span class=\"w\">\n  </span><span class=\"nf\">return</span><span class=\"p\">(</span><span class=\"n\">endgeom</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"p\">}</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<p>The function could be improved in terms of performance. Given that it works at\nthe coordinate level, high-resolution objects introduce some delay.</p>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"n\">test100</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">ne_countries</span><span class=\"p\">(</span><span class=\"w\">\n  </span><span class=\"n\">continent</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"south america\"</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">returnclass</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"sf\"</span><span class=\"w\">\n</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">%&gt;%</span><span class=\"w\">\n  </span><span class=\"n\">st_cast</span><span class=\"p\">(</span><span class=\"s2\">\"POLYGON\"</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"n\">test50</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">ne_countries</span><span class=\"p\">(</span><span class=\"m\">50</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">continent</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"south america\"</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">returnclass</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"sf\"</span><span class=\"w\">\n</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">%&gt;%</span><span class=\"w\">\n  </span><span class=\"n\">st_cast</span><span class=\"p\">(</span><span class=\"s2\">\"POLYGON\"</span><span class=\"p\">)</span><span class=\"w\">\n\n\n\n</span><span class=\"n\">init</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">Sys.time</span><span class=\"p\">()</span><span class=\"w\">\n</span><span class=\"n\">t1</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">stdh_cast_substring</span><span class=\"p\">(</span><span class=\"n\">test100</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"LINESTRING\"</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">end</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">Sys.time</span><span class=\"p\">()</span><span class=\"w\">\n</span><span class=\"n\">kable</span><span class=\"p\">(</span><span class=\"n\">end</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"w\"> </span><span class=\"n\">init</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">format</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"markdown\"</span><span class=\"p\">)</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<table>\n  <thead>\n    <tr>\n      <th style=\"text-align: left\">x</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <td style=\"text-align: left\">0.1729319 secs</td>\n    </tr>\n  </tbody>\n</table>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"n\">init</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">Sys.time</span><span class=\"p\">()</span><span class=\"w\">\n</span><span class=\"n\">t2</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">stdh_cast_substring</span><span class=\"p\">(</span><span class=\"n\">test50</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"LINESTRING\"</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">end</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">Sys.time</span><span class=\"p\">()</span><span class=\"w\">\n</span><span class=\"n\">kable</span><span class=\"p\">(</span><span class=\"n\">end</span><span class=\"w\"> </span><span class=\"o\">-</span><span class=\"w\"> </span><span class=\"n\">init</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">format</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"markdown\"</span><span class=\"p\">)</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<table>\n  <thead>\n    <tr>\n      <th style=\"text-align: left\">x</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <td style=\"text-align: left\">2.288558 secs</td>\n    </tr>\n  </tbody>\n</table>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"n\">par</span><span class=\"p\">(</span><span class=\"n\">mfrow</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"m\">1</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">1</span><span class=\"p\">),</span><span class=\"w\"> </span><span class=\"n\">mar</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"m\">0</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">0</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">0</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">0</span><span class=\"p\">))</span><span class=\"w\">\n</span><span class=\"n\">plot</span><span class=\"p\">(</span><span class=\"n\">st_geometry</span><span class=\"p\">(</span><span class=\"n\">test50</span><span class=\"p\">),</span><span class=\"w\"> </span><span class=\"n\">col</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">NA</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">bg</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"#C6ECFF\"</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">plot</span><span class=\"p\">(</span><span class=\"n\">st_geometry</span><span class=\"p\">(</span><span class=\"n\">ne_countries</span><span class=\"p\">(</span><span class=\"m\">50</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">returnclass</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"sf\"</span><span class=\"p\">)),</span><span class=\"w\"> </span><span class=\"n\">col</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"#F6E1B9\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">border</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"#646464\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">add</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nb\">T</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">plot</span><span class=\"p\">(</span><span class=\"n\">st_geometry</span><span class=\"p\">(</span><span class=\"n\">test50</span><span class=\"p\">),</span><span class=\"w\"> </span><span class=\"n\">col</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"#FEFEE9\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">border</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"#646464\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">add</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nb\">T</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">plot</span><span class=\"p\">(</span><span class=\"n\">st_geometry</span><span class=\"p\">(</span><span class=\"n\">t2</span><span class=\"p\">),</span><span class=\"w\"> </span><span class=\"n\">col</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"s2\">\"red\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"yellow\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"blue\"</span><span class=\"p\">),</span><span class=\"w\"> </span><span class=\"n\">add</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nb\">T</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">lwd</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">0.5</span><span class=\"p\">)</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<p><img src=\"https://dieghernan.github.io/assets/img/blog/20190505_benchmarkfunction-1.webp\" alt=\"Map of South America with country boundaries split into short segments, illustrated with alternating colors.\" /></p>\n\n<p>There is a difference in performance: <code class=\"language-plaintext highlighter-rouge\">test100</code> has 15 polygons decomposed\ninto 914 substrings, while <code class=\"language-plaintext highlighter-rouge\">test50</code> has 80 polygons decomposed into 8,414\nsubstrings. In that sense, the original <code class=\"language-plaintext highlighter-rouge\">st_cast</code> is much faster, although\nthis solution may work well in most cases.</p>\n",
      "date_published": "2019-05-05T00:00:00+02:00",
      "image": "https://dieghernan.github.io/assets/img/blog/20190505_benchmarkfunction-1.webp",
      "summary": "Split a line into its individual segments with a small sf function in R.",
      "tags": ["music","r_bloggers","rstats","rspatial","sf","function","rnaturalearth"],
      "authors": [{
        "name": "Diego HH",
        "url": "https://dieghernan.github.io/"
      }]
    },
    {
      "id": "https://dieghernan.github.io/201904_Using-CountryCodes/",
      "url": "https://dieghernan.github.io/201904_Using-CountryCodes/",
      "title": "Using the CountryCodes database and sf package",
      "content_html": "<p>This vignette shows how to use the database provided in the GitHub project\n<a href=\"https://dieghernan.github.io/projects/countrycodes/\">Country Codes and International Organizations &amp; Groups</a>\nwith the <strong>sf</strong> package in <strong>R</strong>.</p>\n\n<h2 id=\"required-r-packages\">Required <strong>R</strong> packages</h2>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"n\">library</span><span class=\"p\">(</span><span class=\"n\">sf</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">library</span><span class=\"p\">(</span><span class=\"n\">jsonlite</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">library</span><span class=\"p\">(</span><span class=\"n\">rnaturalearth</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">library</span><span class=\"p\">(</span><span class=\"n\">dplyr</span><span class=\"p\">)</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<h2 id=\"reading-the-data\">Reading the data</h2>\n\n<p>The first step is to read the provided database (in this example, the <code class=\"language-plaintext highlighter-rouge\">json</code>\nfile) and extract one international organization. In this example, we will plot\nthe <a href=\"https://en.wikipedia.org/wiki/Commonwealth_of_Nations\">Commonwealth of Nations</a>.</p>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"n\">df</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">fromJSON</span><span class=\"p\">(</span><span class=\"s2\">\"https://raw.githubusercontent.com/dieghernan/Country-Codes-and-International-Organizations/master/outputs/Countrycodesfull.json\"</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"c1\"># Identify Commonwealth acronym</span><span class=\"w\">\n</span><span class=\"n\">orgsdb</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">read.csv</span><span class=\"p\">(</span><span class=\"s2\">\"https://raw.githubusercontent.com/dieghernan/Country-Codes-and-International-Organizations/master/outputs/CountrycodesOrgs.csv\"</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">%&gt;%</span><span class=\"w\">\n  </span><span class=\"n\">distinct</span><span class=\"p\">(</span><span class=\"n\">org_id</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">org_name</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"n\">kable</span><span class=\"p\">(</span><span class=\"n\">orgsdb</span><span class=\"p\">[</span><span class=\"n\">grep</span><span class=\"p\">(</span><span class=\"s2\">\"Common\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">orgsdb</span><span class=\"o\">$</span><span class=\"n\">org_name</span><span class=\"p\">),</span><span class=\"w\"> </span><span class=\"p\">],</span><span class=\"w\"> </span><span class=\"n\">format</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"markdown\"</span><span class=\"p\">)</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<table>\n  <thead>\n    <tr>\n      <th style=\"text-align: left\"> </th>\n      <th style=\"text-align: left\">org_name</th>\n      <th style=\"text-align: left\">org_id</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <td style=\"text-align: left\">25</td>\n      <td style=\"text-align: left\">Commonwealth</td>\n      <td style=\"text-align: left\">C</td>\n    </tr>\n    <tr>\n      <td style=\"text-align: left\">26</td>\n      <td style=\"text-align: left\">Central American Common Market</td>\n      <td style=\"text-align: left\">CACM</td>\n    </tr>\n    <tr>\n      <td style=\"text-align: left\">30</td>\n      <td style=\"text-align: left\">Caribbean Community and Common Market</td>\n      <td style=\"text-align: left\">CARICOM</td>\n    </tr>\n    <tr>\n      <td style=\"text-align: left\">42</td>\n      <td style=\"text-align: left\">Commonwealth of Independent States</td>\n      <td style=\"text-align: left\">CIS</td>\n    </tr>\n    <tr>\n      <td style=\"text-align: left\">43</td>\n      <td style=\"text-align: left\">Common Market for Eastern and Southern Africa</td>\n      <td style=\"text-align: left\">COMESA</td>\n    </tr>\n    <tr>\n      <td style=\"text-align: left\">115</td>\n      <td style=\"text-align: left\">Southern Cone Common Market</td>\n      <td style=\"text-align: left\">MERCOSUR</td>\n    </tr>\n  </tbody>\n</table>\n\n<p>In our case, the value to search for is <code class=\"language-plaintext highlighter-rouge\">C</code>. A function that extracts the\nmembership from the <code class=\"language-plaintext highlighter-rouge\">json</code> database is also provided:</p>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"n\">ISO_memcol</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"k\">function</span><span class=\"p\">(</span><span class=\"n\">df</span><span class=\"p\">,</span><span class=\"w\">\n                       </span><span class=\"n\">orgtosearch</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"p\">{</span><span class=\"w\">\n  </span><span class=\"n\">ind</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">match</span><span class=\"p\">(</span><span class=\"n\">orgtosearch</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">unlist</span><span class=\"p\">(</span><span class=\"n\">df</span><span class=\"p\">[</span><span class=\"m\">1</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"org_id\"</span><span class=\"p\">]))</span><span class=\"w\">\n  </span><span class=\"n\">or</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">lapply</span><span class=\"p\">(</span><span class=\"m\">1</span><span class=\"o\">:</span><span class=\"n\">nrow</span><span class=\"p\">(</span><span class=\"n\">df</span><span class=\"p\">),</span><span class=\"w\"> </span><span class=\"k\">function</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"p\">{</span><span class=\"w\">\n    </span><span class=\"n\">unlist</span><span class=\"p\">(</span><span class=\"n\">df</span><span class=\"p\">[</span><span class=\"n\">x</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"org_member\"</span><span class=\"p\">])[</span><span class=\"n\">ind</span><span class=\"p\">]</span><span class=\"w\">\n  </span><span class=\"p\">})</span><span class=\"w\">\n  </span><span class=\"n\">or</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">data.frame</span><span class=\"p\">(</span><span class=\"n\">matrix</span><span class=\"p\">(</span><span class=\"n\">unlist</span><span class=\"p\">(</span><span class=\"n\">or</span><span class=\"p\">)),</span><span class=\"w\"> </span><span class=\"n\">stringsAsFactors</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nb\">F</span><span class=\"p\">)</span><span class=\"w\">\n  </span><span class=\"nf\">names</span><span class=\"p\">(</span><span class=\"n\">or</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">orgtosearch</span><span class=\"w\">\n  </span><span class=\"n\">df2</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">as.data.frame</span><span class=\"p\">(</span><span class=\"n\">cbind</span><span class=\"p\">(</span><span class=\"n\">df</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">or</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">stringsAsFactors</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nb\">F</span><span class=\"p\">))</span><span class=\"w\">\n  </span><span class=\"nf\">return</span><span class=\"p\">(</span><span class=\"n\">df2</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"p\">}</span><span class=\"w\">\n</span><span class=\"n\">df_org</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">ISO_memcol</span><span class=\"p\">(</span><span class=\"n\">df</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"C\"</span><span class=\"p\">)</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<p>Now <code class=\"language-plaintext highlighter-rouge\">df_org</code> has a new column, named <code class=\"language-plaintext highlighter-rouge\">C</code>, containing the membership status\nof each country.</p>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"n\">df_org</span><span class=\"w\"> </span><span class=\"o\">%&gt;%</span><span class=\"w\">\n  </span><span class=\"n\">count</span><span class=\"p\">(</span><span class=\"n\">C</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">%&gt;%</span><span class=\"w\">\n  </span><span class=\"n\">kable</span><span class=\"p\">(</span><span class=\"n\">format</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"markdown\"</span><span class=\"p\">)</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<table>\n  <thead>\n    <tr>\n      <th style=\"text-align: left\">C</th>\n      <th style=\"text-align: right\">n</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <td style=\"text-align: left\">member</td>\n      <td style=\"text-align: right\">53</td>\n    </tr>\n    <tr>\n      <td style=\"text-align: left\">NA</td>\n      <td style=\"text-align: right\">222</td>\n    </tr>\n  </tbody>\n</table>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"n\">df_org</span><span class=\"w\"> </span><span class=\"o\">%&gt;%</span><span class=\"w\">\n  </span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"o\">!</span><span class=\"nf\">is.na</span><span class=\"p\">(</span><span class=\"n\">C</span><span class=\"p\">))</span><span class=\"w\"> </span><span class=\"o\">%&gt;%</span><span class=\"w\">\n  </span><span class=\"n\">select</span><span class=\"p\">(</span><span class=\"w\">\n    </span><span class=\"n\">ISO_3166_3</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"n\">NAME.EN</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"n\">C</span><span class=\"w\">\n  </span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">%&gt;%</span><span class=\"w\">\n  </span><span class=\"n\">head</span><span class=\"p\">()</span><span class=\"w\"> </span><span class=\"o\">%&gt;%</span><span class=\"w\">\n  </span><span class=\"n\">kable</span><span class=\"p\">(</span><span class=\"n\">format</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"markdown\"</span><span class=\"p\">)</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<table>\n  <thead>\n    <tr>\n      <th style=\"text-align: left\">ISO_3166_3</th>\n      <th style=\"text-align: left\">NAME.EN</th>\n      <th style=\"text-align: left\">C</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <td style=\"text-align: left\">ATG</td>\n      <td style=\"text-align: left\">Antigua &amp; Barbuda</td>\n      <td style=\"text-align: left\">member</td>\n    </tr>\n    <tr>\n      <td style=\"text-align: left\">AUS</td>\n      <td style=\"text-align: left\">Australia</td>\n      <td style=\"text-align: left\">member</td>\n    </tr>\n    <tr>\n      <td style=\"text-align: left\">BHS</td>\n      <td style=\"text-align: left\">Bahamas</td>\n      <td style=\"text-align: left\">member</td>\n    </tr>\n    <tr>\n      <td style=\"text-align: left\">BGD</td>\n      <td style=\"text-align: left\">Bangladesh</td>\n      <td style=\"text-align: left\">member</td>\n    </tr>\n    <tr>\n      <td style=\"text-align: left\">BRB</td>\n      <td style=\"text-align: left\">Barbados</td>\n      <td style=\"text-align: left\">member</td>\n    </tr>\n    <tr>\n      <td style=\"text-align: left\">BLZ</td>\n      <td style=\"text-align: left\">Belize</td>\n      <td style=\"text-align: left\">member</td>\n    </tr>\n  </tbody>\n</table>\n\n<h2 id=\"replacing-the-data-on-a-map\">Replacing the data on a map</h2>\n\n<p>In this example the <strong>rnaturalearth</strong> package is used for retrieving an <code class=\"language-plaintext highlighter-rouge\">sf</code>\nobject. The code below replaces the <code class=\"language-plaintext highlighter-rouge\">data.frame</code> part of the <code class=\"language-plaintext highlighter-rouge\">sf</code> object with\nthe dedicated database.</p>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"n\">testmap</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">ne_countries</span><span class=\"p\">(</span><span class=\"m\">50</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"s2\">\"countries\"</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">returnclass</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"sf\"</span><span class=\"w\">\n</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">%&gt;%</span><span class=\"w\">\n  </span><span class=\"n\">select</span><span class=\"p\">(</span><span class=\"n\">ISO_3166_3</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">adm0_a3</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">%&gt;%</span><span class=\"w\">\n  </span><span class=\"n\">full_join</span><span class=\"p\">(</span><span class=\"n\">df_org</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"c1\"># We also add tiny countries</span><span class=\"w\">\n</span><span class=\"n\">tiny</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">ne_countries</span><span class=\"p\">(</span><span class=\"m\">50</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"s2\">\"tiny_countries\"</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">returnclass</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"sf\"</span><span class=\"w\">\n</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">%&gt;%</span><span class=\"w\">\n  </span><span class=\"n\">select</span><span class=\"p\">(</span><span class=\"n\">ISO_3166_3</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">adm0_a3</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">%&gt;%</span><span class=\"w\">\n  </span><span class=\"n\">full_join</span><span class=\"p\">(</span><span class=\"n\">df_org</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"c1\"># Identify dependencies</span><span class=\"w\">\n</span><span class=\"n\">ISOCommon</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">df_org</span><span class=\"w\"> </span><span class=\"o\">%&gt;%</span><span class=\"w\">\n  </span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"o\">!</span><span class=\"nf\">is.na</span><span class=\"p\">(</span><span class=\"n\">C</span><span class=\"p\">))</span><span class=\"w\"> </span><span class=\"o\">%&gt;%</span><span class=\"w\">\n  </span><span class=\"n\">select</span><span class=\"p\">(</span><span class=\"w\">\n    </span><span class=\"n\">ISO_3166_3.sov</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">ISO_3166_3</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"n\">C_sov</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">C</span><span class=\"w\">\n  </span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">tiny</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">left_join</span><span class=\"p\">(</span><span class=\"n\">tiny</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">ISOCommon</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">tiny</span><span class=\"o\">$</span><span class=\"n\">C</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">coalesce</span><span class=\"p\">(</span><span class=\"n\">tiny</span><span class=\"o\">$</span><span class=\"n\">C</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">tiny</span><span class=\"o\">$</span><span class=\"n\">C_sov</span><span class=\"p\">)</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<h2 id=\"plotting-a-map-wikipedia-style\">Plotting a map: Wikipedia style</h2>\n\n<p>Now we will try to plot a map resembling the one presented in the\n<a href=\"https://en.wikipedia.org/wiki/Commonwealth_of_Nations\">Wikipedia page</a> for the\nCommonwealth.</p>\n\n<p><img src=\"https://upload.wikimedia.org/wikipedia/commons/e/e2/Member_states_of_the_Commonwealth_of_Nations.svg\" alt=\"World map highlighting member states of the Commonwealth of Nations.\" /></p>\n\n<p>The map we will generate is presented in a Robinson projection, and the color\npalette will be based on the <a href=\"https://en.wikipedia.org/wiki/Wikipedia:WikiProject_Maps/Conventions/Orthographic_maps\">Wikipedia convention for Orthographic Maps</a>,\nsince it is the one used in the example.</p>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"c1\"># Projecting the map</span><span class=\"w\">\n</span><span class=\"n\">testmap_rob</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">st_transform</span><span class=\"p\">(</span><span class=\"n\">testmap</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"+proj=robin\"</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">tiny_rob</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">st_transform</span><span class=\"p\">(</span><span class=\"n\">tiny</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"+proj=robin\"</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"c1\"># Bounding box</span><span class=\"w\">\n</span><span class=\"n\">bbox</span><span class=\"w\"> </span><span class=\"o\">&lt;-</span><span class=\"w\"> </span><span class=\"n\">st_linestring</span><span class=\"p\">(</span><span class=\"n\">rbind</span><span class=\"p\">(</span><span class=\"w\">\n  </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"m\">-180</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">90</span><span class=\"p\">),</span><span class=\"w\">\n  </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"m\">180</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">90</span><span class=\"p\">),</span><span class=\"w\">\n  </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"m\">180</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">-90</span><span class=\"p\">),</span><span class=\"w\">\n  </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"m\">-180</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">-90</span><span class=\"p\">),</span><span class=\"w\">\n  </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"m\">-180</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">90</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"p\">))</span><span class=\"w\"> </span><span class=\"o\">%&gt;%</span><span class=\"w\">\n  </span><span class=\"n\">st_segmentize</span><span class=\"p\">(</span><span class=\"m\">5</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">%&gt;%</span><span class=\"w\">\n  </span><span class=\"n\">st_cast</span><span class=\"p\">(</span><span class=\"s2\">\"POLYGON\"</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">%&gt;%</span><span class=\"w\">\n  </span><span class=\"n\">st_sfc</span><span class=\"p\">(</span><span class=\"n\">crs</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">4326</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">%&gt;%</span><span class=\"w\">\n  </span><span class=\"n\">st_transform</span><span class=\"p\">(</span><span class=\"n\">crs</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"+proj=robin\"</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"c1\"># Plotting</span><span class=\"w\">\n</span><span class=\"n\">par</span><span class=\"p\">(</span><span class=\"n\">mar</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nf\">c</span><span class=\"p\">(</span><span class=\"m\">0</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">0</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">0</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"m\">0</span><span class=\"p\">),</span><span class=\"w\"> </span><span class=\"n\">bg</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">NA</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">plot</span><span class=\"p\">(</span><span class=\"n\">bbox</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">col</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"#FFFFFF\"</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">border</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"#AAAAAA\"</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">lwd</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">1.5</span><span class=\"w\">\n</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">plot</span><span class=\"p\">(</span><span class=\"w\">\n  </span><span class=\"n\">st_geometry</span><span class=\"p\">(</span><span class=\"n\">testmap_rob</span><span class=\"p\">),</span><span class=\"w\">\n  </span><span class=\"n\">col</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"#B9B9B9\"</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">border</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"#FFFFFF\"</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">lwd</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">0.1</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">add</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nb\">T</span><span class=\"w\">\n</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"n\">plot</span><span class=\"p\">(</span><span class=\"w\">\n  </span><span class=\"n\">st_geometry</span><span class=\"p\">(</span><span class=\"n\">testmap_rob</span><span class=\"w\"> </span><span class=\"o\">%&gt;%</span><span class=\"w\">\n    </span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"o\">!</span><span class=\"nf\">is.na</span><span class=\"p\">(</span><span class=\"n\">C</span><span class=\"p\">))),</span><span class=\"w\">\n  </span><span class=\"n\">col</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"#346733\"</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">border</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"#FFFFFF\"</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">lwd</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">0.1</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">add</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nb\">T</span><span class=\"w\">\n</span><span class=\"p\">)</span><span class=\"w\">\n\n</span><span class=\"c1\"># Finally, add tiny countries</span><span class=\"w\">\n</span><span class=\"c1\"># All</span><span class=\"w\">\n</span><span class=\"n\">plot</span><span class=\"p\">(</span><span class=\"w\">\n  </span><span class=\"n\">st_geometry</span><span class=\"p\">(</span><span class=\"n\">tiny_rob</span><span class=\"p\">),</span><span class=\"w\">\n  </span><span class=\"n\">col</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"#000000\"</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">bg</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"#B9B9B9\"</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">add</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nb\">T</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">pch</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">21</span><span class=\"w\">\n</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"c1\"># Dependencies</span><span class=\"w\">\n</span><span class=\"n\">plot</span><span class=\"p\">(</span><span class=\"w\">\n  </span><span class=\"n\">st_geometry</span><span class=\"p\">(</span><span class=\"n\">tiny_rob</span><span class=\"w\"> </span><span class=\"o\">%&gt;%</span><span class=\"w\">\n    </span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"o\">!</span><span class=\"nf\">is.na</span><span class=\"p\">(</span><span class=\"n\">C</span><span class=\"p\">))</span><span class=\"w\"> </span><span class=\"o\">%&gt;%</span><span class=\"w\">\n    </span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"o\">!</span><span class=\"nf\">is.na</span><span class=\"p\">(</span><span class=\"n\">ISO_3166_3.sov</span><span class=\"p\">))),</span><span class=\"w\">\n  </span><span class=\"n\">bg</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"#C6DEBD\"</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">col</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"#000000\"</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">pch</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">21</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">add</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nb\">T</span><span class=\"w\">\n</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"c1\"># Independent</span><span class=\"w\">\n</span><span class=\"n\">plot</span><span class=\"p\">(</span><span class=\"w\">\n  </span><span class=\"n\">st_geometry</span><span class=\"p\">(</span><span class=\"n\">tiny_rob</span><span class=\"w\"> </span><span class=\"o\">%&gt;%</span><span class=\"w\">\n    </span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"o\">!</span><span class=\"nf\">is.na</span><span class=\"p\">(</span><span class=\"n\">C</span><span class=\"p\">))</span><span class=\"w\"> </span><span class=\"o\">%&gt;%</span><span class=\"w\">\n    </span><span class=\"n\">filter</span><span class=\"p\">(</span><span class=\"nf\">is.na</span><span class=\"p\">(</span><span class=\"n\">ISO_3166_3.sov</span><span class=\"p\">))),</span><span class=\"w\">\n  </span><span class=\"n\">bg</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"#346733\"</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">col</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"#000000\"</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">pch</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">21</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">add</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nb\">T</span><span class=\"w\">\n</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"n\">plot</span><span class=\"p\">(</span><span class=\"n\">bbox</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">col</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"kc\">NA</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">border</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"s2\">\"#AAAAAA\"</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">lwd</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"m\">1.5</span><span class=\"p\">,</span><span class=\"w\">\n  </span><span class=\"n\">add</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nb\">T</span><span class=\"w\">\n</span><span class=\"p\">)</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<p><img src=\"https://dieghernan.github.io/assets/img/blog/20190427_mapfin-1.webp\" alt=\"World map distinguishing Commonwealth member countries, their dependencies and other countries. Small island states are marked with circles.\" /></p>\n",
      "date_published": "2019-04-27T00:00:00+02:00",
      "image": "https://dieghernan.github.io/assets/img/blog/20190427_mapfin-1.webp",
      "summary": "Use CountryCodes and sf to match country identifiers and put your data on a map in R.",
      "tags": ["r_bloggers","rstats","rspatial","sf","maps","rnaturalearth"],
      "authors": [{
        "name": "Diego HH",
        "url": "https://dieghernan.github.io/"
      }]
    },
    {
      "id": "https://dieghernan.github.io/projects/Country-Codes-and-International-Organizations/",
      "url": "https://dieghernan.github.io/projects/Country-Codes-and-International-Organizations/",
      "title": "Country codes & organizations",
      "content_html": "<p>Complete database of countries and territories, their different country codes\nunder common standards (ISO-3166, GEC <em>(formerly FIPS)</em>, M49 (<em>UN</em>), STANAG\n(<em>NATO</em>), NUTS (<em>EU</em>), etc.) and their membership in different international\norganizations.</p>\n\n<p><sup><em>Note that blanks are presented as</em> <code class=\"language-plaintext highlighter-rouge\">\"\"</code> <em>instead of</em> <code class=\"language-plaintext highlighter-rouge\">NA</code> <em>since ISO-3166-ALPHA 2 for Namibia is</em> <strong>NA</strong>.</sup></p>\n\n<p><strong><a href=\"https://dieghernan.github.io/201904_Using-CountryCodes/\">Vignette: Using country codes</a></strong></p>\n\n<h2 id=\"a-country-codes-csv\">A. Country codes <code class=\"language-plaintext highlighter-rouge\">.csv</code></h2>\n\n<p>Main <code class=\"language-plaintext highlighter-rouge\">.csv</code> file\n<a href=\"https://github.com/dieghernan/Country-Codes-and-International-Organizations/tree/master/outputs/Countrycodes.csv\">(link)</a>\ncontaining:</p>\n\n<ul>\n  <li>Country and regional codes</li>\n  <li>Currency, dependency status and sovereignty information</li>\n  <li>Names in English and Spanish as provided by <a href=\"http://cldr.unicode.org/translation/displaynames/country-names\">Unicode CLDR</a></li>\n  <li>Additional information (demographics, capital, area, etc.)</li>\n</ul>\n\n<h3 id=\"codes-included\">Codes included</h3>\n\n<table>\n  <thead>\n    <tr>\n      <th>Field</th>\n      <th>Description</th>\n      <th>Source</th>\n      <th>Notes</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <td><code class=\"language-plaintext highlighter-rouge\">ISO_3166_1</code></td>\n      <td>ISO 3166-1 numeric</td>\n      <td>Wikipedia</td>\n      <td> </td>\n    </tr>\n    <tr>\n      <td><code class=\"language-plaintext highlighter-rouge\">ISO_3166_2</code></td>\n      <td>ISO 3166-1 alpha-2</td>\n      <td>Wikipedia</td>\n      <td> </td>\n    </tr>\n    <tr>\n      <td><code class=\"language-plaintext highlighter-rouge\">ISO_3166_3</code></td>\n      <td>ISO 3166-1 alpha-3</td>\n      <td>Wikipedia</td>\n      <td> </td>\n    </tr>\n    <tr>\n      <td><code class=\"language-plaintext highlighter-rouge\">FIPS_GEC</code></td>\n      <td>Geopolitical Entities and Codes (GEC)</td>\n      <td>CIA World Factbook</td>\n      <td>Formerly FIPS 1PUB 10-4 (historical CIA reference)</td>\n    </tr>\n    <tr>\n      <td><code class=\"language-plaintext highlighter-rouge\">STANAG</code></td>\n      <td>STANAG 1059 Country Codes</td>\n      <td>CIA World Factbook</td>\n      <td>Used by NATO</td>\n    </tr>\n    <tr>\n      <td><code class=\"language-plaintext highlighter-rouge\">M49</code></td>\n      <td>UN Country Code</td>\n      <td>UN Stats</td>\n      <td> </td>\n    </tr>\n    <tr>\n      <td><code class=\"language-plaintext highlighter-rouge\">NUTS</code></td>\n      <td>NUTS 0 code</td>\n      <td>Wikipedia</td>\n      <td>Used by EU</td>\n    </tr>\n    <tr>\n      <td><code class=\"language-plaintext highlighter-rouge\">geonameId</code></td>\n      <td>geonameId</td>\n      <td>geonames</td>\n      <td> </td>\n    </tr>\n    <tr>\n      <td><code class=\"language-plaintext highlighter-rouge\">continentcode</code></td>\n      <td>geonames Continent Code</td>\n      <td>geonames</td>\n      <td> </td>\n    </tr>\n    <tr>\n      <td><code class=\"language-plaintext highlighter-rouge\">regioncode</code></td>\n      <td>UN Regional Code</td>\n      <td>UN Stats</td>\n      <td> </td>\n    </tr>\n    <tr>\n      <td><code class=\"language-plaintext highlighter-rouge\">interregioncode</code></td>\n      <td>Interregional Code</td>\n      <td>UN Stats</td>\n      <td> </td>\n    </tr>\n    <tr>\n      <td><code class=\"language-plaintext highlighter-rouge\">subregioncode</code></td>\n      <td>Subregion Code</td>\n      <td>UN Stats</td>\n      <td> </td>\n    </tr>\n    <tr>\n      <td><code class=\"language-plaintext highlighter-rouge\">ISO_3166_3.sov</code></td>\n      <td>Sovereign code</td>\n      <td>Wikipedia, Statoids</td>\n      <td>If non-independent</td>\n    </tr>\n  </tbody>\n</table>\n\n<h3 id=\"other-information-included\">Other information included</h3>\n\n<ul>\n  <li>Currency</li>\n  <li>Dependency status</li>\n  <li>Names in English and Spanish for countries, continents, regions and capitals</li>\n  <li>Population, area (km<sup>2</sup>) and developed region</li>\n</ul>\n\n<h2 id=\"b-international-organizations-csv\">B. International organizations <code class=\"language-plaintext highlighter-rouge\">.csv</code></h2>\n\n<p>A single <code class=\"language-plaintext highlighter-rouge\">.csv</code> file\n<a href=\"https://github.com/dieghernan/Country-Codes-and-International-Organizations/tree/master/outputs/CountrycodesOrgs.csv\">(link)</a>\ndescribing the membership status of each country across 186 international\norganizations.</p>\n\n<table>\n  <thead>\n    <tr>\n      <th>Field</th>\n      <th>Description</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <td><code class=\"language-plaintext highlighter-rouge\">ISO_3166_2</code></td>\n      <td>Matches Countrycodes <code class=\"language-plaintext highlighter-rouge\">.csv</code></td>\n    </tr>\n    <tr>\n      <td><code class=\"language-plaintext highlighter-rouge\">ISO_3166_3</code></td>\n      <td>Matches Countrycodes <code class=\"language-plaintext highlighter-rouge\">.csv</code></td>\n    </tr>\n    <tr>\n      <td><code class=\"language-plaintext highlighter-rouge\">NAME.EN</code></td>\n      <td>Matches Countrycodes <code class=\"language-plaintext highlighter-rouge\">.csv</code></td>\n    </tr>\n    <tr>\n      <td><code class=\"language-plaintext highlighter-rouge\">source</code></td>\n      <td>Main data source</td>\n    </tr>\n    <tr>\n      <td><code class=\"language-plaintext highlighter-rouge\">org_name</code></td>\n      <td>Name of the organization</td>\n    </tr>\n    <tr>\n      <td><code class=\"language-plaintext highlighter-rouge\">org_id</code></td>\n      <td>Abbreviation or internal ID</td>\n    </tr>\n    <tr>\n      <td><code class=\"language-plaintext highlighter-rouge\">org_member</code></td>\n      <td>Membership status</td>\n    </tr>\n  </tbody>\n</table>\n\n<h2 id=\"c-full-json-file-json\">C. Full JSON file <code class=\"language-plaintext highlighter-rouge\">.json</code></h2>\n\n<p>This <code class=\"language-plaintext highlighter-rouge\">.json</code> file\n<a href=\"https://github.com/dieghernan/Country-Codes-and-International-Organizations/tree/master/outputs/Countrycodesfull.json\">(link)</a>\ncombines the previous files:</p>\n\n<div class=\"language-json highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"p\">[</span><span class=\"w\">\n  </span><span class=\"err\">...</span><span class=\"w\">\n  </span><span class=\"p\">{</span><span class=\"w\">\n    </span><span class=\"nl\">\"ISO_3166_1\"</span><span class=\"p\">:</span><span class=\"w\"> </span><span class=\"mi\">12</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"nl\">\"ISO_3166_2\"</span><span class=\"p\">:</span><span class=\"w\"> </span><span class=\"s2\">\"DZ\"</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"nl\">\"ISO_3166_3\"</span><span class=\"p\">:</span><span class=\"w\"> </span><span class=\"s2\">\"DZA\"</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"nl\">\"ISO_Official\"</span><span class=\"p\">:</span><span class=\"w\"> </span><span class=\"kc\">true</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"nl\">\"FIPS_GEC\"</span><span class=\"p\">:</span><span class=\"w\"> </span><span class=\"s2\">\"AG\"</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"nl\">\"STANAG\"</span><span class=\"p\">:</span><span class=\"w\"> </span><span class=\"s2\">\"DZA\"</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"nl\">\"M49\"</span><span class=\"p\">:</span><span class=\"w\"> </span><span class=\"mi\">12</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"nl\">\"geonameId\"</span><span class=\"p\">:</span><span class=\"w\"> </span><span class=\"mi\">2589581</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"nl\">\"continentcode\"</span><span class=\"p\">:</span><span class=\"w\"> </span><span class=\"s2\">\"AF\"</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"nl\">\"regioncode\"</span><span class=\"p\">:</span><span class=\"w\"> </span><span class=\"mi\">2</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"nl\">\"subregioncode\"</span><span class=\"p\">:</span><span class=\"w\"> </span><span class=\"mi\">15</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"nl\">\"currency\"</span><span class=\"p\">:</span><span class=\"w\"> </span><span class=\"s2\">\"DZD\"</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"nl\">\"independent\"</span><span class=\"p\">:</span><span class=\"w\"> </span><span class=\"kc\">true</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"nl\">\"NAME.EN\"</span><span class=\"p\">:</span><span class=\"w\"> </span><span class=\"s2\">\"Algeria\"</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"nl\">\"CONTINENT.EN\"</span><span class=\"p\">:</span><span class=\"w\"> </span><span class=\"s2\">\"Africa\"</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"nl\">\"REGION.EN\"</span><span class=\"p\">:</span><span class=\"w\"> </span><span class=\"s2\">\"Africa\"</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"nl\">\"SUBREGION.EN\"</span><span class=\"p\">:</span><span class=\"w\"> </span><span class=\"s2\">\"Northern Africa\"</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"nl\">\"CAPITAL.EN\"</span><span class=\"p\">:</span><span class=\"w\"> </span><span class=\"s2\">\"Algiers\"</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"nl\">\"NAME.ES\"</span><span class=\"p\">:</span><span class=\"w\"> </span><span class=\"s2\">\"Argelia\"</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"nl\">\"CONTINENT.ES\"</span><span class=\"p\">:</span><span class=\"w\"> </span><span class=\"s2\">\"Africa\"</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"nl\">\"REGION.ES\"</span><span class=\"p\">:</span><span class=\"w\"> </span><span class=\"s2\">\"África\"</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"nl\">\"SUBREGION.ES\"</span><span class=\"p\">:</span><span class=\"w\"> </span><span class=\"s2\">\"África septentrional\"</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"nl\">\"CAPITAL.ES\"</span><span class=\"p\">:</span><span class=\"w\"> </span><span class=\"s2\">\"Argel\"</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"nl\">\"pop\"</span><span class=\"p\">:</span><span class=\"w\"> </span><span class=\"mi\">34586184</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"nl\">\"area_km2\"</span><span class=\"p\">:</span><span class=\"w\"> </span><span class=\"mi\">2381740</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"nl\">\"Developed\"</span><span class=\"p\">:</span><span class=\"w\"> </span><span class=\"s2\">\"Developing\"</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"nl\">\"org_id\"</span><span class=\"p\">:</span><span class=\"w\"> </span><span class=\"p\">[</span><span class=\"s2\">\"ABEDA\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"ACP\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"ADB\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"AFDB\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"AFESD\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"AG\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"AL\"</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"err\">...</span><span class=\"w\">\n    </span><span class=\"p\">],</span><span class=\"w\">\n    </span><span class=\"nl\">\"org_member\"</span><span class=\"p\">:</span><span class=\"w\"> </span><span class=\"p\">[</span><span class=\"s2\">\"member\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"kc\">null</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"kc\">null</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"member\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"member\"</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"kc\">null</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"s2\">\"member\"</span><span class=\"p\">,</span><span class=\"w\">\n    </span><span class=\"err\">...</span><span class=\"w\">\n    </span><span class=\"p\">]</span><span class=\"w\">\n  </span><span class=\"p\">},</span><span class=\"w\">\n  </span><span class=\"err\">...</span><span class=\"w\">\n</span><span class=\"p\">]</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<p>A complementary function (intended to be used in <strong>R</strong>) has been developed:</p>\n\n<div class=\"language-r highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"n\">ISO_memcol</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"k\">function</span><span class=\"p\">(</span><span class=\"n\">df</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"c1\">#Input dataframe</span><span class=\"w\">\n                      </span><span class=\"n\">orgtosearch</span><span class=\"w\"> </span><span class=\"c1\">#org id</span><span class=\"w\">\n</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"p\">{</span><span class=\"w\">\n  </span><span class=\"n\">ind</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">match</span><span class=\"p\">(</span><span class=\"n\">orgtosearch</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">unlist</span><span class=\"p\">(</span><span class=\"n\">df</span><span class=\"p\">[</span><span class=\"m\">1</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"org_id\"</span><span class=\"p\">]))</span><span class=\"w\">\n  </span><span class=\"n\">or</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">lapply</span><span class=\"p\">(</span><span class=\"m\">1</span><span class=\"o\">:</span><span class=\"n\">nrow</span><span class=\"p\">(</span><span class=\"n\">df</span><span class=\"p\">),</span><span class=\"w\"> </span><span class=\"k\">function</span><span class=\"p\">(</span><span class=\"n\">x</span><span class=\"p\">)</span><span class=\"w\">\n    </span><span class=\"n\">unlist</span><span class=\"p\">(</span><span class=\"n\">df</span><span class=\"p\">[</span><span class=\"n\">x</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"s2\">\"org_member\"</span><span class=\"p\">])[</span><span class=\"n\">ind</span><span class=\"p\">])</span><span class=\"w\">\n  </span><span class=\"n\">or</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">data.frame</span><span class=\"p\">(</span><span class=\"n\">matrix</span><span class=\"p\">(</span><span class=\"n\">unlist</span><span class=\"p\">(</span><span class=\"n\">or</span><span class=\"p\">)),</span><span class=\"w\"> </span><span class=\"n\">stringsAsFactors</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nb\">F</span><span class=\"p\">)</span><span class=\"w\">\n  </span><span class=\"nf\">names</span><span class=\"p\">(</span><span class=\"n\">or</span><span class=\"p\">)</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">orgtosearch</span><span class=\"w\">\n  </span><span class=\"n\">df2</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"n\">as.data.frame</span><span class=\"p\">(</span><span class=\"n\">cbind</span><span class=\"p\">(</span><span class=\"n\">df</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">or</span><span class=\"p\">,</span><span class=\"w\"> </span><span class=\"n\">stringsAsFactors</span><span class=\"w\"> </span><span class=\"o\">=</span><span class=\"w\"> </span><span class=\"nb\">F</span><span class=\"p\">))</span><span class=\"w\">\n  </span><span class=\"nf\">return</span><span class=\"p\">(</span><span class=\"n\">df2</span><span class=\"p\">)</span><span class=\"w\">\n</span><span class=\"p\">}</span><span class=\"w\">\n</span></code></pre></div></div>\n\n<h2 id=\"d-data-sources\">D. Data sources</h2>\n\n<ul>\n  <li>Central Intelligence Agency. (n.d.). <em>The world factbook</em> [Historical\nreference work]. <a href=\"https://web.archive.org/web/20260203124934/https://www.cia.gov/the-world-factbook/about/archives/\">Archived editions</a></li>\n  <li>GeoNames. (n.d.). <em>GeoNames geographical database</em> [Data set].\n<a href=\"https://www.geonames.org/\">https://www.geonames.org/</a></li>\n  <li>ISO 3166-1. (n.d.). In <em>Wikipedia</em>. <a href=\"https://en.wikipedia.org/wiki/ISO_3166-1\">https://en.wikipedia.org/wiki/ISO_3166-1</a></li>\n  <li>Law, G. (n.d.). <em>Administrative divisions of countries (Statoids)</em>.\n<a href=\"https://www.statoids.com/\">https://www.statoids.com/</a></li>\n  <li>Nomenclatura de las unidades territoriales estadísticas. (n.d.). In\n<em>Wikipedia</em>. <a href=\"https://es.wikipedia.org/wiki/Nomenclatura_de_las_Unidades_Territoriales_Estad%C3%ADsticas\">Article</a></li>\n  <li>REST Countries. (n.d.). <em>REST Countries</em> [Data API].\n<a href=\"https://restcountries.com/\">https://restcountries.com/</a></li>\n  <li>Unicode Consortium. (n.d.). <em>Unicode Common Locale Data Repository</em>\n[Archived data]. GitHub. <a href=\"https://github.com/unicode-cldr\">https://github.com/unicode-cldr</a></li>\n  <li>United Nations Statistics Division. (n.d.). <em>Standard country or area codes\nfor statistical use (M49)</em>.\n<a href=\"https://unstats.un.org/unsd/methodology/m49/overview/\">https://unstats.un.org/unsd/methodology/m49/overview/</a></li>\n</ul>\n",
      "date_published": "2019-04-11T00:00:00+02:00",
      "image": "https://dieghernan.github.io/assets/img/misc/countrycodes.png",
      "summary": "Country and territory codes under different standards, with membership in international organizations.",
      "tags": ["project","rstats","dataset","csv"],
      "authors": [{
        "name": "Diego HH",
        "url": "https://dieghernan.github.io/"
      }]
    },
    {
      "id": "https://dieghernan.github.io/projects/Bzel/",
      "url": "https://dieghernan.github.io/projects/Bzel/",
      "title": "Bzel",
      "content_html": "<p class=\"alert alert-danger p-3 mx-2 mb-3 lead\"><strong>Project discontinued</strong> due to the shutdown of Pebble.</p>\n\n<p><strong>Bzel</strong> integrates the bezel into your watch face. Display minutes as digits,\nas a moving dot or as a fill in the bezel.</p>\n\n<p><img src=\"https://raw.githubusercontent.com/dieghernan/Bzel/master/store/BannerBzel.png\" alt=\"Bzel watch face with minutes displayed around the bezel.\" /></p>\n<p class=\"caption\">Bzel uses the bezel as an extra space for displaying the minutes.</p>\n\n<div class=\"text-center\">\n<a class=\"btn btn-primary my-3 text-white\" href=\"https://apps.rebble.io/en_US/application/59280895b67f9f43f80004c9\">Download\nfrom Rebble Appstore</a>\n</div>\n\n<h2 id=\"features\">Features</h2>\n\n<ul>\n  <li>Clock mode:\n    <ul>\n      <li>Digital: Minute display based on analog movement</li>\n      <li>Dot: Moving dot as a minute marker</li>\n      <li>Bezel: A bar moving around the bezel as a minute marker</li>\n    </ul>\n  </li>\n  <li>Autodetection of 12h/24h mode based on your watch settings</li>\n</ul>\n\n<h2 id=\"take-your-pick\">Take your pick</h2>\n\n<ul>\n  <li>Pebble Health: Display daily steps.</li>\n  <li>Date - Get the weekday based on the language set on your Pebble.</li>\n  <li>Weather: Current conditions in °C or °F.</li>\n  <li>Choose your weather provider:\n    <ul>\n      <li><a href=\"https://www.yahoo.com/?ilc=401\">Yahoo.com</a> <em>No API key required at this\nmoment</em></li>\n      <li><a href=\"https://www.wunderground.com/?apiref=fb6856330e74c168\">Wunderground</a></li>\n      <li><a href=\"https://openweathermap.org/\">OpenWeatherMap</a></li>\n    </ul>\n  </li>\n  <li>Historical integration with Master Key (pmkey.xyz)</li>\n  <li>Location based on your selected weather provider</li>\n  <li>Night theme displayed between sunset and sunrise</li>\n</ul>\n\n<h2 id=\"internationalization\">Internationalization</h2>\n\n<p>Automatic weekday translation is supported for:</p>\n\n<ul>\n  <li>English</li>\n  <li>Spanish</li>\n  <li>German</li>\n  <li>French</li>\n  <li>Portuguese</li>\n  <li>Italian</li>\n</ul>\n\n<h2 id=\"future-developments\">Future developments</h2>\n\n<ul class=\"task-list\">\n  <li class=\"task-list-item\"><input type=\"checkbox\" class=\"task-list-item-checkbox\" disabled=\"disabled\" checked=\"checked\" />Location for weather</li>\n  <li class=\"task-list-item\"><input type=\"checkbox\" class=\"task-list-item-checkbox\" disabled=\"disabled\" checked=\"checked\" />Square support</li>\n  <li class=\"task-list-item\"><input type=\"checkbox\" class=\"task-list-item-checkbox\" disabled=\"disabled\" checked=\"checked\" />New minute mode: bezel</li>\n  <li class=\"task-list-item\"><input type=\"checkbox\" class=\"task-list-item-checkbox\" disabled=\"disabled\" checked=\"checked\" />Steps</li>\n  <li class=\"task-list-item\"><input type=\"checkbox\" class=\"task-list-item-checkbox\" disabled=\"disabled\" />More health metrics</li>\n</ul>\n\n<h2 id=\"screenshots\">Screenshots</h2>\n\n<div class=\"row\">\n<div class=\"col-sm mb-1\">\n    <img src=\"https://raw.githubusercontent.com/dieghernan/Bzel/master/store/BezelPTR.gif\" alt=\"Animated Bzel watch face on Pebble Time Round.\" />\n    <p class=\"caption\">Minute progress displayed around the Pebble Time Round bezel.</p>\n</div>\n<div class=\"col-sm mb-1\">\n    <img src=\"https://raw.githubusercontent.com/dieghernan/Bzel/master/store/BezelPT.gif\" alt=\"Animated Bzel watch face on Pebble Time.\" />\n    <p class=\"caption\">The bezel minute indicator adapted to the Pebble Time screen.</p>\n</div>\n<div class=\"col-sm mb-1\">         \n    <img src=\"https://raw.githubusercontent.com/dieghernan/Bzel/master/store/BezelBW.gif\" alt=\"Animated Bzel watch face on a monochrome Pebble watch.\" />\n    <p class=\"caption\">Monochrome version of the bezel-based minute display.</p>\n</div>\n</div>\n\n<h2 id=\"attributions\">Attributions</h2>\n\n<h3 id=\"fonts\">Fonts</h3>\n\n<ul>\n  <li><a href=\"https://erikflowers.github.io/weather-icons\">Weather Icons</a> by Eric Flowers,\nmodified and fitted to the regular alphabet instead of Unicode values.</li>\n  <li>Custom font for icons created via Fontastic.</li>\n  <li>Gotham Fonts downloaded from <a href=\"http://fontsgeek.com\">fontsgeek.com</a></li>\n</ul>\n\n<h3 id=\"weather-providers\">Weather providers</h3>\n\n<div class=\"row\">\n<div class=\"col\">\n<a href=\"https://www.wunderground.com/?apiref=fb6856330e74c168\"><img src=\"https://icons.wxug.com/logos/PNG/wundergroundLogo_4c.png\" width=\"120\" alt=\"Weather Underground\" /></a>\n</div>\n<div class=\"col\">\n<a href=\"https://openweathermap.org/\"><img src=\"https://openweathermap.org/themes/openweathermap/assets/vendor/owm/img/icons/logo_60x60.png\" width=\"60\" alt=\"OpenWeatherMap\" /></a>\n</div>\n</div>\n\n<h3 id=\"others\">Others</h3>\n\n<p>Master Key (pmkey.xyz) was a service for Pebble users that managed API keys\nthrough a unique PIN.</p>\n\n<h2 id=\"license\">License</h2>\n\n<p>Licensed under the <a href=\"https://raw.githubusercontent.com/dieghernan/Bzel/master/LICENSE\">MIT license</a>.</p>\n\n<p><strong>Made in Madrid, Spain ❤️</strong></p>\n",
      "date_published": "2017-05-25T00:00:00+02:00",
      "image": "https://raw.githubusercontent.com/dieghernan/Bzel/master/store/BannerBzel.png",
      "summary": "Bzel integrates the bezel into your watch face. Display minutes as digits, as a moving dot or as a fill in the bezel.",
      "tags": ["discontinued","project","pebble","watchface","javascript","C"],
      "authors": [{
        "name": "Diego HH",
        "url": "https://dieghernan.github.io/"
      }]
    },
    {
      "id": "https://dieghernan.github.io/projects/7egment/",
      "url": "https://dieghernan.github.io/projects/7egment/",
      "title": "7egment",
      "content_html": "<p class=\"alert alert-danger p-3 mx-2 mb-3 lead\"><strong>Project discontinued</strong> due to the shutdown of Pebble.</p>\n\n<p><strong>7egment</strong> is a customizable watch face based on the classic 7-segment display\nthat adds your location and current weather information in the language used on\nyour watch and smartphone.</p>\n\n<p><img src=\"https://raw.githubusercontent.com/dieghernan/7egment/master/store/Banner.png\" alt=\"7egment watch face with a seven-segment time display and weather information.\" /></p>\n<p class=\"caption\">The 7egment layout combines time, location and weather on a Pebble display.</p>\n\n<div class=\"text-center\">\n<a class=\"btn btn-primary my-3 text-white\" href=\"https://apps.rebble.io/en_US/application/591ead370dfc32aacf000204?section=watchfaces\">Download from Rebble Appstore</a>\n</div>\n\n<h2 id=\"features\">Features</h2>\n\n<ul>\n  <li>Autodetection of 12h/24h mode based on your watch settings</li>\n  <li>Internationalization: Automatic weekday translation is supported for:\n    <ul>\n      <li>English</li>\n      <li>Spanish</li>\n      <li>German</li>\n      <li>French</li>\n      <li>Portuguese</li>\n      <li>Italian</li>\n    </ul>\n  </li>\n</ul>\n\n<h2 id=\"options\">Options</h2>\n\n<ul>\n  <li>Choose colors for the background, frame and text</li>\n  <li>Three-band design. Make it match your tie!</li>\n  <li>Weather: Current conditions in °C or °F.</li>\n  <li>Choose your weather provider:\n    <ul>\n      <li><a href=\"https://www.wunderground.com\">Wunderground</a></li>\n      <li><a href=\"https://openweathermap.org/\">OpenWeatherMap</a></li>\n    </ul>\n  </li>\n  <li>Historical integration with Master Key (pmkey.xyz)</li>\n  <li>Location based on your selected weather provider</li>\n  <li>Bluetooth and GPS warnings</li>\n  <li>Night theme displayed between sunset and sunrise</li>\n</ul>\n\n<h2 id=\"screenshots\">Screenshots</h2>\n\n<div class=\"row\">\n<div class=\"col-sm mb-1\">\n        <img src=\"https://raw.githubusercontent.com/dieghernan/7egment/master/store/PC.gif\" alt=\"Animated 7egment watch face on Pebble Classic.\" />\n        <p class=\"caption\">The Pebble Classic edition uses a monochrome display.</p>\n</div>\n<div class=\"col-sm mb-1\">\n        <img src=\"https://raw.githubusercontent.com/dieghernan/7egment/master/store/PT.gif\" alt=\"Animated 7egment watch face on Pebble Time.\" />\n        <p class=\"caption\">The Pebble Time edition presents the same layout on a color screen.</p>\n</div>\n<div class=\"col-sm mb-1\">\n        <img src=\"https://raw.githubusercontent.com/dieghernan/7egment/master/store/PTR.gif\" alt=\"Animated 7egment watch face on Pebble Time Round.\" />\n        <p class=\"caption\">The Pebble Time Round edition adapts the layout to a circular screen.</p>\n</div>\n</div>\n\n<h2 id=\"attributions\">Attributions</h2>\n\n<h3 id=\"fonts\">Fonts</h3>\n\n<ul>\n  <li><a href=\"http://www.keshikan.net/fonts-e.html\">DSEG7Modern-Bold</a> by Keshikan けしかん.</li>\n  <li><a href=\"https://fontsgeek.com/fonts/Digital7-Regular\">Digital7-Regular</a> downloaded from <a href=\"http://fontsgeek.com\">fontsgeek.com</a></li>\n</ul>\n\n<h3 id=\"weather-providers\">Weather providers</h3>\n\n<div class=\"row\">\n<div class=\"col\">\n<a href=\"https://www.wunderground.com/?apiref=fb6856330e74c168\"><img src=\"https://icons.wxug.com/logos/PNG/wundergroundLogo_4c.png\" width=\"120\" alt=\"Weather Underground\" /></a>\n</div>\n<div class=\"col\">\n<a href=\"https://openweathermap.org/\"><img src=\"https://openweathermap.org/themes/openweathermap/assets/vendor/owm/img/icons/logo_60x60.png\" width=\"60\" alt=\"OpenWeatherMap\" /></a>\n</div>\n</div>\n\n<h3 id=\"others\">Others</h3>\n\n<p>Master Key (pmkey.xyz) was a service for Pebble users that managed API keys\nthrough a unique PIN.</p>\n\n<h2 id=\"license\">License</h2>\n\n<p>Licensed under the <a href=\"https://raw.githubusercontent.com/dieghernan/7egment/master/LICENSE\">MIT license</a>.</p>\n\n<p><strong>Made in Madrid, Spain ❤️</strong></p>\n",
      "date_published": "2017-05-17T00:00:00+02:00",
      "image": "https://raw.githubusercontent.com/dieghernan/7egment/master/store/Banner.png",
      "summary": "7egment is a customizable watch face based on the classic 7-segment display that adds your location and current weather information in the language used on your watch and smartphone.",
      "tags": ["discontinued","project","pebble","watchface","javascript","C"],
      "authors": [{
        "name": "Diego HH",
        "url": "https://dieghernan.github.io/"
      }]
    },
    {
      "id": "https://dieghernan.github.io/projects/Sfera/",
      "url": "https://dieghernan.github.io/projects/Sfera/",
      "title": "Sfera",
      "content_html": "<p class=\"alert alert-danger p-3 mx-2 mb-3 lead\"><strong>Project discontinued</strong> due to the shutdown of Pebble.</p>\n\n<p><strong>Sfera</strong> for Pebble Time Round is a highly customizable watch face that gets\nthe most out of the smartwatch’s capabilities. Set your preferences and enjoy this\nbeautifully designed watch face.</p>\n\n<p><img src=\"https://raw.githubusercontent.com/dieghernan/Sfera/master/assets/SferaBanner.png\" alt=\"Sfera watch face on Pebble Time Round.\" /></p>\n<p class=\"caption\">Users can choose analog, digital, dual or mixed clock modes.</p>\n\n<div class=\"text-center\">\n<a class=\"btn btn-primary my-3 text-white\" href=\"https://apps.rebble.io/en_US/application/58c2f7110dfc32a52a00081f?native=false&amp;query=Sfera&amp;section=watchfaces\">Download from Rebble Appstore</a>\n</div>\n\n<h2 id=\"features\">Features</h2>\n\n<ul>\n  <li>Clock mode:\n    <ul>\n      <li>Analog: Classic analog watch face</li>\n      <li>Digital: Centered hour and minute display based on analog movement</li>\n      <li>Dual: Analog and digital, all in one</li>\n      <li>Mix: Digital hour and analog minute</li>\n    </ul>\n  </li>\n  <li>Autodetection of 12h/24h mode based on your watch settings</li>\n</ul>\n\n<h2 id=\"take-your-pick\">Take your pick</h2>\n\n<ul>\n  <li>Date - Get the weekday based on the language set on your Pebble.</li>\n  <li>Dots as minute markers - choose your color</li>\n  <li>Battery level displayed beautifully as an arc near the bezel. Choose your color and, below 20%, it turns red!</li>\n  <li>Weather: Current conditions in °C or °F.</li>\n  <li>Choose your weather provider:\n    <ul>\n      <li><a href=\"https://www.yahoo.com/?ilc=401\">Yahoo.com</a> <em>No API key required at this moment</em></li>\n      <li><a href=\"https://www.wunderground.com/?apiref=fb6856330e74c168\">Wunderground</a></li>\n      <li><a href=\"https://openweathermap.org/\">OpenWeatherMap</a></li>\n    </ul>\n  </li>\n  <li>Historical integration with Master Key (pmkey.xyz)</li>\n  <li>Location based on your selected weather provider</li>\n  <li>Night theme displayed between sunset and sunrise</li>\n</ul>\n\n<h2 id=\"internationalization\">Internationalization</h2>\n\n<p>Automatic weekday translation is supported for:</p>\n\n<ul>\n  <li>English</li>\n  <li>Spanish</li>\n  <li>German</li>\n  <li>French</li>\n  <li>Portuguese</li>\n  <li>Italian</li>\n</ul>\n\n<h2 id=\"future-developments\">Future developments</h2>\n\n<ul class=\"task-list\">\n  <li class=\"task-list-item\"><input type=\"checkbox\" class=\"task-list-item-checkbox\" disabled=\"disabled\" checked=\"checked\" />12/24h mode</li>\n  <li class=\"task-list-item\"><input type=\"checkbox\" class=\"task-list-item-checkbox\" disabled=\"disabled\" checked=\"checked\" />Night theme</li>\n  <li class=\"task-list-item\"><input type=\"checkbox\" class=\"task-list-item-checkbox\" disabled=\"disabled\" checked=\"checked\" />Several weather providers available</li>\n  <li class=\"task-list-item\"><input type=\"checkbox\" class=\"task-list-item-checkbox\" disabled=\"disabled\" checked=\"checked\" />Master Key (pmkey.xyz) was implemented for easy API key management</li>\n</ul>\n\n<h2 id=\"screenshots\">Screenshots</h2>\n\n<p><img src=\"https://raw.githubusercontent.com/dieghernan/Sfera/master/assets/SferaGif.gif\" alt=\"Animated Sfera watch face on Pebble Time Round.\" /></p>\n<p class=\"caption\">The face also offers a battery arc, weather and an automatic night theme.</p>\n\n<h2 id=\"attributions\">Attributions</h2>\n\n<h3 id=\"fonts\">Fonts</h3>\n\n<ul>\n  <li><a href=\"https://erikflowers.github.io/weather-icons\">Weather Icons</a> by Eric Flowers,\nmodified and fitted to the regular alphabet instead of Unicode values.</li>\n  <li>Custom font for icons created via <strong>Fontastic</strong> downloaded from <a href=\"http://fontsgeek.com\">fontsgeek.com</a></li>\n</ul>\n\n<h3 id=\"weather-providers\">Weather providers</h3>\n\n<div class=\"row\">\n<div class=\"col\">\n<a href=\"https://www.yahoo.com/?ilc=401\"><img src=\"https://poweredby.yahoo.com/purple.png\" alt=\"Powered by Yahoo\" /></a>\n</div>\n<div class=\"col\">\n<a href=\"https://www.wunderground.com/?apiref=fb6856330e74c168\"><img src=\"https://icons.wxug.com/logos/PNG/wundergroundLogo_4c.png\" width=\"120\" alt=\"Weather Underground\" /></a>\n</div>\n<div class=\"col\">\n<a href=\"https://openweathermap.org/\"><img src=\"https://openweathermap.org/themes/openweathermap/assets/vendor/owm/img/icons/logo_60x60.png\" width=\"60\" alt=\"OpenWeatherMap\" /></a>\n</div>\n</div>\n\n<h3 id=\"others\">Others</h3>\n\n<p>Master Key (pmkey.xyz) was a service for Pebble users that managed API keys\nthrough a unique PIN.</p>\n\n<h2 id=\"license\">License</h2>\n\n<p>Licensed under the <a href=\"https://raw.githubusercontent.com/dieghernan/Sfera/master/LICENSE\">MIT license</a>.</p>\n\n<p><strong>Made in Madrid, Spain ❤️</strong></p>\n",
      "date_published": "2017-03-14T00:00:00+01:00",
      "image": "https://raw.githubusercontent.com/dieghernan/Sfera/master/assets/SferaBanner.png",
      "summary": "Sfera for Pebble Time Round is a highly customizable watch face that gets the most out of the smartwatch’s capabilities. Set your preferences and enjoy this beautifully designed watch face.",
      "tags": ["discontinued","project","pebble","watchface","javascript","C"],
      "authors": [{
        "name": "Diego HH",
        "url": "https://dieghernan.github.io/"
      }]
    },
    {
      "id": "https://dieghernan.github.io/projects/TextWatchClima/",
      "url": "https://dieghernan.github.io/projects/TextWatchClima/",
      "title": "TextWatch Clima",
      "content_html": "<p class=\"alert alert-danger p-3 mx-2 mb-3 lead\"><strong>Project discontinued</strong> due to the shutdown of Pebble.</p>\n\n<p><strong>TextWatch Clima</strong> upgrades the classic TextWatch watch face by adding a set of\nnew capabilities.</p>\n\n<p><img src=\"https://raw.githubusercontent.com/dieghernan/TextWatchClima/master/store/BannerRound.png\" alt=\"TextWatch Clima watch face displaying the time in words on Pebble Time Round.\" /></p>\n<p class=\"caption\">Weather and battery indicators can accompany the word-based time.</p>\n\n<p><strong>Available for all Pebble Classic, Pebble Time and Pebble 2 models</strong></p>\n\n<div class=\"text-center\">\n<a class=\"btn btn-primary my-3 text-white\" href=\"https://apps.rebble.io/en_US/application/58a94da90dfc32d35b0002f8?section=watchfaces\">Download from Rebble Appstore</a>\n</div>\n\n<h2 id=\"features\">Features</h2>\n\n<ul>\n  <li>Exact time in natural language</li>\n  <li>Autofit to screen</li>\n</ul>\n\n<p><img src=\"https://raw.githubusercontent.com/dieghernan/TextWatchClima/master/store/BannerTime.png\" alt=\"TextWatch Clima watch face displaying the time in words on Pebble Time.\" /></p>\n<p class=\"caption\">Fuzzy time and animated text are optional display settings.</p>\n\n<h2 id=\"take-your-pick\">Take your pick</h2>\n\n<ul>\n  <li>Date format: Day Month / Month Day</li>\n  <li>Fuzzy time option</li>\n  <li>Text animation</li>\n  <li>Language\n    <ul>\n      <li>Spanish</li>\n      <li>English</li>\n      <li>German (thanks to <a href=\"https://github.com/rodher\">rodher</a>)</li>\n      <li>French</li>\n      <li>Italian</li>\n      <li>Portuguese</li>\n      <li>Norwegian</li>\n      <li>Danish</li>\n      <li>Swedish</li>\n      <li>Esperanto</li>\n      <li>Dutch</li>\n      <li>Catalan * <em>More available on request</em></li>\n    </ul>\n  </li>\n  <li>Battery bar display</li>\n  <li>Weather: Current conditions in °C or °F.</li>\n  <li>Night theme displayed between sunset and sunrise</li>\n  <li>Choose your weather provider:\n    <ul>\n      <li><strong>Yahoo</strong> <em>No API key required at this moment</em></li>\n      <li><strong><a href=\"https://www.wunderground.com/?apiref=fb6856330e74c168\">Wunderground</a></strong></li>\n      <li><strong><a href=\"https://openweathermap.org/\">OpenWeatherMap</a></strong></li>\n    </ul>\n  </li>\n  <li><strong>Historical integration with Master Key (pmkey.xyz)</strong></li>\n</ul>\n\n<p><img src=\"https://raw.githubusercontent.com/dieghernan/TextWatchClima/master/store/BannerClass.png\" alt=\"TextWatch Clima watch face displaying the time in words on Pebble Classic.\" /></p>\n<p class=\"caption\">The watch face supports multiple languages and optional date formats.</p>\n\n<h2 id=\"future-developments\">Future developments</h2>\n\n<ul class=\"task-list\">\n  <li class=\"task-list-item\"><input type=\"checkbox\" class=\"task-list-item-checkbox\" disabled=\"disabled\" checked=\"checked\" />Fuzzy time</li>\n  <li class=\"task-list-item\"><input type=\"checkbox\" class=\"task-list-item-checkbox\" disabled=\"disabled\" checked=\"checked\" />Battery</li>\n  <li class=\"task-list-item\"><input type=\"checkbox\" class=\"task-list-item-checkbox\" disabled=\"disabled\" checked=\"checked\" />Option for animations</li>\n  <li class=\"task-list-item\"><input type=\"checkbox\" class=\"task-list-item-checkbox\" disabled=\"disabled\" checked=\"checked\" />Option for non-pmkey users</li>\n  <li class=\"task-list-item\"><input type=\"checkbox\" class=\"task-list-item-checkbox\" disabled=\"disabled\" checked=\"checked\" />More languages (Swedish, Esperanto…)</li>\n</ul>\n\n<h2 id=\"attributions\">Attributions</h2>\n\n<h3 id=\"fonts\">Fonts</h3>\n\n<ul>\n  <li><a href=\"https://erikflowers.github.io/weather-icons\">Weather Icons</a> by Eric Flowers,\nmodified and fitted to the regular alphabet instead of Unicode values.</li>\n  <li>Custom font for icons created via Fontastic.</li>\n  <li>Gotham Fonts downloaded from <a href=\"http://fontsgeek.com\">fontsgeek.com</a></li>\n</ul>\n\n<h3 id=\"weather-providers\">Weather providers</h3>\n\n<div class=\"row\">\n<div class=\"col\">\n<a href=\"https://www.yahoo.com/?ilc=401\"><img src=\"https://poweredby.yahoo.com/purple.png\" alt=\"Powered by Yahoo\" /></a>\n</div>\n<div class=\"col\">\n<a href=\"https://www.wunderground.com/?apiref=fb6856330e74c168\"><img src=\"https://icons.wxug.com/logos/PNG/wundergroundLogo_4c.png\" width=\"120\" alt=\"Weather Underground\" /></a>\n</div>\n<div class=\"col\">\n<a href=\"https://openweathermap.org/\"><img src=\"https://openweathermap.org/themes/openweathermap/assets/vendor/owm/img/icons/logo_60x60.png\" width=\"60\" alt=\"OpenWeatherMap\" /></a>\n</div>\n</div>\n\n<h3 id=\"others\">Others</h3>\n\n<ul>\n  <li>Master Key (pmkey.xyz) was a service for Pebble users that managed API keys\nthrough a unique PIN.</li>\n  <li><a href=\"https://github.com/wackyneighbor\">wackyneighbor</a> project <a href=\"https://github.com/wackyneighbor/DC_Text_Watch_Deluxe\">DC TextWatch Deluxe</a></li>\n</ul>\n\n<h2 id=\"screenshots\">Screenshots</h2>\n\n<div class=\"row\">\n<div class=\"col-sm mb-1\">\n        <img src=\"https://raw.githubusercontent.com/dieghernan/TextWatchClima/master/store/ScrShClass.gif\" alt=\"Animated TextWatch Clima watch face on Pebble Classic.\" />\n        <p class=\"caption\">The Classic edition supports multilingual display and optional weather.</p>\n</div>\n<div class=\"col-sm mb-1\">\n        <img src=\"https://raw.githubusercontent.com/dieghernan/TextWatchClima/master/store/ScrShTime.gif\" alt=\"Animated TextWatch Clima watch face on Pebble Time.\" />\n        <p class=\"caption\">Text animation and fuzzy time are optional on this edition.</p>\n</div>\n<div class=\"col-sm mb-1\">\n        <img src=\"https://raw.githubusercontent.com/dieghernan/TextWatchClima/master/store/ScrShRound.gif\" alt=\"Animated TextWatch Clima watch face on Pebble Time Round.\" />\n        <p class=\"caption\">Weather, battery status and a night theme are additional options.</p>\n</div>\n</div>\n\n<h2 id=\"license\">License</h2>\n\n<p>Licensed under the <a href=\"https://github.com/dieghernan/TextWatchES_Weather/blob/master/MIT%20License\">MIT license</a>.</p>\n\n<p><strong>Made in Madrid, Spain ❤️</strong></p>\n",
      "date_published": "2017-02-16T00:00:00+01:00",
      "image": "https://raw.githubusercontent.com/dieghernan/TextWatchClima/master/store/BannerRound.png",
      "summary": "TextWatch Clima upgrades the classic TextWatch watch face by adding a set of new capabilities.",
      "tags": ["discontinued","project","pebble","watchface","javascript","C"],
      "authors": [{
        "name": "Diego HH",
        "url": "https://dieghernan.github.io/"
      }]
    }
    
  ]
}
