<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/">
	<channel>
		<title>One world | Projects, maps and coding</title>
		<generator>(c) Chulapa Jekyll Theme RSS generator</generator>
		<link>https://dieghernan.github.io/</link>
		<description>R packages, spatial data, maps and open-source projects by dieghernan</description>
		<language>en-US</language>
		<copyright>(c) 2026, dieghernan</copyright>	
		<pubDate>Wed, 07 Oct 2026 19:32:42 +0200</pubDate>
		<lastBuildDate>Wed, 07 Oct 2026 19:32:42 +0200</lastBuildDate>
		<category>blog</category>
		<ttl>60</ttl>
		<atom:link href="https://dieghernan.github.io/rss.xml" rel="self" type="application/rss+xml" />
		<image>
			<title>One world | Projects, maps and coding</title>
			<url>https://dieghernan.github.io/assets/img/site/banner.png</url>
			<link>https://dieghernan.github.io/</link>
			<description>R packages, spatial data, maps and open-source projects by dieghernan</description>
		</image><item>
			<title>Introducing geobounds</title>
			<description>
				<![CDATA[	
 				<h3>Easy access to administrative boundaries from geoBoundaries</h3>
    		<p>3 min.</p>
				<div><p>If you’ve ever worked with spatial data in <strong>R</strong>, this may ring a bell…</p>

<ul>
  <li>Search for boundary data</li>
  <li>Figure out which version is “official”</li>
  <li>Download a shapefile</li>
  <li>Unzip it</li>
  <li>Load it</li>
  <li>Fix projections</li>
  <li>Repeat</li>
</ul>

<p>While searching for new data sources, I found the excellent
<a href="https://www.geoboundaries.org/">geoBoundaries</a> database. However, accessing the
data can be tedious since it’s provided as zipped shapefiles, and as any GIS
professional knows, <a href="http://switchfromshapefile.org/">shapefiles should die!</a></p>

<p>Previously, the <strong>rgeoboundaries</strong> package was on CRAN and allowed access to
the geoBoundaries API, but it was archived. So I decided to create my own
version, and <strong>geobounds</strong> was born.</p>

<ul>
  <li>Source code: <a href="https://github.com/dieghernan/geobounds">https://github.com/dieghernan/geobounds</a></li>
  <li><strong>pkgdown</strong> website: <a href="https://dieghernan.github.io/geobounds/">https://dieghernan.github.io/geobounds/</a></li>
</ul>

<p>It connects directly to the excellent
<a href="https://www.geoboundaries.org/">geoBoundaries</a> database and returns clean,
ready-to-use <strong>sf</strong> objects with a single function call. No manual downloads and
no shapefile handling.</p>

<p>This is how it works.</p>

<h2 id="installation">Installation</h2>

<p><strong>geobounds</strong> was recently accepted on
<a href="https://cran.r-project.org/package=geobounds">CRAN</a>, so just install it with:</p>

<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">
</span></code></pre></div></div>

<p>Load the package and other complementary packages:</p>

<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">
</span><span class="n">library</span><span class="p">(</span><span class="n">sf</span><span class="p">)</span><span class="w">
</span><span class="n">library</span><span class="p">(</span><span class="n">ggplot2</span><span class="p">)</span><span class="w">
</span><span class="n">library</span><span class="p">(</span><span class="n">dplyr</span><span class="p">)</span><span class="w">
</span></code></pre></div></div>

<h2 id="getting-administrative-levels-adm">Getting administrative levels (ADM)</h2>

<p>Administrative level 0 (ADM0) corresponds to countries:</p>

<div class="language-r highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># Panama</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">"Panama"</span><span class="p">)</span><span class="w"> </span><span class="o">|&gt;</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">
  </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">
  </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">
</span></code></pre></div></div>

<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>

<p>You can also retrieve multiple administrative levels at once. For example:</p>

<div class="language-r highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># Simplified files</span><span class="w">
</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">
  </span><span class="n">ggplot</span><span class="p">()</span><span class="w"> </span><span class="o">+</span><span class="w">
  </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">
  </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">
  </span><span class="n">scale_fill_viridis_d</span><span class="p">()</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">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">
    </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">
    </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">
  </span><span class="p">)</span><span class="w">
</span></code></pre></div></div>

<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>

<h2 id="global-composite-boundaries-cgaz">Global Composite Boundaries (CGAZ)</h2>

<p>When you download individual country files, each country reflects its own view
of borders. This results in:</p>

<ul>
  <li>Overlapping boundaries</li>
  <li>Geographic gaps</li>
  <li>Disputed territories</li>
</ul>

<p>For clean global visualizations, geoBoundaries provides a Composite Global
Administrative Zones (CGAZ) dataset that can be accessed with <code class="language-plaintext highlighter-rouge">gb_get_world()</code>.</p>

<p>Here’s an example with country-level files:</p>

<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">
</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">
  </span><span class="c1"># Disputed area: Kashmir</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">
  </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">
  </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">
  </span><span class="n">labs</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">"Country"</span><span class="p">,</span><span class="w">
    </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">
    </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">
    </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">
  </span><span class="p">)</span><span class="w">
</span></code></pre></div></div>

<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>

<p>And here’s the same comparison using CGAZ with <code class="language-plaintext highlighter-rouge">gb_get_world()</code>:</p>

<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">
  </span><span class="n">ggplot</span><span class="p">()</span><span class="w"> </span><span class="o">+</span><span class="w">
  </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">
  </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">
  </span><span class="n">labs</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">"Country"</span><span class="p">,</span><span class="w">
    </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">
    </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">
    </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">
  </span><span class="p">)</span><span class="w">
</span></code></pre></div></div>

<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>

<h2 id="understanding-the-data">Understanding the data</h2>

<p>The geoBoundaries database undergoes rigorous quality assurance, including
manual review and hand-digitization of physical maps. This ensures the highest
level of spatial accuracy for scientific and academic research.</p>

<p>This precision comes at a cost: some files can be large and take longer to
download. For visualization and general mapping, we recommend using simplified
datasets by setting <code class="language-plaintext highlighter-rouge">simplified = TRUE</code>.</p>

<div class="language-r highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># Different resolutions</span><span class="w">
</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">
  </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">
</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">
</span><span class="c1">#&gt; 26.5 Mb</span><span class="w">

</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">
  </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">
</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">
</span><span class="c1">#&gt; 1.5 Mb</span><span class="w">

</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">

</span><span class="c1"># Plot with ggplot2</span><span class="w">
</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">
  </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">
  </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">
  </span><span class="n">theme_minimal</span><span class="p">()</span><span class="w"> </span><span class="o">+</span><span class="w">
  </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">
</span></code></pre></div></div>

<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>

<h2 id="caching">Caching</h2>

<p>Downloaded files are cached locally. That means:</p>

<ul>
  <li>You download once</li>
  <li>Re-running your script is fast</li>
  <li>Your workflow stays reproducible</li>
</ul>

<p>You can set the cache directory with:</p>

<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">
</span></code></pre></div></div>

<h2 id="when-should-you-use-geobounds">When should you use <strong>geobounds</strong>?</h2>

<p>Use <strong>geobounds</strong> when:</p>

<ul>
  <li>You need reliable global administrative boundaries</li>
  <li>You want reproducible workflows</li>
  <li>You prefer code over manual downloads</li>
  <li>You’re building maps, dashboards or spatial analyses</li>
</ul>

<h2 id="related-packages">Related packages</h2>

<p><strong>geobounds</strong> is not alone in this space. Depending on your needs, you might
also want to look at:</p>

<h3 id="rnaturalearth"><strong>rnaturalearth</strong></h3>

<p>A very popular package to access Natural Earth datasets directly from <strong>R</strong>. It’s
lightweight and great for quick global maps, especially at small scales.</p>

<p>If you need physical layers (rivers, coastlines, elevation) alongside political
boundaries, this is often a good choice.</p>

<h3 id="giscor"><strong>giscoR</strong></h3>

<p>If your focus is Europe, <strong>giscoR</strong> provides direct access to Eurostat GISCO
data. It’s particularly useful for NUTS regions and European statistical
boundaries.</p>

<h3 id="osmdata"><strong>osmdata</strong></h3>

<p>When administrative boundaries are not enough and you need OpenStreetMap
features (roads, POIs, land use, etc.), <strong>osmdata</strong> gives you powerful querying
capabilities.</p>

<h2 id="bottom-line">Bottom line</h2>

<p>I built <strong>geobounds</strong> to provide direct access to geoBoundaries products. I hope
this package will help you in your GIS journey.</p>

<p>Happy mapping!</p>
</div>
				]]>
			</description>
			<link>https://dieghernan.github.io/202602_geobounds/</link>
			<category>posts</category>
		    <category>geobounds</category><category>ggplot2</category><category>maps</category><category>r_bloggers</category><category>rspatial</category><category>rstats</category><category>sf</category><media:title type="html"><![CDATA[Introducing <strong>geobounds</strong> ]]></media:title>
      <media:content url="https://dieghernan.github.io/assets/img/blog/202602-overlaps-1.webp" medium="image"/>
      <media:thumbnail url="https://dieghernan.github.io/assets/img/blog/202602-overlaps-1.webp" /><guid isPermaLink="true">https://dieghernan.github.io/202602_geobounds/</guid>
      <pubDate>Thu, 12 Feb 2026 00:00:00 +0100</pubDate>
		</item><item>
			<title>Mapping Antarctica</title>
			<description>
				<![CDATA[	
 				<h3>Cool maps from the South Pole</h3>
    		<p>6 min.</p>
				<div><p>Creating maps with <strong>R</strong> is usually straightforward, but representations that
cross the <a href="https://en.wikipedia.org/wiki/International_Date_Line">International Date
Line</a> or that use polar
projections can be tricky.</p>

<p>Different spatial-data providers use different conventions: some break
geometries at certain longitudes (for example, cutting the Chukchi Peninsula),
while others omit portions of the data. These inconsistencies can produce
awkward artifacts near the poles.</p>

<p>In this post I fix the <a href="https://ec.europa.eu/eurostat/web/gisco">GISCO (European
Commission)</a> shapefile for Antarctica
and produce clean orthographic maps. I walk through the manual corrections and
then create a few example maps.</p>

<div class="language-r highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># Libraries</span><span class="w">
</span><span class="n">library</span><span class="p">(</span><span class="n">tidyverse</span><span class="p">)</span><span class="w">
</span><span class="n">library</span><span class="p">(</span><span class="n">sf</span><span class="p">)</span><span class="w">
</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="n">library</span><span class="p">(</span><span class="n">ggrepel</span><span class="p">)</span><span class="w">
</span><span class="n">library</span><span class="p">(</span><span class="n">rmapshaper</span><span class="p">)</span><span class="w">
</span></code></pre></div></div>

<h2 id="fixing-the-geometry">Fixing the geometry</h2>

<p>First, we obtain the GISCO Antarctica polygon and transform it to an
orthographic projection centered on the South Pole.</p>

<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">
  </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">
  </span><span class="c1"># Orthographic projection centered on the South Pole</span><span class="w">
  </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">

</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">
  </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">
</span></code></pre></div></div>

<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>

<p>The shapefile contains a visible “lollipop” cut that looks unnatural in an
orthographic projection. I correct it manually with these steps:</p>

<ol>
  <li>Identify the polygon that represents the main Antarctic landmass.</li>
  <li>Convert that polygon to a sequence of coordinates (points).</li>
  <li>Remove the small sequence of points that create the artifact.</li>
  <li>Rebuild the polygon from the cleaned coordinates and replace the broken
geometry with the corrected one.</li>
</ol>

<p>We convert polygons to point coordinates and inspect them to find the offending
sequence:</p>

<div class="language-r highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># Identify the largest polygon</span><span class="w">
</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">
  </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="n">nrow</span><span class="p">(</span><span class="n">ant_explode</span><span class="p">)</span><span class="w">
</span><span class="c1">#&gt; [1] 778</span><span class="w">

</span><span class="c1"># Largest polygon</span><span class="w">

</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">

</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">
  </span><span class="n">as_tibble</span><span class="p">()</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
  </span><span class="c1"># Add an ID for the points</span><span class="w">
  </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">


</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">
  </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">
  </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">
  </span><span class="n">coord_equal</span><span class="p">()</span><span class="w">
</span></code></pre></div></div>

<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>

<p>From the plotted indices, we can see the problematic points fall roughly in the
range 8200–9200. We inspect that interval in detail to select the exact indices
to remove.</p>

<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">
  </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">

</span><span class="n">test</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
  </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">
  </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">
  </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></code></pre></div></div>

<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>

<div class="alert alert-warning p-3 mx-2 mb-3">

Note: This cleaning is tailored to this specific shapefile and may need to be
repeated for other shapefiles. The approach is straightforward but depends on
the particular geometry and projection.

</div>

<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">

</span><span class="n">test</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">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="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">
  </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">
  </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">


</span><span class="n">test</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="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="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">
  </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">
  </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">
</span></code></pre></div></div>

<div class="figure row no-gutters">
<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%" />

After removing the offending points, we rebuild the polygon and reconstitute the
full Antarctica shape from the corrected piece plus the remaining polygons.

</div>

<div class="language-r highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># From coordinates to polygon</span><span class="w">
</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">
  </span><span class="n">as.data.frame</span><span class="p">()</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="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">
  </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">
  </span><span class="n">as.matrix</span><span class="p">()</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
  </span><span class="nf">list</span><span class="p">()</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
  </span><span class="n">st_polygon</span><span class="p">()</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="w"> </span><span class="o">|&gt;</span><span class="w">
  </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">

</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">

</span><span class="c1"># Regenerate initial shape</span><span class="w">
</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">
  </span><span class="n">ant_max_fixed</span><span class="p">,</span><span class="w">
  </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">
</span><span class="p">)</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
  </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">
  </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">
  </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">
  </span><span class="n">st_make_valid</span><span class="p">()</span><span class="w">

</span><span class="n">antarctica_fixed</span><span class="w">
</span><span class="c1">#&gt; Simple feature collection with 1 feature and 1 field</span><span class="w">
</span><span class="c1">#&gt; Geometry type: MULTIPOLYGON</span><span class="w">
</span><span class="c1">#&gt; Dimension:     XY</span><span class="w">
</span><span class="c1">#&gt; Bounding box:  xmin: -2583099 ymin: -2458296 xmax: 2690846 ymax: 2233395</span><span class="w">
</span><span class="c1">#&gt; Projected CRS: +proj=ortho +lat_0=-90 +lon_0=0</span><span class="w">
</span><span class="c1">#&gt; # A tibble: 1 × 2</span><span class="w">
</span><span class="c1">#&gt;   NAME                                                                     geometry</span><span class="w">
</span><span class="c1">#&gt; * &lt;chr&gt;                                                          &lt;MULTIPOLYGON [m]&gt;</span><span class="w">
</span><span class="c1">#&gt; 1 Antarctica (((-2456385 1179033, -2456141 1178965, -2456464 1178341, -2456563 117…</span><span class="w">

</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">
  </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">
</span></code></pre></div></div>

<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>

<h2 id="plotting-examples">Plotting examples</h2>

<p>With the corrected shape we can produce maps. Below are a few examples based on
proposed Antarctic flag designs.</p>

<h3 id="graham-bartrams-proposal-1996">Graham Bartram’s proposal (1996)</h3>

<p>A simple rendition of Bartram’s original concept:</p>

<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">

</span><span class="n">antarctica_fixed</span><span class="w"> </span><span class="o">|&gt;</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">
  </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">
  </span><span class="n">theme</span><span class="p">(</span><span class="w">
    </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">
    </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">
    </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">
    </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">
  </span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w">
  </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">
  </span><span class="n">coord_sf</span><span class="p">(</span><span class="w">
    </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">
    </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">
  </span><span class="p">)</span><span class="w">
</span></code></pre></div></div>

<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>

<h3 id="emblem-of-the-antarctic-treaty">Emblem of the Antarctic Treaty</h3>

<p>This example uses graticules to create a concentric “bullseye” pattern around
Antarctica. Generating such graticules and merging meridians requires a few
extra steps to avoid small gaps near the pole.</p>

<div class="language-r highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># Need graticules</span><span class="w">
</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">
  </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">
  </span><span class="c1"># Specify the cuts of the graticules</span><span class="w">
  </span><span class="n">st_graticule</span><span class="p">(</span><span class="w">
    </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">
    </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">
    </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">
    </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">
  </span><span class="p">)</span><span class="w">


</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">
  </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">
</span></code></pre></div></div>

<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>

<p>We merge meridians so the area around the South Pole is filled. <code class="language-plaintext highlighter-rouge">st_graticule()</code>
can leave a tiny hole at the pole, and we fix this by joining complementary
meridians.</p>

<div class="language-r highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># Merge meridians</span><span class="w">
</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">
  </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">
    </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">
    </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">

  </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">
    </span><span class="n">st_geometry</span><span class="p">()</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">"MULTIPOINT"</span><span class="p">)</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
    </span><span class="n">st_union</span><span class="p">()</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">

  </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">
    </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">
    </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="n">geometry</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">df2</span><span class="w">
  </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"> </span><span class="n">bind_rows</span><span class="p">()</span><span class="w">


</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">
  </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">
    </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></code></pre></div></div>

<p>We then cut and color the resulting graticules so they form the emblem-like
pattern.</p>

<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">

</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">
</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">
</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">

</span><span class="n">antarctica_simp</span><span class="w"> </span><span class="o">|&gt;</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">
  </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">
  </span><span class="n">theme</span><span class="p">(</span><span class="w">
    </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">
    </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">
    </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">
    </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">
  </span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w">
  </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">
  </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">
  </span><span class="n">coord_sf</span><span class="p">(</span><span class="w">
    </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">
    </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">
  </span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w">
  </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">
</span></code></pre></div></div>

<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>

<h3 id="antarctica-flag-redesigned">Antarctica flag redesigned</h3>

<p>In 2024, Graham Bartram revealed a new version of his original flag as part of
a global campaign to raise awareness about the growing problem of microplastic
pollution. The new design keeps the familiar white outline of Antarctica but
swaps the plain blue background for one filled with countless tiny, colorful
dots. These dots represent the microscopic bits of plastic that have been
discovered even in the planet’s most untouched places, including the Antarctic
ice and its surrounding oceans.</p>

<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>

<p>Because the design relies on randomness, we approximate it using the following
procedure:</p>

<ol>
  <li>Sample random points across the Antarctic polygon.</li>
  <li>Build Voronoi polygons from those points, then apply a small negative buffer
to create gaps.</li>
  <li>Randomly sample the resulting polygons to increase visual noise.</li>
  <li>Color polygons so larger areas remain white while smaller polygons use
magenta/pink tones.</li>
</ol>

<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">

</span><span class="n">ant_max_fixed</span><span class="w">
</span><span class="c1">#&gt; Simple feature collection with 1 feature and 1 field</span><span class="w">
</span><span class="c1">#&gt; Geometry type: POLYGON</span><span class="w">
</span><span class="c1">#&gt; Dimension:     XY</span><span class="w">
</span><span class="c1">#&gt; Bounding box:  xmin: -2447764 ymin: -2125910 xmax: 2690846 ymax: 2233395</span><span class="w">
</span><span class="c1">#&gt; Projected CRS: +proj=ortho +lat_0=-90 +lon_0=0</span><span class="w">
</span><span class="c1">#&gt;         NAME                       geometry</span><span class="w">
</span><span class="c1">#&gt; 1 Antarctica POLYGON ((-2423737 1557908,...</span><span class="w">

</span><span class="n">set.seed</span><span class="p">(</span><span class="m">2024</span><span class="p">)</span><span class="w">
</span><span class="c1"># Sample, Voronoi and negative buffer</span><span class="w">
</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">
  </span><span class="n">st_union</span><span class="p">()</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
  </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">
  </span><span class="n">st_collection_extract</span><span class="p">()</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
  </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">


</span><span class="c1"># Keep only those properly included in the outline</span><span class="w">

</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">
  </span><span class="n">as.vector</span><span class="p">()</span><span class="w">

</span><span class="c1"># Select random chunks</span><span class="w">
</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">
  </span><span class="n">st_as_sf</span><span class="p">()</span><span class="w"> </span><span class="o">|&gt;</span><span class="w">
  </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">

</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">
  </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">
</span></code></pre></div></div>

<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>

<div class="language-r highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="w">

</span><span class="c1"># Random coloring</span><span class="w">

</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">

</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">
</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">
  </span><span class="s2">"white"</span><span class="p">,</span><span class="w">
  </span><span class="n">plastic_end</span><span class="o">$</span><span class="n">fill</span><span class="w">
</span><span class="p">)</span><span class="w">

</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">
</span><span class="n">ggplot</span><span class="p">()</span><span class="w"> </span><span class="o">+</span><span class="w">
  </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">
  </span><span class="n">scale_fill_identity</span><span class="p">()</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">
    </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">
    </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">
    </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">
    </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">
  </span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w">
  </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">
  </span><span class="n">coord_sf</span><span class="p">(</span><span class="w">
    </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">
    </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">
  </span><span class="p">)</span><span class="w">
</span></code></pre></div></div>

<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>
</div>
				]]>
			</description>
			<link>https://dieghernan.github.io/202510_mapping-antarctica/</link>
			<category>posts</category>
		    <category>beautiful_maps</category><category>ggplot2</category><category>giscoR</category><category>maps</category><category>r_bloggers</category><category>rspatial</category><category>rstats</category><category>sf</category><media:title type="html"><![CDATA[Mapping Antarctica ]]></media:title>
      <media:content url="https://dieghernan.github.io/assets/img/blog/202510_good_pol-1.webp" medium="image"/>
      <media:thumbnail url="https://dieghernan.github.io/assets/img/blog/202510_good_pol-1.webp" /><guid isPermaLink="true">https://dieghernan.github.io/202510_mapping-antarctica/</guid>
      <pubDate>Sat, 25 Oct 2025 00:00:00 +0200</pubDate>
		</item><item>
			<title>Implementing group_by count in Liquid</title>
			<description>
				<![CDATA[	
 				<h3>See the magic happening</h3>
    		<p>5 min.</p>
				<div><p><a href="https://shopify.github.io/liquid/">Liquid</a> is an open-source template
language created by Shopify back in 2006 and written in Ruby. It is widely
used by several frameworks, with <a href="https://jekyllrb.com/">Jekyll</a> being one of
the most famous.</p>

<p>This website is created using Jekyll, specifically my Jekyll template
<span class="chulapa">Chulapa</span>
(<a href="https://dieghernan.github.io/chulapa">link</a>).</p>

<p>Some time ago, <a href="https://github.com/cargocultprogramming">@cargocultprogramming</a>
opened <a href="https://github.com/dieghernan/chulapa/issues/29">dieghernan/chulapa#29</a>
because one of the components of the theme was broken in Jekyll <code class="language-plaintext highlighter-rouge">&gt;=4.1.0</code>.
Digging a bit, I saw
<a href="https://github.com/jekyll/jekyll/issues/8214">jekyll/jekyll#8214</a>, exposing
the same issue. What seemed to be a feature was indeed a bug that some
developers were exploiting.</p>

<p>The change is that when applying the <code class="language-plaintext highlighter-rouge">group_by</code> Liquid filter on an array, it
used to produce a “grouped” version of the array, while in Jekyll <code class="language-plaintext highlighter-rouge">&gt;=4.1.0</code>
it produces a different result that can’t be used in the same way.</p>

<div class="language-html highlighter-rouge"><div class="highlight"><pre class="highlight"><code> {% assign alldocs = site.exercises %} {% assign grouptag = alldocs |
map: 'tags' | join: ',' | split: ',' | group_by: tag %} {{ grouptag }}

<span class="c">&lt;!-- Jekyll &lt; 4.1.0 result --&gt;</span>
{"name"=&gt;"tag A", "items"=&gt;["tag A"], "size"=&gt;1}{"name"=&gt;"Tag B", "items"=&gt;["Tag
B"], "size"=&gt;1}{"name"=&gt;"Virtualbox", "items"=&gt;["Virtualbox"],
"size"=&gt;1}{"name"=&gt;"netcat", "items"=&gt;["netcat"], "size"=&gt;1}{"name"=&gt;"whois",
"items"=&gt;["whois"], "size"=&gt;1}{"name"=&gt;"dig", "items"=&gt;["dig"], "size"=&gt;1} ...
{"name"=&gt;"Hydra", "items"=&gt;["Hydra"], "size"=&gt;1}

<span class="c">&lt;!-- Jekyll &gt;= 4.1.0 result --&gt;</span>
{"name"=&gt;"", "items"=&gt;["tag A", "Tag B", "Virtualbox", "netcat", "whois", "dig",
... , "Hydra"], "size"=&gt;26} 
</code></pre></div></div>

<p>So basically, counting items was not easy anymore. I developed a solution in
pure Liquid (which is quite verbose when working outside the predefined
filters) that is compatible with any Jekyll version.</p>

<p>The algorithm is now implemented in <span class="chulapa">Chulapa</span>. You
can check the results on my <a href="https://dieghernan.github.io/tags">/tags</a> page.</p>

<p>Note that the tables produced in the example are taken from my live site,
so they may change as I add more posts. The table results should
have the same order and number of tags displayed on the
<a href="https://dieghernan.github.io/tags">/tags</a> page.</p>

<h2 id="alternative-group_by-with-liquid">Alternative <code class="language-plaintext highlighter-rouge">group_by</code> with Liquid</h2>

<p>First, we define an array of all the tags included in the documents of my site:</p>

<div class="language-html highlighter-rouge"><div class="highlight"><pre class="highlight"><code> {% assign alldocs = site.documents %} {% assign alltags = alldocs |
map: 'tags' | join: ',' | split: ',' %} 
</code></pre></div></div>

<div>

<p>Cool! Now we can count the number of unique elements in
<code>alltags</code> by counting the occurrences of unique tags in the
array:</p>

</div>

<div class="language-html highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c">&lt;!-- Allocating array to group_by: replacement --&gt;</span>

<span class="c">&lt;!-- Unique values --&gt;</span>
{% assign single_tags = alltags | uniq %}

<span class="c">&lt;!-- Arrays to populate --&gt;</span>
{% assign count_tags = '' | split: ',' %}

<span class="c">&lt;!-- Iterator 0 to number of unique tags - 1 (size = number of unique tags) --&gt;</span>
{% assign n_tags = single_tags | size | minus: 1 %} {% for i in (0..n_tags) %}
<span class="c">&lt;!-- Populate --&gt;</span>
{% assign count_this_tag = alltags | where_exp:"item", "item == single_tags[i]"
| size %} {% assign count_tags = count_tags | push: count_this_tag %} {% endfor
%}

<span class="c">&lt;!-- Display single_tags and count_tags as a table --&gt;</span>
<span class="nt">&lt;table&gt;</span>
  <span class="nt">&lt;caption&gt;</span>
    Display count of tags on this site
  <span class="nt">&lt;/caption&gt;</span>
  <span class="nt">&lt;tr&gt;</span>
    <span class="nt">&lt;th&gt;</span>Tag<span class="nt">&lt;/th&gt;</span>
    <span class="nt">&lt;th&gt;</span>Count<span class="nt">&lt;/th&gt;</span>
  <span class="nt">&lt;/tr&gt;</span>
  {% for i in (0..n_tags) %}
  <span class="nt">&lt;tr&gt;</span>
    <span class="nt">&lt;td&gt;</span>{{ single_tags[i] }}<span class="nt">&lt;/td&gt;</span>
    <span class="nt">&lt;td&gt;</span>{{ count_tags[i] }}<span class="nt">&lt;/td&gt;</span>
  <span class="nt">&lt;/tr&gt;</span>
  {% endfor %}
<span class="nt">&lt;/table&gt;</span>

</code></pre></div></div>

<details>
  <summary>See results</summary>
<table>
  <caption>Display count of tags on this site </caption>
  <tr>
    <th>Tag</th>
    <th>Count</th>
  </tr>
    <tr>
      <td>r_bloggers</td>
      <td>22</td>
    </tr>
    <tr>
      <td>rstats</td>
      <td>23</td>
    </tr>
    <tr>
      <td>rspatial</td>
      <td>23</td>
    </tr>
    <tr>
      <td>sf</td>
      <td>14</td>
    </tr>
    <tr>
      <td>maps</td>
      <td>27</td>
    </tr>
    <tr>
      <td>vignette</td>
      <td>1</td>
    </tr>
    <tr>
      <td>rnaturalearth</td>
      <td>3</td>
    </tr>
    <tr>
      <td>function</td>
      <td>4</td>
    </tr>
    <tr>
      <td>leaflet</td>
      <td>5</td>
    </tr>
    <tr>
      <td>jekyll</td>
      <td>2</td>
    </tr>
    <tr>
      <td>html</td>
      <td>2</td>
    </tr>
    <tr>
      <td>beautiful_maps</td>
      <td>8</td>
    </tr>
    <tr>
      <td>giscoR</td>
      <td>10</td>
    </tr>
    <tr>
      <td>raster</td>
      <td>1</td>
    </tr>
    <tr>
      <td>flags</td>
      <td>4</td>
    </tr>
    <tr>
      <td>mapSpain</td>
      <td>3</td>
    </tr>
    <tr>
      <td>Wikipedia</td>
      <td>1</td>
    </tr>
    <tr>
      <td>cartography</td>
      <td>4</td>
    </tr>
    <tr>
      <td>svg</td>
      <td>1</td>
    </tr>
    <tr>
      <td>inset</td>
      <td>3</td>
    </tr>
    <tr>
      <td>r_package</td>
      <td>5</td>
    </tr>
    <tr>
      <td>classInt</td>
      <td>1</td>
    </tr>
    <tr>
      <td>terra</td>
      <td>6</td>
    </tr>
    <tr>
      <td>rasterpic</td>
      <td>1</td>
    </tr>
    <tr>
      <td>ggplot2</td>
      <td>10</td>
    </tr>
    <tr>
      <td>tmap</td>
      <td>1</td>
    </tr>
    <tr>
      <td>mapsf</td>
      <td>1</td>
    </tr>
    <tr>
      <td>discontinued</td>
      <td>8</td>
    </tr>
    <tr>
      <td>project</td>
      <td>11</td>
    </tr>
    <tr>
      <td>R</td>
      <td>5</td>
    </tr>
    <tr>
      <td>python</td>
      <td>2</td>
    </tr>
    <tr>
      <td>guest-author</td>
      <td>1</td>
    </tr>
    <tr>
      <td>COVID19</td>
      <td>3</td>
    </tr>
    <tr>
      <td>ggridges</td>
      <td>1</td>
    </tr>
    <tr>
      <td>tidyterra</td>
      <td>4</td>
    </tr>
    <tr>
      <td>maptiles</td>
      <td>1</td>
    </tr>
    <tr>
      <td>s2</td>
      <td>1</td>
    </tr>
    <tr>
      <td>astronomy</td>
      <td>2</td>
    </tr>
    <tr>
      <td>celestial</td>
      <td>2</td>
    </tr>
    <tr>
      <td>geojson</td>
      <td>2</td>
    </tr>
    <tr>
      <td>gpkg</td>
      <td>2</td>
    </tr>
    <tr>
      <td>resmush</td>
      <td>1</td>
    </tr>
    <tr>
      <td>liquid</td>
      <td>1</td>
    </tr>
    <tr>
      <td>chulapa</td>
      <td>1</td>
    </tr>
    <tr>
      <td>geobounds</td>
      <td>1</td>
    </tr>
    <tr>
      <td>pebble</td>
      <td>4</td>
    </tr>
    <tr>
      <td>watchface</td>
      <td>4</td>
    </tr>
    <tr>
      <td>javascript</td>
      <td>4</td>
    </tr>
    <tr>
      <td>C</td>
      <td>4</td>
    </tr>
    <tr>
      <td>webscraping</td>
      <td>1</td>
    </tr>
    <tr>
      <td>dataset</td>
      <td>2</td>
    </tr>
    <tr>
      <td>csv</td>
      <td>2</td>
    </tr>
    <tr>
      <td>json</td>
      <td>1</td>
    </tr>
    <tr>
      <td>twitter</td>
      <td>1</td>
    </tr></table>

</details>

<h2 id="sorting">Sorting</h2>

<p>How to rank the tags by the number of occurrences? We can set the maximum
number of occurrences and loop in reverse order. The ranked array would be
populated when a tag’s count matches the current number in the main loop:</p>

<div class="language-html highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c">&lt;!-- Used in https://github.com/mmistakes/minimal-mistakes/blob/master/_includes/posts-taxonomy.html --&gt;</span>
 {% assign items_max = count_tags | sort | last %} {% assign
sorted_tags = '' | split: ',' %} {% assign sorted_count_tags = '' | split: ','
%} {% for i in (1..items_max) reversed %} {% for j in (0..n_tags) %} {% if
count_tags[j] == i %} {% assign sorted_tags = sorted_tags | push: single_tags[j]
%} {% assign sorted_count_tags = sorted_count_tags | push: i %} {% endif %} {%
endfor %} {% endfor %} {% assign sorted_tags = sorted_tags | uniq %}

<span class="nt">&lt;table&gt;</span>
  <span class="nt">&lt;caption&gt;</span>
    Display sorted count of tags on this site
  <span class="nt">&lt;/caption&gt;</span>
  <span class="nt">&lt;tr&gt;</span>
    <span class="nt">&lt;th&gt;</span>Tag<span class="nt">&lt;/th&gt;</span>
    <span class="nt">&lt;th&gt;</span>Count (desc sorted)<span class="nt">&lt;/th&gt;</span>
  <span class="nt">&lt;/tr&gt;</span>
  {%- for i in (0..n_tags) %}
  <span class="nt">&lt;tr&gt;</span>
    <span class="nt">&lt;td&gt;</span>{{ sorted_tags[i] }}<span class="nt">&lt;/td&gt;</span>
    <span class="nt">&lt;td&gt;</span>{{ sorted_count_tags[i] }}<span class="nt">&lt;/td&gt;</span>
  <span class="nt">&lt;/tr&gt;</span>
  {%- endfor -%}
<span class="nt">&lt;/table&gt;</span>

</code></pre></div></div>

<details>
  <summary>See results</summary>

<table>
  <caption>Display sorted count of tags on this site </caption>
  <tr>
    <th>Tag</th>
    <th>Count (desc sorted)</th>
  </tr>
    <tr>
      <td>maps</td>
      <td>27</td>
    </tr>
    <tr>
      <td>rstats</td>
      <td>23</td>
    </tr>
    <tr>
      <td>rspatial</td>
      <td>23</td>
    </tr>
    <tr>
      <td>r_bloggers</td>
      <td>22</td>
    </tr>
    <tr>
      <td>sf</td>
      <td>14</td>
    </tr>
    <tr>
      <td>project</td>
      <td>11</td>
    </tr>
    <tr>
      <td>giscoR</td>
      <td>10</td>
    </tr>
    <tr>
      <td>ggplot2</td>
      <td>10</td>
    </tr>
    <tr>
      <td>beautiful_maps</td>
      <td>8</td>
    </tr>
    <tr>
      <td>discontinued</td>
      <td>8</td>
    </tr>
    <tr>
      <td>terra</td>
      <td>6</td>
    </tr>
    <tr>
      <td>leaflet</td>
      <td>5</td>
    </tr>
    <tr>
      <td>r_package</td>
      <td>5</td>
    </tr>
    <tr>
      <td>R</td>
      <td>5</td>
    </tr>
    <tr>
      <td>function</td>
      <td>4</td>
    </tr>
    <tr>
      <td>flags</td>
      <td>4</td>
    </tr>
    <tr>
      <td>cartography</td>
      <td>4</td>
    </tr>
    <tr>
      <td>tidyterra</td>
      <td>4</td>
    </tr>
    <tr>
      <td>pebble</td>
      <td>4</td>
    </tr>
    <tr>
      <td>watchface</td>
      <td>4</td>
    </tr>
    <tr>
      <td>javascript</td>
      <td>4</td>
    </tr>
    <tr>
      <td>C</td>
      <td>4</td>
    </tr>
    <tr>
      <td>rnaturalearth</td>
      <td>3</td>
    </tr>
    <tr>
      <td>mapSpain</td>
      <td>3</td>
    </tr>
    <tr>
      <td>inset</td>
      <td>3</td>
    </tr>
    <tr>
      <td>COVID19</td>
      <td>3</td>
    </tr>
    <tr>
      <td>jekyll</td>
      <td>2</td>
    </tr>
    <tr>
      <td>html</td>
      <td>2</td>
    </tr>
    <tr>
      <td>python</td>
      <td>2</td>
    </tr>
    <tr>
      <td>astronomy</td>
      <td>2</td>
    </tr>
    <tr>
      <td>celestial</td>
      <td>2</td>
    </tr>
    <tr>
      <td>geojson</td>
      <td>2</td>
    </tr>
    <tr>
      <td>gpkg</td>
      <td>2</td>
    </tr>
    <tr>
      <td>dataset</td>
      <td>2</td>
    </tr>
    <tr>
      <td>csv</td>
      <td>2</td>
    </tr>
    <tr>
      <td>vignette</td>
      <td>1</td>
    </tr>
    <tr>
      <td>raster</td>
      <td>1</td>
    </tr>
    <tr>
      <td>Wikipedia</td>
      <td>1</td>
    </tr>
    <tr>
      <td>svg</td>
      <td>1</td>
    </tr>
    <tr>
      <td>classInt</td>
      <td>1</td>
    </tr>
    <tr>
      <td>rasterpic</td>
      <td>1</td>
    </tr>
    <tr>
      <td>tmap</td>
      <td>1</td>
    </tr>
    <tr>
      <td>mapsf</td>
      <td>1</td>
    </tr>
    <tr>
      <td>guest-author</td>
      <td>1</td>
    </tr>
    <tr>
      <td>ggridges</td>
      <td>1</td>
    </tr>
    <tr>
      <td>maptiles</td>
      <td>1</td>
    </tr>
    <tr>
      <td>s2</td>
      <td>1</td>
    </tr>
    <tr>
      <td>resmush</td>
      <td>1</td>
    </tr>
    <tr>
      <td>liquid</td>
      <td>1</td>
    </tr>
    <tr>
      <td>chulapa</td>
      <td>1</td>
    </tr>
    <tr>
      <td>geobounds</td>
      <td>1</td>
    </tr>
    <tr>
      <td>webscraping</td>
      <td>1</td>
    </tr>
    <tr>
      <td>json</td>
      <td>1</td>
    </tr>
    <tr>
      <td>twitter</td>
      <td>1</td>
    </tr></table>

</details>

<h2 id="bottom-line">Bottom line</h2>

<p>Done! Here you have a clean version of the algorithm:</p>

<div class="language-html highlighter-rouge"><div class="highlight"><pre class="highlight"><code> {% assign alldocs = site.documents %} {% assign alltags = alldocs |
map: 'tags' | join: ',' | split: ',' %} {% assign single_tags = alltags | uniq
%}

<span class="c">&lt;!-- Counting --&gt;</span>
{% assign count_tags = '' | split: ',' %} {% assign n_tags = single_tags | size
| minus: 1 %} {% for i in (0..n_tags) %} {% assign count_this_tag = alltags |
where_exp:"item", "item == single_tags[i]" | size %} {% assign count_tags =
count_tags | push: count_this_tag %} {% endfor %}

<span class="c">&lt;!-- Extra: sort --&gt;</span>
{% assign items_max = count_tags | sort | last %} {% assign sorted_tags = '' |
split: ',' %} {% assign sorted_count_tags = '' | split: ',' %} {% for i in
(1..items_max) reversed %} {% for j in (0..n_tags) %} {% if count_tags[j] == i
%} {% assign sorted_tags = sorted_tags | push: single_tags[j] %} {% assign
sorted_count_tags = sorted_count_tags | push: i %} {% endif %} {% endfor %} {%
endfor %} {% assign sorted_tags = sorted_tags | uniq %} 
</code></pre></div></div>
</div>
				]]>
			</description>
			<link>https://dieghernan.github.io/202502_liquid-group-by/</link>
			<category>posts</category>
		    <category>chulapa</category><category>function</category><category>html</category><category>jekyll</category><category>liquid</category><media:title type="html"><![CDATA[Implementing <code>group_by</code> count in Liquid ]]></media:title>
      <media:content url="https://dieghernan.github.io/assets/img/blog/og_jekyll.webp" medium="image"/>
      <media:thumbnail url="https://dieghernan.github.io/assets/img/blog/og_jekyll.webp" /><guid isPermaLink="true">https://dieghernan.github.io/202502_liquid-group-by/</guid>
      <pubDate>Fri, 28 Feb 2025 00:00:00 +0100</pubDate>
		</item><item>
			<title>Happy Valentine’s Day</title>
			<description>
				<![CDATA[	
 				<h3>Do you know the Bonne projection?</h3>
    		<p>1 min.</p>
				<div><p>Do you know the <a href="https://en.wikipedia.org/wiki/Bonne_projection">Bonne
Projection</a>? This is a very
special one, as it produces this result when used to map the whole world. Happy
Valentine’s Day!</p>

<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">
</span><span class="n">library</span><span class="p">(</span><span class="n">dplyr</span><span class="p">)</span><span class="w">
</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="n">library</span><span class="p">(</span><span class="n">ggplot2</span><span class="p">)</span><span class="w">
</span><span class="n">library</span><span class="p">(</span><span class="n">showtext</span><span class="p">)</span><span class="w">


</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">

</span><span class="c1"># Shaped ocean</span><span class="w">

</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">
  </span><span class="c1"># Fine grid</span><span class="w">
  </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">
  </span><span class="c1"># Bonne projection</span><span class="w">
  </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">
  </span><span class="c1"># To sf object (data-frame like)</span><span class="w">
  </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">


</span><span class="c1"># And finally</span><span class="w">

</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">

</span><span class="n">showtext_auto</span><span class="p">()</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">
  </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">
  </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">
  </span><span class="n">theme_void</span><span class="p">()</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">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">
    </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">
  </span><span class="p">)</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">
    </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">
      </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">
      </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">
    </span><span class="p">),</span><span class="w">
    </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">
    </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">
    </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">
  </span><span class="p">)</span><span class="w">
</span></code></pre></div></div>

<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>
</div>
				]]>
			</description>
			<link>https://dieghernan.github.io/202502_st_valentine/</link>
			<category>posts</category>
		    <category>beautiful_maps</category><category>ggplot2</category><category>giscoR</category><category>maps</category><category>r_bloggers</category><category>rspatial</category><category>rstats</category><category>sf</category><media:title type="html"><![CDATA[Happy Valentine's Day ]]></media:title>
      <media:content url="https://dieghernan.github.io/assets/img/blog/202402_bonne_proj.webp" medium="image"/>
      <media:thumbnail url="https://dieghernan.github.io/assets/img/blog/202402_bonne_proj.webp" /><guid isPermaLink="true">https://dieghernan.github.io/202502_st_valentine/</guid>
      <pubDate>Mon, 17 Feb 2025 00:00:00 +0100</pubDate>
		</item><item>
			<title>Optimize your images with R and reSmush.it</title>
			<description>
				<![CDATA[	
 				<h3>Introducing the <strong>resmush</strong> package</h3>
    		<p>5 min.</p>
				<div><p>The <strong>resmush</strong> package has recently been accepted on
<a href="https://cran.r-project.org/package=resmush">CRAN</a>! This small utility package
allows for the optimization (i.e., compression) of local and online images
using <a href="https://resmush.it/">reSmush.it</a>.</p>

<p>You can install <strong>resmush</strong> from
<a href="https://CRAN.R-project.org/package=resmush"><strong>CRAN</strong></a> with:</p>

<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">
</span></code></pre></div></div>

<h2 id="what-is-resmushit">What is reSmush.it?</h2>

<p>reSmush.it is a <strong>free online API</strong> that provides image optimization and has
been implemented in WordPress, Drupal and Magento. Some features of reSmush.it
include:</p>

<ul>
  <li>Free optimization services, no API key required.</li>
  <li>Optimization of local and online images.</li>
  <li>Supported image file formats: PNG, JPG/JPEG, GIF, BMP, TIFF, WebP.</li>
  <li>Maximum image size: 5 MB.</li>
  <li>Compression using several algorithms:
    <ul>
      <li><a href="https://pngquant.org/"><strong>PNGQuant</strong></a>: Strip unneeded chunks from
PNGs while preserving full alpha transparency.</li>
      <li><a href="https://github.com/tjko/jpegoptim"><strong>JPEGOptim</strong></a><strong>:</strong> Lossless
optimization based on optimizing the Huffman tables.</li>
      <li><a href="https://optipng.sourceforge.net/"><strong>OptiPNG</strong></a>: <code class="language-plaintext highlighter-rouge">png</code> reducer
used by several online optimizers.</li>
    </ul>
  </li>
</ul>

<p><strong>reSmush.it</strong> is free of charge, but its team is planning to offer more
services and extend the service to support other types of image files. If you
enjoy this API (as I do), you can consider supporting them.</p>

<div class="text-center my-3">
<a title="Support reSmush.it on ko-fi.com" class="kofi-button" style="background-color:#ff5e5b;" href="https://ko-fi.com/E1E51PW00" target="_blank">
<span class="kofitext"><img src="https://storage.ko-fi.com/cdn/cup-border.png" alt="" class="kofiimg" />Support reSmush.it on Ko-fi</span></a>
</div>

<h2 id="why-the-resmush-package">Why the <strong>resmush</strong> package?</h2>

<p>One of the main reasons I developed <strong>resmush</strong> is because I usually
include <a href="https://ropensci.org/blog/2019/12/08/precompute-vignettes/">precomputed
vignettes</a>
with my packages (see <a href="https://cran.r-project.org/web/packages/tidyterra/vignettes/welcome.html"><strong>tidyterra</strong></a>
as an example). I found that the plots created on CRAN with the standard
configuration (i.e., not precomputed vignettes but built on CRAN itself) were
not very satisfying. In some of the packages I developed, especially those
related to mapping, they didn’t do justice to the actual results when a user
runs them.</p>

<p>Precomputing vignettes has the drawback of producing higher-quality images at
the expense of size. To avoid exceeding <a href="https://cran.r-project.org/web/packages/policies.html">CRAN’s 5 MB maximum size
policy</a>, I developed
<strong>resmush</strong>, which enables me to reduce the size of the images without a
significant loss in quality.</p>

<p>Another use case for <strong>resmush</strong> is optimizing images in the context of web page
development and SEO optimization. For example, I optimized all the images on
this blog using <code class="language-plaintext highlighter-rouge">resmush_dir()</code>, which is a shorthand for optimizing all files
in a specific folder.</p>

<p>There are other alternatives that I discuss <a href="#other-alternatives">at the end of this
post</a>, but briefly, the reSmush.it API works quickly
with minimal configuration for a wide range of formats without needing an API
key.</p>

<h2 id="using-the-resmush-package">Using the <strong>resmush</strong> package</h2>

<h3 id="with-local-files">With local files</h3>

<p>Let’s present an example of how a local file can be optimized. First, we create
a large plot with <strong>ggplot2</strong>.</p>

<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">
</span><span class="n">library</span><span class="p">(</span><span class="n">ggplot2</span><span class="p">)</span><span class="w">
</span><span class="n">library</span><span class="p">(</span><span class="n">terra</span><span class="p">)</span><span class="w">
</span><span class="n">library</span><span class="p">(</span><span class="n">maptiles</span><span class="p">)</span><span class="w">

</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">
  </span><span class="n">project</span><span class="p">(</span><span class="s2">"EPSG:3857"</span><span class="p">)</span><span class="w">
</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">
</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">
  </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">

</span><span class="n">cyl_gg</span><span class="w">
</span></code></pre></div></div>

<div class="figure">

<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%" />
<p class="caption">
Original file
</p>

</div>

<div class="language-r highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="w">
</span><span class="c1"># And we save it for resmushing</span><span class="w">
</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">
</span></code></pre></div></div>

<p>The file has a size of 1.7 MB. We can use <code class="language-plaintext highlighter-rouge">resmush_file()</code> to
reduce it:</p>

<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">
</span><span class="n">resmush_file</span><span class="p">(</span><span class="s2">"cyl.png"</span><span class="p">)</span><span class="w">
</span><span class="c1">#&gt; ══ resmush summary ══════════════════════════════════════════</span><span class="w">
</span><span class="c1">#&gt; ℹ Input: 1 file with size 1.7 Mb</span><span class="w">
</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">
</span><span class="c1">#&gt; See result in directory '.'.</span><span class="w">

</span><span class="c1"># Check</span><span class="w">
</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">
  </span><span class="n">grid</span><span class="o">::</span><span class="n">grid.raster</span><span class="p">()</span><span class="w">
</span></code></pre></div></div>

<div class="figure">

<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%" />
<p class="caption">
Optimized file
</p>

</div>

<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
file, although this behavior may be modified with the <code class="language-plaintext highlighter-rouge">overwrite = TRUE</code>
parameter. Now, the optimized file (<code class="language-plaintext highlighter-rouge">"cyl_resmush.png"</code>) has a size of 762.2 kB.</p>

<p>Let’s compare the results side-by-side:</p>

<div class="figure row no-gutters">
<a href="https://dieghernan.github.io/assets/img/samples/cyl.png" class="col-sm-6 p-1">
<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." />
</a>
<a href="https://dieghernan.github.io/assets/img/samples/cyl_resmush.png" class="col-sm-6 p-1">
<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." />
</a>
<p class="caption">
Original picture (left/top): 1.7 MB. Optimized picture (right/bottom): 762.2 kB.
(55.46% reduction in file size). Click on the images to enlarge.
</p>
</div>

<p>We can verify that the image has been compressed without reducing its
dimensions.</p>

<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">
  </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">
  </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">
</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">
  </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">
  </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">

</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">
</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">

</span><span class="n">data.frame</span><span class="p">(</span><span class="w">
  </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">
  </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">
  </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">
</span><span class="p">)</span><span class="w"> </span><span class="o">%&gt;%</span><span class="w">
  </span><span class="n">knitr</span><span class="o">::</span><span class="n">kable</span><span class="p">()</span><span class="w">
</span></code></pre></div></div>

<table>
  <thead>
    <tr>
      <th style="text-align: left">source</th>
      <th style="text-align: left">size</th>
      <th style="text-align: left">dimensions</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="text-align: left">original file</td>
      <td style="text-align: left">1.7 Mb</td>
      <td style="text-align: left">1050x1500</td>
    </tr>
    <tr>
      <td style="text-align: left">compressed file</td>
      <td style="text-align: left">762.2 Kb</td>
      <td style="text-align: left">1050x1500</td>
    </tr>
  </tbody>
</table>

<h3 id="with-online-files">With online files</h3>

<p>We can also optimize online files with <code class="language-plaintext highlighter-rouge">resmush_url()</code> and download them to
disk. In this example, I demonstrate a feature of all the functions in
<strong>resmush</strong>: they return an invisible data frame with a summary of the process.</p>

<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">

</span><span class="c1"># Invisible data frame</span><span class="w">
</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">
</span></code></pre></div></div>

<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">
</span></code></pre></div></div>

<table>
  <thead>
    <tr>
      <th style="text-align: left">src_img</th>
      <th style="text-align: left">dest_img</th>
      <th style="text-align: left">src_size</th>
      <th style="text-align: left">dest_size</th>
      <th style="text-align: left">compress_ratio</th>
      <th style="text-align: left">notes</th>
      <th style="text-align: right">src_bytes</th>
      <th style="text-align: right">dest_bytes</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <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>
      <td style="text-align: left">sample_optimized.jpg</td>
      <td style="text-align: left">1.3 Mb</td>
      <td style="text-align: left">985 Kb</td>
      <td style="text-align: left">26.63%</td>
      <td style="text-align: left">OK</td>
      <td style="text-align: right">1374693</td>
      <td style="text-align: right">1008593</td>
    </tr>
  </tbody>
</table>

<div class="figure row no-gutters">
<a href="https://dieghernan.github.io/assets/img/samples/sample_1.3mb.jpg" class="col-sm-6 p-1">
<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." />
</a>

<a href="https://dieghernan.github.io/assets/img/samples/sample_optimized.jpg" class="col-sm-6 p-1">
<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." />
</a>
<p class="caption">

Original picture (left/top): 1.3 MB. Optimized picture (right/bottom): 985 kB.
(26.63% reduction in file size). Click on the images to enlarge.

</p>

</div>

<h2 id="other-alternatives">Other alternatives</h2>

<p>There are other alternatives for optimizing images with <strong>R</strong>, but first…</p>

<div class="alert alert-info p-3 mx-2 mb-3">

<p>
  <a href="https://yihui.org/">Yihui Xie</a>, one of the most prominent figures
  in the <strong>R</strong> community, was recently laid off from his position
  at Posit PBC (formerly RStudio)
  (<a href="https://yihui.org/en/2024/01/bye-rstudio/">more info here</a>).
</p>
<p>
  Yihui is the developer of <strong>knitr</strong>, <strong>markdown</strong>,
  <strong>blogdown</strong> and <strong>bookdown</strong>, among others, and he
  has been one of the key contributors (if not the most) to the reproducible
  research space with <strong>R</strong> through his libraries.
</p>
<p>
  If you have ever used and enjoyed his packages, consider sponsoring him on
  GitHub.
</p>

<div class="text-center my-3">

      <a class="btn btn-light border border-dark" role="button" aria-label="Sponsor @yihui" target="_top" href="https://github.com/sponsors/yihui?o=esb">
      <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>
      </a>

</div>

</div>

<ul>
  <li>One of the many packages developed by Yihui is
<a href="https://cran.r-project.org/package=xfun"><strong>xfun</strong></a>, which includes the
following functions for optimizing image files:
    <ul>
      <li><code class="language-plaintext highlighter-rouge">xfun::tinify()</code> is similar to <code class="language-plaintext highlighter-rouge">resmush_file()</code> but uses
<a href="https://tinypng.com/"><strong>TinyPNG</strong></a>. An API key is required.</li>
      <li><code class="language-plaintext highlighter-rouge">xfun::optipng()</code> compresses local files with <strong>OptiPNG</strong> (which needs to be
installed locally).</li>
    </ul>
  </li>
  <li><a href="https://jmablog.github.io/tinieR/"><strong>tinieR</strong></a> package by
<a href="https://jmablog.com/">jmablog</a>. An <strong>R</strong> package that provides a full
interface with <a href="https://tinypng.com/"><strong>TinyPNG</strong></a>.</li>
  <li><a href="https://github.com/coolbutuseless/optout"><strong>optout</strong></a> package by
<a href="https://coolbutuseless.github.io/">@coolbutuseless</a>. Similar to
<code class="language-plaintext highlighter-rouge">xfun::optipng()</code> with additional options. Requires additional software to
be installed locally.</li>
</ul>

<table class="table table-sm table-striped">
    <caption>Table 1: <strong>R</strong> packages: Comparison of alternatives for optimizing
images.</caption>
<thead class="text-center">
   <tr>
     <th class="align-middle">tool</th>
     <th class="align-middle">CRAN</th>
     <th class="align-middle">Additional software?</th>
     <th class="align-middle">Online?</th>
     <th class="align-middle">API Key?</th>
     <th class="align-middle">Limits?</th>
   </tr>
 </thead>
 <tbody>
   <tr>
     <td><code class="language-plaintext highlighter-rouge">xfun::tinify()</code></td>
     <td>Yes</td>
     <td>No</td>
     <td>Yes</td>
     <td>Yes</td>
     <td>500 files/month (Free tier)</td>
   </tr>
   <tr>
     <td><code class="language-plaintext highlighter-rouge">xfun::optipng()</code></td>
     <td>Yes</td>
     <td>Yes</td>
     <td>No</td>
     <td>No</td>
     <td>No</td>
   </tr>
   <tr>
     <td><strong>tinieR</strong></td>
     <td>No</td>
     <td>No</td>
     <td>Yes</td>
     <td>Yes</td>
     <td>500 files/month (Free tier)</td>
   </tr>
   <tr>
     <td><strong>optout</strong></td>
     <td>No</td>
     <td>Yes</td>
     <td>No</td>
     <td>No</td>
     <td>No</td>
   </tr>
   <tr>
     <td><strong>resmush</strong></td>
     <td>Yes</td>
     <td>No</td>
     <td>Yes</td>
     <td>No</td>
     <td>Max size 5Mb</td>
   </tr>
 </tbody>
</table>

<table class="table table-striped">
<caption>Table 2: <strong>R</strong> packages: Supported formats.</caption>
    <thead>
   <tr>
     <th class="align-middle">tool</th>
     <th class="align-middle">png</th>
     <th class="align-middle">jpg</th>
     <th class="align-middle">gif</th>
     <th class="align-middle">bmp</th>
     <th class="align-middle">tiff</th>
     <th class="align-middle">webp</th>
     <th class="align-middle">pdf</th>
   </tr>
 </thead>
 <tbody>
   <tr>
     <td><code class="language-plaintext highlighter-rouge">xfun::tinify()</code></td>
     <td>✅</td>
     <td>✅</td>
     <td>❌</td>
     <td>❌</td>
     <td>❌</td>
     <td>✅</td>
     <td>❌</td>
   </tr>
   <tr>
     <td><code class="language-plaintext highlighter-rouge">xfun::optipng()</code></td>
     <td>✅</td>
     <td>❌</td>
     <td>❌</td>
     <td>❌</td>
     <td>❌</td>
     <td>❌</td>
     <td>❌</td>
   </tr>
   <tr>
     <td><strong>tinieR</strong></td>
     <td>✅</td>
     <td>✅</td>
     <td>❌</td>
     <td>❌</td>
     <td>❌</td>
     <td>✅</td>
     <td>❌</td>
   </tr>
   <tr>
     <td><strong>optout</strong></td>
     <td>✅</td>
     <td>✅</td>
     <td>❌</td>
     <td>❌</td>
     <td>❌</td>
     <td>❌</td>
     <td>✅</td>
   </tr>
   <tr>
     <td><strong>resmush</strong></td>
     <td>✅</td>
     <td>✅</td>
     <td>✅</td>
     <td>✅</td>
     <td>✅</td>
     <td>✅</td>
     <td>❌</td>
   </tr>
 </tbody>
</table>

<p>Additionally, if you host your projects on GitHub, you can try
<a href="https://imgbot.net/">Imgbot</a>, which is free for open-source projects. Imgbot
provides automatic optimization for files in your repositories, and the
optimized files will be included in specific pull requests before merging into
your work.</p>
</div>
				]]>
			</description>
			<link>https://dieghernan.github.io/202402_optimize-images-r/</link>
			<category>posts</category>
		    <category>r_bloggers</category><category>r_package</category><category>resmush</category><media:title type="html"><![CDATA[Optimize your images with R and reSmush.it ]]></media:title>
      <media:content url="https://dieghernan.github.io/assets/img/misc/compress-img.png" medium="image"/>
      <media:thumbnail url="https://dieghernan.github.io/assets/img/misc/compress-img.png" /><guid isPermaLink="true">https://dieghernan.github.io/202402_optimize-images-r/</guid>
      <pubDate>Mon, 05 Feb 2024 00:00:00 +0100</pubDate>
		</item><item>
			<title>Beautiful maps with R (V): Point densities</title>
			<description>
				<![CDATA[	
 				<h3>Bertin’s dot density maps with R and GHSL</h3>
    		<p>8 min.</p>
				<div><p>Recently the <a href="https://r-graph-gallery.com/">R Graph Gallery</a> has incorporated a
new post by <a href="https://twitter.com/BjnNowak">Benjamin Nowak</a> showing how to create
a dot density map based on the work of the French cartographer <a href="https://en.wikipedia.org/wiki/Jacques_Bertin">Jacques
Bertin</a> (1918 - 2010):</p>

<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>

<p>In this post, I create a similar map for Iberia and also show how to create a
variation using a hexagonal grid instead of a rectangular one. This is the fifth
issue of the series
<a href="https://dieghernan.github.io/tags#beautiful_maps">Beautiful Maps with R</a>.</p>

<h2 id="libraries">Libraries</h2>

<p>I will use the following libraries for loading, manipulating and plotting
spatial data (both raster and vector):</p>

<div class="language-r highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># Base spatial packages</span><span class="w">
</span><span class="n">library</span><span class="p">(</span><span class="n">terra</span><span class="p">)</span><span class="w">
</span><span class="n">library</span><span class="p">(</span><span class="n">sf</span><span class="p">)</span><span class="w">
</span><span class="c1"># Spatial data</span><span class="w">
</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"># Wrangling and plotting</span><span class="w">
</span><span class="n">library</span><span class="p">(</span><span class="n">tidyverse</span><span class="p">)</span><span class="w">
</span><span class="n">library</span><span class="p">(</span><span class="n">tidyterra</span><span class="p">)</span><span class="w">
</span><span class="n">library</span><span class="p">(</span><span class="n">ggtext</span><span class="p">)</span><span class="w">
</span><span class="c1"># Additional for hex grids</span><span class="w">
</span><span class="c1"># Supporting for units and bridge raster to polygon</span><span class="w">
</span><span class="n">library</span><span class="p">(</span><span class="n">units</span><span class="p">)</span><span class="w">
</span><span class="n">library</span><span class="p">(</span><span class="n">exactextractr</span><span class="p">)</span><span class="w">
</span></code></pre></div></div>

<h2 id="get-the-data">Get the data</h2>

<p>The first step is always to get the data we need. My final map uses a circular
layout with Iberia in the middle (that is our observation window), so we can get
the corresponding shapes and create a buffer around it.</p>

<p>After that, we extract the population spatial distribution from <a href="https://ghsl.jrc.ec.europa.eu/download.php">GHSL -
Global Human Settlement Layer</a>. We
use the global file with a resolution of 1 km in the Mollweide projection
(ESRI:54009).</p>

<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">
</span><span class="c1"># We create a buffered circle</span><span class="w">
</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">
  </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">
  </span><span class="c1"># We buffer in 3035 since I want my final map on this projection</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">
  </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">
</span><span class="p">)</span><span class="w"> </span><span class="o">%&gt;%</span><span class="w">
  </span><span class="n">st_geometry</span><span class="p">()</span><span class="w"> </span><span class="o">%&gt;%</span><span class="w">
  </span><span class="n">st_union</span><span class="p">()</span><span class="w"> </span><span class="o">%&gt;%</span><span class="w">
  </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">
  </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">
  </span><span class="c1"># But for extracting raster data we need this in Mollweide so far</span><span class="w">
  </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">

</span><span class="c1"># Get additional shapes and cut them to the owin</span><span class="w">
</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">
  </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">
  </span><span class="n">st_intersection</span><span class="p">(</span><span class="n">owin</span><span class="p">)</span><span class="w">

</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">
  </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">
  </span><span class="n">st_intersection</span><span class="p">(</span><span class="n">owin</span><span class="p">)</span><span class="w">

</span><span class="c1"># Base map</span><span class="w">
</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">
  </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">
  </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">
  </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">

</span><span class="n">base_gg</span><span class="w">
</span></code></pre></div></div>

<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>

<p>That is our base map. Now we download the GHSL data programmatically and check
that everything is correct. At this point, it is interesting to
use 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
allows us to load only the desired area with the subsequent improvement in
terms of performance.</p>

<div class="language-r highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># Download data</span><span class="w">
</span><span class="c1"># We need the following file (download 305Mb)</span><span class="w">
</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">

</span><span class="c1"># This is where I store the file, you need to modify the folder</span><span class="w">
</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">
</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">
  </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">
</span><span class="p">}</span><span class="w">
</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">
</span><span class="n">zip_content</span><span class="w">
</span><span class="c1">#&gt;                                                 Name    Length                Date</span><span class="w">
</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">
</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">
</span><span class="c1">#&gt; 3                         GHSL_Data_Package_2023.pdf   9761851 2023-10-27 14:30:00</span><span class="w">
</span><span class="c1">#&gt; 4           GHS_POP_GLOBE_R2023A_input_metadata.xlsx    137963 2023-04-30 10:42:00</span><span class="w">

</span><span class="c1"># Unzip</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">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">

</span><span class="c1"># Create the path to the file</span><span class="w">
</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">
</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">

</span><span class="c1"># And read cropping to our owin</span><span class="w">
</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">

</span><span class="c1"># Consistent naming of the layer</span><span class="w">
</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">

</span><span class="n">ncell</span><span class="p">(</span><span class="n">pop_init</span><span class="p">)</span><span class="w">
</span><span class="c1">#&gt; [1] 2255923</span><span class="w">

</span><span class="c1"># And check with tidyterra</span><span class="w">
</span><span class="n">base_gg</span><span class="w"> </span><span class="o">+</span><span class="w">
  </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">
  </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">
</span></code></pre></div></div>

<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>

<h2 id="data-wrangling">Data wrangling</h2>

<p>The GHSL information contains the estimated population in each cell. However, the
file has a high resolution (more than 2 million cells), so for plotting
purposes we are going to reduce (i.e. aggregate) the number of cells so we can
have a better dot visualization. Once we aggregate, we compute the
area of each new aggregated cell and compute the corresponding population
density.</p>

<p>Instead of using the numeric range of densities, we use categories for the final
map, so we classify the density into different groups:</p>

<div class="language-r highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># Reduce resolution for visualization</span><span class="w">
</span><span class="c1"># Compute factor to reduce raster to (aprox) 100 rows:</span><span class="w">
</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="c1">#&gt; [1] 1511</span><span class="w">
</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">

</span><span class="c1"># Each new cell contains the sum of population of the aggregated cells</span><span class="w">
</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">
  </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">
  </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">
</span><span class="p">)</span><span class="w">


</span><span class="c1"># Compute area of each new cell</span><span class="w">
</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">

</span><span class="c1"># Compute densities, mask to owin, convert to points and create categories</span><span class="w">
</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">
  </span><span class="c1"># Compute density by cell</span><span class="w">
  </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">
  </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">
  </span><span class="c1"># Mask to the countries shapes</span><span class="w">
  </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">
  </span><span class="c1"># SpatVector as points</span><span class="w">
  </span><span class="n">as.points</span><span class="p">()</span><span class="w"> </span><span class="o">%&gt;%</span><span class="w">
  </span><span class="c1"># Categorize</span><span class="w">
  </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">
    </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">
    </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">
    </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">
    </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">
    </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">
    </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">
    </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">
  </span><span class="p">))</span><span class="w">
</span></code></pre></div></div>

<h2 id="final-plot">Final plot</h2>

<p>And finally, the map. In this case, I save it as a high-resolution square
map.</p>

<div class="language-r highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># Final plot</span><span class="w">
</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">
  </span><span class="c1"># Layer, this object is a SpatVector instead of sf object</span><span class="w">
  </span><span class="n">geom_spatvector</span><span class="p">(</span><span class="w">
    </span><span class="n">pop_points</span><span class="p">,</span><span class="w">
    </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">
    </span><span class="c1"># Use a point with a border AND a fill</span><span class="w">
    </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">
  </span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w">
  </span><span class="n">scale_size_manual</span><span class="p">(</span><span class="w">
    </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">
    </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">
      </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">
      </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">
    </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="n">guide_legend</span><span class="p">(</span><span class="w">
      </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">
      </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">
      </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">
      </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">
    </span><span class="p">)</span><span class="w">
  </span><span class="p">)</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">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">
    </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">
    </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">
    </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">
  </span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w">
  </span><span class="n">theme_void</span><span class="p">()</span><span class="w"> </span><span class="o">+</span><span class="w">
  </span><span class="c1"># This CRS for representation only</span><span class="w">
  </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">
  </span><span class="n">theme</span><span class="p">(</span><span class="w">
    </span><span class="c1"># plot.margin = margin(20,0,20,0,"cm"),</span><span class="w">
    </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">
    </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">
    </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">
    </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">
    </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">
    </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">
    </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">
    </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">
      </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">
      </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">
      </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">
    </span><span class="p">)</span><span class="w">
  </span><span class="p">)</span><span class="w">



</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">
</span></code></pre></div></div>

<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>

<h2 id="alternative-hexagonal-grid">Alternative hexagonal grid</h2>

<p>The previous plot is based on the centroids of each cell of the raster, which is,
by definition, a rectangular grid. I would also like to experiment with
hexagonal grids (i.e. a grid of hexagons) since I have the feeling that they
look more “natural” than the rectangular ones, which present a regularity
hardly seen in
the wild.</p>

<p>The issue here is that <strong>terra</strong> does not produce this type of grid. However, it
is possible to create them with <code class="language-plaintext highlighter-rouge">sf::st_make_grid()</code>, so the workflow for this
alternative is:</p>

<ol>
  <li>Create a hexagonal grid, where each hexagon represents a similar area to
each cell in the aggregated raster.</li>
  <li>Extract the values of the raster to the new grid.</li>
  <li>Finally, follow the same data wrangling and plotting steps.</li>
</ol>

<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>
should be the “diameter” of the hexagon instead of the area. Luckily, we can
infer this value since the area of a hexagon is</p>

<p>[A = \frac{\sqrt{3}}{2}d^{2}]</p>

<p>So we can extract \(d\) from the previous expression knowing the area \(A\) of
the aggregated cells:</p>

<div class="language-r highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># Hex grid with sf ----</span><span class="w">

</span><span class="c1"># Avg size of the cells on the aggregated grid</span><span class="w">
</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">
  </span><span class="n">pull</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"> </span><span class="o">%&gt;%</span><span class="w">
  </span><span class="n">as_units</span><span class="p">(</span><span class="s2">"km^2"</span><span class="p">)</span><span class="w">

</span><span class="n">target_area</span><span class="w">
</span><span class="c1">#&gt; 224.7461 [km^2]</span><span class="w">

</span><span class="c1"># Infer diam hex</span><span class="w">
</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">
</span><span class="c1"># Create hexagonal grid</span><span class="w">
</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">

</span><span class="nf">length</span><span class="p">(</span><span class="n">pop_agg_sf</span><span class="p">)</span><span class="w">
</span><span class="c1">#&gt; [1] 10340</span><span class="w">
</span><span class="n">ncell</span><span class="p">(</span><span class="n">pop_agg</span><span class="p">)</span><span class="w">
</span><span class="c1">#&gt; [1] 10100</span><span class="w">

</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">
  </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">
  </span><span class="nf">as.double</span><span class="p">()</span><span class="w">

</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">
</span></code></pre></div></div>

<p>Now, we use <code class="language-plaintext highlighter-rouge">exact_extract()</code> to extract the population in each hexagonal cell.</p>

<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">
</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">
  </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">
  </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">
  </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">
</span><span class="p">)</span><span class="w">


</span><span class="n">base_gg</span><span class="w"> </span><span class="o">+</span><span class="w">
  </span><span class="n">geom_sf</span><span class="p">(</span><span class="w">
    </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">
    </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">
  </span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w">
  </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">
</span></code></pre></div></div>

<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>

<p>Finally, we compute densities, create categories and produce the map:</p>

<div class="language-r highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># Mask and categorize</span><span class="w">
</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">
  </span><span class="c1"># Compute density by cell</span><span class="w">
  </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">
  </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">
  </span><span class="c1"># To points and filter to country shape</span><span class="w">
  </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">
  </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">
  </span><span class="c1"># Categorize</span><span class="w">
  </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">
    </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">
    </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">
    </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">
    </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">
    </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">
    </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">
    </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">
  </span><span class="p">))</span><span class="w">

</span><span class="c1"># Final plot</span><span class="w">
</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">
  </span><span class="c1"># Layer, this object is a sf object</span><span class="w">
  </span><span class="n">geom_sf</span><span class="p">(</span><span class="w">
    </span><span class="n">pop_sf_points</span><span class="p">,</span><span class="w">
    </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">
    </span><span class="c1"># Use a point with a border AND a fill</span><span class="w">
    </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">
  </span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w">
  </span><span class="n">scale_size_manual</span><span class="p">(</span><span class="w">
    </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">
    </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">
      </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">
      </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">
    </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="n">guide_legend</span><span class="p">(</span><span class="w">
      </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">
      </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">
      </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">
      </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">
    </span><span class="p">)</span><span class="w">
  </span><span class="p">)</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">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">
    </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">
    </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">
    </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">
  </span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w">
  </span><span class="n">theme_void</span><span class="p">()</span><span class="w"> </span><span class="o">+</span><span class="w">
  </span><span class="c1"># This CRS for representation only</span><span class="w">
  </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">
  </span><span class="n">theme</span><span class="p">(</span><span class="w">
    </span><span class="c1"># plot.margin = margin(20,0,20,0,"cm"),</span><span class="w">
    </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">
    </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">
    </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">
    </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">
    </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">
    </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">
    </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">
    </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">
      </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">
      </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">
      </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">
    </span><span class="p">)</span><span class="w">
  </span><span class="p">)</span><span class="w">

</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">
</span></code></pre></div></div>

<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>

<p>And that’s it! Which one do you like the most? Let me know in the comments.</p>

<h2 id="references">References</h2>

<ul>
  <li>Bertin J (1967). <em>Sémiologie graphique. Les diagrammes. Les réseaux. Les
cartes</em>. Gauthier-Villars, Paris.</li>
  <li>European Commission. Joint Research Centre. (2023). <em>GHSL data package 2023.</em>. Publications Office, LU <a href="https://doi.org/10.2760/098587">https://doi.org/10.2760/098587</a></li>
  <li>Hernangómez D (2023). “Using the tidyverse with terra objects: the tidyterra
package <em>Journal of Open Source Software</em>, <em>8</em>(91), 5751. ISSN 2475-9066
<a href="https://doi.org/10.21105/joss.05751">https://doi.org/10.21105/joss.05751</a></li>
  <li>Pesaresi M, Politis P (2023). “GHS-BUILT-C R2023A - GHS Settlement
Characteristics, derived from Sentinel2 composite (2018) and other GHS
R2023A data.” <a href="https://doi.org/10.2905/3C60DDF6-0586-4190-854B-F6AA0EDC2A30">https://doi.org/10.2905/3C60DDF6-0586-4190-854B-F6AA0EDC2A30</a></li>
</ul>
</div>
				]]>
			</description>
			<link>https://dieghernan.github.io/202312_bertin_dots/</link>
			<category>posts</category>
		    <category>beautiful_maps</category><category>ggplot2</category><category>giscoR</category><category>maps</category><category>r_bloggers</category><category>rspatial</category><category>rstats</category><category>sf</category><category>terra</category><category>tidyterra</category><media:title type="html"><![CDATA[Beautiful maps with R (V): Point densities ]]></media:title>
      <media:content url="https://dieghernan.github.io/assets/img/blog/202312_finalmap.webp" medium="image"/>
      <media:thumbnail url="https://dieghernan.github.io/assets/img/blog/202312_finalmap.webp" /><guid isPermaLink="true">https://dieghernan.github.io/202312_bertin_dots/</guid>
      <pubDate>Sat, 16 Dec 2023 00:00:00 +0100</pubDate>
		</item><item>
			<title>Star map with R</title>
			<description>
				<![CDATA[	
 				<h3>Creating Star Map Visualizations Based on Location and Date</h3>
    		<p>13 min.</p>
				<div><p>A couple of weeks ago I was doing my daily check on
<a href="https://stackoverflow.com/questions/tagged/sf">Stack Overflow</a> when I found a
question by <a href="https://bensstats.wordpress.com/">Benjamin Smith</a> that blew my
mind: <a href="https://stackoverflow.com/questions/75064069/creating-star-map-visualizations-based-on-location-and-date">Creating Star Map Visualizations Based on Location and
Date</a>
!!</p>

<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
Fitter</a> already worked on this two years earlier,
see his <a href="https://kimnewzealand.github.io/2019/02/21/celestial-maps/">Celestial
Maps</a>. So I decided
to put some work into this.</p>

<p>Since then, I have also learned that Benjamin and I have been working in parallel
on the same topic. He is preparing an <strong>R</strong> package named
<a href="https://github.com/benyamindsmith/starBliss"><strong>starBliss</strong></a> and hopefully this
post will be of some help.</p>

<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
have any suggestions, please let me know in the comments section below.</p>

<h2 id="first-things-first-the-data">First things first: the data</h2>

<p>The initial data source for all these projects (Kim’s, Benjamin’s and mine) is the
same, and it is provided by the D3 plugin
<a href="https://github.com/ofrohn/d3-celestial/tree/master/data">d3-celestial</a> by <a href="http://armchairastronautics.blogspot.com/">Olaf
Frohn</a>. As Kim Fitter pointed out in
<a href="https://kimnewzealand.github.io/2019/02/21/celestial-maps/">his post</a>, these
data files present the problem (experienced by <a href="https://stackoverflow.com/search?q=%5Bsf%5D+dateline">almost any <strong>sf</strong>
user</a>) of lines crossing
the international date line (longitude 180º). I also found that some files are
not valid as per <code class="language-plaintext highlighter-rouge">sf::st_make_valid()</code>.</p>

<p>Solution? I processed and fixed almost every file, including the files
corresponding to the Milky Way and the lines for Chinese constellations, manually,
to provide a set of files. That is the origin of my project <a href="https://dieghernan.github.io/celestial_data/">Celestial
Data</a>, which provides all these
files in several spatial formats. Please <a href="https://github.com/dieghernan/celestial_data">check out the
repo</a> to learn more about it.</p>

<h2 id="creating-a-star-map-with-r">Creating a star map with R</h2>

<p>The first step is to load libraries that will help us with this cosmic
task:</p>

<div class="language-r highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># Spatial manipulation</span><span class="w">
</span><span class="n">library</span><span class="p">(</span><span class="n">sf</span><span class="p">)</span><span class="w">
</span><span class="n">library</span><span class="p">(</span><span class="n">s2</span><span class="p">)</span><span class="w">
</span><span class="n">library</span><span class="p">(</span><span class="n">nominatimlite</span><span class="p">)</span><span class="w">

</span><span class="c1">## Wrangling data and dates</span><span class="w">
</span><span class="n">library</span><span class="p">(</span><span class="n">dplyr</span><span class="p">)</span><span class="w">
</span><span class="n">library</span><span class="p">(</span><span class="n">lubridate</span><span class="p">)</span><span class="w">
</span><span class="n">library</span><span class="p">(</span><span class="n">lutz</span><span class="p">)</span><span class="w">

</span><span class="c1">## Visualization</span><span class="w">
</span><span class="n">library</span><span class="p">(</span><span class="n">ggplot2</span><span class="p">)</span><span class="w">
</span><span class="n">library</span><span class="p">(</span><span class="n">ggfx</span><span class="p">)</span><span class="w">
</span><span class="n">library</span><span class="p">(</span><span class="n">ggshadow</span><span class="p">)</span><span class="w">
</span></code></pre></div></div>

<h3 id="helper-functions">Helper functions</h3>

<p>Now we prepare some helper functions:</p>

<ul>
  <li>
    <p><code class="language-plaintext highlighter-rouge">load_celestial()</code> just downloads the corresponding <code class="language-plaintext highlighter-rouge">.geojson</code> from the
<a href="https://github.com/dieghernan/celestial_data/tree/main/data">Celestial Data
repo</a><sup id="fnref:1"><a href="#fn:1" class="footnote" rel="footnote" role="doc-noteref">1</a></sup> to a
specific directory <code class="language-plaintext highlighter-rouge">cachedir</code> and loads it with <code class="language-plaintext highlighter-rouge">sf::st_read()</code>.</p>
  </li>
  <li>
    <p><code class="language-plaintext highlighter-rouge">pretty_lonlat()</code> is a labeler that returns a decimal longitude or latitude
coordinate in the format degrees/minutes/seconds (e.g., a <strong>latitude
34.72782</strong> would be converted into <strong>34° 43’ 40.15” N</strong>).</p>
  </li>
</ul>

<details class="my-4">

  <summary>Show <code>load_celestial</code> and
<code>pretty_lonlat()</code></summary>

  <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">
                           </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">
                           </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">
  </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">
    </span><span class="n">stop</span><span class="p">(</span><span class="w">
      </span><span class="s2">"Please create "</span><span class="p">,</span><span class="w">
      </span><span class="n">path.expand</span><span class="p">(</span><span class="n">cachedir</span><span class="p">),</span><span class="w">
      </span><span class="s2">" directory"</span><span class="p">,</span><span class="w">
      </span><span class="s2">"first"</span><span class="w">
    </span><span class="p">)</span><span class="w">
  </span><span class="p">}</span><span class="w">

  </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">
  </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">


  </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">
    </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">
  </span><span class="p">}</span><span class="w">

  </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">

  </span><span class="nf">return</span><span class="p">(</span><span class="n">celestial</span><span class="p">)</span><span class="w">
</span><span class="p">}</span><span class="w">

</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">
  </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">

  </span><span class="c1"># Decompose</span><span class="w">
  </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">
  </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">
  </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">
  </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">
  </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">

  </span><span class="c1"># Get label</span><span class="w">
  </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">
    </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">
  </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">
    </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">
  </span><span class="p">}</span><span class="w">


  </span><span class="c1"># Compose</span><span class="w">
  </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">
  </span><span class="nf">return</span><span class="p">(</span><span class="n">label</span><span class="p">)</span><span class="w">
</span><span class="p">}</span><span class="w">
</span></code></pre></div>  </div>

</details>

<p>Additionally, you may notice that on this <a href="https://ofrohn.github.io/celestial-demo/location.html">d3-celestial
demo</a> there is some
degree of rotation depending on the location and the time. I found how this is
done on the <strong>d3-celestial plugin</strong> and I found the function
<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>,
which I ported to <strong>R</strong> (<code class="language-plaintext highlighter-rouge">get_mst()</code>). Based on the research I did,
this function computes the <a href="https://en.wikipedia.org/wiki/Sidereal_time">Mean Sidereal
Time</a> (MST) given a specific
longitude (perhaps Local Sidereal Time is a more accurate term here?)
expressed in degrees, following the formulas provided by Meeus (1998). If you
want to learn more about this, I recommend <a href="https://squarewidget.com/astronomical-calculations-sidereal-time/">this
post</a> by
<a href="https://squarewidget.com/">James Still</a>.</p>

<!-- FIXME: Confirm whether the function returns mean or local sidereal time. -->

<p>So basically the input is a <code class="language-plaintext highlighter-rouge">POSIXct</code> date-time and a given longitude and the
result is an alternative longitude that we use to adjust the projection of our
Star Map. This provides the rotation observed in the <strong>d3-celestial
plugin</strong>.</p>

<details class="my-4">

  <summary>Show <code>get_mst()</code></summary>

  <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">
</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">
  </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">


  </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">
  </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">
  </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">
  </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">
  </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">
  </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">

  </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">
    </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">
    </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">
  </span><span class="p">}</span><span class="w">

  </span><span class="c1"># Adjust times before Gregorian Calendar</span><span class="w">
  </span><span class="c1"># See https://squarewidget.com/julian-day/</span><span class="w">
  </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">
    </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">
    </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">
  </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">
    </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">
  </span><span class="p">}</span><span class="w">
  </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">
  </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">

  </span><span class="c1"># days since J2000.0</span><span class="w">
  </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">
  </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">

  </span><span class="c1"># Rotation</span><span class="w">
  </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">
    </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">

  </span><span class="c1"># Modulo 360 degrees</span><span class="w">
  </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">

  </span><span class="nf">return</span><span class="p">(</span><span class="n">mst</span><span class="p">)</span><span class="w">
</span><span class="p">}</span><span class="w">
</span></code></pre></div>  </div>

</details>

<p>The final result would have a spherical outline. That means that we would need
to 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
longer flat</a>? Thanks to <strong>s2</strong> we can
overcome 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
the changes on the
projection</a>.
This also includes some refinements to avoid empty/non-valid geometries as well
as <code class="language-plaintext highlighter-rouge">GEOMETRYCOLLECTION</code> handling. The function <code class="language-plaintext highlighter-rouge">sf_spherical_cut()</code> would do
that for us.</p>

<details class="my-4">

  <summary>Show <code>sf_spherical_cut()</code></summary>

  <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">
</span><span class="c1"># Optionally, project and flip</span><span class="w">

</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">
  </span><span class="c1"># Get geometry type</span><span class="w">
  </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">

  </span><span class="c1"># Keep the data frame, s2 drops it</span><span class="w">
  </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">
  </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">
  </span><span class="c1"># Convert to s2 if needed</span><span class="w">
  </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">
    </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">
  </span><span class="p">}</span><span class="w">

  </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">
    </span><span class="c1"># Cut with s2</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="w"> </span><span class="o">%&gt;%</span><span class="w">
    </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">
    </span><span class="c1"># Back to sf and add the df</span><span class="w">
    </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">
    </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">
    </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">
    </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">

  </span><span class="c1"># If it is not POINT filter by valid and non-empty</span><span class="w">
  </span><span class="c1"># This if for performance</span><span class="w">
  </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">
    </span><span class="c1"># If any is GEOMETRYCOLLECTION extract the right value</span><span class="w">
    </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">
      </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">
        </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">
    </span><span class="p">}</span><span class="w">

    </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">
      </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">
  </span><span class="p">}</span><span class="w">

  </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">
    </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">
      </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">
      </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">
  </span><span class="p">}</span><span class="w">

  </span><span class="nf">return</span><span class="p">(</span><span class="n">the_cut</span><span class="p">)</span><span class="w">
</span><span class="p">}</span><span class="w">
</span></code></pre></div>  </div>

</details>

<h3 id="inputs">Inputs</h3>

<p>Now we are ready to start creating our visualization. We need only two inputs:</p>

<ul>
  <li>
    <p>A desired location, which we will geocode with <strong>nominatimlite</strong>.</p>
  </li>
  <li>
    <p>A specific moment in time.</p>
  </li>
</ul>

<div class="language-r highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># Inputs</span><span class="w">
</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">

</span><span class="c1"># We are not using yet the timezone</span><span class="w">
</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">
  </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">
  </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">
  </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">
  </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">
  </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">
</span><span class="p">)</span><span class="w">

</span><span class="c1"># Geocode place with nominatimlite</span><span class="w">
</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">

</span><span class="n">desired_place_geo</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">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">
</span><span class="c1">#&gt; # A tibble: 1 × 3</span><span class="w">
</span><span class="c1">#&gt;   address                                                                                    lat   lon</span><span class="w">
</span><span class="c1">#&gt;   &lt;chr&gt;                                                                                    &lt;dbl&gt; &lt;dbl&gt;</span><span class="w">
</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">

</span><span class="c1"># And get the coordinates</span><span class="w">
</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">
  </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">
  </span><span class="n">unlist</span><span class="p">()</span><span class="w">

</span><span class="n">desired_loc</span><span class="w">
</span><span class="c1">#&gt;       lat       lon</span><span class="w">
</span><span class="c1">#&gt; 40.416705 -3.703582</span><span class="w">
</span></code></pre></div></div>

<p>With respect to our object <code class="language-plaintext highlighter-rouge">desired_date</code>, it is quite relevant for accurate
plotting to specify the correct time zone. Since we already know the latitude and
longitude of our desired location, we can easily get that with the <strong>lutz</strong>
package:</p>

<div class="language-r highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">desired_date</span><span class="w">
</span><span class="c1">#&gt; [1] "2015-09-22 03:45:00 UTC"</span><span class="w">

</span><span class="c1"># Get tz</span><span class="w">
</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">

</span><span class="n">get_tz</span><span class="w">
</span><span class="c1">#&gt; [1] "Europe/Madrid"</span><span class="w">

</span><span class="c1"># Force it to be local time</span><span class="w">
</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">

</span><span class="n">desired_date_tz</span><span class="w">
</span><span class="c1">#&gt; [1] "2015-09-22 03:45:00 CEST"</span><span class="w">
</span></code></pre></div></div>

<h4 id="about-time-zones">About time zones</h4>

<p>Some online shops that create this kind of map (I won’t post links) include
this script:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>...

'selectedHour': '22',
'selectedMinute': '00',

...
</code></pre></div></div>

<p>This means that those shops are really creating the map at
<code class="language-plaintext highlighter-rouge">YYYY-MM-DD 22:00:00 UTC</code>. If you want to exactly replicate that (even though
that night sky is not accurate, think that in New Zealand the local time at that
moment would be 10:00 hence no stars are visible) you would need to adjust
<code class="language-plaintext highlighter-rouge">desired_date_tz</code> as:</p>

<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">
</span><span class="c1">#&gt; [1] "2015-09-22 22:00:00 UTC"</span><span class="w">

</span><span class="c1"># That would really correspond to 10:00</span><span class="w">
</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">
  </span><span class="n">with_tz</span><span class="p">(</span><span class="s2">"Pacific/Auckland"</span><span class="p">)</span><span class="w">
</span><span class="c1">#&gt; [1] "2015-09-23 10:00:00 NZST"</span><span class="w">
</span></code></pre></div></div>

<h3 id="setup">Setup</h3>

<p>Now we can start creating our buffers and projections, which will help us to
crop the celestial data objects.</p>

<p>I also noticed that the <a href="https://ofrohn.github.io/celestial-demo/location.html">location
demo</a> of
<strong>d3-celestial.js</strong> uses <a href="https://github.com/ofrohn/d3-celestial/blob/7e720a3de062059d4c5400a379146a601d9010e0/demo/location.html#L17-L22">Airy
projection</a>,
so we are going to replicate that as well:</p>

<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">

</span><span class="c1"># Get right degrees</span><span class="w">
</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">
</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">

</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">
</span><span class="c1">#&gt;      lon      lat</span><span class="w">
</span><span class="c1">#&gt; 23.15892 40.41670</span><span class="w">

</span><span class="c1"># Create proj4string w/ Airy projection</span><span class="w">

</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">


</span><span class="n">target_crs</span><span class="w">
</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">

</span><span class="c1"># We need to flip celestial objects to get the impression of see from the Earth</span><span class="w">
</span><span class="c1"># to the sky, instead of from the sky to the Earth</span><span class="w">
</span><span class="c1"># https://stackoverflow.com/a/75064359/7877917</span><span class="w">
</span><span class="c1"># Flip matrix for affine transformation</span><span class="w">

</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">


</span><span class="c1"># And create an s2 buffer of the visible hemisphere at the given location</span><span class="w">
</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">
  </span><span class="n">as_s2_geography</span><span class="p">(</span><span class="w">
    </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">
  </span><span class="p">),</span><span class="w">
  </span><span class="m">9800000</span><span class="p">,</span><span class="w">
  </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">
</span><span class="p">)</span><span class="w">

</span><span class="c1"># This one is for plotting</span><span class="w">
</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">
  </span><span class="n">st_as_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="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">
  </span><span class="n">st_make_valid</span><span class="p">()</span><span class="w">
</span></code></pre></div></div>

<h3 id="celestial-data">Celestial data</h3>

<p>Now, we can load the data of our choice. In this case, I have chosen to
represent the Milky Way, constellation lines and stars.</p>

<p>We also add some additional variables that would help us to improve the
visualization.</p>

<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">

</span><span class="c1"># Add colors to MW to use on fill</span><span class="w">
</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">
</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">

</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">
  </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">
  </span><span class="n">scale_fill_identity</span><span class="p">()</span><span class="w">
</span></code></pre></div></div>

<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>

<div class="language-r highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="w">
</span><span class="c1"># And process it</span><span class="w">

</span><span class="c1"># Cut to buffer</span><span class="w">
</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">
  </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">
  </span><span class="c1"># Change the crs</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">target_crs</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="n">flip_matrix</span><span class="w">
</span><span class="p">)</span><span class="w">


</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">
  </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">
  </span><span class="n">scale_fill_identity</span><span class="p">()</span><span class="w">
</span></code></pre></div></div>

<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>

<p>Now it is the turn of the constellations:</p>

<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">

</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">
  </span><span class="n">geom_sf</span><span class="p">()</span><span class="w"> </span><span class="o">+</span><span class="w">
  </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">
</span></code></pre></div></div>

<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>

<div class="language-r highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="w">
</span><span class="c1"># Cut to buffer</span><span class="w">

</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">
  </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">
  </span><span class="c1"># Change the crs</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">target_crs</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="n">flip_matrix</span><span class="w">
</span><span class="p">)</span><span class="w">


</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">
  </span><span class="n">geom_sf</span><span class="p">()</span><span class="w"> </span><span class="o">+</span><span class="w">
  </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">
</span></code></pre></div></div>

<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>

<p>And finally the stars:</p>

<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">

</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">
  </span><span class="c1"># We use relative brightness (br) as aes</span><span class="w">
  </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">
  </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">
  </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">
  </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">
</span></code></pre></div></div>

<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>

<div class="language-r highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="w">
</span><span class="c1"># Cut to buffer</span><span class="w">

</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">
  </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">
  </span><span class="c1"># Change the crs</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">target_crs</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="n">flip_matrix</span><span class="w">
</span><span class="p">)</span><span class="w">

</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">
  </span><span class="c1"># We use relative brightness (br) as aes</span><span class="w">
  </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">
  </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">
  </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></code></pre></div></div>

<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>

<h3 id="graticules">Graticules</h3>

<p>We are also going to include graticules, so the Earth’s poles can be quickly
spotted. In this case we don’t apply any affine transformation, so the <code class="language-plaintext highlighter-rouge">flip</code>
parameter 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>

<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">
  </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">
  </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">
  </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">
</span><span class="p">)</span><span class="w">

</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">
  </span><span class="n">geom_sf</span><span class="p">()</span><span class="w"> </span><span class="o">+</span><span class="w">
  </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">
</span></code></pre></div></div>

<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>

<div class="language-r highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="w">
</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">
</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">
  </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">
  </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">
  </span><span class="c1"># Change the crs</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">target_crs</span><span class="w">
</span><span class="p">)</span><span class="w">


</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">
  </span><span class="n">geom_sf</span><span class="p">()</span><span class="w"> </span><span class="o">+</span><span class="w">
  </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">
</span></code></pre></div></div>

<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>

<h2 id="visualization-with-ggplot2">Visualization with <strong>ggplot2</strong></h2>

<p>We are almost set! For preparing the final map, first we are going to create the
corresponding labels, which will be included as <code class="language-plaintext highlighter-rouge">caption</code> on the <strong>ggplot2</strong> map:</p>

<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">
</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">

</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">

</span><span class="n">cat</span><span class="p">(</span><span class="n">pretty_labs</span><span class="p">)</span><span class="w">
</span><span class="c1">#&gt; 40° 25' 0.14" N / 3° 42' 12.9" W</span><span class="w">

</span><span class="c1"># Create final caption to put on bottom</span><span class="w">

</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">
  </span><span class="c1"># Pretty Day</span><span class="w">
  </span><span class="n">scales</span><span class="o">::</span><span class="n">label_date</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">"%d %b %Y"</span><span class="p">,</span><span class="w">
    </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">
  </span><span class="p">)(</span><span class="n">desired_date_tz</span><span class="p">),</span><span class="w">
  </span><span class="c1"># Pretty Hour</span><span class="w">
  </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">
</span><span class="p">)</span><span class="w">

</span><span class="n">cat</span><span class="p">(</span><span class="n">pretty_time</span><span class="p">)</span><span class="w">
</span><span class="c1">#&gt; 22 Sep 2015 03:45 CEST</span><span class="w">

</span><span class="c1"># Our final caption</span><span class="w">
</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">
  </span><span class="s2">"Star Map\n"</span><span class="p">,</span><span class="w">
  </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">
  </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">
  </span><span class="n">pretty_labs</span><span class="w">
</span><span class="p">))</span><span class="w">


</span><span class="n">cat</span><span class="p">(</span><span class="n">caption</span><span class="p">)</span><span class="w">
</span><span class="c1">#&gt; STAR MAP</span><span class="w">
</span><span class="c1">#&gt; MADRID, SPAIN</span><span class="w">
</span><span class="c1">#&gt; 22 SEP 2015 03:45 CEST</span><span class="w">
</span><span class="c1">#&gt; 40° 25' 0.14" N / 3° 42' 12.9" W</span><span class="w">
</span></code></pre></div></div>

<p>We can enhance the visualization by applying some interesting effects:</p>

<ul>
  <li>
    <p>We want the Milky Way to appear a bit blurry instead of as a Well-Known
geometry. With this effect we can mimic how we really see it from the Earth.
So we can use <code class="language-plaintext highlighter-rouge">ggfx::with_blur()</code> to get this effect.</p>
  </li>
  <li>
    <p>We can also add a glowing effect to our stars and constellations (have a
look at Dominic Royé’s post <a href="https://dominicroye.github.io/en/2021/firefly-cartography/">Firefly
Cartography</a> to
know more about this). The only drawback is that I was not able to use
<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
instead I converted my lines (the constellations) to coordinates and applied
<code class="language-plaintext highlighter-rouge">ggshadow::geom_glowpath()</code>.</p>
  </li>
</ul>

<p>So we are ready now to create the final visualization:</p>

<div class="language-r highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># Prepare MULTILINESTRING</span><span class="w">

</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">
  </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">
  </span><span class="n">st_coordinates</span><span class="p">()</span><span class="w"> </span><span class="o">%&gt;%</span><span class="w">
  </span><span class="n">as.data.frame</span><span class="p">()</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">
  </span><span class="c1"># Graticules</span><span class="w">
  </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">
  </span><span class="c1"># A blurry Milky Way</span><span class="w">
  </span><span class="n">with_blur</span><span class="p">(</span><span class="w">
    </span><span class="n">geom_sf</span><span class="p">(</span><span class="w">
      </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">
      </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">
    </span><span class="p">),</span><span class="w">
    </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">
  </span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w">
  </span><span class="n">scale_fill_identity</span><span class="p">()</span><span class="w"> </span><span class="o">+</span><span class="w">
  </span><span class="c1"># Glowing stars</span><span class="w">
  </span><span class="n">geom_glowpoint</span><span class="p">(</span><span class="w">
    </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">
      </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">
        </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">
    </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">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">
  </span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w">
  </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">
  </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">
  </span><span class="c1"># Glowing constellations</span><span class="w">
  </span><span class="n">geom_glowpath</span><span class="p">(</span><span class="w">
    </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">
    </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">
    </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">
  </span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w">
  </span><span class="c1"># Border of the sphere</span><span class="w">
  </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">
  </span><span class="c1"># Caption</span><span class="w">
  </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">
  </span><span class="c1"># And end with theming</span><span class="w">
  </span><span class="n">theme_void</span><span class="p">()</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">
    </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">
    </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">
    </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">
    </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">
    </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">
      </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">
      </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">
      </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">
      </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">
    </span><span class="p">)</span><span class="w">
  </span><span class="p">)</span><span class="w">
</span></code></pre></div></div>

<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>

<p>Voilà! I checked several times the results with the results provided by
d3-celestial.js on the <a href="https://ofrohn.github.io/celestial-demo/location.html">location
demo</a> and the underlying
calculations in JavaScript, and everything seems to be up and running.</p>

<h2 id="extra-chinese-constellations">Extra: Chinese constellations</h2>

<p><a href="https://dieghernan.github.io/celestial_data/">Celestial Data</a> also provides
data for traditional Chinese constellations, so we can create a similar map with
this entirely different set of geometries:</p>

<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">

</span><span class="c1"># Cut and prepare for geom_glowpath() on a single step</span><span class="w">
</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">
  </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">
  </span><span class="c1"># Change the crs</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">target_crs</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="n">flip_matrix</span><span class="w">
</span><span class="p">)</span><span class="w"> </span><span class="o">%&gt;%</span><span class="w">
  </span><span class="c1"># To paths</span><span class="w">
  </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">
  </span><span class="n">st_coordinates</span><span class="p">()</span><span class="w"> </span><span class="o">%&gt;%</span><span class="w">
  </span><span class="n">as.data.frame</span><span class="p">()</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">
  </span><span class="c1"># Graticules</span><span class="w">
  </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">
  </span><span class="c1"># A blurry Milky Way</span><span class="w">
  </span><span class="n">with_blur</span><span class="p">(</span><span class="w">
    </span><span class="n">geom_sf</span><span class="p">(</span><span class="w">
      </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">
      </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">
    </span><span class="p">),</span><span class="w">
    </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">
  </span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w">
  </span><span class="n">scale_fill_identity</span><span class="p">()</span><span class="w"> </span><span class="o">+</span><span class="w">
  </span><span class="c1"># Glowing stars</span><span class="w">
  </span><span class="n">geom_glowpoint</span><span class="p">(</span><span class="w">
    </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">
      </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">
        </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">
    </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">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">
  </span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w">
  </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">
  </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">
  </span><span class="c1"># Glowing constellations</span><span class="w">
  </span><span class="n">geom_glowpath</span><span class="p">(</span><span class="w">
    </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">
    </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">
    </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">
  </span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w">
  </span><span class="c1"># Border of the sphere</span><span class="w">
  </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">
  </span><span class="c1"># Caption</span><span class="w">
  </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">
  </span><span class="c1"># And end with theming</span><span class="w">
  </span><span class="n">theme_void</span><span class="p">()</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">
    </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">
    </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">
    </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">
    </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">
    </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">
      </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">
      </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">
      </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">
      </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">
    </span><span class="p">)</span><span class="w">
  </span><span class="p">)</span><span class="w">
</span></code></pre></div></div>

<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>

<h2 id="references">References</h2>

<p>Meeus J (1998). <em>Astronomical algorithms</em>, 2nd edition. Willmann-Bell,
Richmond, Va. ISBN 9780943396613.</p>

<p>Frohn O, Hernangómez D (2023). “Celestial Data.”
<a href="https://doi.org/10.5281/zenodo.7561601">doi:10.5281/zenodo.7561601</a>,
<a href="https://dieghernan.github.io/celestial_data/">https://dieghernan.github.io/celestial_data/</a>.</p>

<p>Frohn O (2015). “d3-celestial.” <a href="https://github.com/ofrohn/d3-celestial/">https://github.com/ofrohn/d3-celestial/</a>.</p>

<p>Fitter K (2019). “Celestial Maps.” (<a href="https://kimnewzealand.github.io/2019/02/21/celestial-maps/">link</a>).</p>

<p>Still J (2020). “Astronomical Calculations: Sidereal Time.” <a href="https://squarewidget.com/astronomical-calculations-sidereal-time/">https://squarewidget.com/astronomical-calculations-sidereal-time/</a>.</p>

<p>Pebesma E, Dunnington D (2020). “In r-spatial, the Earth is no longer flat.”
(<a href="https://r-spatial.org/r/2020/06/17/s2.html">link</a>).</p>

<p>Royé D (2020). “Firefly Cartography.”
(<a href="https://dominicroye.github.io/en/2021/firefly-cartography/">link</a>).</p>
<div class="footnotes" role="doc-endnotes">
  <ol>
    <li id="fn:1">

      <p>In fact, the download is performed via
<a href="https://www.jsdelivr.com/">jsDelivr</a>, which distributes files hosted on
<a href="https://www.jsdelivr.com/github">GitHub via CDN.</a> This is supposed to
improve performance, but in any case the underlying data source is the GitHub
repo. <a href="#fnref:1" class="reversefootnote" role="doc-backlink">&uarr;</a></p>
    </li>
  </ol>
</div>
</div>
				]]>
			</description>
			<link>https://dieghernan.github.io/202301_star-map-R/</link>
			<category>posts</category>
		    <category>astronomy</category><category>celestial</category><category>geojson</category><category>ggplot2</category><category>gpkg</category><category>maps</category><category>r_bloggers</category><category>rspatial</category><category>rstats</category><category>s2</category><category>sf</category><media:title type="html"><![CDATA[Star map with R ]]></media:title>
      <media:content url="https://dieghernan.github.io/celestial_data/assets/img/ogimage.webp" medium="image"/>
      <media:thumbnail url="https://dieghernan.github.io/celestial_data/assets/img/ogimage.webp" /><guid isPermaLink="true">https://dieghernan.github.io/202301_star-map-R/</guid>
      <pubDate>Wed, 25 Jan 2023 00:00:00 +0100</pubDate>
		</item><item>
			<title>Celestial data</title>
			<description>
				<![CDATA[	
 				<h3>A compilation of celestial data files</h3>
    		<p>1 min.</p>
				<div><p><a href="https://doi.org/10.5281/zenodo.7561601"><img src="https://img.shields.io/badge/DOI-10.5281/zenodo.7561601-blue" alt="DOI" /></a></p>

<p>This project provides several datasets of celestial objects as of the J2000
epoch in GeoJSON and GeoPackage formats.</p>

<p>The original files were provided by the
<a href="https://github.com/ofrohn/d3-celestial/">d3-celestial plugin</a>
(<a href="#ref-frohn2015">Frohn 2015</a>) under
<a href="https://opensource.org/licenses/BSD-3-Clause">BSD 3-Clause</a>. The datasets
produced by this project consist of the same data provided by the
<a href="https://github.com/ofrohn/d3-celestial/">d3-celestial plugin</a> processed with
the <strong>R</strong> package <strong>sf</strong> (<a href="#ref-pebesma2018">Pebesma 2018</a>) to ensure its
validity:</p>

<ul>
  <li>
    <p>The spatial data objects are bounded by \([-180, -90, 180, 90]\).</p>
  </li>
  <li>
    <p>Data are provided in WGS 84 - World Geodetic System 1984
(<a href="https://epsg.io/4326">EPSG:4326</a>).</p>
  </li>
  <li>
    <p>All geometries are valid as per
<a href="https://postgis.net/docs/ST_IsValid.html">ST_IsValid</a> (GEOS <strong>3.9.3</strong>).</p>
  </li>
</ul>

<h2 id="distribution">Distribution</h2>

<p>The data can be accessed from several API endpoints:</p>

<div class="language-html highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c">&lt;!-- From GitHub --&gt;</span>
https://raw.githubusercontent.com/dieghernan/celestial_data/main/data/mw.min.geojson

<span class="c">&lt;!-- From the website --&gt;</span>
https://dieghernan.github.io/celestial_data/data/mw.min.geojson

<span class="c">&lt;!-- From jsDelivr --&gt;</span>
https://cdn.jsdelivr.net/gh/dieghernan/celestial_data@main/data/mw.min.geojson
</code></pre></div></div>

<h2 id="data">Data</h2>

<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.
Additionally, for GeoJSON files a minified version (<code class="language-plaintext highlighter-rouge">*.min.geojson</code>) is
also provided.</p>

<p>The data source can be found in the corresponding
<a href="https://github.com/dieghernan/celestial_data/tree/main/data">GitHub repo</a>.</p>

<details class="my-2">
  <summary>
List of files provided:
</summary>

  <ul>
    <li><code class="language-plaintext highlighter-rouge">asterisms.geojson</code></li>
    <li><code class="language-plaintext highlighter-rouge">asterisms.gpkg</code></li>
    <li><code class="language-plaintext highlighter-rouge">asterisms.min.geojson</code></li>
    <li><code class="language-plaintext highlighter-rouge">constellations.borders.cn.geojson</code></li>
    <li><code class="language-plaintext highlighter-rouge">constellations.borders.cn.gpkg</code></li>
    <li><code class="language-plaintext highlighter-rouge">constellations.borders.cn.min.geojson</code></li>
    <li><code class="language-plaintext highlighter-rouge">constellations.borders.geojson</code></li>
    <li><code class="language-plaintext highlighter-rouge">constellations.borders.gpkg</code></li>
    <li><code class="language-plaintext highlighter-rouge">constellations.borders.min.geojson</code></li>
    <li><code class="language-plaintext highlighter-rouge">constellations.borders.min.min.geojson</code></li>
    <li><code class="language-plaintext highlighter-rouge">constellations.bounds.cn.geojson</code></li>
    <li><code class="language-plaintext highlighter-rouge">constellations.bounds.cn.gpkg</code></li>
    <li><code class="language-plaintext highlighter-rouge">constellations.bounds.cn.min.geojson</code></li>
    <li><code class="language-plaintext highlighter-rouge">constellations.bounds.geojson</code></li>
    <li><code class="language-plaintext highlighter-rouge">constellations.bounds.gpkg</code></li>
    <li><code class="language-plaintext highlighter-rouge">constellations.bounds.min.geojson</code></li>
    <li><code class="language-plaintext highlighter-rouge">constellations.cn.csv</code></li>
    <li><code class="language-plaintext highlighter-rouge">constellations.cn.geojson</code></li>
    <li><code class="language-plaintext highlighter-rouge">constellations.cn.gpkg</code></li>
    <li><code class="language-plaintext highlighter-rouge">constellations.cn.min.geojson</code></li>
    <li><code class="language-plaintext highlighter-rouge">constellations.csv</code></li>
    <li><code class="language-plaintext highlighter-rouge">constellations.geojson</code></li>
    <li><code class="language-plaintext highlighter-rouge">constellations.gpkg</code></li>
    <li><code class="language-plaintext highlighter-rouge">constellations.lines.cn.geojson</code></li>
    <li><code class="language-plaintext highlighter-rouge">constellations.lines.cn.gpkg</code></li>
    <li><code class="language-plaintext highlighter-rouge">constellations.lines.cn.min.geojson</code></li>
    <li><code class="language-plaintext highlighter-rouge">constellations.lines.geojson</code></li>
    <li><code class="language-plaintext highlighter-rouge">constellations.lines.gpkg</code></li>
    <li><code class="language-plaintext highlighter-rouge">constellations.lines.min.geojson</code></li>
    <li><code class="language-plaintext highlighter-rouge">constellations.min.geojson</code></li>
    <li><code class="language-plaintext highlighter-rouge">dsonames.cn.csv</code></li>
    <li><code class="language-plaintext highlighter-rouge">dsonames.csv</code></li>
    <li><code class="language-plaintext highlighter-rouge">dsos.14.geojson</code></li>
    <li><code class="language-plaintext highlighter-rouge">dsos.14.gpkg</code></li>
    <li><code class="language-plaintext highlighter-rouge">dsos.14.min.geojson</code></li>
    <li><code class="language-plaintext highlighter-rouge">dsos.20.geojson</code></li>
    <li><code class="language-plaintext highlighter-rouge">dsos.20.gpkg</code></li>
    <li><code class="language-plaintext highlighter-rouge">dsos.20.min.geojson</code></li>
    <li><code class="language-plaintext highlighter-rouge">dsos.6.geojson</code></li>
    <li><code class="language-plaintext highlighter-rouge">dsos.6.gpkg</code></li>
    <li><code class="language-plaintext highlighter-rouge">dsos.6.min.geojson</code></li>
    <li><code class="language-plaintext highlighter-rouge">dsos.bright.geojson</code></li>
    <li><code class="language-plaintext highlighter-rouge">dsos.bright.gpkg</code></li>
    <li><code class="language-plaintext highlighter-rouge">dsos.bright.min.geojson</code></li>
    <li><code class="language-plaintext highlighter-rouge">lg.geojson</code></li>
    <li><code class="language-plaintext highlighter-rouge">lg.gpkg</code></li>
    <li><code class="language-plaintext highlighter-rouge">lg.min.geojson</code></li>
    <li><code class="language-plaintext highlighter-rouge">messier.geojson</code></li>
    <li><code class="language-plaintext highlighter-rouge">messier.gpkg</code></li>
    <li><code class="language-plaintext highlighter-rouge">messier.min.geojson</code></li>
    <li><code class="language-plaintext highlighter-rouge">mw.geojson</code></li>
    <li><code class="language-plaintext highlighter-rouge">mw.gpkg</code></li>
    <li><code class="language-plaintext highlighter-rouge">mw.min.geojson</code></li>
    <li><code class="language-plaintext highlighter-rouge">starnames.cn.csv</code></li>
    <li><code class="language-plaintext highlighter-rouge">starnames.csv</code></li>
    <li><code class="language-plaintext highlighter-rouge">stars.14.geojson</code></li>
    <li><code class="language-plaintext highlighter-rouge">stars.14.gpkg</code></li>
    <li><code class="language-plaintext highlighter-rouge">stars.14.min.geojson</code></li>
    <li><code class="language-plaintext highlighter-rouge">stars.6.geojson</code></li>
    <li><code class="language-plaintext highlighter-rouge">stars.6.gpkg</code></li>
    <li><code class="language-plaintext highlighter-rouge">stars.6.min.geojson</code></li>
    <li><code class="language-plaintext highlighter-rouge">stars.8.geojson</code></li>
    <li><code class="language-plaintext highlighter-rouge">stars.8.gpkg</code></li>
    <li><code class="language-plaintext highlighter-rouge">stars.8.min.geojson</code></li>
  </ul>

</details>

<p>See additional details in the
<a href="https://dieghernan.github.io/celestial_data/data">data description</a>.</p>

<h2 id="citation">Citation</h2>

<p>Please cite these datasets as:</p>

<p>Frohn, O., &amp; Hernangómez, D. (2023). Celestial Data [Data set].
<a href="https://doi.org/10.5281/zenodo.7561601">https://doi.org/10.5281/zenodo.7561601</a></p>

<p>A BibTeX entry:</p>

<div class="language-bibtex highlighter-rouge"><div class="highlight"><pre class="highlight"><code>
<span class="nc">@misc</span><span class="p">{</span><span class="nl">frohnhernangomez:2023</span><span class="p">,</span>
    <span class="na">title</span>        <span class="p">=</span> <span class="s">{Celestial Data}</span><span class="p">,</span>
    <span class="na">author</span>       <span class="p">=</span> <span class="s">{Olaf Frohn and Diego Hernangómez}</span><span class="p">,</span>
    <span class="na">year</span>         <span class="p">=</span> <span class="m">2023</span><span class="p">,</span>
    <span class="na">doi</span>          <span class="p">=</span> <span class="s">{10.5281/zenodo.7561601}</span><span class="p">,</span>
    <span class="na">url</span>          <span class="p">=</span> <span class="s">{https://dieghernan.github.io/celestial_data/}</span><span class="p">,</span>
<span class="p">}</span>

</code></pre></div></div>

<h2 id="references">References</h2>

<div id="ref-frohn2015" class="csl-entry">

  <p>Frohn, Olaf. 2015. “d3-celestial” <a href="https://github.com/ofrohn/d3-celestial/">https://github.com/ofrohn/d3-celestial/</a>.</p>

</div>

<div id="ref-pebesma2018" class="csl-entry">

  <p>Pebesma, Edzer. 2018. “Simple Features for R: Standardized Support for
Spatial Vector Data.” <em>The R Journal</em> 10 (1): 439446.
<a href="https://doi.org/10.32614/RJ-2018-009">https://doi.org/10.32614/RJ-2018-009</a>.</p>

</div>
</div>
				]]>
			</description>
			<link>https://dieghernan.github.io/projects/celestial-data/</link>
			<category>projects</category>
		    <category>astronomy</category><category>celestial</category><category>csv</category><category>dataset</category><category>geojson</category><category>gpkg</category><category>maps</category><category>project</category><media:title type="html"><![CDATA[Celestial data ]]></media:title>
      <media:content url="https://dieghernan.github.io/celestial_data/assets/img/ogimage.webp" medium="image"/>
      <media:thumbnail url="https://dieghernan.github.io/celestial_data/assets/img/ogimage.webp" /><guid isPermaLink="true">https://dieghernan.github.io/projects/celestial-data/</guid>
      <pubDate>Mon, 23 Jan 2023 00:00:00 +0100</pubDate>
		</item><item>
			<title>Hillshade, colors and marginal plots with tidyterra (II)</title>
			<description>
				<![CDATA[	
 				<h3>The rain in Spain does not stay mainly in the plain</h3>
    		<p>12 min.</p>
				<div><p><em>This is the second post of the series “Hillshade, colors and
marginal plots with <strong>tidyterra</strong>”. In this post, I explore an approach for
annotating marginal plots on a <strong>ggplot2</strong> map of a SpatRaster, including
information about the values by longitude and latitude. See the first post of the
series <a href="https://dieghernan.github.io/202210_tidyterra-hillshade/">here</a>.</em></p>

<p>If you love watching classic movies, especially from Hollywood’s Golden Age,
you may recognize the following lyrics:</p>

<blockquote>
  <p>The rain in Spain stays mainly in the plain!</p>

  <p>By George, she’s got it! By George, she’s got it!</p>

  <p>Now, once again where does it rain? On the plain! On the plain!</p>

  <p>And where’s that soggy plain? In Spain! In Spain!</p>

  <p>The rain in Spain stays mainly in the plain!</p>

  <p>The rain in Spain stays mainly in the plain!</p>
</blockquote>

<!-- Thanks to Minimal Mistakes -->
<p><!-- https://embedresponsively.com/ --></p>
<div class="embed-responsive embed-responsive-16by9 my-2 chulapa-rounded-lg" itemscope="" itemprop="VideoObject" itemtype="https://schema.org/VideoObject">
      <iframe loading="lazy" title="Video from YouTube" class="embed-responsive-item" src="https://www.youtube-nocookie.com/embed/uVmU3iANbgk" allowfullscreen="" itemprop="embedUrl"></iframe>
    
  </div>

<p>This emphatic statement is made in <a href="https://en.wikipedia.org/wiki/My_Fair_Lady_(film)"><em>My Fair Lady
(1964)</em></a> by Audrey Hepburn,
Rex Harrison and Stanley Holloway. But as a Spaniard, I can tell you it is
<strong>completely false</strong>.</p>

<p>The rain in Spain stays mainly in the north, most notably in Galicia. And I can
prove it!</p>

<p>In this post, I overlay a SpatRaster showing average precipitation data
with an extra set of plots on the margin to identify where the rain in Spain
stays (mainly).</p>

<h2 id="libraries">Libraries</h2>

<p>In this post, we will use the following libraries:</p>

<div class="language-r highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">## Libraries</span><span class="w">

</span><span class="c1"># Data manipulation</span><span class="w">
</span><span class="n">library</span><span class="p">(</span><span class="n">terra</span><span class="p">)</span><span class="w">
</span><span class="n">library</span><span class="p">(</span><span class="n">tidyterra</span><span class="p">)</span><span class="w">
</span><span class="n">library</span><span class="p">(</span><span class="n">dplyr</span><span class="p">)</span><span class="w">

</span><span class="c1"># Get the data</span><span class="w">
</span><span class="n">library</span><span class="p">(</span><span class="n">geodata</span><span class="p">)</span><span class="w">
</span><span class="n">library</span><span class="p">(</span><span class="n">mapSpain</span><span class="p">)</span><span class="w">

</span><span class="c1"># Plotting</span><span class="w">
</span><span class="n">library</span><span class="p">(</span><span class="n">ggplot2</span><span class="p">)</span><span class="w">
</span><span class="n">library</span><span class="p">(</span><span class="n">scales</span><span class="p">)</span><span class="w">
</span><span class="n">library</span><span class="p">(</span><span class="n">cowplot</span><span class="p">)</span><span class="w">
</span><span class="n">library</span><span class="p">(</span><span class="n">colorspace</span><span class="p">)</span><span class="w">
</span></code></pre></div></div>

<h2 id="the-plain-in-spain">The plain in Spain</h2>

<p>The plain (or as we call it, <em>La Meseta Central</em>) covers a large area of
inland Spain, with an average altitude of 650 meters above sea level.</p>

<p>I didn’t find any accurate spatial data file with the bounds of the plain, so
for this case I would approximate it using a mixture of political borders
(historically the <em>Meseta</em> is associated with Castile and Madrid) and elevation
data to get a rough shape.</p>

<div class="language-r highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="w">
</span><span class="c1"># Using mapSpain</span><span class="w">
</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">
  </span><span class="nf">c</span><span class="p">(</span><span class="w">
    </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">
    </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">
    </span><span class="s2">"Teruel"</span><span class="w">
  </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">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">
</span><span class="p">)</span><span class="w"> </span><span class="o">%&gt;%</span><span class="w">
  </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">
  </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">
  </span><span class="c1"># Combine</span><span class="w">
  </span><span class="n">summarise</span><span class="p">()</span><span class="w"> </span><span class="o">%&gt;%</span><span class="w">
  </span><span class="c1"># To terra, until this step was sf</span><span class="w">
  </span><span class="n">vect</span><span class="p">()</span><span class="w">

</span><span class="c1"># Get altitude</span><span class="w">

</span><span class="c1"># I use here a local directory to cache downloaded files on my PC.</span><span class="w">
</span><span class="c1"># Modify this to your likes, e.g. using</span><span class="w">
</span><span class="c1"># mydir &lt;- tempdir()</span><span class="w">

</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">


</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">

</span><span class="c1"># For better handling we set here the names</span><span class="w">
</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">

</span><span class="c1"># We don't want values lower than 0 on the raster</span><span class="w">
</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">
  </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">


</span><span class="c1"># Now intersect the raster and the vector and filter by range</span><span class="w">

</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">
  </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">
  </span><span class="c1"># Let's define here a range of elevations</span><span class="w">
  </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">
  </span><span class="n">drop_na</span><span class="p">()</span><span class="w"> </span><span class="o">%&gt;%</span><span class="w">
  </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">
  </span><span class="c1"># Aggregate first</span><span class="w">
  </span><span class="n">aggregate</span><span class="p">()</span><span class="w"> </span><span class="o">%&gt;%</span><span class="w">
  </span><span class="c1"># Explode vectors</span><span class="w">
  </span><span class="n">disagg</span><span class="p">()</span><span class="w"> </span><span class="o">%&gt;%</span><span class="w">
  </span><span class="c1"># And fill holes</span><span class="w">
  </span><span class="n">fillHoles</span><span class="p">()</span><span class="w">



</span><span class="c1"># Select biggest polygons (area bigger than 50 kms 2)</span><span class="w">
</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"> </span><span class="o">%&gt;%</span><span class="w">
  </span><span class="c1"># Add area</span><span class="w">
  </span><span class="n">mutate</span><span class="p">(</span><span class="n">area</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">expanse</span><span class="p">(</span><span class="n">exploded</span><span class="p">))</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">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">
  </span><span class="c1"># And convert to lines</span><span class="w">
  </span><span class="n">as.lines</span><span class="p">()</span><span class="w">

</span><span class="n">autoplot</span><span class="p">(</span><span class="n">r_plain</span><span class="p">)</span><span class="w">
</span></code></pre></div></div>

<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>

<p>We can create a new plot similar to the one produced in the <a href="https://dieghernan.github.io/202210_tidyterra-hillshade/">previous
post</a> to identify the
plain. First, I create a base layer with a representation of the
hillshade, which we will reuse later:</p>

<div class="language-r highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="w">
</span><span class="c1"># Creating hillshade</span><span class="w">

</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">
</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">
</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">

</span><span class="c1"># normalize names</span><span class="w">
</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">

</span><span class="c1"># Hillshading palette</span><span class="w">
</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">

</span><span class="c1"># Index of color by cell</span><span class="w">
</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">
  </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">
  </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">
  </span><span class="n">pull</span><span class="p">(</span><span class="n">index_col</span><span class="p">)</span><span class="w">


</span><span class="c1"># Get cols</span><span class="w">
</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">

</span><span class="c1"># Need to avoid resampling</span><span class="w">
</span><span class="c1"># and don't use aes</span><span class="w">

</span><span class="c1"># Base hill plot</span><span class="w">
</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">
  </span><span class="n">geom_spatraster</span><span class="p">(</span><span class="w">
    </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">
    </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">
  </span><span class="p">)</span><span class="w">

</span><span class="n">hill_plot</span><span class="w">
</span></code></pre></div></div>

<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>

<p>And finally we overlay the altitude and the outline of the plain in Spain.</p>

<div class="language-r highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># Overlaying and theming</span><span class="w">

</span><span class="c1"># Aware of limits of the raster</span><span class="w">

</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">
</span><span class="c1"># Round to lower and higher 500 integer with a min of 0</span><span class="w">
</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">
  </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">
  </span><span class="m">0</span><span class="w">
</span><span class="p">)</span><span class="w">

</span><span class="n">alt_limits</span><span class="w">
</span><span class="c1">#&gt; [1]    0 3500</span><span class="w">


</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">


</span><span class="n">plot_esp</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">hill_plot</span><span class="w"> </span><span class="o">+</span><span class="w">
  </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">
  </span><span class="c1"># Overlay the_plain</span><span class="w">
  </span><span class="n">geom_spatvector</span><span class="p">(</span><span class="w">
    </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">
    </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">
  </span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w">
  </span><span class="n">scale_fill_hypso_tint_c</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">"wiki-schwarzwald-cont"</span><span class="p">,</span><span class="w">
    </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">
    </span><span class="n">alpha</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">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">
    </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">
  </span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w">
  </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">
    </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">
    </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">
    </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">
    </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">
    </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">0.8</span><span class="p">)</span><span class="w">
  </span><span class="p">))</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">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">
    </span><span class="n">subtitle</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"The plain represented with black line"</span><span class="w">
  </span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w">
  </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="s2">"serif"</span><span class="p">)</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">
    </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="s2">"white"</span><span class="p">),</span><span class="w">
    </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">
      </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">
      </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">
    </span><span class="p">),</span><span class="w">
    </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">
      </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">
      </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">
    </span><span class="p">),</span><span class="w">
    </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">
      </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">
      </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">
    </span><span class="p">),</span><span class="w">
    </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">
    </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">
    </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">
  </span><span class="p">)</span><span class="w">

</span><span class="n">plot_esp</span><span class="w">
</span></code></pre></div></div>

<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>

<h2 id="the-rain-in-spain">The rain in Spain</h2>

<p>Let’s check now whether the rain falls mainly in the plain or not. We use here
<code class="language-plaintext highlighter-rouge">geodata::worldclim_country()</code> to get the average precipitation by month from
<a href="https://www.worldclim.org/">WorldClim</a>:</p>

<div class="language-r highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># Precipitation of Spain</span><span class="w">

</span><span class="c1"># Get precip data</span><span class="w">
</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">

</span><span class="n">precip</span><span class="w">
</span><span class="c1">#&gt; class       : SpatRaster</span><span class="w">
</span><span class="c1">#&gt; dimensions  : 1980, 2760, 12  (nrow, ncol, nlyr)</span><span class="w">
</span><span class="c1">#&gt; resolution  : 0.008333333, 0.008333333  (x, y)</span><span class="w">
</span><span class="c1">#&gt; extent      : -18.5, 4.5, 27.5, 44  (xmin, xmax, ymin, ymax)</span><span class="w">
</span><span class="c1">#&gt; coord. ref. : lon/lat WGS 84 (EPSG:4326)</span><span class="w">
</span><span class="c1">#&gt; source      : ESP_wc2.1_30s_prec.tif</span><span class="w">
</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">
</span><span class="c1">#&gt; min values  :           0,           1,           1,           0,           0,           0, ...</span><span class="w">
</span><span class="c1">#&gt; max values  :         296,         255,         199,         166,         181,         140, ...</span><span class="w">
</span></code></pre></div></div>

<p>We have now a SpatRaster with 12 layers representing the value of each month. So
we now just add the values by cell to get the annual average. Note that we also
need to normalize the SpatRaster to the projection, extent and resolution of our
<code class="language-plaintext highlighter-rouge">hill</code> object:</p>

<div class="language-r highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># Sum all layers</span><span class="w">
</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">

</span><span class="n">precip_avg</span><span class="w">
</span><span class="c1">#&gt; class       : SpatRaster</span><span class="w">
</span><span class="c1">#&gt; dimensions  : 1980, 2760, 1  (nrow, ncol, nlyr)</span><span class="w">
</span><span class="c1">#&gt; resolution  : 0.008333333, 0.008333333  (x, y)</span><span class="w">
</span><span class="c1">#&gt; extent      : -18.5, 4.5, 27.5, 44  (xmin, xmax, ymin, ymax)</span><span class="w">
</span><span class="c1">#&gt; coord. ref. : lon/lat WGS 84 (EPSG:4326)</span><span class="w">
</span><span class="c1">#&gt; source(s)   : memory</span><span class="w">
</span><span class="c1">#&gt; name        :  sum</span><span class="w">
</span><span class="c1">#&gt; min value   :    8</span><span class="w">
</span><span class="c1">#&gt; max value   : 2055</span><span class="w">


</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">

</span><span class="c1"># Align raster using hill</span><span class="w">

</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">
  </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">
  </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">
  </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="c1"># Normalize</span><span class="w">
</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">

</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">

</span><span class="n">autoplot</span><span class="p">(</span><span class="n">precip_avg_mask</span><span class="p">)</span><span class="w">
</span></code></pre></div></div>

<p><img src="https://dieghernan.github.io/assets/img/blog/20221212_prepare_precip-1.webp" alt="Map of average yearly precipitation in mainland Spain and the Balearic Islands. Higher values occur along the northern coast and lower values in the southeast." width="100%" /></p>

<h3 id="creating-a-modified-palette">Creating a modified palette</h3>

<p>We can now start representing our precipitation map. I chose here to create a
custom palette with <strong>colorspace</strong> to better highlight the differences:</p>

<div class="language-r highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="w">
</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">
  </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">
  </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">
  </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">
  </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">
  </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">
</span><span class="p">)</span><span class="w">

</span><span class="n">show_col</span><span class="p">(</span><span class="n">mypal</span><span class="p">)</span><span class="w">
</span></code></pre></div></div>

<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>

<p>And now we can create the final map showing if <em>the rain in Spain stays mainly
in the plain</em>:</p>

<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">
</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">


</span><span class="n">meteo_plot</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">hill_plot</span><span class="w"> </span><span class="o">+</span><span class="w">
  </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">precip_avg_mask</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">
  </span><span class="c1"># Overlay the_plain</span><span class="w">
  </span><span class="n">geom_spatvector</span><span class="p">(</span><span class="w">
    </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">
    </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">
  </span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w">
  </span><span class="c1"># This part is theming only</span><span class="w">
  </span><span class="n">scale_fill_gradientn</span><span class="p">(</span><span class="w">
    </span><span class="n">colours</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">alpha</span><span class="p">(</span><span class="n">mypal</span><span class="p">,</span><span class="w"> </span><span class="m">0.7</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">
    </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">
    </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">
  </span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w">
  </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">
    </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">
    </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">
    </span><span class="n">keywidth</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">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">
    </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="p">,</span><span class="w">
    </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">
    </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">
    </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">
    </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">0.9</span><span class="p">)</span><span class="w">
  </span><span class="p">))</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">title</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"Average yearly precipitation of Spain"</span><span class="p">,</span><span class="w">
    </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">
  </span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w">
  </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="s2">"serif"</span><span class="p">)</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">
    </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="s2">"white"</span><span class="p">),</span><span class="w">
    </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">
      </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">
      </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">
    </span><span class="p">),</span><span class="w">
    </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">
      </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">
      </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">
    </span><span class="p">),</span><span class="w">
    </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">
    </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">
    </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">
    </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">
    </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">
    </span><span class="n">legend.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">
  </span><span class="p">)</span><span class="w">


</span><span class="n">meteo_plot</span><span class="w">
</span></code></pre></div></div>

<p><img src="https://dieghernan.github.io/assets/img/blog/20221212_precip_end-1.webp" alt="Map of average yearly precipitation in Spain with hillshade beneath the color layer. Wetter northern and northwestern areas contrast with the drier southeast." width="100%" /></p>

<p>We can now see that the rain in Spain falls mainly on the Atlantic coast
(northern Spain) and specifically in Galicia. That’s why in Spanish the lyrics
<em>The rain in Spain stays mainly in the plain</em> were translated into:</p>

<blockquote>
  <p>La lluvia en Sevilla es una pura maravilla.</p>
</blockquote>

<p>That can be translated as <em>“The rain in Seville is a true marvel”</em>. And it is,
indeed. Seville (located in the south on the <a href="https://goo.gl/maps/V8ZrDjrA74CTknYb7">Guadalquivir
Valley</a>) has circa 50 rainy days per year,
featuring very hot and dry summers.</p>

<h2 id="marginal-plots-finally">Marginal plots (finally)</h2>

<p>We can now start profiling our final plot. The idea is to create two bar charts,
representing the value to be plotted (in this case, average annual
precipitation) by longitude and latitude.</p>

<p>But first we add some additional margins and axis titles to the main plot, so we
can easily insert those marginal plots into our main plot:</p>

<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">

</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">
  </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">
  </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">
  </span><span class="c1"># titles on secondary axis, for later</span><span class="w">
  </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">
    </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">
  </span><span class="p">))</span><span class="w"> </span><span class="o">+</span><span class="w">
  </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">
    </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">
  </span><span class="p">))</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">
    </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">
      </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">
      </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"> </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">
    </span><span class="p">),</span><span class="w">
    </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">
      </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">
      </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">
        </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">
        </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="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">0.9</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">
    </span><span class="p">)</span><span class="w">
  </span><span class="p">)</span><span class="w">

</span><span class="n">plot_main</span><span class="w">
</span></code></pre></div></div>

<p><img src="https://dieghernan.github.io/assets/img/blog/20221212_precip_for_margin-1.webp" alt="Map of average yearly precipitation in Spain prepared for adding marginal profiles. Colors distinguish the wetter north from the drier southeast." width="100%" /></p>

<h3 id="profiling-marginal-plots">Profiling marginal plots</h3>

<p>In the following code, I am drafting what the marginal plots would look
like, so we can have a preview of the final result:</p>

<div class="language-r highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="w">
</span><span class="c1"># Profiling marginal plots</span><span class="w">

</span><span class="c1"># Getting averages by x,y</span><span class="w">
</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">
  </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">
  </span><span class="n">drop_na</span><span class="p">()</span><span class="w"> </span><span class="o">%&gt;%</span><span class="w">
  </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">
  </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">

</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">
  </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">
  </span><span class="n">drop_na</span><span class="p">()</span><span class="w"> </span><span class="o">%&gt;%</span><span class="w">
  </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">
  </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">


</span><span class="c1"># Cowplot would delete axis, we create an axis at 1000 and 2000</span><span class="w">
</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">

</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">
  </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">
  </span><span class="s2">"mm."</span><span class="w">
</span><span class="p">))</span><span class="w">

</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">
</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">
</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">

</span><span class="c1"># Profiling</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">
  </span><span class="n">geom_col</span><span class="p">(</span><span class="w">
    </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">
    </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">
    </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">show.legend</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="kc">FALSE</span><span class="w">
  </span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w">
  </span><span class="n">geom_text</span><span class="p">(</span><span class="w">
    </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">
    </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">
    </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">
  </span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w">
  </span><span class="n">scale_fill_gradientn</span><span class="p">(</span><span class="w">
    </span><span class="n">colours</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">alpha</span><span class="p">(</span><span class="n">mypal</span><span class="p">,</span><span class="w"> </span><span class="m">0.9</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">
    </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">
    </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="w">
  </span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w">
  </span><span class="n">scale_y_continuous</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="n">br_4marginal</span><span class="p">,</span><span class="w">
    </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">
  </span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w">
  </span><span class="n">theme_void</span><span class="p">()</span><span class="w"> </span><span class="o">+</span><span class="w">
  </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">
    </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">
    </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">
  </span><span class="p">))</span><span class="w">
</span></code></pre></div></div>

<p><img src="https://dieghernan.github.io/assets/img/blog/20221212_profile_marg-1.webp" alt="Bar profile of average yearly 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>

<div class="language-r highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="w">
</span><span class="n">ggplot</span><span class="p">()</span><span class="w"> </span><span class="o">+</span><span class="w">
  </span><span class="n">geom_col</span><span class="p">(</span><span class="w">
    </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">
    </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">
    </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">show.legend</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="kc">FALSE</span><span class="w">
  </span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w">
  </span><span class="n">geom_text</span><span class="p">(</span><span class="w">
    </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">
    </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">
    </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">
    </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">
  </span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w">
  </span><span class="n">scale_fill_gradientn</span><span class="p">(</span><span class="w">
    </span><span class="n">colours</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">alpha</span><span class="p">(</span><span class="n">mypal</span><span class="p">,</span><span class="w"> </span><span class="m">0.9</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">
    </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">
    </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="w">
  </span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w">
  </span><span class="n">scale_y_continuous</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="n">br_4marginal</span><span class="p">,</span><span class="w">
    </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">
  </span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w">
  </span><span class="n">coord_flip</span><span class="p">()</span><span class="w"> </span><span class="o">+</span><span class="w">
  </span><span class="n">theme_void</span><span class="p">()</span><span class="w"> </span><span class="o">+</span><span class="w">
  </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">
    </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">
    </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">
  </span><span class="p">))</span><span class="w">
</span></code></pre></div></div>

<p><img src="https://dieghernan.github.io/assets/img/blog/20221212_profile_marg-2.webp" alt="Horizontal bar profile of average yearly precipitation by north-south position in Spain. Bar length and color encode rainfall in millimeters, with higher averages in the north." width="100%" /></p>

<h3 id="putting-all-the-pieces-together">Putting all the pieces together</h3>

<p>Finally, we use <code class="language-plaintext highlighter-rouge">cowplot::axis_canvas()</code> to create the marginal plots as
we want:</p>

<div class="language-r highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="w">
</span><span class="c1"># Last step: We combine plots</span><span class="w">

</span><span class="c1"># Marginal plots</span><span class="w">
</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">
  </span><span class="n">geom_col</span><span class="p">(</span><span class="w">
    </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">
    </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">
    </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">show.legend</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="kc">FALSE</span><span class="w">
  </span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w">
  </span><span class="n">geom_text</span><span class="p">(</span><span class="w">
    </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">
    </span><span class="c1"># Adjust the position of the labels</span><span class="w">
    </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">
    </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">
    </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">
    </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">
  </span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w">
  </span><span class="n">scale_fill_gradientn</span><span class="p">(</span><span class="w">
    </span><span class="n">colours</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">alpha</span><span class="p">(</span><span class="n">mypal</span><span class="p">,</span><span class="w"> </span><span class="m">0.9</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">
    </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">
    </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="w">
  </span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w">
  </span><span class="n">scale_y_continuous</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="n">br_4marginal</span><span class="p">,</span><span class="w">
    </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">
  </span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w">
  </span><span class="n">theme_void</span><span class="p">()</span><span class="w"> </span><span class="o">+</span><span class="w">
  </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">
    </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">
    </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">
    </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">
  </span><span class="p">))</span><span class="w">

</span><span class="n">plot_x</span><span class="w">
</span></code></pre></div></div>

<p><img src="https://dieghernan.github.io/assets/img/blog/20221212_prepare_axis-1.webp" alt="Bar profile of average yearly precipitation from west to east in Spain, formatted for placement above the map. Height and color encode rainfall in millimeters." width="100%" /></p>

<div class="language-r highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="w">
</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">
  </span><span class="n">geom_col</span><span class="p">(</span><span class="w">
    </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">
    </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">
    </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">show.legend</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="kc">FALSE</span><span class="w">
  </span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w">
  </span><span class="n">geom_text</span><span class="p">(</span><span class="w">
    </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">
    </span><span class="c1"># Adjust the position of the labels</span><span class="w">
    </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">
    </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">
    </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">
    </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">
    </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">
  </span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w">
  </span><span class="n">scale_fill_gradientn</span><span class="p">(</span><span class="w">
    </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">
    </span><span class="n">colours</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">alpha</span><span class="p">(</span><span class="n">mypal</span><span class="p">,</span><span class="w"> </span><span class="m">0.9</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">
    </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">
  </span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w">
  </span><span class="n">scale_y_continuous</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="n">br_4marginal</span><span class="p">,</span><span class="w">
    </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">
  </span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w">
  </span><span class="n">coord_flip</span><span class="p">()</span><span class="w"> </span><span class="o">+</span><span class="w">
  </span><span class="n">theme_void</span><span class="p">()</span><span class="w"> </span><span class="o">+</span><span class="w">
  </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">
    </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">
    </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">
    </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">
  </span><span class="p">))</span><span class="w">
</span><span class="n">plot_y</span><span class="w">
</span></code></pre></div></div>

<p><img src="https://dieghernan.github.io/assets/img/blog/20221212_prepare_axis-2.webp" alt="Horizontal bar profile of average yearly precipitation from south to north in Spain, formatted for placement beside the map. Length and color encode rainfall in millimeters." width="100%" /></p>

<p>And insert everything in the main plot. See the final result:</p>

<div class="language-r highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="w">
</span><span class="c1"># Combine all plots into one</span><span class="w">
</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">

</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">
  </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">
  </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">
</span><span class="p">)</span><span class="w">
</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">
  </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">
  </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">
</span><span class="p">)</span><span class="w">

</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">
</span><span class="n">gg_final</span><span class="w">
</span></code></pre></div></div>

<p><img src="https://dieghernan.github.io/assets/img/blog/20221212_finalplot-1.webp" alt="Map of average yearly 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>

<p>And with a bit of effort we got it.</p>

<h2 id="recap">Recap</h2>

<p>Much of the code we have created relates to the theming and labels of the
plot. Here you can find a simplified version:</p>

<details>
  <summary>Simplified version</summary>

  <div class="language-r highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="w">
</span><span class="c1"># Libraries</span><span class="w">
</span><span class="c1"># Data manipulation</span><span class="w">
</span><span class="n">library</span><span class="p">(</span><span class="n">terra</span><span class="p">)</span><span class="w">
</span><span class="n">library</span><span class="p">(</span><span class="n">tidyterra</span><span class="p">)</span><span class="w">
</span><span class="n">library</span><span class="p">(</span><span class="n">dplyr</span><span class="p">)</span><span class="w">

</span><span class="c1"># Get the data</span><span class="w">
</span><span class="n">library</span><span class="p">(</span><span class="n">geodata</span><span class="p">)</span><span class="w">

</span><span class="c1"># Plotting</span><span class="w">
</span><span class="n">library</span><span class="p">(</span><span class="n">ggplot2</span><span class="p">)</span><span class="w">
</span><span class="n">library</span><span class="p">(</span><span class="n">scales</span><span class="p">)</span><span class="w">
</span><span class="n">library</span><span class="p">(</span><span class="n">cowplot</span><span class="p">)</span><span class="w">
</span><span class="n">library</span><span class="p">(</span><span class="n">colorspace</span><span class="p">)</span><span class="w">

</span><span class="c1"># Get the data</span><span class="w">
</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">

</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">
  </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">
  </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">

</span><span class="c1"># Creating hillshade</span><span class="w">

</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">
</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">
</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">

</span><span class="c1"># normalize names</span><span class="w">
</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">

</span><span class="c1"># Hillshading palette</span><span class="w">
</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">

</span><span class="c1"># Index of color by cell</span><span class="w">
</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">
  </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">
  </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">
  </span><span class="n">pull</span><span class="p">(</span><span class="n">index_col</span><span class="p">)</span><span class="w">


</span><span class="c1"># Get cols</span><span class="w">
</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">


</span><span class="c1"># Base hill plot</span><span class="w">
</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">
  </span><span class="n">geom_spatraster</span><span class="p">(</span><span class="w">
    </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">
    </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">
  </span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w">
  </span><span class="n">theme_minimal</span><span class="p">()</span><span class="w">

</span><span class="c1"># Overlay</span><span class="w">
</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">
</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">
  </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">
  </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">
  </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">
  </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">

</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">

</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">
  </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">
  </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">
  </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">
  </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">
  </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">
</span><span class="p">)</span><span class="w">


</span><span class="n">base_plot</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">hill_plot</span><span class="w"> </span><span class="o">+</span><span class="w">
  </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">precip_end</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">
  </span><span class="n">scale_fill_gradientn</span><span class="p">(</span><span class="w">
    </span><span class="n">colors</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">alpha</span><span class="p">(</span><span class="n">mypal</span><span class="p">,</span><span class="w"> </span><span class="m">0.7</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">
    </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">
  </span><span class="p">)</span><span class="w">

</span><span class="c1"># Marginal plots</span><span class="w">
</span><span class="c1"># Data</span><span class="w">
</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">
  </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">
  </span><span class="n">drop_na</span><span class="p">()</span><span class="w"> </span><span class="o">%&gt;%</span><span class="w">
  </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">
  </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">

</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">
  </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">
  </span><span class="n">drop_na</span><span class="p">()</span><span class="w"> </span><span class="o">%&gt;%</span><span class="w">
  </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">
  </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">

</span><span class="c1"># Adding marginal plots</span><span class="w">

</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">
  </span><span class="n">geom_col</span><span class="p">(</span><span class="w">
    </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">
    </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">
    </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">show.legend</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="kc">FALSE</span><span class="w">
  </span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w">
  </span><span class="n">scale_fill_gradientn</span><span class="p">(</span><span class="w">
    </span><span class="n">colours</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">alpha</span><span class="p">(</span><span class="n">mypal</span><span class="p">,</span><span class="w"> </span><span class="m">0.9</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">
    </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">
  </span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w">
  </span><span class="n">theme_void</span><span class="p">()</span><span class="w">

</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">
  </span><span class="n">geom_col</span><span class="p">(</span><span class="w">
    </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">
    </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">
    </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">show.legend</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="kc">FALSE</span><span class="w">
  </span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w">
  </span><span class="n">scale_fill_gradientn</span><span class="p">(</span><span class="w">
    </span><span class="n">colours</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">alpha</span><span class="p">(</span><span class="n">mypal</span><span class="p">,</span><span class="w"> </span><span class="m">0.9</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">
    </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">
  </span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w">
  </span><span class="n">theme_void</span><span class="p">()</span><span class="w"> </span><span class="o">+</span><span class="w">
  </span><span class="n">coord_flip</span><span class="p">()</span><span class="w">

</span><span class="c1"># All pieces together</span><span class="w">
</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">

</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">
  </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">
  </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">
</span><span class="p">)</span><span class="w">
</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">
  </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">
  </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">
</span><span class="p">)</span><span class="w">

</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">
</span><span class="n">gg_final_simp</span><span class="w">
</span></code></pre></div>  </div>

  <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>

</details>
</div>
				]]>
			</description>
			<link>https://dieghernan.github.io/202212_tidyterra-hillshade-2/</link>
			<category>posts</category>
		    <category>ggplot2</category><category>inset</category><category>mapSpain</category><category>maps</category><category>r_bloggers</category><category>rspatial</category><category>rstats</category><category>terra</category><category>tidyterra</category><media:title type="html"><![CDATA[Hillshade, colors and marginal plots with <strong>tidyterra</strong> (II) ]]></media:title>
      <media:content url="https://dieghernan.github.io/assets/img/blog/20221212_finalplot-1.webp" medium="image"/>
      <media:thumbnail url="https://dieghernan.github.io/assets/img/blog/20221212_finalplot-1.webp" /><guid isPermaLink="true">https://dieghernan.github.io/202212_tidyterra-hillshade-2/</guid>
      <pubDate>Mon, 12 Dec 2022 00:00:00 +0100</pubDate>
		</item><item>
			<title>Hillshade, colors and marginal plots with tidyterra (I)</title>
			<description>
				<![CDATA[	
 				<h3>How to overlay SpatRasters</h3>
    		<p>8 min.</p>
				<div><p><em>This is the first post of a series of two, showing how to overlay a SpatRaster
on top of a hillshade background. The next post shows how to add marginal plots
including information about the values of the raster by longitude and latitude. See
the second post <a href="https://dieghernan.github.io/202212_tidyterra-hillshade-2/">here</a>.</em></p>

<p>Using shadow effects on relief maps is a very common technique that helps
produce informative yet beautiful maps. If you are interested in this topic
and you work with <strong>R</strong>, you have probably seen this map:</p>

<p><img src="https://timogrossenbacher.ch/content/images/size/w2000/2023/07/bm-thematic-bivariate-map-with-legend-1-2.png" alt="Bivariate thematic map of Switzerland combining two variables with a color legend and shaded terrain relief." /></p>

<p>The production of this map by <a href="https://timogrossenbacher.ch/bivariate-maps-with-ggplot2-and-sf/">Timo
Grossenbacher</a>
has been a reference for years. However, recent developments in the <strong>R</strong> package
ecosystem (<strong>terra</strong>, <strong>sf</strong> and support of both classes on <strong>ggplot2</strong>, development
of <strong>ggnewscale</strong>, etc.) can make it even easier to produce these types of
maps.</p>

<p>In fact, Dominic Royé recently wrote a very detailed
<a href="https://dominicroye.github.io/en/2022/hillshade-effects/">post</a> on creating
shadow effects on map reliefs. In this first post of the series, I replicate
that technique with a slight variation (e.g. not making use of
<strong>ggnewscale</strong>) and discuss the potential choice of a color
palette for this kind of map.</p>

<h2 id="libraries">Libraries</h2>

<p>I will use the following libraries:</p>

<div class="language-r highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="w">
</span><span class="c1">## Libraries</span><span class="w">

</span><span class="n">library</span><span class="p">(</span><span class="n">terra</span><span class="p">)</span><span class="w">
</span><span class="n">library</span><span class="p">(</span><span class="n">tidyterra</span><span class="p">)</span><span class="w">
</span><span class="n">library</span><span class="p">(</span><span class="n">ggplot2</span><span class="p">)</span><span class="w">
</span><span class="n">library</span><span class="p">(</span><span class="n">dplyr</span><span class="p">)</span><span class="w">
</span><span class="n">library</span><span class="p">(</span><span class="n">scales</span><span class="p">)</span><span class="w">

</span><span class="c1"># Get the data</span><span class="w">
</span><span class="n">library</span><span class="p">(</span><span class="n">geodata</span><span class="p">)</span><span class="w">
</span></code></pre></div></div>

<h2 id="get-the-data">Get the data</h2>

<p>The first step is to get the altitude data. I use the <strong>geodata</strong> package for
simplicity, but you can also use <strong>elevatr</strong>, which is much more comprehensive.
However, <strong>elevatr</strong> produces the result as a <code class="language-plaintext highlighter-rouge">RasterLayer</code>, so you would need to
convert the object to <code class="language-plaintext highlighter-rouge">SpatRaster</code> with <code class="language-plaintext highlighter-rouge">terra::rast()</code>.</p>

<div class="language-r highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="w">
</span><span class="c1"># Cache map data</span><span class="w">
</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">

</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">

</span><span class="n">r_init</span><span class="w">
</span><span class="c1">#&gt; class       : SpatRaster</span><span class="w">
</span><span class="c1">#&gt; dimensions  : 588, 1176, 1  (nrow, ncol, nlyr)</span><span class="w">
</span><span class="c1">#&gt; resolution  : 0.008333333, 0.008333333  (x, y)</span><span class="w">
</span><span class="c1">#&gt; extent      : 20.1, 29.9, 43.5, 48.4  (xmin, xmax, ymin, ymax)</span><span class="w">
</span><span class="c1">#&gt; coord. ref. : lon/lat WGS 84 (EPSG:4326)</span><span class="w">
</span><span class="c1">#&gt; source      : ROU_elv_msk.tif</span><span class="w">
</span><span class="c1">#&gt; name        : ROU_elv_msk</span><span class="w">
</span><span class="c1">#&gt; min value   :          -4</span><span class="w">
</span><span class="c1">#&gt; max value   :        2481</span><span class="w">

</span><span class="c1"># For better handling we set here the names</span><span class="w">
</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">

</span><span class="c1"># We don't want values lower than 0</span><span class="w">
</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">
  </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">

</span><span class="n">r</span><span class="w">
</span><span class="c1">#&gt; class       : SpatRaster</span><span class="w">
</span><span class="c1">#&gt; dimensions  : 588, 1176, 1  (nrow, ncol, nlyr)</span><span class="w">
</span><span class="c1">#&gt; resolution  : 0.008333333, 0.008333333  (x, y)</span><span class="w">
</span><span class="c1">#&gt; extent      : 20.1, 29.9, 43.5, 48.4  (xmin, xmax, ymin, ymax)</span><span class="w">
</span><span class="c1">#&gt; coord. ref. : lon/lat WGS 84 (EPSG:4326)</span><span class="w">
</span><span class="c1">#&gt; source      : memory</span><span class="w">
</span><span class="c1">#&gt; name        :  alt</span><span class="w">
</span><span class="c1">#&gt; min value   :    0</span><span class="w">
</span><span class="c1">#&gt; max value   : 2481</span><span class="w">
</span></code></pre></div></div>

<p>We can now have a quick look at the plot with <code class="language-plaintext highlighter-rouge">tidyterra::autoplot()</code>:</p>

<div class="language-r highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># Quick look</span><span class="w">
</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">
  </span><span class="n">theme_minimal</span><span class="p">()</span><span class="w">
</span></code></pre></div></div>

<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>

<h2 id="hillshading">Hillshading</h2>

<p>The next step is to calculate the hillshade. Royé has a very detailed discussion
<a href="https://dominicroye.github.io/en/2022/hillshade-effects/#calculate-the-hillshade">here</a>,
so I will not go into detail. What we want to create is a layer that
approximates the potential “texture” of the surface based on the elevation and
the sun’s position. This is straightforward with the <code class="language-plaintext highlighter-rouge">terra::terrain()</code> and
<code class="language-plaintext highlighter-rouge">terra::shade()</code> functions:</p>

<div class="language-r highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="w">
</span><span class="c1">## Create hillshade effect</span><span class="w">

</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">
</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">
</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">270</span><span class="p">)</span><span class="w">

</span><span class="c1"># normalize names</span><span class="w">
</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">

</span><span class="c1"># Hillshading, but we need a palette</span><span class="w">
</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">

</span><span class="n">ggplot</span><span class="p">()</span><span class="w"> </span><span class="o">+</span><span class="w">
  </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">
  </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">
</span><span class="c1">#&gt; SpatRaster resampled to ncells = 501501</span><span class="w">
</span></code></pre></div></div>

<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>

<p>We can also do the following hack to avoid the use of a <code class="language-plaintext highlighter-rouge">scale_fill_*</code> (via
<strong>ggplot2</strong> or via <code class="language-plaintext highlighter-rouge">ggnewscale::new_scale_fill()</code>):</p>

<ul>
  <li>Select a vector of colors (in this post <code class="language-plaintext highlighter-rouge">pal_greys</code>).</li>
  <li>Extract the values of the raster and rescale them to the length of the
palette (<code class="language-plaintext highlighter-rouge">c(1, 1000)</code>).</li>
  <li>Round those rescaled values to the nearest integer. So we would have an index
indicating which value of <code class="language-plaintext highlighter-rouge">pal_greys</code> should be mapped to each cell.</li>
  <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>
</ul>

<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
would perform a spatial resampling if the raster has more cells than <code class="language-plaintext highlighter-rouge">maxcell</code>.
This is for optimization (note that <code class="language-plaintext highlighter-rouge">terra::plot()</code> has the same setup and that
users often forget about it), but we can force all cells to be plotted by
using <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 be effectively set to <code class="language-plaintext highlighter-rouge">Inf</code> to ensure that the number of color values
and the number of cells are the same.</p>

<div class="language-r highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="w">
</span><span class="c1"># Use a vector of colors</span><span class="w">


</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">
  </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">
  </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">
  </span><span class="n">pull</span><span class="p">(</span><span class="n">index_col</span><span class="p">)</span><span class="w">


</span><span class="c1"># Get cols</span><span class="w">
</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">

</span><span class="c1"># Need to avoid resampling</span><span class="w">
</span><span class="c1"># and don't use aes</span><span class="w">

</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">
  </span><span class="n">geom_spatraster</span><span class="p">(</span><span class="w">
    </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">
    </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">
  </span><span class="p">)</span><span class="w">

</span><span class="n">hill_plot</span><span class="w">
</span></code></pre></div></div>

<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>

<h2 id="selecting-colors">Selecting colors</h2>

<p>The selection of colors for elevation maps is a key aspect when designing this
kind of visualization since colors can be confused with environmental phenomena
(Patterson and Jenny, 2011). For example, by convention green colors are
associated with low elevations, while oranges, browns and whites are associated with
high elevations on some of the most common elevation palettes (aka hypsometric
tints). See for example the <a href="https://en.wikipedia.org/wiki/Wikipedia:WikiProject_Maps/Conventions/Topographic_maps">Wikipedia Topographic maps
conventions</a>.</p>

<p>This is not ideal, since greens can be confused with forests, for example, so an
elevation map of desert areas would not be appropriate with a
green-brown-white color scheme.</p>

<p>There is an additional point to take into account when designing color palettes
for maps. A regular gradient would just interpolate colors assuming that the
distance among colors is the same:</p>

<div class="language-r highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="w">
</span><span class="c1"># Regular gradient</span><span class="w">
</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">

</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">
  </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">
</span></code></pre></div></div>

<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>

<p>For that reason, <strong>tidyterra</strong> provides additional gradients whose colors are placed
unevenly with the goal of providing a better understanding of the maps:</p>

<div class="language-r highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="w">
</span><span class="c1"># Hypso gradient</span><span class="w">
</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">


</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">
  </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">
</span></code></pre></div></div>

<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>

<p>Can you notice the difference? In the first map, green is the dominant color.
However, greens represent a wide range of elevations (0-750 meters) that
correspond to most of the territory. In terms of perception, we won’t be
clearly spotting elevation differences in the center of the country, while with
the uneven gradient greens only correspond to the range (0 - 250 meters) and the
overall perception of elevation improves. Note that the only difference between
plots is the color palette.</p>

<p>For producing our map we are going to assess visually the result of a selection
of palettes provided by <strong>tidyterra</strong>. We use here the version
<code class="language-plaintext highlighter-rouge">tidyterra::scale_fill_hypso_tint_c()</code> instead of
<code class="language-plaintext highlighter-rouge">tidyterra::scale_fill_hypso_c()</code> for taking advantage of the uneven color
gradients.</p>

<p>A downside of using these scales is that we also need to adjust the <code class="language-plaintext highlighter-rouge">limits</code>
argument of the functions to make <strong>ggplot2</strong> aware of the limits of the value of
the raster. This is easily achieved with <code class="language-plaintext highlighter-rouge">terra::minmax()</code> but I added an extra
touch rounding up and down the range of values to the nearest 500.</p>

<div class="language-r highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="w">
</span><span class="c1"># Try some options, but we need to be aware of the values of our raster</span><span class="w">

</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">

</span><span class="c1"># Rounded to lower and upper 500</span><span class="w">
</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">

</span><span class="c1"># And making min value to 0.</span><span class="w">
</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">

</span><span class="c1"># Compare</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">
</span><span class="c1">#&gt; [1]    0 2481</span><span class="w">
</span><span class="n">r_limits</span><span class="w">
</span><span class="c1">#&gt; [1]    0 2500</span><span class="w">


</span><span class="c1"># Now let's have some fun with scales from tidyterra</span><span class="w">

</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">
  </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="c1"># Create a helper function</span><span class="w">

</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">
  </span><span class="n">elevt_test</span><span class="w"> </span><span class="o">+</span><span class="w">
    </span><span class="n">scale_fill_hypso_tint_c</span><span class="p">(</span><span class="w">
      </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">
      </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">
    </span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w">
    </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">
    </span><span class="n">theme_minimal</span><span class="p">()</span><span class="w">
</span><span class="p">}</span><span class="w">

</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">
</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">
</span><span class="n">plot_pal_test</span><span class="p">(</span><span class="s2">"spain"</span><span class="p">)</span><span class="w">
</span><span class="n">plot_pal_test</span><span class="p">(</span><span class="s2">"pakistan"</span><span class="p">)</span><span class="w">
</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">
</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">
</span></code></pre></div></div>

<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 ocean 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 pastel 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 urban_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>

<p>I finally selected for my plot the <code class="language-plaintext highlighter-rouge">"dem_poster"</code> palette, but this is
completely a personal choice. You should select the palette you feel more
comfortable with. See the full range of color palettes provided by <strong>tidyterra</strong>
<a href="https://dieghernan.github.io/tidyterra/articles/palettes.html">here</a>.</p>

<h2 id="final-plot">Final plot</h2>

<p>So now it is time to blend both the hillshade layer and the altitude layer using
some level of <code class="language-plaintext highlighter-rouge">alpha</code> on the upper layer.</p>

<div class="language-r highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="w">
</span><span class="n">base_plot</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">hill_plot</span><span class="w"> </span><span class="o">+</span><span class="w">
  </span><span class="c1"># Avoid resampling with maxcell</span><span class="w">
  </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">
  </span><span class="n">scale_fill_hypso_tint_c</span><span class="p">(</span><span class="w">
    </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">
    </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">
    </span><span class="n">alpha</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">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">
    </span><span class="c1"># For the legend I use custom breaks</span><span class="w">
    </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">
      </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">
      </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">
      </span><span class="m">2000</span><span class="w">
    </span><span class="p">)</span><span class="w">
  </span><span class="p">)</span><span class="w">

</span><span class="n">base_plot</span><span class="w">
</span></code></pre></div></div>

<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>

<p>And with a bit of trickery and theming we can have our final map. First we load
a font from Google with a custom function:</p>

<div class="language-r highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">myload_fonts</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">fontname</span><span class="p">,</span><span class="w"> </span><span class="n">family</span><span class="p">,</span><span class="w">
                         </span><span class="n">fontdir</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">
  </span><span class="n">fontname_url</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">utils</span><span class="o">::</span><span class="n">URLencode</span><span class="p">(</span><span class="n">fontname</span><span class="p">)</span><span class="w">
  </span><span class="n">fontzip</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">".zip"</span><span class="p">)</span><span class="w">
  </span><span class="n">download.file</span><span class="p">(</span><span class="n">paste0</span><span class="p">(</span><span class="s2">"https://fonts.google.com/download?family="</span><span class="p">,</span><span class="w"> </span><span class="n">fontname_url</span><span class="p">),</span><span class="w">
    </span><span class="n">fontzip</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="w">
  </span><span class="p">)</span><span class="w">
  </span><span class="n">unzip</span><span class="p">(</span><span class="n">fontzip</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="n">fontdir</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="w">
  </span><span class="p">)</span><span class="w">

  </span><span class="c1"># Load fonts</span><span class="w">
  </span><span class="n">paths</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">
    </span><span class="n">regular</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"Regular.ttf"</span><span class="p">,</span><span class="w">
    </span><span class="n">bold</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"Bold.ttf"</span><span class="p">,</span><span class="w">
    </span><span class="n">italic</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"Italic.ttf"</span><span class="p">,</span><span class="w">
    </span><span class="n">bolditalic</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"BoldItalic.ttf"</span><span class="w">
  </span><span class="p">)</span><span class="w">


  </span><span class="n">namefile</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="n">gsub</span><span class="p">(</span><span class="s2">" "</span><span class="p">,</span><span class="w"> </span><span class="s2">""</span><span class="p">,</span><span class="w"> </span><span class="n">fontname</span><span class="p">)</span><span class="w">
  </span><span class="n">paths_end</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">
    </span><span class="n">fontdir</span><span class="p">,</span><span class="w">
    </span><span class="n">paste</span><span class="p">(</span><span class="n">namefile</span><span class="p">,</span><span class="w"> </span><span class="n">paths</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">
  </span><span class="p">)</span><span class="w">


  </span><span class="nf">names</span><span class="p">(</span><span class="n">paths_end</span><span class="p">)</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="nf">names</span><span class="p">(</span><span class="n">paths</span><span class="p">)</span><span class="w">

  </span><span class="n">sysfonts</span><span class="o">::</span><span class="n">font_add</span><span class="p">(</span><span class="n">family</span><span class="p">,</span><span class="w">
    </span><span class="n">regular</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">paths_end</span><span class="p">[</span><span class="s2">"regular"</span><span class="p">],</span><span class="w">
    </span><span class="n">bold</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">paths_end</span><span class="p">[</span><span class="s2">"bold"</span><span class="p">],</span><span class="w">
    </span><span class="n">italic</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">paths_end</span><span class="p">[</span><span class="s2">"italic"</span><span class="p">],</span><span class="w">
    </span><span class="n">bolditalic</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">paths_end</span><span class="p">[</span><span class="s2">"bolditalic"</span><span class="p">]</span><span class="w">
  </span><span class="p">)</span><span class="w">

  </span><span class="nf">return</span><span class="p">(</span><span class="nf">invisible</span><span class="p">())</span><span class="w">
</span><span class="p">}</span><span class="w">
</span></code></pre></div></div>

<p>And now we theme it:</p>

<div class="language-r highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># Theming</span><span class="w">
</span><span class="n">myload_fonts</span><span class="p">(</span><span class="s2">"Noto Serif"</span><span class="p">,</span><span class="w"> </span><span class="s2">"notoserif"</span><span class="p">,</span><span class="w"> </span><span class="s2">"~/R/googlefonts"</span><span class="p">)</span><span class="w">
</span><span class="n">showtext</span><span class="o">::</span><span class="n">showtext_auto</span><span class="p">()</span><span class="w">

</span><span class="c1"># Adjust text size</span><span class="w">
</span><span class="n">base_text_size</span><span class="w"> </span><span class="o">&lt;-</span><span class="w"> </span><span class="m">30</span><span class="w">

</span><span class="n">base_plot</span><span class="w"> </span><span class="o">+</span><span class="w">
  </span><span class="c1"># Change guide</span><span class="w">
  </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">
    </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">
    </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">
    </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">
    </span><span class="n">keywidth</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">1.75</span><span class="p">,</span><span class="w">
    </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">
    </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="p">,</span><span class="w">
    </span><span class="n">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">
    </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">
  </span><span class="p">))</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">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">
    </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 blend"</span><span class="p">,</span><span class="w">
    </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">
      </span><span class="s2">"@dhernangomez using tidyterra, ggplot2, geodata R packages."</span><span class="p">,</span><span class="w">
      </span><span class="s2">" Data: Shuttle Radar Topography Mission (SRTM)"</span><span class="w">
    </span><span class="p">)</span><span class="w">
  </span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w">
  </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="s2">"notoserif"</span><span class="p">)</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">
    </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">
    </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">
    </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">
    </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">
    </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">
      </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">
      </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="p">),</span><span class="w">
    </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">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">
    </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">0.8</span><span class="p">),</span><span class="w">
    </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">0.8</span><span class="p">),</span><span class="w">
    </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">
    </span><span class="n">legend.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">
  </span><span class="p">)</span><span class="w">
</span></code></pre></div></div>

<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>

<h2 id="references">References</h2>

<p>Patterson T, Jenny B (2011). “The Development and Rationale of Cross-blended
Hypsometric Tints.” <em>Cartographic Perspectives</em>, 31–46. <a href="https://doi.org/10.14714/CP69.20">https://doi.org/10.14714/CP69.20</a></p>

<p>Grossenbacher T (2016). “Beautiful thematic maps with ggplot2 (only).”
<a href="https://timogrossenbacher.ch/bivariate-maps-with-ggplot2-and-sf/">https://timogrossenbacher.ch/bivariate-maps-with-ggplot2-and-sf/</a>.</p>

<p>Royé D (2022). “Hillshade effects.”
<a href="https://dominicroye.github.io/en/2022/hillshade-effects/">https://dominicroye.github.io/en/2022/hillshade-effects/</a>.</p>

<p>Hernangómez D (2022). <em>tidyterra: tidyverse Methods and ggplot2 Helpers for
terra Objects</em>. &lt;doi:10.5281/zenodo.6572471&gt;
<a href="https://doi.org/10.5281/zenodo.6572471">https://doi.org/10.5281/zenodo.6572471</a>.</p>
</div>
				]]>
			</description>
			<link>https://dieghernan.github.io/202210_tidyterra-hillshade/</link>
			<category>posts</category>
		    <category>ggplot2</category><category>maps</category><category>r_bloggers</category><category>rspatial</category><category>rstats</category><category>terra</category><category>tidyterra</category><media:title type="html"><![CDATA[Hillshade, colors and marginal plots with <strong>tidyterra</strong> (I) ]]></media:title>
      <media:content url="https://dieghernan.github.io/assets/img/blog/20221017-6-finalplot-1.webp" medium="image"/>
      <media:thumbnail url="https://dieghernan.github.io/assets/img/blog/20221017-6-finalplot-1.webp" /><guid isPermaLink="true">https://dieghernan.github.io/202210_tidyterra-hillshade/</guid>
      <pubDate>Mon, 17 Oct 2022 00:00:00 +0200</pubDate>
		</item><item>
			<title>Introducing tidyterra</title>
			<description>
				<![CDATA[	
 				<h3>Easily work with and plot SpatRasters</h3>
    		<p>4 min.</p>
				<div><p>If you have been playing around with <strong>R</strong> for a while, you are probably
familiar with the <code class="language-plaintext highlighter-rouge">volcano</code> dataset:</p>

<div class="language-r highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="w">
</span><span class="n">data</span><span class="p">(</span><span class="s2">"volcano"</span><span class="p">)</span><span class="w">
</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">
</span></code></pre></div></div>

<p><img src="https://dieghernan.github.io/assets/img/blog/20220525_volcano-1.webp" title="plot of chunk 20220525_volcano" 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>

<p>This represents the topographic information about one of the volcanoes of Auckland
(New Zealand), specifically <a href="https://en.wikipedia.org/wiki/Maungawhau_/_Mount_Eden">Maungawhau / Mount
Eden</a>. But <strong>do you know
that this map is flipped?</strong></p>

<p>In this post I introduce the <a href="https://github.com/dieghernan/tidyterra"><strong>tidyterra</strong>
package</a>, recently added to
<a href="https://CRAN.R-project.org/package=tidyterra">CRAN</a>, and I show you how to
geotag the <code class="language-plaintext highlighter-rouge">volcano</code> dataset. We will also produce <strong>ggplot2</strong> maps using the
functions of <strong>tidyterra</strong>.</p>

<div class="language-r highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># Libraries</span><span class="w">
</span><span class="n">library</span><span class="p">(</span><span class="n">terra</span><span class="p">)</span><span class="w">
</span><span class="n">library</span><span class="p">(</span><span class="n">ggplot2</span><span class="p">)</span><span class="w">
</span><span class="n">library</span><span class="p">(</span><span class="n">tidyterra</span><span class="p">)</span><span class="w">
</span><span class="n">library</span><span class="p">(</span><span class="n">maptiles</span><span class="p">)</span><span class="w">
</span><span class="n">library</span><span class="p">(</span><span class="n">sf</span><span class="p">)</span><span class="w">
</span></code></pre></div></div>

<h2 id="wait-volcano-is-flipped">Wait, <code class="language-plaintext highlighter-rouge">volcano</code> is flipped?</h2>

<p>Let’s check it out. Thanks to the package <strong>maptiles</strong> we can have a glimpse of
the location of Maungawhau using map tiles, as in Google Maps. We will use
<strong>tidyterra</strong> for displaying the map tile:</p>

<div class="language-r highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="w">
</span><span class="c1"># location of Maungawhau</span><span class="w">

</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">
  </span><span class="m">174.7611552780</span><span class="p">,</span><span class="w">
  </span><span class="m">-36.8799200525</span><span class="p">,</span><span class="w">
  </span><span class="m">174.7682380109</span><span class="p">,</span><span class="w">
  </span><span class="m">-36.8719519780</span><span class="w">
</span><span class="p">)</span><span class="w">
</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">
</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">
</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">

</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">
  </span><span class="c1"># To crs for NZGD49</span><span class="w">
  </span><span class="n">st_transform</span><span class="p">(</span><span class="m">27200</span><span class="p">)</span><span class="w">

</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">


</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">
  </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">

</span><span class="n">ggtile</span><span class="w">
</span></code></pre></div></div>

<p><img src="https://dieghernan.github.io/assets/img/blog/20220525_tile-1.webp" title="plot of chunk 20220525_tile" alt="Street map of Maungawhau in Auckland, showing the crater, surrounding paths and nearby streets." width="100%" /></p>

<p>Here we have a crisp RGB tile of Maungawhau. Now, the next
question is how to match the <code class="language-plaintext highlighter-rouge">volcano</code> dataset (a matrix) with this tile (a
geotagged map tile)? Let’s check it out.</p>

<h2 id="working-with-spatrasters">Working with SpatRasters</h2>

<p>Thanks to the <strong>terra</strong> package we can start converting <code class="language-plaintext highlighter-rouge">volcano</code> into a
SpatRaster:</p>

<div class="language-r highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="w">
</span><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">

</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">
</span></code></pre></div></div>

<p><img src="https://dieghernan.github.io/assets/img/blog/20220525_volcano_raster-1.webp" title="plot of chunk 20220525_volcano_raster" alt="Elevation raster of Maungawhau before orientation correction. The crater appears near the top of the map." width="100%" /></p>

<div class="language-r highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="w">
</span><span class="c1"># Wait, it is flipped!</span><span class="w">
</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">
  </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">
  </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">
</span><span class="p">])</span><span class="w">

</span><span class="c1"># Much better!</span><span class="w">
</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">
</span></code></pre></div></div>

<p><img src="https://dieghernan.github.io/assets/img/blog/20220525_volcano_raster-2.webp" title="plot of chunk 20220525_volcano_raster" alt="Elevation raster of Maungawhau after reversing rows and columns. The crater now appears near the bottom of the map." width="100%" /></p>

<div class="language-r highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="w">
</span><span class="n">volcano_rast_ok</span><span class="w">
</span><span class="c1">#&gt; class       : SpatRaster</span><span class="w">
</span><span class="c1">#&gt; dimensions  : 87, 61, 1  (nrow, ncol, nlyr)</span><span class="w">
</span><span class="c1">#&gt; resolution  : 1, 1  (x, y)</span><span class="w">
</span><span class="c1">#&gt; extent      : 0, 61, 0, 87  (xmin, xmax, ymin, ymax)</span><span class="w">
</span><span class="c1">#&gt; coord. ref. :</span><span class="w">
</span><span class="c1">#&gt; source      : memory</span><span class="w">
</span><span class="c1">#&gt; name        : lyr.1</span><span class="w">
</span><span class="c1">#&gt; min value   :    94</span><span class="w">
</span><span class="c1">#&gt; max value   :   195</span><span class="w">
</span></code></pre></div></div>

<p>Nice! Now we have a raster of <code class="language-plaintext highlighter-rouge">volcano</code>, but still without geotagged
information. Thanks to this article by Tomislav Hengl
(<a href="https://twitter.com/tom_hengl">@tom_hengl</a>) we can check the basic geographic
parameters of <code class="language-plaintext highlighter-rouge">volcano</code> (see <a href="https://www.geomorphometry.org/2009/08/20/volcano-maungawhau/">Volcano
Maungawhau</a>), which are:</p>

<ul>
  <li><strong>CRS</strong>: EPSG:27200</li>
  <li><strong>xllcorner</strong>: 2667400</li>
  <li><strong>yllcorner</strong>: 6478700</li>
  <li><strong>cellsize</strong>: 10 m</li>
  <li><strong>ncols</strong>: 61</li>
  <li><strong>nrows</strong>: 87</li>
</ul>

<p>And we can translate that easily to an empty SpatRaster:</p>

<div class="language-r highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="w">
</span><span class="c1"># Extra length for proper handling extent</span><span class="w">
</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">
</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">

</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">
  </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">
  </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">
  </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">
  </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">
  </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">
  </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">
</span><span class="p">)</span><span class="w">
</span><span class="n">template</span><span class="w">
</span><span class="c1">#&gt; class       : SpatRaster</span><span class="w">
</span><span class="c1">#&gt; dimensions  : 87, 61, 1  (nrow, ncol, nlyr)</span><span class="w">
</span><span class="c1">#&gt; resolution  : 10, 10  (x, y)</span><span class="w">
</span><span class="c1">#&gt; extent      : 2667400, 2668010, 6478700, 6479570  (xmin, xmax, ymin, ymax)</span><span class="w">
</span><span class="c1">#&gt; coord. ref. : NZGD49 / New Zealand Map Grid (EPSG:27200)</span><span class="w">
</span></code></pre></div></div>

<p>So now we only need to transfer the values from <code class="language-plaintext highlighter-rouge">volcano_rast_ok</code> to our
template:</p>

<div class="language-r highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="w">
</span><span class="c1"># Use tidyterra to pull the values of one raster</span><span class="w">
</span><span class="c1"># and create a new layer</span><span class="w">

</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">
  </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">
  </span><span class="n">select</span><span class="p">(</span><span class="n">elevation</span><span class="p">)</span><span class="w">

</span><span class="n">volcano2</span><span class="w">
</span><span class="c1">#&gt; class       : SpatRaster</span><span class="w">
</span><span class="c1">#&gt; dimensions  : 87, 61, 1  (nrow, ncol, nlyr)</span><span class="w">
</span><span class="c1">#&gt; resolution  : 10, 10  (x, y)</span><span class="w">
</span><span class="c1">#&gt; extent      : 2667400, 2668010, 6478700, 6479570  (xmin, xmax, ymin, ymax)</span><span class="w">
</span><span class="c1">#&gt; coord. ref. : NZGD49 / New Zealand Map Grid (EPSG:27200)</span><span class="w">
</span><span class="c1">#&gt; source      : memory</span><span class="w">
</span><span class="c1">#&gt; name        : elevation</span><span class="w">
</span><span class="c1">#&gt; min value   :        94</span><span class="w">
</span><span class="c1">#&gt; max value   :       195</span><span class="w">

</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">
</span></code></pre></div></div>

<p><img src="https://dieghernan.github.io/assets/img/blog/20220525_create_volcano2-1.webp" title="plot of chunk 20220525_create_volcano2" alt="Georeferenced elevation map of Maungawhau. Projected coordinates locate the terrain and colors represent altitude from 94 to 195 meters." width="100%" /></p>

<div class="language-r highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="w">
</span><span class="c1"># And plot it</span><span class="w">
</span><span class="n">ggtile</span><span class="w"> </span><span class="o">+</span><span class="w">
  </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">
  </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">
</span></code></pre></div></div>

<p><img src="https://dieghernan.github.io/assets/img/blog/20220525_create_volcano2-2.webp" title="plot of chunk 20220525_create_volcano2" alt="Street map of Maungawhau overlaid with a translucent elevation raster, aligning the terrain with the crater and surrounding streets." width="100%" /></p>

<h2 id="an-easter-egg">An Easter egg</h2>

<p>The <code class="language-plaintext highlighter-rouge">volcano</code> dataset may not be completely up to date. As a complement,
<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>
raster, 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
(2013)</a> and
resampled to a resolution of 5x5 meters, for package size optimization. See here
how to load it and check the plotting possibilities of <strong>tidyterra</strong>:</p>

<div class="language-r highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="w">
</span><span class="c1"># Load out Easter Egg</span><span class="w">

</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">
  </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">
</span><span class="p">))</span><span class="w">

</span><span class="n">volcano2_easter</span><span class="w">
</span><span class="c1">#&gt; class       : SpatRaster</span><span class="w">
</span><span class="c1">#&gt; dimensions  : 174, 122, 1  (nrow, ncol, nlyr)</span><span class="w">
</span><span class="c1">#&gt; resolution  : 5, 5  (x, y)</span><span class="w">
</span><span class="c1">#&gt; extent      : 1756969, 1757579, 5917003, 5917873  (xmin, xmax, ymin, ymax)</span><span class="w">
</span><span class="c1">#&gt; coord. ref. : NZGD2000 / New Zealand Transverse Mercator 2000 (EPSG:2193)</span><span class="w">
</span><span class="c1">#&gt; source      : volcano2.tif</span><span class="w">
</span><span class="c1">#&gt; name        : elevation</span><span class="w">
</span><span class="c1">#&gt; min value   :  76.26222</span><span class="w">
</span><span class="c1">#&gt; max value   :  195.5542</span><span class="w">
</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">
</span></code></pre></div></div>

<p><img src="https://dieghernan.github.io/assets/img/blog/20220525_easteregg-1.webp" title="plot of chunk 20220525_easteregg" alt="Elevation map of Maungawhau derived from LiDAR data, showing the crater and surrounding terrain at 5-meter resolution." width="100%" /></p>

<div class="language-r highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="w">

</span><span class="c1"># Only altitudes of more than 130m</span><span class="w">

</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">
  </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">


</span><span class="n">ggtile</span><span class="w"> </span><span class="o">+</span><span class="w">
  </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">
  </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">
  </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">
</span></code></pre></div></div>

<p><img src="https://dieghernan.github.io/assets/img/blog/20220525_easteregg-2.webp" title="plot of chunk 20220525_easteregg" 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>

<div class="language-r highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="w">

</span><span class="c1"># Contour lines</span><span class="w">

</span><span class="n">ggtile</span><span class="w"> </span><span class="o">+</span><span class="w">
  </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">
</span></code></pre></div></div>

<p><img src="https://dieghernan.github.io/assets/img/blog/20220525_easteregg-3.webp" title="plot of chunk 20220525_easteregg" alt="Street map of Maungawhau overlaid with elevation contours at 10-meter intervals. Nested contours outline the crater and its rim." width="100%" /></p>

<div class="language-r highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="w">

</span><span class="c1"># Contour lines + contour polygons</span><span class="w">

</span><span class="n">ggtile</span><span class="w"> </span><span class="o">+</span><span class="w">
  </span><span class="n">geom_spatraster_contour_filled</span><span class="p">(</span><span class="w">
    </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">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">
    </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">
  </span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w">
  </span><span class="n">geom_spatraster_contour</span><span class="p">(</span><span class="w">
    </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">
    </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">
  </span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w">
  </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">
</span></code></pre></div></div>

<p><img src="https://dieghernan.github.io/assets/img/blog/20220525_easteregg-4.webp" title="plot of chunk 20220525_easteregg" 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>
</div>
				]]>
			</description>
			<link>https://dieghernan.github.io/202205_tidyterra/</link>
			<category>posts</category>
		    <category>ggplot2</category><category>maps</category><category>maptiles</category><category>r_bloggers</category><category>r_package</category><category>rspatial</category><category>rstats</category><category>terra</category><category>tidyterra</category><media:title type="html"><![CDATA[Introducing <strong>tidyterra</strong> ]]></media:title>
      <media:content url="https://dieghernan.github.io/assets/img/blog/20220525_easteregg-2.webp" medium="image"/>
      <media:thumbnail url="https://dieghernan.github.io/assets/img/blog/20220525_easteregg-2.webp" /><guid isPermaLink="true">https://dieghernan.github.io/202205_tidyterra/</guid>
      <pubDate>Wed, 25 May 2022 00:00:00 +0200</pubDate>
		</item><item>
			<title>Unknown pleasures with R</title>
			<description>
				<![CDATA[	
 				<h3>Joyplot elevation maps with <strong>ggridges</strong> and <strong>terra</strong></h3>
    		<p>8 min.</p>
				<div><p>In 1970, Harold D. Craft Jr. published his Ph.D. thesis <em>“Radio observations of
the pulse profiles and dispersion measures of twelve pulsars”.</em> The thesis (337
pages) includes on pages 214 to 216 the following depictions of successive
pulses of some pulsars:</p>

<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>

<p class="caption">From “Radio Observations of the Pulse Profiles and Dispersion Measures of Twelve
Pulsars” by Harold D. Craft, Jr. (September 1970). Original source:
<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>

<p>Nine years later, a young graphic designer named Peter Saville had a new
project. He had to design the cover of the debut album of a young British rock
band, named Joy Division. At some point in the process, Bernard Sumner (lead
guitarist 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
Encyclopaedia of Astronomy</em> (1977 edition):</p>

<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>

<p>Saville presented a black-and-white version, producing a cover that reached
iconic status in the ’80s. This cover has been reproduced in the form of
tattoos, clothing, merchandise, video games and even 3-D sculptures:</p>

<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>

<p>If you are interested in learning more about this fascinating history of science
and 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
Division’s Unknown Pleasures Album
Cover</a>
by <a href="https://www.scientificamerican.com/author/jen-christiansen/">Jen
Christiansen</a>.</p>

<p>Since then, these kinds of plots have become very popular, known as <strong>ridge
plots</strong> or <strong>joyplots</strong>, in honor of Joy Division. In this post, I produce
“joyplots” with <strong>R</strong> for specific regions of the world using elevation data for
creating the ridges.</p>

<h2 id="creating-joyplot-maps-with-r">Creating joyplot maps with <strong>R</strong></h2>

<p>This topic has already been covered by other authors, such as <a href="https://danielredondo.com/blog/2020-01-25-joy_division/">Daniel
Redondo</a> (Spanish) and
<a href="https://cartographicperspectives.org/index.php/journal/article/view/1536/1726">Travis M.
White</a>.
However, they both use QGIS, while in this post I work completely in
<strong>R</strong>.</p>

<p>Some initial considerations we may need to bear in mind:</p>

<ul>
  <li>
    <p>In this post I will use <code class="language-plaintext highlighter-rouge">geom_ridgeline()</code> instead of
<code class="language-plaintext highlighter-rouge">geom_density_ridges()</code>. This gives us more control over the
final plot, but there is a caveat: <strong>both the coordinates and the
elevation should be in the same unit</strong> (<a href="https://wilkelab.org/ggridges/reference/geom_ridgeline.html">See
why</a>).
Therefore, we should project both the raster and the base <code class="language-plaintext highlighter-rouge">sf</code> object to a
suitable CRS defined in meters (in this case).</p>
  </li>
  <li>
    <p>Joyplots are much cooler when only a few lines are displayed. This is
directly related to the number of rows in our raster. A very detailed
raster (e.g. lots of rows) would produce a much more detailed plot but it may not
suit our needs.</p>
  </li>
</ul>

<p>Now, let’s start with the required libraries:</p>

<div class="language-r highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="w">
</span><span class="c1"># Libraries</span><span class="w">

</span><span class="c1"># Spatial</span><span class="w">
</span><span class="n">library</span><span class="p">(</span><span class="n">sf</span><span class="p">)</span><span class="w">
</span><span class="n">library</span><span class="p">(</span><span class="n">terra</span><span class="p">)</span><span class="w">
</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">
</span><span class="n">library</span><span class="p">(</span><span class="n">elevatr</span><span class="p">)</span><span class="w">

</span><span class="c1"># Data viz and wrangling</span><span class="w">
</span><span class="n">library</span><span class="p">(</span><span class="n">ggplot2</span><span class="p">)</span><span class="w">
</span><span class="n">library</span><span class="p">(</span><span class="n">dplyr</span><span class="p">)</span><span class="w">
</span><span class="n">library</span><span class="p">(</span><span class="n">ggridges</span><span class="p">)</span><span class="w">
</span></code></pre></div></div>

<p>The first step consists of selecting our region of interest (<code class="language-plaintext highlighter-rouge">sf</code> object) and
extracting the elevation data. We can achieve that with <strong>giscoR</strong> and
<strong>elevatr</strong>.
In this post, I create a joyplot of
<a href="https://en.wikipedia.org/wiki/Andalusia">Andalusia</a>. Note that, given we are
creating just a visualization, the resolution of the <code class="language-plaintext highlighter-rouge">sf</code> object is not very
relevant.</p>

<div class="language-r highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="w">
</span><span class="c1"># Select a Spanish Region: Andalucia</span><span class="w">
</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">
  </span><span class="c1"># And project data</span><span class="w">
  </span><span class="n">st_transform</span><span class="p">(</span><span class="m">25830</span><span class="p">)</span><span class="w">
</span></code></pre></div></div>

<p>Now we need to extract the elevation using <strong>elevatr</strong>. We can also adjust the
zoom level as needed. You can find guidance on zoom levels in the
<a href="https://wiki.openstreetmap.org/wiki/Zoom_levels">OpenStreetMap wiki</a>.</p>

<div class="language-r highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="w">
</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">
  </span><span class="c1"># And convert to terra</span><span class="w">
  </span><span class="n">rast</span><span class="p">()</span><span class="w"> </span><span class="o">%&gt;%</span><span class="w">
  </span><span class="c1"># Mask to the shape</span><span class="w">
  </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">

</span><span class="c1"># Rename layer for further manipulation</span><span class="w">
</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">

</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="c1">#&gt; [1] 698</span><span class="w">

</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">
</span></code></pre></div></div>

<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>

<p>We already have our elevation raster. Now the next step is to adjust the number
of rows of our raster to a lower number. We can then aggregate the raster (i.e.
reduce the number of cells or increase their size) using a scaling
factor that would reduce the number of rows to our desired target (in this case
90 rows):</p>

<div class="language-r highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># Approx</span><span class="w">
</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">

</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">

</span><span class="n">nrow</span><span class="p">(</span><span class="n">dem_agg</span><span class="p">)</span><span class="w">
</span><span class="c1">#&gt; [1] 88</span><span class="w">

</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">
</span></code></pre></div></div>

<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>

<p>We can check how the number of rows has decreased. Also, the plot shows that we
now have fewer cells.</p>

<p>Now, we may need to perform additional manipulations on the values of the
raster:</p>

<ul>
  <li>
    <p>We need to ensure that all valid values are greater than or equal to zero.</p>
  </li>
  <li>
    <p>We will replace the <code class="language-plaintext highlighter-rouge">NA</code> values produced when masking the raster with zeros. We
will use this later to decide whether to remove some parts of the
plot.</p>
  </li>
</ul>

<p>After that, we create a data frame with the information needed for
creating the joyplot.</p>

<div class="language-r highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="w">
</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">
</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">

</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">

</span><span class="n">as_tibble</span><span class="p">(</span><span class="n">dem_df</span><span class="p">)</span><span class="w">
</span><span class="c1">#&gt; # A tibble: 12,848 x 3</span><span class="w">
</span><span class="c1">#&gt;          x        y  elev</span><span class="w">
</span><span class="c1">#&gt;      &lt;dbl&gt;    &lt;dbl&gt; &lt;dbl&gt;</span><span class="w">
</span><span class="c1">#&gt;  1  77184. 4306315.     0</span><span class="w">
</span><span class="c1">#&gt;  2  81049. 4306315.     0</span><span class="w">
</span><span class="c1">#&gt;  3  84914. 4306315.     0</span><span class="w">
</span><span class="c1">#&gt;  4  88779. 4306315.     0</span><span class="w">
</span><span class="c1">#&gt;  5  92644. 4306315.     0</span><span class="w">
</span><span class="c1">#&gt;  6  96510. 4306315.     0</span><span class="w">
</span><span class="c1">#&gt;  7 100375. 4306315.     0</span><span class="w">
</span><span class="c1">#&gt;  8 104240. 4306315.     0</span><span class="w">
</span><span class="c1">#&gt;  9 108105. 4306315.     0</span><span class="w">
</span><span class="c1">#&gt; 10 111970. 4306315.     0</span><span class="w">
</span><span class="c1">#&gt; # ... with 12,838 more rows</span><span class="w">
</span></code></pre></div></div>

<p>Now is a good moment to adjust the units of the coordinates and the elevation if
needed. In this case both are in meters, but I will show you how to perform
those adjustments with the <strong>units</strong> package:</p>

<div class="language-r highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="w">
</span><span class="n">library</span><span class="p">(</span><span class="n">units</span><span class="p">)</span><span class="w">

</span><span class="c1"># Units of DEM projection</span><span class="w">
</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">

</span><span class="n">units_crs</span><span class="w">
</span><span class="c1">#&gt; [1] "m"</span><span class="w">

</span><span class="c1"># Example, convert to miles</span><span class="w">
</span><span class="c1"># Adjust as needed</span><span class="w">

</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">
  </span><span class="n">mutate</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="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">
    </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">
    </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">
    </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">
    </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">
    </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">
  </span><span class="p">)</span><span class="w">

</span><span class="n">as_tibble</span><span class="p">(</span><span class="n">dem_miles</span><span class="p">)</span><span class="w">
</span><span class="c1">#&gt; # A tibble: 12,848 x 6</span><span class="w">
</span><span class="c1">#&gt;          x        y elev x_mile y_mile elev_mile</span><span class="w">
</span><span class="c1">#&gt;        [m]      [m]  [m]   [mi]   [mi]      [mi]</span><span class="w">
</span><span class="c1">#&gt;  1  77184. 4306315.    0   48.0  2676.         0</span><span class="w">
</span><span class="c1">#&gt;  2  81049. 4306315.    0   50.4  2676.         0</span><span class="w">
</span><span class="c1">#&gt;  3  84914. 4306315.    0   52.8  2676.         0</span><span class="w">
</span><span class="c1">#&gt;  4  88779. 4306315.    0   55.2  2676.         0</span><span class="w">
</span><span class="c1">#&gt;  5  92644. 4306315.    0   57.6  2676.         0</span><span class="w">
</span><span class="c1">#&gt;  6  96510. 4306315.    0   60.0  2676.         0</span><span class="w">
</span><span class="c1">#&gt;  7 100375. 4306315.    0   62.4  2676.         0</span><span class="w">
</span><span class="c1">#&gt;  8 104240. 4306315.    0   64.8  2676.         0</span><span class="w">
</span><span class="c1">#&gt;  9 108105. 4306315.    0   67.2  2676.         0</span><span class="w">
</span><span class="c1">#&gt; 10 111970. 4306315.    0   69.6  2676.         0</span><span class="w">
</span><span class="c1">#&gt; # ... with 12,838 more rows</span><span class="w">
</span></code></pre></div></div>

<p>Finally, we can create our joyplot. Note that we can “train” the scales of our
<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
the plot. The relative height of the ridges is controlled via the <code class="language-plaintext highlighter-rouge">scale</code>
parameter:</p>

<div class="language-r highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="w">
</span><span class="n">ggplot</span><span class="p">()</span><span class="w"> </span><span class="o">+</span><span class="w">
  </span><span class="c1"># Just for the scales, pass with NA arguments so it is not shown</span><span class="w">
  </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">
  </span><span class="n">geom_ridgeline</span><span class="p">(</span><span class="w">
    </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">
      </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">
      </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">
      </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">
    </span><span class="p">),</span><span class="w">
    </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">
  </span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w">
  </span><span class="n">theme_ridges</span><span class="p">()</span><span class="w">
</span></code></pre></div></div>

<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>

<p>The last step is to provide a black theme, resembling the cover of the album:</p>

<div class="language-r highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="w">
</span><span class="n">ggplot</span><span class="p">()</span><span class="w"> </span><span class="o">+</span><span class="w">
  </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">
  </span><span class="n">geom_ridgeline</span><span class="p">(</span><span class="w">
    </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">
      </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">
      </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">
      </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">
    </span><span class="p">),</span><span class="w">
    </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">
    </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">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">.25</span><span class="w">
  </span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w">
  </span><span class="n">theme_void</span><span class="p">()</span><span class="w"> </span><span class="o">+</span><span class="w">
  </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></code></pre></div></div>

<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>

<h2 id="variations">Variations</h2>

<p>We can produce some variations of the same map using several parameters and
other artifacts.</p>

<h3 id="using-geom_density_ridges">Using <code class="language-plaintext highlighter-rouge">geom_density_ridges()</code></h3>

<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
<code class="language-plaintext highlighter-rouge">geom_ridgeline()</code> for creating a similar map:</p>

<div class="language-r highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="w">
</span><span class="n">ggplot</span><span class="p">()</span><span class="w"> </span><span class="o">+</span><span class="w">
  </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">
  </span><span class="n">geom_density_ridges</span><span class="p">(</span><span class="w">
    </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">
      </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">
      </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">
      </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">
    </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">"identity"</span><span class="p">,</span><span class="w">
    </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">
    </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">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">.25</span><span class="w">
  </span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w">
  </span><span class="n">theme_void</span><span class="p">()</span><span class="w"> </span><span class="o">+</span><span class="w">
  </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></code></pre></div></div>

<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>

<h3 id="land-only">Land only</h3>

<p>If we use <code class="language-plaintext highlighter-rouge">geom_ridgeline()</code> it is quite easy to remove some parts of the lines,
as the parameter <code class="language-plaintext highlighter-rouge">min_height</code> allows us to control the minimum height to be
plotted. I found this much more difficult when using <code class="language-plaintext highlighter-rouge">geom_density_ridges()</code>,
where the equivalent parameter <code class="language-plaintext highlighter-rouge">rel_min_height</code> is relative to the overall
maximum height.</p>

<p>This is the main reason why we replaced the <code class="language-plaintext highlighter-rouge">NA</code> values with zeros, so those
parts of the string can be easily removed.</p>

<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">
  </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">
  </span><span class="n">geom_ridgeline</span><span class="p">(</span><span class="w">
    </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">
      </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">
      </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">
      </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">
    </span><span class="p">),</span><span class="w">
    </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">
    </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">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">.25</span><span class="p">,</span><span class="w">
    </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">
  </span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w">
  </span><span class="n">theme_void</span><span class="p">()</span><span class="w"> </span><span class="o">+</span><span class="w">
  </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></code></pre></div></div>

<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>

<h3 id="with-colors">With colors</h3>

<p>We can apply different colors to the plot. Note that <strong>ggridges</strong> only accepts
different <code class="language-plaintext highlighter-rouge">aes</code> by row, not by column:</p>

<div class="language-r highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="w">
</span><span class="c1"># Classify on three different bands</span><span class="w">

</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">
  </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">

</span><span class="n">ggplot</span><span class="p">()</span><span class="w"> </span><span class="o">+</span><span class="w">
  </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">
  </span><span class="n">geom_ridgeline</span><span class="p">(</span><span class="w">
    </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">
      </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">
      </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">
      </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">
      </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">
    </span><span class="p">),</span><span class="w">
    </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">
    </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">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">
    </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">
  </span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w">
  </span><span class="n">theme_void</span><span class="p">()</span><span class="w"> </span><span class="o">+</span><span class="w">
  </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">
  </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">
    </span><span class="nf">c</span><span class="p">(</span><span class="w">
      </span><span class="s2">"#007A33"</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">"#007A33"</span><span class="w">
    </span><span class="p">),</span><span class="w">
    </span><span class="m">.95</span><span class="w">
  </span><span class="p">))</span><span class="w">
</span></code></pre></div></div>

<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>

<h3 id="combine-with-another-object">Combine with another object</h3>

<p>For example, using an <code class="language-plaintext highlighter-rouge">sf</code> object:</p>

<div class="language-r highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="w">
</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">
  </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="n">resolution</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">1</span><span class="w">
</span><span class="p">)</span><span class="w"> </span><span class="o">%&gt;%</span><span class="w">
  </span><span class="c1"># And project data</span><span class="w">
  </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">
  </span><span class="n">st_buffer</span><span class="p">(</span><span class="m">-5000</span><span class="p">)</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">
  </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">
  </span><span class="n">geom_ridgeline</span><span class="p">(</span><span class="w">
    </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">
      </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">
      </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">
      </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">
    </span><span class="p">),</span><span class="w">
    </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">
    </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">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">.25</span><span class="p">,</span><span class="w">
    </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">
  </span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w">
  </span><span class="n">theme_void</span><span class="p">()</span><span class="w"> </span><span class="o">+</span><span class="w">
  </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></code></pre></div></div>

<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>

<p>Or adding a frame to the plot:</p>

<div class="language-r highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="w">
</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">
  </span><span class="n">st_as_sf</span><span class="p">()</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">
  </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">
  </span><span class="n">geom_ridgeline</span><span class="p">(</span><span class="w">
    </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">
      </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">
      </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">
      </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">
    </span><span class="p">),</span><span class="w">
    </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">
    </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">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">.25</span><span class="w">
  </span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w">
  </span><span class="n">theme_void</span><span class="p">()</span><span class="w"> </span><span class="o">+</span><span class="w">
  </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></code></pre></div></div>

<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>

<h2 id="references">References</h2>

<p>Craft Jr, H. D. (1970). <em>Radio observations of the pulse profiles and dispersion
measures of twelve pulsars.</em> Cornell University.</p>

<p>Mitton, Simon (1977). <em>The Cambridge encyclopaedia of astronomy.</em> Prentice-Hall
of Canada.</p>

<p>Lipez, Zachary (2019, June 14). “How Joy Division’s ‘Unknown Pleasures’ image
went from underground album cover to a piece of cultural ubiquity” <em>The
Washington Post</em>. <a href="https://wapo.st/3K6Chsc">https://wapo.st/3K6Chsc</a></p>

<p>White, T. M. (2019). Cartographic Pleasures: Maps Inspired by Joy Division’s
Unknown Pleasures Album Art. <em>Cartographic Perspectives</em>, (92), 65–78.
<a href="https://doi.org/10.14714/CP92.1536">https://doi.org/10.14714/CP92.1536</a></p>

<p>Redondo, Daniel (2020, January 25). “Mapas estilo Joy Division con QGIS y R.”
<a href="https://danielredondo.com/blog/2020-01-25-joy_division/">https://danielredondo.com/blog/2020-01-25-joy_division/</a></p>
<div class="footnotes" role="doc-endnotes">
  <ol>
    <li id="fn:1">
      <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>
    </li>
  </ol>
</div>
</div>
				]]>
			</description>
			<link>https://dieghernan.github.io/202205_Unknown-pleasures-R/</link>
			<category>posts</category>
		    <category>ggplot2</category><category>ggridges</category><category>giscoR</category><category>maps</category><category>r_bloggers</category><category>rspatial</category><category>rstats</category><category>terra</category><media:title type="html"><![CDATA[Unknown pleasures with R ]]></media:title>
      <media:content url="https://dieghernan.github.io/assets/img/blog/20220501_joyplots.webp" medium="image"/>
      <media:thumbnail url="https://dieghernan.github.io/assets/img/blog/20220501_joyplots.webp" /><guid isPermaLink="true">https://dieghernan.github.io/202205_Unknown-pleasures-R/</guid>
      <pubDate>Sun, 01 May 2022 00:00:00 +0200</pubDate>
		</item><item>
			<title>Corona timelapse</title>
			<description>
				<![CDATA[	
 				<h3>Travel restrictions amidst the COVID crisis across time - A German perspective</h3>
    		<p>1 min.</p>
				<div><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></p>

<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>

<p>In April 2021, my brother Diego and I saw
the 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>

<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
COVID-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>

<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
<a href="https://archive.org/web/">Archive.org Wayback Machine</a> as provided by
<a href="https://sangaline.com/post/wayback-machine-scraper/">Evan Sangaline</a>, and we have of course worked around the inconsistencies of
German bureaucracy.</p>

<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>

<h2 id="links">Links</h2>

<ul>
  <li><a href="../projects/corona-atlas">Read more on this site</a></li>
  <li><a href="https://dieghernan.github.io/corona-atlas.de/en">Project’s Website</a></li>
  <li><a href="https://github.com/dieghernan/corona-atlas.de">Project’s Repository</a></li>
</ul>

</div>
				]]>
			</description>
			<link>https://dieghernan.github.io/202203_Corona-timelapse/</link>
			<category>posts</category>
		    <category>COVID19</category><category>R</category><category>discontinued</category><category>guest-author</category><category>leaflet</category><category>maps</category><category>project</category><category>python</category><media:title type="html"><![CDATA[Corona timelapse ]]></media:title>
      <media:content url="https://dieghernan.github.io/corona-atlas.de/timelapse/frames/D2021-04-16.png" medium="image"/>
      <media:thumbnail url="https://dieghernan.github.io/corona-atlas.de/timelapse/frames/D2021-04-16.png" /><guid isPermaLink="true">https://dieghernan.github.io/202203_Corona-timelapse/</guid>
      <pubDate>Mon, 14 Mar 2022 00:00:00 +0100</pubDate>
		</item><item>
			<title>Insets with ggplot2 and tmap - and mapsf!</title>
			<description>
				<![CDATA[	
 				<h3>A map on a map</h3>
    		<p>3 min.</p>
				<div><p><em>This post is dedicated to <a href="https://dominicroye.github.io/en/">Dominic Royé</a>, AKA <a href="https://twitter.com/dr_xeo">\@dr_xeo</a></em></p>

<p>A common challenge when creating maps is how to include an inset map in your
visualization. An inset map is nothing more than a smaller map usually included
in a corner that may provide additional context to the overall map. It is also
useful for representing spatial units that may form part of a country but whose
geographical location would result in an imperfect visualization, or for
including small units that would otherwise not be shown on the map.</p>

<p>I have already covered this
<a href="https://dieghernan.github.io//201911_QuickR/">using the base <code class="language-plaintext highlighter-rouge">plot()</code> function</a>,
but this time I show how to produce these insets using the <strong>ggplot2</strong> and
<strong>tmap</strong> packages. In short: use the <strong>cowplot</strong> package.</p>

<h2 id="test-case-canary-islands-as-an-inset">Test case: Canary Islands as an inset</h2>

<p>In this example, I create a map of Spain using <strong>mapSpain</strong> and an inset for the
Canary Islands.</p>

<p>The “true” map of Spain is:</p>

<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">
</span><span class="n">library</span><span class="p">(</span><span class="n">sf</span><span class="p">)</span><span class="w">
</span><span class="n">library</span><span class="p">(</span><span class="n">ggplot2</span><span class="p">)</span><span class="w">
</span><span class="n">library</span><span class="p">(</span><span class="n">dplyr</span><span class="p">)</span><span class="w">

</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">

</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">
  </span><span class="n">geom_sf</span><span class="p">()</span><span class="w">
</span></code></pre></div></div>

<p><img src="https://dieghernan.github.io/assets/img/blog//20220303_truemap-1.webp" title="plot of chunk 20220303_truemap" alt="Map of Spain with autonomous community boundaries and the Canary Islands in their geographic position southwest of the mainland." width="100%" /></p>

<p>I use a different CRS for each part of Spain. In the case of mainland Spain, I
use ETRS89 / UTM 30N (<a href="https://epsg.io/25830">EPSG:25830</a>) and for the Canary
Islands I use REGCAN95 / UTM 28N (<a href="https://epsg.io/4083">EPSG:4083</a>).</p>

<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">
  </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">
  </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="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">
  </span><span class="n">geom_sf</span><span class="p">()</span><span class="w">
</span></code></pre></div></div>

<p><img src="https://dieghernan.github.io/assets/img/blog//20220303_mainsub-1.webp" title="plot of chunk 20220303_mainsub" alt="Map of mainland Spain and the Balearic Islands with autonomous community boundaries, excluding the Canary Islands." width="100%" /></p>

<div class="language-r highlighter-rouge"><div class="highlight"><pre class="highlight"><code><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">
  </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">
  </span><span class="n">st_transform</span><span class="p">(</span><span class="m">4083</span><span class="p">)</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">
  </span><span class="n">geom_sf</span><span class="p">()</span><span class="w">
</span></code></pre></div></div>

<p><img src="https://dieghernan.github.io/assets/img/blog//20220303_mainsub-2.webp" title="plot of chunk 20220303_mainsub" alt="Map of the Canary Islands in their local projected coordinate system." width="100%" /></p>

<p>So that was easy! Just a couple of maps using <strong>ggplot2</strong>. Let’s start mixing and
matching!</p>

<h2 id="on-ggplot2">On <strong>ggplot2</strong></h2>

<p>We have already created two quick maps with <strong>ggplot2</strong>. Now, to produce our map
with insets we will:</p>

<ol>
  <li>
    <p>Produce two plots: the main plot and the subplot, providing a minimal style.
We will store them as <code class="language-plaintext highlighter-rouge">ggplot</code> objects.</p>
  </li>
  <li>
    <p>Combine both objects with <strong>cowplot</strong>.</p>
  </li>
</ol>

<div class="language-r highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># Main plot</span><span class="w">
</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">
  </span><span class="n">geom_sf</span><span class="p">()</span><span class="w"> </span><span class="o">+</span><span class="w">
  </span><span class="n">theme_void</span><span class="p">()</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">
    </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">
    </span><span class="c1"># Add a bit of margin on the bottom left</span><span class="w">
    </span><span class="c1"># We will place the inset there</span><span class="w">
    </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">
  </span><span class="p">)</span><span class="w">

</span><span class="c1"># Sub plot</span><span class="w">
</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">
  </span><span class="n">geom_sf</span><span class="p">()</span><span class="w"> </span><span class="o">+</span><span class="w">
  </span><span class="n">theme_void</span><span class="p">()</span><span class="w"> </span><span class="o">+</span><span class="w">
  </span><span class="c1"># Add a border to the inset</span><span class="w">
  </span><span class="n">theme</span><span class="p">(</span><span class="w">
    </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">
    </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">
  </span><span class="p">)</span><span class="w">
</span></code></pre></div></div>

<p>We have our objects in place, and now is when the magic happens! With <strong>cowplot</strong>,
we can combine both maps into a single one. You may need to play a bit with the
parameters <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
placement:</p>

<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">

</span><span class="n">ggdraw</span><span class="p">()</span><span class="w"> </span><span class="o">+</span><span class="w">
  </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">
  </span><span class="n">draw_plot</span><span class="p">(</span><span class="n">sub_gg</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.2</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">-0.25</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="m">0.08</span><span class="w">
  </span><span class="p">)</span><span class="w">
</span></code></pre></div></div>

<p><img src="https://dieghernan.github.io/assets/img/blog//20220303_insetggplot-1.webp" title="plot of chunk 20220303_insetggplot" alt="Map of Spain with the Canary Islands moved into a boxed inset at the lower left." width="100%" /></p>

<p>Note also that this approach is valid not only for maps, but for all types of
plots produced by <strong>ggplot2</strong>, since this package is not specific to map
objects:</p>

<div class="language-r highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># Combining non-spatial plots</span><span class="w">
</span><span class="n">library</span><span class="p">(</span><span class="n">palmerpenguins</span><span class="p">)</span><span class="w">

</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">
  </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="w">
    </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="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">
  </span><span class="p">)</span><span class="w">
</span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w">
  </span><span class="n">geom_point</span><span class="p">(</span><span class="n">aes</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">species</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="n">species</span><span class="w">
  </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="n">alpha</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">0.8</span><span class="w">
  </span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w">
  </span><span class="n">theme_minimal</span><span class="p">()</span><span class="w"> </span><span class="o">+</span><span class="w">
  </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">

</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">
  </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">
    </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="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">
    </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">
  </span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w">
  </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">
  </span><span class="n">theme_void</span><span class="p">()</span><span class="w"> </span><span class="o">+</span><span class="w">
  </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">


</span><span class="c1"># Nonsense plot!</span><span class="w">
</span><span class="n">ggdraw</span><span class="p">()</span><span class="w"> </span><span class="o">+</span><span class="w">
  </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">
  </span><span class="n">draw_plot</span><span class="p">(</span><span class="n">flipper_hist</span><span class="p">,</span><span class="w">
    </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">
    </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">
    </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">
  </span><span class="p">)</span><span class="w">
</span></code></pre></div></div>

<p><img src="https://dieghernan.github.io/assets/img/blog//20220303_insetggplot_nonsense-1.webp" title="plot of chunk 20220303_insetggplot_nonsense" 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>

<h2 id="on-tmap">On <strong>tmap</strong></h2>

<p>We can follow a similar approach with <strong>tmap</strong>. In version 3.x.x (there is a
new <a href="https://github.com/r-tmap/tmap/issues/599">revamped version under development</a>),
we can use <a href="https://github.com/r-tmap/tmap/issues/541"><code class="language-plaintext highlighter-rouge">tmap_grob()</code></a> to
convert the <code class="language-plaintext highlighter-rouge">tmap</code> objects to the objects that <strong>cowplot</strong> can handle.</p>

<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">

</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">
  </span><span class="n">tm_polygons</span><span class="p">()</span><span class="w"> </span><span class="o">+</span><span class="w">
  </span><span class="n">tm_layout</span><span class="p">(</span><span class="w">
    </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">
    </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">
  </span><span class="p">)</span><span class="w">


</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">

</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">
  </span><span class="n">tm_polygons</span><span class="p">()</span><span class="w">

</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">
</span></code></pre></div></div>

<p>Once we have these new “grobs”, we can use the same approach as the one we
applied to <strong>ggplot2</strong> objects.</p>

<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">
  </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">
  </span><span class="n">draw_plot</span><span class="p">(</span><span class="n">sub_tmap</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.3</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">-0.2</span><span class="w">
  </span><span class="p">)</span><span class="w">
</span></code></pre></div></div>

<p><img src="https://dieghernan.github.io/assets/img/blog//20220303_insettmap-1.webp" title="plot of chunk 20220303_insettmap" alt="Map of Spain with regional boundaries and a Canary Islands inset at the lower left." width="100%" /></p>

<h2 id="update-on-mapsf">Update: On <strong>mapsf</strong></h2>

<p><a href="https://rgeomatic.hypotheses.org/">Timotheé Giraud</a> (AKA
<a href="https://twitter.com/rgeomatic">\@rgeomatic</a>), the developer of <strong>mapsf</strong>, also
shared how to create inset maps using that package:</p>

<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">

</span><span class="n">mf_map</span><span class="p">(</span><span class="n">main</span><span class="p">)</span><span class="w">
</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">
</span><span class="n">mf_map</span><span class="p">(</span><span class="n">island</span><span class="p">)</span><span class="w">
</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">
</span><span class="n">mf_inset_off</span><span class="p">()</span><span class="w">
</span></code></pre></div></div>

<p><img src="https://dieghernan.github.io/assets/img/blog//20220303_insetmapsf-1.webp" title="plot of chunk 20220303_insetmapsf" alt="Map of Spain with regional boundaries and a boxed Canary Islands inset at the lower right." width="100%" /></p>
</div>
				]]>
			</description>
			<link>https://dieghernan.github.io/202203_insetmaps/</link>
			<category>posts</category>
		    <category>ggplot2</category><category>inset</category><category>mapSpain</category><category>maps</category><category>mapsf</category><category>r_bloggers</category><category>rspatial</category><category>rstats</category><category>sf</category><category>tmap</category><media:title type="html"><![CDATA[Insets with <strong>ggplot2</strong> and <strong>tmap</strong> - and <strong>mapsf</strong>! ]]></media:title>
      <media:content url="https://dieghernan.github.io/assets/img/blog/20220303_inset.webp" medium="image"/>
      <media:thumbnail url="https://dieghernan.github.io/assets/img/blog/20220303_inset.webp" /><guid isPermaLink="true">https://dieghernan.github.io/202203_insetmaps/</guid>
      <pubDate>Thu, 03 Mar 2022 00:00:00 +0100</pubDate>
		</item><item>
			<title>Beautiful maps with R (IV): Fun with flags revisited</title>
			<description>
				<![CDATA[	
 				<h3>Any picture as a basemap</h3>
    		<p>2 min.</p>
				<div><p>On 27 Jan. 2022 my package <strong>rasterpic</strong> was accepted on
<a href="https://cran.r-project.org/package=rasterpic">CRAN</a> (Hooray!). This package
geotags images, using a spatial object (from <strong>sf</strong> or <strong>terra</strong>) as a
geographic reference.</p>

<p>I tweeted about that, and it seems to have received good feedback from the
<a href="https://twitter.com/hashtag/rspatial">#rspatial</a> community:</p>

<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>
<script async="" src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

<p>I also received an interesting reply to this from <strong>Hefin Ioan Rhys</strong>
<a href="https://twitter.com/HRJ21">@HRJ21</a>:</p>

<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>
<script async="" src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

<p>That reminds me of a <a href="https://dieghernan.github.io/202002_cartography1/#png-layer">previous
post</a> that I wrote
when I added some new functions to the <strong>cartography</strong> package, now replaced by
the <a href="https://cran.r-project.org/package=mapsf"><strong>mapsf</strong></a> package.</p>

<p>With <strong>rasterpic</strong>, we now have an alternative tool for creating maps using
images, and this quick post shows you how to do it.</p>

<p>I will replicate the Africa map presented in my previous plot, but this time I
will use newer packages, such as
<a href="https://cran.r-project.org/package=giscoR"><strong>giscoR</strong></a>, and the development
version of <a href="https://github.com/paleolimbot/ggspatial/pull/92"><strong>ggspatial</strong></a>
(not released yet), which adds support for <code class="language-plaintext highlighter-rouge">SpatRaster</code> objects in <strong>ggplot2</strong>.
The flags will be extracted from the GitHub repository
<a href="https://github.com/hampusborgos/country-flags">https://github.com/hampusborgos/country-flags</a>.</p>

<div class="language-r highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="w">
</span><span class="c1"># Development version of ggspatial</span><span class="w">
</span><span class="c1"># devtools::install_github("paleolimbot/ggspatial")</span><span class="w">
</span><span class="n">library</span><span class="p">(</span><span class="n">ggspatial</span><span class="p">)</span><span class="w">
</span><span class="n">library</span><span class="p">(</span><span class="n">ggplot2</span><span class="p">)</span><span class="w">
</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="n">library</span><span class="p">(</span><span class="n">dplyr</span><span class="p">)</span><span class="w">
</span><span class="n">library</span><span class="p">(</span><span class="n">rasterpic</span><span class="p">)</span><span class="w">

</span><span class="c1"># For country names</span><span class="w">
</span><span class="n">library</span><span class="p">(</span><span class="n">countrycode</span><span class="p">)</span><span class="w">

</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">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">

</span><span class="c1"># Base map of Africa</span><span class="w">
</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">
  </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">
  </span><span class="n">theme_minimal</span><span class="p">()</span><span class="w"> </span><span class="o">+</span><span class="w">
  </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">

</span><span class="n">plot</span><span class="w"> </span><span class="o">+</span><span class="w">
  </span><span class="c1"># Zoom on Africa</span><span class="w">
  </span><span class="n">coord_sf</span><span class="p">(</span><span class="w">
    </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">
    </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">
  </span><span class="p">)</span><span class="w">
</span></code></pre></div></div>

<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>

<p>Now, let’s add the flags with a loop:</p>

<div class="language-r highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="w">
</span><span class="c1"># We paste the ISO2 code to each African country</span><span class="w">
</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">

</span><span class="c1"># Get flags from repo - low quality to speed up the code</span><span class="w">
</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">

</span><span class="c1"># Loop and add</span><span class="w">
</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">
  </span><span class="c1"># Download pic and plot</span><span class="w">
  </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">
  </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">
  </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">

  </span><span class="c1"># Raster</span><span class="w">
  </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">
  </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">
  </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">
</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="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">
  </span><span class="c1"># Zoom on Africa</span><span class="w">
  </span><span class="n">coord_sf</span><span class="p">(</span><span class="w">
    </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">
    </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">
  </span><span class="p">)</span><span class="w">
</span></code></pre></div></div>

<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>
</div>
				]]>
			</description>
			<link>https://dieghernan.github.io/202201_maps-flags/</link>
			<category>posts</category>
		    <category>beautiful_maps</category><category>flags</category><category>giscoR</category><category>maps</category><category>r_bloggers</category><category>rasterpic</category><category>rspatial</category><category>rstats</category><category>terra</category><media:title type="html"><![CDATA[Beautiful maps with R (IV): Fun with flags revisited ]]></media:title>
      <media:content url="https://dieghernan.github.io/assets/img/blog/20220128_flag-1.webp" medium="image"/>
      <media:thumbnail url="https://dieghernan.github.io/assets/img/blog/20220128_flag-1.webp" /><guid isPermaLink="true">https://dieghernan.github.io/202201_maps-flags/</guid>
      <pubDate>Fri, 28 Jan 2022 00:00:00 +0100</pubDate>
		</item><item>
			<title>Corona Atlas</title>
			<description>
				<![CDATA[	
 				<h3>Interactive map of the international COVID-19 risk areas as designated by the German authorities.</h3>
    		<p>1 min.</p>
				<div><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></p>

<p><img src="https://dieghernan.github.io/corona-atlas.de/assets/img/corona-atlas-icon.png" alt="Corona Atlas logo" style="width: 25%;" /></p>

<p>Visit <a href="https://dieghernan.github.io/corona-atlas.de/">https://dieghernan.github.io/corona-atlas.de/</a></p>

<p>Interactive map of the international COVID-19 risk areas as designated by the German authorities.</p>

<p>The data is 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>

<p>Data scraping is performed in <strong>Python</strong> with
<a href="https://scrapy.org/"><strong>scrapy</strong></a>.
The scraper also uses
<a href="https://pandas.pydata.org/"><strong>pandas</strong></a> and
<a href="https://pypi.org/project/pycountry/"><strong>pycountry</strong></a>.</p>

<p>For the prototype version, map visualization was created with <strong>R</strong> and
generated via <a href="https://rmarkdown.rstudio.com/"><strong>rmarkdown</strong></a> using
<a href="http://rstudio.github.io/leaflet/"><strong>leaflet</strong></a>,
<a href="https://dieghernan.github.io/giscoR/"><strong>giscoR</strong></a> and some packages included in
the <a href="https://www.tidyverse.org/">tidyverse</a>.
For the deployment, map logic has moved to JavaScript to support multiple languages.</p>

<p><a href="/202203_Corona-timelapse">Read more in this post</a></p>
</div>
				]]>
			</description>
			<link>https://dieghernan.github.io/projects/corona-atlas/</link>
			<category>projects</category>
		    <category>COVID19</category><category>R</category><category>discontinued</category><category>leaflet</category><category>maps</category><category>project</category><category>python</category><media:title type="html"><![CDATA[Corona Atlas ]]></media:title>
      <media:content url="https://dieghernan.github.io/corona-atlas.de/assets/img/og_corona_atlas.png" medium="image"/>
      <media:thumbnail url="https://dieghernan.github.io/corona-atlas.de/assets/img/og_corona_atlas.png" /><guid isPermaLink="true">https://dieghernan.github.io/projects/corona-atlas/</guid>
      <pubDate>Fri, 30 Apr 2021 00:00:00 +0200</pubDate>
		</item><item>
			<title>spain-munic-bot</title>
			<description>
				<![CDATA[	
 				<h3>A Twitter bot written in R.</h3>
    		<p>1 min.</p>
				<div><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></p>

<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>

<p>Hi! I am a bot 🤖 that tweets 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 run 🏃‍♀️ every 20 minutes.</p>

<h2 id="i-have-a-website"><a href="https://dieghernan.github.io/spain-munic-bot/">I have a website!</a></h2>

<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>

<h2 id="-r-packages">📦 <strong>R</strong> packages</h2>

<p>Core packages used in the project are:</p>

<ul>
  <li><a href="https://ropenspain.github.io/mapSpain/"><strong>mapSpain</strong></a> for the location of the
municipalities, base polygons, coordinates and imagery.</li>
  <li><a href="https://docs.ropensci.org/osmdata/"><strong>osmdata</strong></a> for the streets.</li>
  <li><a href="https://mtennekes.github.io/tmap/"><strong>tmap</strong></a> for plotting.</li>
  <li><a href="https://docs.ropensci.org/rtweet/"><strong>rtweet</strong></a> for posting.</li>
</ul>

<p>Other packages used are <strong>sf</strong>, <strong>dplyr</strong> and other common supporting packages.</p>
</div>
				]]>
			</description>
			<link>https://dieghernan.github.io/projects/spain-munic-bot/</link>
			<category>projects</category>
		    <category>R</category><category>discontinued</category><category>maps</category><category>project</category><category>twitter</category><media:title type="html"><![CDATA[spain-munic-bot ]]></media:title>
      <media:content url="https://dieghernan.github.io/spain-munic-bot/assets/img/sample.png" medium="image"/>
      <media:thumbnail url="https://dieghernan.github.io/spain-munic-bot/assets/img/sample.png" /><guid isPermaLink="true">https://dieghernan.github.io/projects/spain-munic-bot/</guid>
      <pubDate>Fri, 29 Jan 2021 00:00:00 +0100</pubDate>
		</item><item>
			<title>Leaflet-providersESP</title>
			<description>
				<![CDATA[	
 				<h3>Plugin for Leaflet.js</h3>
    		<p>1 min.</p>
				<div><p><strong>Leaflet-providersESP</strong> is a plugin for <a href="https://leafletjs.com/">Leaflet</a> that
contains configurations for various tile layers provided by public agencies in
Spain.</p>

<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>

<h2 id="demo">Demo</h2>

<p>Full docs and examples are available at
<a href="https://dieghernan.github.io/leaflet-providersESP/">https://dieghernan.github.io/leaflet-providersESP/</a>.</p>

<p>This code generates a Leaflet map with a layer provided by
Leaflet-providersESP.</p>

<div class="language-html highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">&lt;!DOCTYPE html&gt;</span>
<span class="nt">&lt;html&gt;</span>
  <span class="nt">&lt;head&gt;</span>
    <span class="nt">&lt;title&gt;</span>Minimal page | leaflet-providersESP<span class="nt">&lt;/title&gt;</span>
    <span class="nt">&lt;meta</span> <span class="na">charset=</span><span class="s">"utf-8"</span> <span class="nt">/&gt;</span>
    <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>
    <span class="c">&lt;!-- Load Leaflet --&gt;</span>
    <span class="nt">&lt;link</span>
      <span class="na">rel=</span><span class="s">"stylesheet"</span>
      <span class="na">href=</span><span class="s">"https://unpkg.com/leaflet@1.7.1/dist/leaflet.css"</span>
    <span class="nt">/&gt;</span>
    <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>
    <span class="c">&lt;!-- Install leaflet-providersESP --&gt;</span>
    <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>
    <span class="c">&lt;!-- Display map full page --&gt;</span>
    <span class="nt">&lt;style&gt;</span>
      <span class="nt">html</span> <span class="p">{</span>
        <span class="nl">height</span><span class="p">:</span> <span class="m">100%</span><span class="p">;</span>
      <span class="p">}</span>
      <span class="nt">body</span> <span class="p">{</span>
        <span class="nl">height</span><span class="p">:</span> <span class="m">100%</span><span class="p">;</span>
        <span class="nl">margin</span><span class="p">:</span> <span class="m">0</span><span class="p">;</span>
        <span class="nl">padding</span><span class="p">:</span> <span class="m">0</span><span class="p">;</span>
      <span class="p">}</span>
      <span class="nf">#mapid</span> <span class="p">{</span>
        <span class="nl">height</span><span class="p">:</span> <span class="m">100%</span><span class="p">;</span>
        <span class="nl">width</span><span class="p">:</span> <span class="m">100%</span><span class="p">;</span>
      <span class="p">}</span>
    <span class="nt">&lt;/style&gt;</span>
  <span class="nt">&lt;/head&gt;</span>
  <span class="nt">&lt;body&gt;</span>
    <span class="c">&lt;!-- Create map --&gt;</span>
    <span class="nt">&lt;div</span> <span class="na">id=</span><span class="s">"mapid"</span><span class="nt">&gt;&lt;/div&gt;</span>
    <span class="c">&lt;!-- Puerta del Sol - IDErioja server --&gt;</span>
    <span class="nt">&lt;script&gt;</span>
      <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>
      <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>
    <span class="nt">&lt;/script&gt;</span>
  <span class="nt">&lt;/body&gt;</span>
<span class="nt">&lt;/html&gt;</span>
</code></pre></div></div>

<div class="embed-responsive embed-responsive-4by3 my-2 chulapa-rounded-lg border border-primary">
  <iframe class="embed-responsive-item" src="https://dieghernan.github.io/leaflet-providersESP/demo/minimal" allowfullscreen="" loading="lazy"></iframe>
</div>

<h2 id="all-providers">All providers</h2>

<div class="embed-responsive embed-responsive-4by3 my-2 chulapa-rounded-lg border border-primary mt-5 mb-2">
  <iframe class="embed-responsive-item" src="https://dieghernan.github.io/leaflet-providersESP/allproviders/" allowfullscreen="" loading="lazy"></iframe>
</div>
</div>
				]]>
			</description>
			<link>https://dieghernan.github.io/projects/leaflet-providersESP/</link>
			<category>projects</category>
		    <category>leaflet</category><category>maps</category><category>project</category><media:title type="html"><![CDATA[Leaflet-providersESP ]]></media:title>
      <media:content url="https://dieghernan.github.io/assets/img/misc/leaflet-providersesp.png" medium="image"/>
      <media:thumbnail url="https://dieghernan.github.io/assets/img/misc/leaflet-providersesp.png" /><guid isPermaLink="true">https://dieghernan.github.io/projects/leaflet-providersESP/</guid>
      <pubDate>Mon, 26 Oct 2020 00:00:00 +0100</pubDate>
		</item><item>
			<title>Head/tail breaks in the classInt package</title>
			<description>
				<![CDATA[	
 				
    		<p>11 min.</p>
				<div><blockquote class="blockquote">
  <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>
  <footer class="blockquote-footer text-right">Jiang (2013)</footer>
</blockquote>

<h2 id="abstract">Abstract</h2>

<p>This vignette discusses the implementation of the “Head/tail breaks” style
(Jiang (2013)) in the <code class="language-plaintext highlighter-rouge">classIntervals()</code> function from the <strong>classInt</strong> package.
A step-by-step example is presented to clarify the method. A case study using
<code class="language-plaintext highlighter-rouge">spData::afcon</code> is also included, making use of additional packages such as
<strong>sf</strong>.</p>

<h2 id="introduction">Introduction</h2>

<p><strong>Head/tail breaks</strong> is a classification scheme introduced by Jiang (2013) for
revealing hierarchies in data with many small values and a few large ones.
The related <strong>ht-index</strong> measures the depth of this hierarchy, rather than
being another name for the classification method.</p>

<p>The distributions considered here are strongly right-skewed, with a minority
of large values in the head and a majority of small values in the tail. This
imbalance can be expressed as <em>“far more small things than large things”</em>.</p>

<p>Power-law and lognormal distributions are examples of heavy-tailed
distributions. The head/tail breaks literature also considers exponential
distributions under its broader description of this imbalance. Nature,
society and finance (Vasicek (2002)) provide examples of rare and extreme
events. Taleb (2008) discusses the impact of unexpected extreme events,
offering another reason to pay attention to low-frequency observations.</p>

<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">

</span><span class="c1"># 1. Characterization of heavy-tail distributions----</span><span class="w">
</span><span class="n">set.seed</span><span class="p">(</span><span class="m">1234</span><span class="p">)</span><span class="w">
</span><span class="c1"># Pareto distribution a=1 b=1.161 n=1000</span><span class="w">
</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">
</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">
</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">
</span><span class="n">plot</span><span class="p">(</span><span class="w">
  </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">
  </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">
  </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">
  </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">
  </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">
</span><span class="p">)</span><span class="w">
</span><span class="n">abline</span><span class="p">(</span><span class="w">
  </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">
  </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">
  </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">
</span><span class="p">)</span><span class="w">
</span><span class="n">abline</span><span class="p">(</span><span class="w">
  </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">
  </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">
  </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">
</span><span class="p">)</span><span class="w">
</span><span class="n">legend</span><span class="p">(</span><span class="w">
  </span><span class="s2">"topleft"</span><span class="p">,</span><span class="w">
  </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">
  </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">
  </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">
  </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">
</span><span class="p">)</span><span class="w">

</span><span class="n">hist</span><span class="p">(</span><span class="w">
  </span><span class="n">sample_par</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">100</span><span class="p">,</span><span class="w">
  </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">
  </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">
  </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">
  </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">
  </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">
</span><span class="p">)</span><span class="w">
</span><span class="n">par</span><span class="p">(</span><span class="n">opar</span><span class="p">)</span><span class="w">
</span></code></pre></div></div>

<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>

<h2 id="breaking-method">Breaking method</h2>

<p>The method itself consists of a four-step process performed recursively until a
stopping condition is satisfied. Given a vector of values \(v = (a_1, a_2,
..., a_n)\), the process can be described as follows:</p>

<ol>
  <li>Compute the arithmetic mean, \(\mu = \frac{1}{n}\sum_{i=1}^{n} a_i\).</li>
  <li>Break \(v\) into the \(tail\) and the \(head\):
\(tail = \{ a_x \in v | a_x \lt \mu \}\)
\(head = \{ a_x \in v | a_x \gt \mu \}\).</li>
  <li>Check whether the proportion of observations in the head is at most the
chosen threshold:
\(\frac{|head|}{|v|} \le threshold\)</li>
  <li>If step 3 is <code class="language-plaintext highlighter-rouge">TRUE</code> and the head contains at least two observations, replace
\(v\) with \(head\) and repeat. Otherwise, stop.</li>
</ol>

<p>Only values strictly above the mean enter the next iteration. Values equal to
the mean are not part of the head. Stopping does not require an exact 50/50
split.</p>

<p>A threshold of 40% provides a practical stopping rule. It is not a statistical
test for whether a distribution is heavy-tailed.</p>

<p>The final breaks are the vector of consecutive \(\mu\):</p>

<p>[breaks = (\mu_1, \mu_2, \mu_3, …, \mu_n )]</p>

<h2 id="step-by-step-example">Step-by-step example</h2>

<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>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Recursive function Head/tail Breaks:
 Rank the input data from the largest to the smallest
 Break the data into the head and the tail around the mean;
 // the head for those above the mean
 // the tail for those below the mean
 While (head &lt;= 40%):
 Head/tail Breaks (head);
End Function
</code></pre></div></div>

<p>The following <strong>R</strong> example uses <code class="language-plaintext highlighter-rouge">prop &lt; thr</code>, whereas the pseudocode above
uses <code class="language-plaintext highlighter-rouge">head &lt;= 40%</code>. At exactly 40%, the R loop stops and the pseudocode
continues. This distinction does not affect the example below.</p>

<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">
</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">
</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">
</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">
</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">

</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">
  </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">
  </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">
  </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">
  </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">
  </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">
</span><span class="p">)</span><span class="w">
</span><span class="c1"># Pars for chart</span><span class="w">
</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">
</span><span class="c1"># Iteration</span><span class="w">
</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">
  </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">
  </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">
  </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">
  </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">
  </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">
  </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">
    </span><span class="n">sum_table</span><span class="p">,</span><span class="w">
    </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">
  </span><span class="p">)</span><span class="w">
  </span><span class="n">hist</span><span class="p">(</span><span class="w">
    </span><span class="n">var</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="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">
    </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">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">
    </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">
    </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">
    </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">
  </span><span class="p">)</span><span class="w">
  </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">
  </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">
  </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">
  </span><span class="n">text</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="n">mu</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">ylabel</span><span class="p">,</span><span class="w">
    </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">
    </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">
    </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">
  </span><span class="p">)</span><span class="w">
  </span><span class="n">legend</span><span class="p">(</span><span class="w">
    </span><span class="s2">"right"</span><span class="p">,</span><span class="w">
    </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">
    </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="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">
    </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">
  </span><span class="p">)</span><span class="w">
  </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">
    </span><span class="k">break</span><span class="w">
  </span><span class="p">}</span><span class="w">
  </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">
</span><span class="p">}</span><span class="w">
</span><span class="n">par</span><span class="p">(</span><span class="n">opar</span><span class="p">)</span><span class="w">
</span></code></pre></div></div>

<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>

<p>The head proportion varies across iterations and reaches 50% in the fourth,
which stops the loop. It does not increase monotonically.</p>

<table>
  <thead>
    <tr>
      <th style="text-align: right">iter</th>
      <th style="text-align: right">mu</th>
      <th style="text-align: left">prop</th>
      <th style="text-align: right">n_var</th>
      <th style="text-align: right">n_head</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="text-align: right">1</td>
      <td style="text-align: right">5.6755</td>
      <td style="text-align: left">14.5%</td>
      <td style="text-align: right">1000</td>
      <td style="text-align: right">145</td>
    </tr>
    <tr>
      <td style="text-align: right">2</td>
      <td style="text-align: right">27.2369</td>
      <td style="text-align: left">21.38%</td>
      <td style="text-align: right">145</td>
      <td style="text-align: right">31</td>
    </tr>
    <tr>
      <td style="text-align: right">3</td>
      <td style="text-align: right">85.1766</td>
      <td style="text-align: left">19.35%</td>
      <td style="text-align: right">31</td>
      <td style="text-align: right">6</td>
    </tr>
    <tr>
      <td style="text-align: right">4</td>
      <td style="text-align: right">264.7126</td>
      <td style="text-align: left">50%</td>
      <td style="text-align: right">6</td>
      <td style="text-align: right">3</td>
    </tr>
  </tbody>
</table>

<p>The break vector includes the original minimum and maximum, plus the means
computed during the iterations. Here the original data are <code class="language-plaintext highlighter-rouge">sample_par</code>, since
<code class="language-plaintext highlighter-rouge">var</code> is replaced by the head inside the loop.</p>

<h2 id="implementation-in-the-classint-package">Implementation in the <strong>classInt</strong> package</h2>

<p>The implementation in <code class="language-plaintext highlighter-rouge">classIntervals()</code> reproduces these results:</p>

<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">
</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">
</span></code></pre></div></div>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>## [1] TRUE TRUE TRUE TRUE TRUE TRUE
</code></pre></div></div>

<p>As stated in Jiang (2013), the number of breaks is determined by the data.
However, the <code class="language-plaintext highlighter-rouge">thr</code> parameter can help adjust the final number. A lower value
of <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
the underlying distribution follows the <em>“far more small things than large
things”</em> principle.</p>

<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">
</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">

</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">
</span><span class="c1"># Minimum: single break</span><span class="w">
</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">
</span><span class="n">plot</span><span class="p">(</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"> </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">
  </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">"thr = 0"</span><span class="w">
</span><span class="p">)</span><span class="w">

</span><span class="c1"># Two breaks</span><span class="w">
</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">
</span><span class="n">plot</span><span class="p">(</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"> </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">
  </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">"thr = 0.2"</span><span class="w">
</span><span class="p">)</span><span class="w">

</span><span class="c1"># Default breaks: 0.4</span><span class="w">
</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">
</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">
  </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">"thr = Default"</span><span class="w">
</span><span class="p">)</span><span class="w">

</span><span class="c1"># Maximum breaks</span><span class="w">
</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">
</span><span class="n">plot</span><span class="p">(</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"> </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">
  </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">"thr = 1"</span><span class="w">
</span><span class="p">)</span><span class="w">
</span><span class="n">par</span><span class="p">(</span><span class="n">opar</span><span class="p">)</span><span class="w">
</span></code></pre></div></div>

<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>

<p>For this example, even <code class="language-plaintext highlighter-rouge">thr = 0</code> retains the mean as an internal break.
The returned vector also contains the minimum and maximum, so this gives two
classes, not one.</p>

<h2 id="case-study">Case study</h2>

<p>Jiang (2013) states that <em>"the new classification scheme is more natural than
the natural breaks in finding the groupings or hierarchy for data with a
heavy-tailed distribution."</em> (p. 482), referring to Jenks’ natural breaks
method. 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
alias for the Fisher-Jenks algorithm and is always preferred to the <code class="language-plaintext highlighter-rouge">jenks</code>
style (see <code class="language-plaintext highlighter-rouge">?classIntervals</code>). For this example, we will use the <code class="language-plaintext highlighter-rouge">afcon</code>
dataset from the <strong>spData</strong> package, plus some additional spatial information to
create the data visualization.</p>

<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">
</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">
</span></code></pre></div></div>

<p>Let’s have a look at the top 10 values and the distribution of the variable
<code class="language-plaintext highlighter-rouge">totcon</code> (index of total conflict 1966-78):</p>

<div class="language-r highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># Top10</span><span class="w">
</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">

</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">
</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">
</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">
  </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">
  </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">
  </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">
  </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">
  </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">
</span><span class="p">)</span><span class="w">
</span><span class="n">plot</span><span class="p">(</span><span class="w">
  </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">
  </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">
  </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">
</span><span class="p">)</span><span class="w">
</span><span class="n">par</span><span class="p">(</span><span class="n">opar</span><span class="p">)</span><span class="w">
</span></code></pre></div></div>

<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>

<p>The values for Egypt (EG) and Sudan (SU) stand out from the rest. The histogram
shows a strongly right-skewed pattern with many small values and a few large
ones.</p>

<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
classification styles. Quantile breaks are based on ranks rather than the
size of the gaps between observations.</p>

<p>Applying the three aforementioned methods to break the data:</p>

<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">
</span><span class="n">print</span><span class="p">(</span><span class="n">brks_ht</span><span class="p">)</span><span class="w">
</span><span class="c1"># Same number of classes for "fisher"</span><span class="w">
</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">
</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">
  </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">
  </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">
</span><span class="p">)</span><span class="w">
</span><span class="n">print</span><span class="p">(</span><span class="n">brks_fisher</span><span class="p">)</span><span class="w">

</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">
  </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">
  </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">
</span><span class="p">)</span><span class="w">
</span><span class="n">print</span><span class="p">(</span><span class="n">brks_quantile</span><span class="p">)</span><span class="w">

</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">
</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">
</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">
</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">
</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">
</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">
</span><span class="n">par</span><span class="p">(</span><span class="n">opar</span><span class="p">)</span><span class="w">
</span></code></pre></div></div>

<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>

<p>The top three classes of <code class="language-plaintext highlighter-rouge">headtails</code> contain five observations, whereas those
of <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
upper end of the distribution.</p>

<p>The next plot compares density estimates of the rescaled <code class="language-plaintext highlighter-rouge">totcon</code> values and
the class assignments from each method. The original values are rescaled to
<code class="language-plaintext highlighter-rouge">[1, nclass]</code> and shifted by -0.5 for the visual comparison.</p>

<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">
</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">
  </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">
  </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">
  </span><span class="nf">return</span><span class="p">(</span><span class="n">r</span><span class="p">)</span><span class="w">
</span><span class="p">}</span><span class="w">
</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">
  </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">
  </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">
</span><span class="p">)</span><span class="w">
</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">
  </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="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">
  </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">
</span><span class="p">)</span><span class="w">

</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">
  </span><span class="n">brks_fisher</span><span class="o">$</span><span class="n">brks</span><span class="p">,</span><span class="w">
  </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">
  </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">
</span><span class="p">)</span><span class="w">

</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">
  </span><span class="n">brks_quantile</span><span class="o">$</span><span class="n">brks</span><span class="p">,</span><span class="w">
  </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">
  </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">
</span><span class="p">)</span><span class="w">

</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">
</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">
</span><span class="n">plot</span><span class="p">(</span><span class="w">
  </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">
  </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">
  </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">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">
  </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">
</span><span class="p">)</span><span class="w">
</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">
</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">
</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">
  </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="w">
</span><span class="p">)</span><span class="w">
</span><span class="n">legend</span><span class="p">(</span><span class="s2">"topright"</span><span class="p">,</span><span class="w">
  </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">
    </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">
    </span><span class="s2">"fisher"</span><span class="p">,</span><span class="w"> </span><span class="s2">"quantile"</span><span class="w">
  </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">"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">
  </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">
  </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">
  </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">
</span><span class="p">)</span><span class="w">
</span><span class="n">par</span><span class="p">(</span><span class="n">opar</span><span class="p">)</span><span class="w">
</span></code></pre></div></div>

<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>

<p>In this example, the class assignments from <code class="language-plaintext highlighter-rouge">headtails</code> retain more of the
original imbalance. By contrast, <code class="language-plaintext highlighter-rouge">quantile</code> aims for similar numbers of
observations per class, regardless of the gaps between values.</p>

<p>We now compare the methods using proportional-symbol maps. Symbol size
represents <code class="language-plaintext highlighter-rouge">totcon</code>, while color distinguishes the classes.</p>

<p>The first map uses proportional symbols without class-based colors, providing
a reference for the three classified maps.</p>

<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">
</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="n">library</span><span class="p">(</span><span class="n">cartography</span><span class="p">)</span><span class="w">

</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">

</span><span class="n">par</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">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="s2">"white"</span><span class="w">
</span><span class="p">)</span><span class="w">
</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">

</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">
</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">
</span><span class="c1"># afcon.sf &lt;- st_join(africa[, "admin"], afcon.sf)</span><span class="w">
</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">



</span><span class="c1"># High granularity map</span><span class="w">
</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">
</span><span class="n">propSymbolsLayer</span><span class="p">(</span><span class="w">
  </span><span class="n">afcon.sf</span><span class="p">,</span><span class="w">
  </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">
  </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">
  </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">
  </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">
</span><span class="p">)</span><span class="w">
</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">

</span><span class="c1"># Quantile</span><span class="w">

</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">
</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">
</span><span class="n">propSymbolsTypoLayer</span><span class="p">(</span><span class="w">
  </span><span class="n">afcon.sf</span><span class="p">,</span><span class="w">
  </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">
  </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">
  </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">
  </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">
  </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">
  </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">
  </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">
</span><span class="p">)</span><span class="w">
</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">


</span><span class="c1"># Fisher</span><span class="w">
</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">
</span><span class="n">propSymbolsTypoLayer</span><span class="p">(</span><span class="w">
  </span><span class="n">afcon.sf</span><span class="p">,</span><span class="w">
  </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">
  </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">
  </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">
  </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">
  </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">
  </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">
  </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">
</span><span class="p">)</span><span class="w">
</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">

</span><span class="c1"># Head Tails</span><span class="w">
</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">
</span><span class="n">propSymbolsTypoLayer</span><span class="p">(</span><span class="w">
  </span><span class="n">afcon.sf</span><span class="p">,</span><span class="w">
  </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">
  </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">
  </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">
  </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">
  </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">
  </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">
  </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">
</span><span class="p">)</span><span class="w">
</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">
</span><span class="n">par</span><span class="p">(</span><span class="n">opar</span><span class="p">)</span><span class="w">
</span></code></pre></div></div>

<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>

<p>Compared with the unclassified proportional-symbol map, <code class="language-plaintext highlighter-rouge">headtails</code> makes
the most extreme values easier to distinguish. The <code class="language-plaintext highlighter-rouge">quantile</code> style groups
observations by rank, while <code class="language-plaintext highlighter-rouge">fisher</code> provides an intermediate view in this
example.</p>

<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
information that can be useful depending on the context. While <code class="language-plaintext highlighter-rouge">headtails</code>
highlights the outliers, it fails to provide good clustering on the tail, while
<code class="language-plaintext highlighter-rouge">fisher</code> seems to reflect these patterns better. This can be observed in the
values of Western Africa and the Niger River Basin, where <code class="language-plaintext highlighter-rouge">headtails</code> does not
highlight any special cluster of conflicts, while <code class="language-plaintext highlighter-rouge">fisher</code> suggests a
potential cluster consistent with the unclassified map. This can be
confirmed in the histogram generated previously, where a concentration of
<code class="language-plaintext highlighter-rouge">totcon</code> around 1,000 is visible.</p>

<h2 id="references">References</h2>

<p>Jiang, Bin. 2013. "Head/Tail Breaks: A New Classification Scheme for Data with a Heavy-Tailed Distribution." <em>The Professional Geographer</em> 65 (3): 482–94. <a href="https://doi.org/10.1080/00330124.2012.700499">DOI</a>.</p>

<p>———. 2019. "A Recursive Definition of Goodness of Space for Bridging the Concepts of Space and Place for Sustainability." <em>Sustainability</em> 11 (15): 4091. <a href="https://doi.org/10.3390/su11154091">DOI</a>.</p>

<p>Jiang, Bin, Xintao Liu, and Tao Jia. 2013. "Scaling of Geographic Space as a Universal Rule for Map Generalization." <em>Annals of the Association of American Geographers</em> 103 (4): 844–55. <a href="https://doi.org/10.1080/00045608.2013.765773">DOI</a>.</p>

<p>Jiang, Bin, and Junjun Yin. 2013. "Ht-Index for Quantifying the Fractal or Scaling Structure of Geographic Features." <em>Annals of the Association of American Geographers</em> 104 (3): 530–40. <a href="https://doi.org/10.1080/00045608.2013.834239">DOI</a>.</p>

<p>Taleb, Nassim Nicholas. 2008. <em>The Black Swan: The Impact of the Highly Improbable.</em> 1st ed. London: Random House.</p>

<p>Vasicek, Oldrich. 2002. "Loan Portfolio Value." <em>Risk</em>, December, 160–62.</p>

<div class="footnotes" role="doc-endnotes">
  <ol>
    <li id="fn:1">
      <p>The method implemented in <strong>classInt</strong> corresponds to head/tail breaks
1.0, as named in this article. <a href="#fnref:1" class="reversefootnote" role="doc-backlink">&uarr;</a></p>
    </li>
  </ol>
</div>
</div>
				]]>
			</description>
			<link>https://dieghernan.github.io/202004_headtails/</link>
			<category>posts</category>
		    <category>classInt</category><category>r_bloggers</category><category>r_package</category><category>rspatial</category><category>rstats</category><media:title type="html"><![CDATA[Head/tail breaks in the <strong>classInt</strong> package ]]></media:title>
      <media:content url="https://dieghernan.github.io/assets/img/blog/20200405_finalplot-1.webp" medium="image"/>
      <media:thumbnail url="https://dieghernan.github.io/assets/img/blog/20200405_finalplot-1.webp" /><guid isPermaLink="true">https://dieghernan.github.io/202004_headtails/</guid>
      <pubDate>Sun, 05 Apr 2020 00:00:00 +0200</pubDate>
		</item><item>
			<title>COVID19 microsite</title>
			<description>
				<![CDATA[	
 				<h3>Tracking the outbreak in Spain by region</h3>
    		<p>1 min.</p>
				<div><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></p>

<p>Visit the microsite with maps and official data on the impact of COVID-19 in Spain.</p>

<p><a href="https://dieghernan.github.io/COVID19">https://dieghernan.github.io/COVID19</a>
[In Spanish]</p>

<p><img src="https://dieghernan.github.io/COVID19/assets/Fallecidos.gif" alt="Animation of the evolution of reported COVID-19 deaths in Spain." /></p>

<p class="caption">Overall deaths in Spain due to COVID-19: evolution</p>
</div>
				]]>
			</description>
			<link>https://dieghernan.github.io/projects/COVID19</link>
			<category>projects</category>
		    <category>COVID19</category><category>R</category><category>cartography</category><category>discontinued</category><category>maps</category><category>project</category><category>sf</category><media:title type="html"><![CDATA[COVID19 microsite ]]></media:title>
      <media:content url="https://dieghernan.github.io/COVID19/assets/img/header.png" medium="image"/>
      <media:thumbnail url="https://dieghernan.github.io/COVID19/assets/img/header.png" /><guid isPermaLink="true">https://dieghernan.github.io/projects/COVID19</guid>
      <pubDate>Sat, 04 Apr 2020 00:00:00 +0200</pubDate>
		</item><item>
			<title>New features in the cartography package</title>
			<description>
				<![CDATA[	
 				<h3>Vignette of the package expansion</h3>
    		<p>6 min.</p>
				<div><h2 id="introduction">Introduction</h2>

<p>This document describes the new features added to <strong>cartography</strong> in version
<code class="language-plaintext highlighter-rouge">2.4.0</code> by
<a href="https://github.com/dieghernan/">dieghernan</a> and already available on <strong>CRAN</strong>.</p>

<p>Those new features are:</p>

<ul>
  <li><code class="language-plaintext highlighter-rouge">hatchedLayer</code> and <code class="language-plaintext highlighter-rouge">legendHatched</code> functions.</li>
  <li><code class="language-plaintext highlighter-rouge">pngLayer</code> and <code class="language-plaintext highlighter-rouge">getPngLayer</code> functions.</li>
  <li><code class="language-plaintext highlighter-rouge">wordcloudLayer</code> function.</li>
</ul>

<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>

<h2 id="installation">Installation</h2>

<div class="language-r highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">#install.packages("cartography")</span><span class="w">
</span><span class="n">library</span><span class="p">(</span><span class="n">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">
</span><span class="c1">## [1] '3.0.0'</span><span class="w">
</span></code></pre></div></div>

<h2 id="hatched-map">Hatched map</h2>

<p>Version of typology/choropleth maps using a hatched filling. This is
particularly useful for maps that need to be printed in black and white, such
as academic papers. These maps are also useful for representing overlapping
dimensions.</p>

<h3 id="example-1">Example 1</h3>

<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">
</span><span class="n">library</span><span class="p">(</span><span class="n">jsonlite</span><span class="p">)</span><span class="w">
</span><span class="n">library</span><span class="p">(</span><span class="n">dplyr</span><span class="p">)</span><span class="w">

</span><span class="c1">#Shape</span><span class="w">
</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">
                  </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">
</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">
</span><span class="c1">## Simple feature collection with 257 features and 6 fields</span><span class="w">
</span><span class="c1">## Geometry type: MULTIPOLYGON</span><span class="w">
</span><span class="c1">## Dimension:     XY</span><span class="w">
</span><span class="c1">## Bounding box:  xmin: -7142317 ymin: -9160665 xmax: 16932290 ymax: 15428010</span><span class="w">
</span><span class="c1">## Projected CRS: ETRS89-extended / LAEA Europe</span><span class="w">

</span><span class="c1"># Include trade blocks</span><span class="w">
</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">
</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">
                       </span><span class="n">orgtosearch</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w">
  </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">
  </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="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">
  </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">
  </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">
  </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">
  </span><span class="nf">return</span><span class="p">(</span><span class="n">df2</span><span class="p">)</span><span class="w">
</span><span class="p">}</span><span class="w">
</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">
</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">
</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">


</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">
                </span><span class="n">df</span><span class="p">,</span><span class="w">
                </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">
                </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">
                </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">

</span><span class="n">library</span><span class="p">(</span><span class="n">cartography</span><span class="p">)</span><span class="w">


</span><span class="c1">#Limits EU</span><span class="w">
</span><span class="c1">#Plot base map</span><span class="w">
</span><span class="n">plot</span><span class="p">(</span><span class="w">
  </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">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">
  </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">
</span><span class="p">)</span><span class="w">
</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">
</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">
</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">
</span><span class="c1">#Add hatching</span><span class="w">
</span><span class="n">hatchedLayer</span><span class="p">(</span><span class="w">
  </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">
  </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">
  </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">
  </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">
  </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">
</span><span class="p">)</span><span class="w">
</span><span class="n">legendTypo</span><span class="p">(</span><span class="w">
  </span><span class="s2">"topright"</span><span class="p">,</span><span class="w">
  </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">
  </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">
  </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">
  </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">
</span><span class="p">)</span><span class="w">

</span><span class="n">legendHatched</span><span class="p">(</span><span class="w">
  </span><span class="s2">"right"</span><span class="p">,</span><span class="w">
  </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">
  </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">
  </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">
  </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">
</span><span class="p">)</span><span class="w">
</span><span class="n">layoutLayer</span><span class="p">(</span><span class="w">
  </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">
  </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">
  </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">
  </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">
  </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">
  </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">
</span><span class="p">)</span><span class="w">
</span></code></pre></div></div>

<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>

<h3 id="example-2">Example 2</h3>

<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">
</span><span class="n">library</span><span class="p">(</span><span class="n">cartography</span><span class="p">)</span><span class="w">

</span><span class="c1"># Plot World</span><span class="w">
</span><span class="n">plot</span><span class="p">(</span><span class="w">
  </span><span class="n">cntries</span><span class="o">$</span><span class="n">geometry</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">"white"</span><span class="p">,</span><span class="w">
  </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">
  </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">
</span><span class="p">)</span><span class="w">
</span><span class="c1">#Add layers for non european area - left2right</span><span class="w">
</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">
</span><span class="n">hatchedLayer</span><span class="p">(</span><span class="w">
  </span><span class="n">NOEUR</span><span class="p">,</span><span class="w">
  </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">
  </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="c1">#Basic usage</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">2</span><span class="p">,</span><span class="w">
  </span><span class="c1">#Densify default grid</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.2</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">3</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">"grey50"</span><span class="w">
</span><span class="p">)</span><span class="w">            </span><span class="c1">#Formatting</span><span class="w">

</span><span class="c1">#Extract Europe Regions</span><span class="w">
</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">
</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">


</span><span class="c1">#Plot Regions</span><span class="w">
</span><span class="c1"># First element with zigzag</span><span class="w">
</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">
             </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">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">
             </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">

</span><span class="c1">#dot with parms</span><span class="w">
</span><span class="n">hatchedLayer</span><span class="p">(</span><span class="w">
  </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">
  </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">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">
  </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">
  </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">
  </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">

</span><span class="c1">#vertical</span><span class="w">
</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">
             </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">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">
             </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">

</span><span class="c1">#another dot</span><span class="w">
</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">
             </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">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">
             </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">
             </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">

</span><span class="c1">#create legend</span><span class="w">
</span><span class="n">legendHatched</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">"topright"</span><span class="p">,</span><span class="w">
  </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">
  </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">
  </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">
  </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">
               </span><span class="s2">"dot"</span><span class="p">,</span><span class="w">
               </span><span class="s2">"vertical"</span><span class="p">,</span><span class="w">
               </span><span class="s2">"dot"</span><span class="p">,</span><span class="w">
               </span><span class="s2">"left2right"</span><span class="p">),</span><span class="w">
  </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">
  </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">
  </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">
  </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">
</span><span class="p">)</span><span class="w">

</span><span class="n">layoutLayer</span><span class="p">(</span><span class="w">
  </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">
  </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">
  </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">
  </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">
  </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">
  </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">
</span><span class="p">)</span><span class="w">
</span></code></pre></div></div>

<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>

<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>
patterns are present, so <code class="language-plaintext highlighter-rouge">pch = c(4,15)</code> takes care of that. Note that three
line-type patterns are also plotted, as in the previous case, and <code class="language-plaintext highlighter-rouge">lty = c(1,
1, 3)</code> respects that order.</p>

<h3 id="example-3">Example 3</h3>

<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>

<div class="language-r highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="w">
</span><span class="n">library</span><span class="p">(</span><span class="n">sf</span><span class="p">)</span><span class="w">
</span><span class="n">library</span><span class="p">(</span><span class="n">cartography</span><span class="p">)</span><span class="w">



</span><span class="c1">#Warsaw Pact - roughly mapped via UN Region</span><span class="w">
</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">

</span><span class="c1">#European Union - after Brexit</span><span class="w">
</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">

</span><span class="c1">#Euro Area</span><span class="w">
</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">

</span><span class="c1">#Flags for plotting</span><span class="w">
</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">
              </span><span class="s2">"European Union"</span><span class="p">,</span><span class="w">
              </span><span class="n">cntries</span><span class="o">$</span><span class="n">CONTINENT.EN</span><span class="p">)</span><span class="w">


</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">
              </span><span class="n">flag</span><span class="p">)</span><span class="w">
</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">



</span><span class="c1">#Plot lims</span><span class="w">
</span><span class="n">plot</span><span class="p">(</span><span class="w">
  </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">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">
  </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">
</span><span class="p">)</span><span class="w">


</span><span class="c1">#Combine with typoLayer</span><span class="w">
</span><span class="n">typoLayer</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="n">cntries</span><span class="p">,</span><span class="w">
  </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">
  </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">
  </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">
                          </span><span class="s2">"Europe"</span><span class="p">,</span><span class="w">
                          </span><span class="s2">"Other"</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">"#A6BDDB"</span><span class="p">,</span><span class="w">
          </span><span class="s2">"#FEFEE9"</span><span class="p">,</span><span class="w">
          </span><span class="s2">"#E0E0E0"</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="w">
</span><span class="p">)</span><span class="w">

</span><span class="c1">#hatching</span><span class="w">
</span><span class="n">hatchedLayer</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="n">ea</span><span class="p">,</span><span class="w">
  </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">
  </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">
  </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">
</span><span class="p">)</span><span class="w">

</span><span class="n">hatchedLayer</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="n">wp</span><span class="p">,</span><span class="w">
  </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">
  </span><span class="n">col</span><span class="o">=</span><span class="s2">"red"</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="m">75000</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="w">
</span><span class="p">)</span><span class="w">

</span><span class="c1">#Legend</span><span class="w">
</span><span class="n">legendHatched</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">"right"</span><span class="p">,</span><span class="w">
  </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">
  </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">
    </span><span class="s2">"Euro Area"</span><span class="p">,</span><span class="w">
    </span><span class="s2">"Former \nWarsaw Pact"</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">"Europe"</span><span class="p">,</span><span class="w">
    </span><span class="s2">"Other"</span><span class="w">
  </span><span class="p">),</span><span class="w">
  </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">
  </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">
          </span><span class="s2">"#FEFEE9"</span><span class="p">,</span><span class="w">
          </span><span class="s2">"#E0E0E0"</span><span class="p">),</span><span class="w">
  </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">
              </span><span class="s2">"#FEFEE9"</span><span class="p">,</span><span class="w">
              </span><span class="s2">"#E0E0E0"</span><span class="p">),</span><span class="w">
  </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">
</span><span class="p">)</span><span class="w">

</span><span class="n">layoutLayer</span><span class="p">(</span><span class="w">
  </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">
  </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">
  </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">
  </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">
  </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">
  </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">
</span><span class="p">)</span><span class="w">
</span></code></pre></div></div>

<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>

<h2 id="png-layer">PNG layer</h2>

<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>

<p>For high-quality PNG maps, <strong>it is recommended to plot your map on an SVG
graphics device</strong>.</p>

<h3 id="example-1-1">Example 1</h3>

<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">
</span><span class="n">library</span><span class="p">(</span><span class="n">cartography</span><span class="p">)</span><span class="w">

</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">
                  </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">
</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">
</span><span class="c1">## Simple feature collection with 257 features and 6 fields</span><span class="w">
</span><span class="c1">## Geometry type: MULTIPOLYGON</span><span class="w">
</span><span class="c1">## Dimension:     XY</span><span class="w">
</span><span class="c1">## Bounding box:  xmin: -20037510 ymin: -30240970 xmax: 20037510 ymax: 18446790</span><span class="w">
</span><span class="c1">## Projected CRS: WGS 84 / Pseudo-Mercator</span><span class="w">

</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">
                </span><span class="n">df</span><span class="p">,</span><span class="w">
                </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">
                </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">
                </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">

</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">
  </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">


</span><span class="c1">#Get bigger countries</span><span class="w">

</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">


</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">

</span><span class="c1">#Iterate for Africa</span><span class="w">
</span><span class="c1">#Get flags from repo - low quality to speed up the vignette</span><span class="w">
</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">


</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">
  </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">
  </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">
                  </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">
  </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">
</span><span class="p">}</span><span class="w">
</span><span class="c1">#Add borders</span><span class="w">
</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">

</span><span class="n">layoutLayer</span><span class="p">(</span><span class="w">
  </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">
  </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">
  </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">
  </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">
  </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">
  </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">
</span><span class="p">)</span><span class="w">
</span></code></pre></div></div>

<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>

<h3 id="example-2-1">Example 2</h3>

<div class="language-r highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="w">
</span><span class="n">library</span><span class="p">(</span><span class="n">sf</span><span class="p">)</span><span class="w">
</span><span class="n">library</span><span class="p">(</span><span class="n">cartography</span><span class="p">)</span><span class="w">

</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">
</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">

</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">
</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">


</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">
</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">
</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">

</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">

</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">
</span></code></pre></div></div>

<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>

<h2 id="wordcloudlayer"><code class="language-plaintext highlighter-rouge">wordcloudLayer()</code></h2>

<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>

<p>Word cloud layers fitted into a map shape provide a good trade-off between
physical location, scale and labels. The size and color of the words are based
on the frequency of the factor being plotted, highlighting the most frequent
terms.</p>

<h3 id="example-1-2">Example 1</h3>

<div class="language-r highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="w">
</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">

</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">
               </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">
               </span><span class="n">nclass</span><span class="o">=</span><span class="m">7</span><span class="p">,</span><span class="w">
               </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">
</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">

</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">
</span><span class="n">layoutLayer</span><span class="p">(</span><span class="w">
  </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">
  </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">
  </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">
  </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">
  </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">
  </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">
</span><span class="p">)</span><span class="w">
</span></code></pre></div></div>

<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>

<h3 id="example-2-2">Example 2</h3>

<div class="language-r highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="w">
</span><span class="c1"># Genres from MB--</span><span class="w">
</span><span class="c1">#Import genres</span><span class="w">
</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">
</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">

</span><span class="n">set.seed</span><span class="p">(</span><span class="m">1234</span><span class="p">)</span><span class="w">

</span><span class="n">library</span><span class="p">(</span><span class="n">rnaturalearth</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="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">
</span><span class="c1">#Get main polygon</span><span class="w">
</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">
</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">
</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">

</span><span class="n">set.seed</span><span class="p">(</span><span class="m">1234</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">100</span><span class="w">
</span><span class="c1">#Sample regular</span><span class="w">
</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">

</span><span class="c1">#Center points</span><span class="w">

</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">
</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">
</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">
               </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">
  </span><span class="n">arrange</span><span class="p">((</span><span class="n">dist</span><span class="p">))</span><span class="w">


</span><span class="c1">#Create df</span><span class="w">
</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">
             </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">

</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">
</span><span class="n">wordcloudLayer</span><span class="p">(</span><span class="n">points</span><span class="p">,</span><span class="w">
               </span><span class="n">txt</span><span class="o">=</span><span class="s2">"genre"</span><span class="p">,</span><span class="w">
               </span><span class="n">freq</span><span class="o">=</span><span class="s2">"n"</span><span class="p">,</span><span class="w">
               </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">
               </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">
               </span><span class="n">nclass</span><span class="o">=</span><span class="m">7</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">
</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">
            </span><span class="n">sources</span><span class="o">=</span><span class="s2">"Musicbrainz"</span><span class="p">,</span><span class="w">
              </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">
            </span><span class="n">theme</span><span class="o">=</span><span class="s2">"orange.pal"</span><span class="p">)</span><span class="w">
</span></code></pre></div></div>

<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>
</div>
				]]>
			</description>
			<link>https://dieghernan.github.io/202002_cartography1/</link>
			<category>posts</category>
		    <category>beautiful_maps</category><category>cartography</category><category>maps</category><category>r_bloggers</category><category>r_package</category><category>rspatial</category><category>rstats</category><category>sf</category><media:title type="html"><![CDATA[New features in the <strong>cartography</strong> package ]]></media:title>
      <media:content url="https://dieghernan.github.io/assets/img/blog/20200217_wordcloud2-1.webp" medium="image"/>
      <media:thumbnail url="https://dieghernan.github.io/assets/img/blog/20200217_wordcloud2-1.webp" /><guid isPermaLink="true">https://dieghernan.github.io/202002_cartography1/</guid>
      <pubDate>Mon, 17 Feb 2020 00:00:00 +0100</pubDate>
		</item><item>
			<title>We’ll miss you, UK</title>
			<description>
				<![CDATA[	
 				<h3>Brexit and the consequences</h3>
    		<p>1 min.</p>
				<div><p>This is just a short post regarding Brexit. Setting aside economic, political
and social considerations, there is another consequence: there is now one fewer
country in the EU.</p>

<p>We will miss you, UK. We wish you the best.</p>

<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">
</span><span class="n">library</span><span class="p">(</span><span class="n">sf</span><span class="p">)</span><span class="w">
</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">#EU</span><span class="w">
</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">

</span><span class="c1"># Download maps</span><span class="w">
</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">


</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">

</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">
</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">
  </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">

</span><span class="c1"># Flag image</span><span class="w">
</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">

</span><span class="c1">#Mask UK</span><span class="w">
</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">
                       </span><span class="n">url</span><span class="p">)</span><span class="w">
</span><span class="c1"># Full extent</span><span class="w">
</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">
                       </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">


</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">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">
</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">
</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">
     </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">
     </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">
     </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></code></pre></div></div>

<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>
</div>
				]]>
			</description>
			<link>https://dieghernan.github.io/202002_Brexit/</link>
			<category>posts</category>
		    <category>flags</category><category>giscoR</category><category>maps</category><category>rspatial</category><category>rstats</category><media:title type="html"><![CDATA[We'll miss you, UK ]]></media:title>
      <media:content url="https://dieghernan.github.io/assets/img/blog/20200602_imgpost-1.webp" medium="image"/>
      <media:thumbnail url="https://dieghernan.github.io/assets/img/blog/20200602_imgpost-1.webp" /><guid isPermaLink="true">https://dieghernan.github.io/202002_Brexit/</guid>
      <pubDate>Thu, 06 Feb 2020 00:00:00 +0100</pubDate>
		</item><item>
			<title>Beautiful maps with R (III): Patterns and hatched maps</title>
			<description>
				<![CDATA[	
 				<h3>A solution for black-and-white and academic maps</h3>
    		<p>2 min.</p>
				<div><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
in <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>
and <a href="https://riatelab.github.io/cartography/docs/reference/legendHatched.html"><code class="language-plaintext highlighter-rouge">legendHatched</code></a>
functions. Just install it via <code class="language-plaintext highlighter-rouge">install.packages("cartography")</code>. A dedicated
blog post with examples is available at this <a href="../202002_cartography1">link</a>.</p>

<p>In this post, I show how to produce different filling patterns that can be added
over your shapefiles with the <strong>cartography</strong> package.</p>

<h2 id="required-r-packages">Required <strong>R</strong> packages</h2>

<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">
</span><span class="n">library</span><span class="p">(</span><span class="n">dplyr</span><span class="p">)</span><span class="w">
</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="n">library</span><span class="p">(</span><span class="n">cartography</span><span class="p">)</span><span class="w">
</span></code></pre></div></div>

<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">
</span></code></pre></div></div>

<p>Let’s see how it works.</p>

<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">
  </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">
  </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">cex</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">0.5</span><span class="w">
</span><span class="p">)</span><span class="w">
</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">
</span><span class="n">title</span><span class="p">(</span><span class="s2">"dot"</span><span class="p">)</span><span class="w">
</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">
</span><span class="n">title</span><span class="p">(</span><span class="s2">"text"</span><span class="p">)</span><span class="w">
</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">
</span><span class="n">title</span><span class="p">(</span><span class="s2">"diamond"</span><span class="p">)</span><span class="w">
</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">
</span><span class="n">title</span><span class="p">(</span><span class="s2">"grid"</span><span class="p">)</span><span class="w">
</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">
</span><span class="n">title</span><span class="p">(</span><span class="s2">"hexagon"</span><span class="p">)</span><span class="w">
</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">
</span><span class="n">title</span><span class="p">(</span><span class="s2">"horizontal"</span><span class="p">)</span><span class="w">
</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">
</span><span class="n">title</span><span class="p">(</span><span class="s2">"vertical"</span><span class="p">)</span><span class="w">
</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">
</span><span class="n">title</span><span class="p">(</span><span class="s2">"left2right"</span><span class="p">)</span><span class="w">
</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">
</span><span class="n">title</span><span class="p">(</span><span class="s2">"right2left"</span><span class="p">)</span><span class="w">
</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">title</span><span class="p">(</span><span class="s2">"zigzag"</span><span class="p">)</span><span class="w">
</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">
</span><span class="n">title</span><span class="p">(</span><span class="s2">"circle"</span><span class="p">)</span><span class="w">
</span></code></pre></div></div>

<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>

<p>Let’s play a little bit more with some of the additional features of the
function:</p>

<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">
</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">hatchedLayer</span><span class="p">(</span><span class="w">
  </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">
  </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">
  </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">
  </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">
  </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">add</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nb">T</span><span class="w">
</span><span class="p">)</span><span class="w">
</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">hatchedLayer</span><span class="p">(</span><span class="w">
  </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">
  </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">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">
  </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">
  </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">
  </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">
</span><span class="p">)</span><span class="w">
</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">
</span><span class="n">hatchedLayer</span><span class="p">(</span><span class="w">
  </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">"DE"</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">1.1</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">"white"</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="w">
</span><span class="p">)</span><span class="w">
</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">
</span><span class="n">hatchedLayer</span><span class="p">(</span><span class="w">
  </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">3</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="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">
  </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">
</span><span class="p">)</span><span class="w">
</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">
</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">
</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">
  </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">
  </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">
  </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">
</span><span class="p">)</span><span class="w">
</span></code></pre></div></div>

<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>

<h2 id="adding-legends-the-legendhatched-function">Adding legends: the <code class="language-plaintext highlighter-rouge">legendHatched</code> function</h2>

<p>As a complementary function, there is also <code class="language-plaintext highlighter-rouge">legendHatched</code>. The main parameters
are:</p>

<ul>
  <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>:
See <code class="language-plaintext highlighter-rouge">?cartography::legendTypo</code>.</li>
  <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>
  <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>
  <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>
  <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>
  <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>
  <li>As in the case of the <code class="language-plaintext highlighter-rouge">hatchedLayer</code> function, different graphical
parameters 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>
</ul>

<p>Note that it is also possible to create solid legends by setting <code class="language-plaintext highlighter-rouge">col</code> and
<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>
variable.</p>

<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">
</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">
</span><span class="n">legendHatched</span><span class="p">(</span><span class="w">
  </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">
  </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">
  </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">
  </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">
  </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">
</span><span class="p">)</span><span class="w">
</span><span class="n">legendHatched</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">"left"</span><span class="p">,</span><span class="w">
  </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">
  </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">
  </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">
  </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">
  </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">
  </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">
</span><span class="p">)</span><span class="w">

</span><span class="n">legendHatched</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">"topright"</span><span class="p">,</span><span class="w">
  </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">
  </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">
  </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">
  </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">
  </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">
  </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">
  </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">
</span><span class="p">)</span><span class="w">


</span><span class="n">legendHatched</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">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">
  </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">
  </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">
  </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">
  </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">
  </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">
  </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">
  </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">
  </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">
</span><span class="p">)</span><span class="w">
</span></code></pre></div></div>

<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>

<p>I hope that you find these functions useful. Enjoy, and happy mapping!</p>

<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>
</div>
				]]>
			</description>
			<link>https://dieghernan.github.io/201912_Beautiful3/</link>
			<category>posts</category>
		    <category>beautiful_maps</category><category>cartography</category><category>function</category><category>giscoR</category><category>maps</category><category>r_bloggers</category><category>r_package</category><category>rspatial</category><category>rstats</category><category>sf</category><media:title type="html"><![CDATA[Beautiful maps with R (III): Patterns and hatched maps ]]></media:title>
      <media:content url="https://dieghernan.github.io/assets/img/blog/20191212_imgpost-1.webp" medium="image"/>
      <media:thumbnail url="https://dieghernan.github.io/assets/img/blog/20191212_imgpost-1.webp" /><guid isPermaLink="true">https://dieghernan.github.io/201912_Beautiful3/</guid>
      <pubDate>Thu, 12 Dec 2019 00:00:00 +0100</pubDate>
		</item><item>
			<title>Quick R: Inset maps</title>
			<description>
				<![CDATA[	
 				<h3>An alternative using plot()</h3>
    		<p>3 min.</p>
				<div><p>How to place an inset map in <strong>R</strong>? There are many solutions out there using
the <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
<strong>R</strong>, <strong>sf</strong> and <strong>ggplot2</strong></a>
by Mel Moreno and Mathieu Basille). However, I like the old reliable <code class="language-plaintext highlighter-rouge">plot</code>
function, so the question is: is there another way?</p>

<p>There is. I found inspiration
<a href="https://www.statmethods.net/advgraphs/layout.html">here</a> and I just applied it
to a map.</p>

<h2 id="required-r-packages">Required <strong>R</strong> packages</h2>

<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">
</span><span class="n">library</span><span class="p">(</span><span class="n">dplyr</span><span class="p">)</span><span class="w">
</span><span class="n">library</span><span class="p">(</span><span class="n">rnaturalearth</span><span class="p">)</span><span class="w">
</span></code></pre></div></div>

<h2 id="mimicking-moreno--basille">Mimicking Moreno &amp; Basille</h2>

<p>I present here an alternative version of
<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>,
so the bulk of the detail can be found there. I focus only on the <code class="language-plaintext highlighter-rouge">plot()</code>
side.</p>

<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">
</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">

</span><span class="c1"># Plot mainland USA----</span><span class="w">
</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">plot</span><span class="p">(</span><span class="w">
  </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">
    </span><span class="n">st_transform</span><span class="p">(</span><span class="m">2163</span><span class="p">)),</span><span class="w">
  </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">
  </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">
  </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">bg</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"#C6ECFF"</span><span class="w">
</span><span class="p">)</span><span class="w">
</span><span class="n">plot</span><span class="p">(</span><span class="w">
  </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">
  </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">"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="nb">T</span><span class="w">
</span><span class="p">)</span><span class="w">
</span></code></pre></div></div>

<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>

<div class="language-r highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># Plot Alaska----</span><span class="w">
</span><span class="n">plot</span><span class="p">(</span><span class="w">
  </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">
    </span><span class="n">st_transform</span><span class="p">(</span><span class="m">3467</span><span class="p">)),</span><span class="w">
  </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">
  </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">
  </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">bg</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"#C6ECFF"</span><span class="w">
</span><span class="p">)</span><span class="w">
</span><span class="n">plot</span><span class="p">(</span><span class="w">
  </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">
  </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">"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="nb">T</span><span class="w">
</span><span class="p">)</span><span class="w">
</span></code></pre></div></div>

<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>

<div class="language-r highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># Plot Hawaii----</span><span class="w">
</span><span class="n">plot</span><span class="p">(</span><span class="w">
  </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">
    </span><span class="n">st_transform</span><span class="p">(</span><span class="m">4135</span><span class="p">)),</span><span class="w">
  </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">
  </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">
  </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">bg</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"#C6ECFF"</span><span class="w">
</span><span class="p">)</span><span class="w">
</span><span class="n">plot</span><span class="p">(</span><span class="w">
  </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">
  </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">"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="nb">T</span><span class="w">
</span><span class="p">)</span><span class="w">
</span></code></pre></div></div>

<p><img src="https://dieghernan.github.io/assets/img/blog/20191108_Hawaii-1.webp" alt="Map of the Hawaiian island chain." /></p>

<h2 id="insetting">Insetting</h2>

<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>.
Quoting <a href="https://www.statmethods.net/advgraphs/layout.html">statmethods</a>:</p>

<blockquote>
  <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>(…)
<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>
</blockquote>

<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,
we can set up those parameters and adjust the final placement of the insets.
Additionally, I added a box around the insets using <code class="language-plaintext highlighter-rouge">bbox()</code>. I didn’t mimic
Moreno &amp; Basille here and I just worked it out by myself.</p>

<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">plot</span><span class="p">(</span><span class="w">
  </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">
    </span><span class="n">st_transform</span><span class="p">(</span><span class="m">2163</span><span class="p">)),</span><span class="w">
  </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">
  </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">
  </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">bg</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"#C6ECFF"</span><span class="w">
</span><span class="p">)</span><span class="w">
</span><span class="n">plot</span><span class="p">(</span><span class="w">
  </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">
  </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">"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="nb">T</span><span class="w">
</span><span class="p">)</span><span class="w">
</span><span class="c1"># Alaska</span><span class="w">
</span><span class="n">par</span><span class="p">(</span><span class="w">
  </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">
  </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">
</span><span class="p">)</span><span class="w">
</span><span class="n">plot</span><span class="p">(</span><span class="w">
  </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">
    </span><span class="n">st_transform</span><span class="p">(</span><span class="m">3467</span><span class="p">)),</span><span class="w">
  </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">
  </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">
  </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">bg</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"#C6ECFF"</span><span class="w">
</span><span class="p">)</span><span class="w">
</span><span class="n">plot</span><span class="p">(</span><span class="w">
  </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">
  </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">"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="nb">T</span><span class="w">
</span><span class="p">)</span><span class="w">
</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">

</span><span class="c1"># Hawaii</span><span class="w">
</span><span class="n">par</span><span class="p">(</span><span class="w">
  </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">
  </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">
</span><span class="p">)</span><span class="w">
</span><span class="n">plot</span><span class="p">(</span><span class="w">
  </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">
    </span><span class="n">st_transform</span><span class="p">(</span><span class="m">4135</span><span class="p">)),</span><span class="w">
  </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">
  </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">
  </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">bg</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"#C6ECFF"</span><span class="w">
</span><span class="p">)</span><span class="w">
</span><span class="n">plot</span><span class="p">(</span><span class="w">
  </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">
  </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">"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="nb">T</span><span class="w">
</span><span class="p">)</span><span class="w">

</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">
</span></code></pre></div></div>

<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>

<p>Results may vary depending on the size of the original plot (Mainland USA),
your plotting device and the output. However, with a bit of trial and error,
it is quite easy to adjust the final result.</p>

<p>As an example, see one of my contributions to <strong>Wikimedia Commons</strong>, which
represents a map of the NUTS3 regions of the European Union. Several countries
(France, Portugal, Spain) have overseas territories, so I made a few insets on
the right side.</p>

<p><img src="https://upload.wikimedia.org/wikipedia/commons/thumb/4/46/Population_density_by_NUTS_3_region_%282017%29.svg/1000px-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>
</div>
				]]>
			</description>
			<link>https://dieghernan.github.io/201911_QuickR/</link>
			<category>posts</category>
		    <category>flags</category><category>inset</category><category>maps</category><category>r_bloggers</category><category>rnaturalearth</category><category>rspatial</category><category>rstats</category><category>sf</category><media:title type="html"><![CDATA[Quick R: Inset maps ]]></media:title>
      <media:content url="https://upload.wikimedia.org/wikipedia/commons/thumb/4/46/Population_density_by_NUTS_3_region_%282017%29.svg/1000px-Population_density_by_NUTS_3_region_%282017%29.svg.png" medium="image"/>
      <media:thumbnail url="https://upload.wikimedia.org/wikipedia/commons/thumb/4/46/Population_density_by_NUTS_3_region_%282017%29.svg/1000px-Population_density_by_NUTS_3_region_%282017%29.svg.png" /><guid isPermaLink="true">https://dieghernan.github.io/201911_QuickR/</guid>
      <pubDate>Thu, 07 Nov 2019 00:00:00 +0100</pubDate>
		</item><item>
			<title>Wikipedia maps (I): Organ donor rates</title>
			<description>
				<![CDATA[	
 				<h3>A choropleth map with <strong>R</strong></h3>
    		<p>2 min.</p>
				<div><p>This is a quick post on how to create a map according to the
<a href="https://en.wikipedia.org/wiki/Wikipedia:WikiProject_Maps/Conventions#Gradient_maps">Wikipedia conventions</a>.
In this case, I have chosen to plot the
<a href="https://en.wikipedia.org/wiki/International_organ_donor_rates">international organ donor rates</a>,
retrieved on February 10, 2019, although the data refers to 2017 (source:
<a href="http://www.irodat.org/?p=database">IRODaT</a>).</p>

<h2 id="web-scraping">Web scraping</h2>

<p>The first step is to scrape Wikipedia in order to get the final table. To do
so, I will use the <strong>rvest</strong> package. You can get the <code class="language-plaintext highlighter-rouge">xpath</code> you want to
scrape as explained <a href="https://stackoverflow.com/a/57972054/7877917">here</a>.</p>

<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">
</span><span class="n">library</span><span class="p">(</span><span class="n">dplyr</span><span class="p">)</span><span class="w">

</span><span class="n">Base</span><span class="w"> </span><span class="o">&lt;-</span><span class="w">
  </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">
  </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">
  </span><span class="n">html_table</span><span class="p">()</span><span class="w"> </span><span class="o">%&gt;%</span><span class="w">
  </span><span class="n">as.data.frame</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">
    </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">
  </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">Country</span><span class="p">,</span><span class="w">
    </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">
  </span><span class="p">)</span><span class="w">

</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">
</span></code></pre></div></div>

<table>
  <thead>
    <tr>
      <th style="text-align: left">Country</th>
      <th style="text-align: right">RateDonperMill</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="text-align: left">Argentina</td>
      <td style="text-align: right">19.60</td>
    </tr>
    <tr>
      <td style="text-align: left">Armenia</td>
      <td style="text-align: right">0.00</td>
    </tr>
    <tr>
      <td style="text-align: left">Australia</td>
      <td style="text-align: right">21.60</td>
    </tr>
    <tr>
      <td style="text-align: left">Austria</td>
      <td style="text-align: right">23.88</td>
    </tr>
    <tr>
      <td style="text-align: left">Azerbaijan</td>
      <td style="text-align: right">0.00</td>
    </tr>
    <tr>
      <td style="text-align: left">Bahrain</td>
      <td style="text-align: right">4.00</td>
    </tr>
    <tr>
      <td style="text-align: left">Bangladesh</td>
      <td style="text-align: right">0.00</td>
    </tr>
    <tr>
      <td style="text-align: left">Belarus</td>
      <td style="text-align: right">26.20</td>
    </tr>
    <tr>
      <td style="text-align: left">Belgium</td>
      <td style="text-align: right">30.30</td>
    </tr>
    <tr>
      <td style="text-align: left">Bolivia</td>
      <td style="text-align: right">0.36</td>
    </tr>
  </tbody>
</table>

<p>Now we need to choose a <a href="https://dieghernan.github.io/201906_Beautiful2/">good source of maps</a>:</p>

<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">
</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"># Map import from Eurostat</span><span class="w">
</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">
  </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">
</span></code></pre></div></div>

<h2 id="merging-everything-together">Merging everything together</h2>

<p>Now let’s join and have a look to see what is going on. We use the
<strong>countrycode</strong> package to retrieve the ISO3 codes of our scraped dataset:</p>

<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">

</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">


</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">
  </span><span class="n">WorldMap</span><span class="p">,</span><span class="w">
  </span><span class="n">Base</span><span class="w">
</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="w">
    </span><span class="n">Country</span><span class="p">,</span><span class="w">
    </span><span class="n">ISO_3166_3</span><span class="p">,</span><span class="w">
    </span><span class="n">RateDonperMill</span><span class="w">
  </span><span class="p">)</span><span class="w">
</span></code></pre></div></div>

<h2 id="make-the-svg-file">Make the <code class="language-plaintext highlighter-rouge">.svg</code> file</h2>

<p>As already explained, I would like to follow the Wikipedia conventions, so there
are some things to bear in mind:</p>

<ul>
  <li>Obviously, the colors. Wikipedia already provides good guidance for this. I
will use the <strong>RColorBrewer</strong> library, which implements
<a href="http://colorbrewer2.org/#type=sequential&amp;scheme=PuBu&amp;n=9">ColorBrewer</a> in
<strong>R</strong>.</li>
  <li>In terms of projection, Wikipedia recommends the
<a href="https://en.wikipedia.org/wiki/Equirectangular_projection">Equirectangular projection</a>
but, as in their own sample of a gradient map, I will use the
<a href="https://en.wikipedia.org/wiki/Robinson_projection">Robinson projection</a>.</li>
  <li>I should also produce an <code class="language-plaintext highlighter-rouge">.svg</code> file following the naming convention.</li>
</ul>

<p>Some libraries remain to be used: <strong>RColorBrewer</strong>, <strong>rsvg</strong> and, especially,
one of my favorites, <strong>cartography</strong>:</p>

<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">
</span><span class="n">library</span><span class="p">(</span><span class="n">cartography</span><span class="p">)</span><span class="w">
</span><span class="n">library</span><span class="p">(</span><span class="n">rsvg</span><span class="p">)</span><span class="w">

</span><span class="c1"># Create bbox of the world</span><span class="w">
</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">
  </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">
  </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">
  </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">
  </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">
  </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">
</span><span class="p">))</span><span class="w"> </span><span class="o">%&gt;%</span><span class="w">
  </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">
  </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">
  </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">
  </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">

</span><span class="c1"># Create SVG</span><span class="w">
</span><span class="n">svg</span><span class="p">(</span><span class="w">
  </span><span class="s2">"Organ donor rate per million by country gradient map (2017).svg"</span><span class="p">,</span><span class="w">
  </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">
  </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">
  </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">
</span><span class="p">)</span><span class="w">

</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">
</span><span class="n">choroLayer</span><span class="p">(</span><span class="w">
  </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">
  </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">
  </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">
  </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">
  </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">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">
  </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">
  </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">
  </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">
  </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">
</span><span class="p">)</span><span class="w">

</span><span class="c1"># Bounding box</span><span class="w">
</span><span class="n">plot</span><span class="p">(</span><span class="n">bbox</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">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">lwd</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="p">)</span><span class="w">

</span><span class="n">dev.off</span><span class="p">()</span><span class="w">
</span></code></pre></div></div>

<p>And that’s all. Our <code class="language-plaintext highlighter-rouge">.svg</code> file is ready to be included in Wikipedia.</p>

<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>

<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>
</div>
				]]>
			</description>
			<link>https://dieghernan.github.io/201910_WikiMap1/</link>
			<category>posts</category>
		    <category>Wikipedia</category><category>cartography</category><category>giscoR</category><category>maps</category><category>r_bloggers</category><category>rspatial</category><category>rstats</category><category>sf</category><category>svg</category><media:title type="html"><![CDATA[Wikipedia maps (I): Organ donor rates ]]></media:title>
      <media:content url="https://dieghernan.github.io/assets/img/blog/20191016_imgpost.webp" medium="image"/>
      <media:thumbnail url="https://dieghernan.github.io/assets/img/blog/20191016_imgpost.webp" /><guid isPermaLink="true">https://dieghernan.github.io/201910_WikiMap1/</guid>
      <pubDate>Wed, 16 Oct 2019 00:00:00 +0200</pubDate>
		</item><item>
			<title>Beautiful maps with R (II): Fun with flags</title>
			<description>
				<![CDATA[	
 				<h3>Put a picture on your map</h3>
    		<p>3 min.</p>
				<div><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
in <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>
function. Just install it via <code class="language-plaintext highlighter-rouge">install.packages("cartography")</code>. A dedicated
blog post with examples is available at this <a href="../202002_cartography1">link</a>.</p>

<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
<strong>rasterpic</strong> + <strong>tidyterra</strong> to achieve the same result, see <a href="https://dieghernan.github.io/202201_maps-flags/">link1</a>
and <a href="https://dieghernan.github.io/202205_tidyterra/">link2</a>.</p>

<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
in the right place. I am aware that there are some <strong>R</strong> packages out
<a href="https://github.com/RobertMyles/flagfillr">there</a>, but we focus here on the
option provided by <code class="language-plaintext highlighter-rouge">cartography::getPngLayer()</code>, which basically converts your
image into a raster. See also Paul Murrell’s article <strong>“Raster Images in R
Graphics”</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>

<h2 id="required-r-packages">Required <strong>R</strong> packages</h2>

<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">
</span><span class="n">library</span><span class="p">(</span><span class="n">sf</span><span class="p">)</span><span class="w">
</span><span class="n">library</span><span class="p">(</span><span class="n">cartography</span><span class="p">)</span><span class="w">
</span><span class="n">library</span><span class="p">(</span><span class="n">mapSpain</span><span class="p">)</span><span class="w">
</span><span class="n">library</span><span class="p">(</span><span class="n">giscoR</span><span class="p">)</span><span class="w">
</span></code></pre></div></div>

<h2 id="choosing-a-good-source-for-our-shape">Choosing a good source for our shape</h2>

<p>In this post, I am going to plot a map of Spain with its
<a href="https://en.wikipedia.org/wiki/Autonomous_communities_of_Spain">autonomous communities (plus 2 autonomous cities)</a>,
which are the first-level administrative divisions of the country.
<a href="https://en.wikipedia.org/wiki/Autonomous_communities_of_Spain">Wikipedia</a>
shows an initial map that also identifies the flag of each territory.</p>

<p>For that, I will use <strong>mapSpain</strong>, which uses information from <strong>giscoR</strong>, whose
source is the geodata available in <a href="https://ec.europa.eu/eurostat"><strong>Eurostat</strong></a>.
I will also use <strong>giscoR</strong> to get the world around Spain.</p>

<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">

</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">

</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">

</span><span class="c1"># Plot</span><span class="w">
</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">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="kc">NA</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">
  </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">
</span><span class="p">)</span><span class="w">
</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">
  </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">
  </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">
  </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">
</span><span class="p">)</span><span class="w">
</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">
</span><span class="n">layoutLayer</span><span class="p">(</span><span class="w">
  </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">
  </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">
  </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">
  </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">
  </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">
</span><span class="p">)</span><span class="w">
</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">
</span></code></pre></div></div>

<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>

<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>

<h2 id="loading-the-flag">Loading the flag</h2>

<p>As a first example, I chose <a href="https://en.wikipedia.org/wiki/Asturias">Asturias</a>
to build my code. The goal here is to create a <code class="language-plaintext highlighter-rouge">RasterBrick</code> from the desired
<code class="language-plaintext highlighter-rouge">*.png</code> file, add the necessary geographical information and use the shape of
Asturias to crop the flag.</p>

<div class="language-r highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># 1.Shape---</span><span class="w">
</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">

</span><span class="c1"># 2.Get flag---</span><span class="w">

</span><span class="c1"># Masked</span><span class="w">
</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">

</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">

</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">

</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">
</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">
</span><span class="n">pngLayer</span><span class="p">(</span><span class="n">flagnomask</span><span class="p">)</span><span class="w">
</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">

</span><span class="c1"># 4.Mask---</span><span class="w">
</span><span class="n">pngLayer</span><span class="p">(</span><span class="n">flagmask</span><span class="p">)</span><span class="w">
</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">
</span></code></pre></div></div>

<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>

<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">
</span></code></pre></div></div>

<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,
otherwise the plot will look quite poor. Here I show an extreme example.</p>

<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">
</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">
  </span><span class="n">MURshp</span><span class="p">,</span><span class="w">
  </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">
</span><span class="p">)</span><span class="w">
</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">
  </span><span class="n">MURshp</span><span class="p">,</span><span class="w">
  </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">
</span><span class="p">)</span><span class="w">


</span><span class="c1"># Plot and compare</span><span class="w">
</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">
</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">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">
</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">

</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">
</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">
</span></code></pre></div></div>

<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>

<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">
</span></code></pre></div></div>

<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>

<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">
</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">
  </span><span class="n">st_geometry</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">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">
</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">
</span><span class="p">)</span><span class="w">
</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">
  </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">
  </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">
</span><span class="p">)</span><span class="w">
</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">
  </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">
</span><span class="p">)</span><span class="w">
</span><span class="n">layoutLayer</span><span class="p">(</span><span class="w">
  </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">
  </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">
  </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">
  </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">
</span><span class="p">)</span><span class="w">
</span><span class="c1"># Andalucia</span><span class="w">
</span><span class="n">flag</span><span class="w"> </span><span class="o">&lt;-</span><span class="w">
  </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">
</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">
</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">

</span><span class="c1"># ...more flags</span><span class="w">
</span><span class="c1"># Go to the source code of this post on GitHub for the full code</span><span class="w">

</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="kc">NA</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">add</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nb">T</span><span class="w">
</span><span class="p">)</span><span class="w">
</span></code></pre></div></div>

<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>

<p>We are done now. If you have suggestions, you can leave a comment. As always,
if you enjoyed the post, you can share it on your preferred social network.</p>
</div>
				]]>
			</description>
			<link>https://dieghernan.github.io/201906_Beautiful2/</link>
			<category>posts</category>
		    <category>beautiful_maps</category><category>flags</category><category>function</category><category>giscoR</category><category>mapSpain</category><category>maps</category><category>r_bloggers</category><category>raster</category><category>rspatial</category><category>rstats</category><media:title type="html"><![CDATA[Beautiful maps with R (II): Fun with flags ]]></media:title>
      <media:content url="https://dieghernan.github.io/assets/img/blog/20190618_imgpost-1.webp" medium="image"/>
      <media:thumbnail url="https://dieghernan.github.io/assets/img/blog/20190618_imgpost-1.webp" /><guid isPermaLink="true">https://dieghernan.github.io/201906_Beautiful2/</guid>
      <pubDate>Tue, 18 Jun 2019 00:00:00 +0200</pubDate>
		</item><item>
			<title>Beautiful maps with R (I): Fishnets, honeycombs and pixels</title>
			<description>
				<![CDATA[	
 				<h3>Simplified maps with R</h3>
    		<p>5 min.</p>
				<div><p>Sometimes you want to produce maps with special layouts. I especially like
maps with modified geometries, e.g. simplifying the original shapes to squares
or dots. When searching the web, I found the fantastic post <a href="https://strimas.com/post/hexagonal-grids/">Fishnets and
Honeycomb: Square vs. Hexagonal Spatial Grids</a>
by <a href="https://strimas.com/#about">Matt Strimas-Mackey</a>, which was a huge
inspiration (by the way, don’t miss <a href="http://strimas.com/#posts">his blog</a>, full
of very interesting pieces of work).</p>

<p>The only thing I was not completely comfortable with was that the post used the
<a href="https://geocompr.robinlovelace.net/intro.html#the-history-of-r-spatial">old-fashioned</a>
<strong>sp</strong> package instead of my personal favorite, the <strong>sf</strong> package. The post
was published in 2016, and note that the author has also moved to the <strong>sf</strong>
package since then. So I decided to explore further options with <strong>sf</strong>.</p>

<p>The approach is similar, using grids over a map and working with them, but with
<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>.
I also expanded it by grouping the grids and producing dots over the geometries.
So basically I produced five variations of the map:</p>

<table>
  <thead>
    <tr>
      <th>Type</th>
      <th style="text-align: center">Replacement</th>
      <th style="text-align: center">Grouped</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><strong>Fishnet</strong></td>
      <td style="text-align: center">Square</td>
      <td style="text-align: center">No</td>
    </tr>
    <tr>
      <td><strong>Puzzle</strong></td>
      <td style="text-align: center">Square</td>
      <td style="text-align: center">Yes</td>
    </tr>
    <tr>
      <td><strong>Honeycomb</strong></td>
      <td style="text-align: center">Hexagon</td>
      <td style="text-align: center">No</td>
    </tr>
    <tr>
      <td><strong>Hexbin</strong></td>
      <td style="text-align: center">Hexagon</td>
      <td style="text-align: center">Yes</td>
    </tr>
    <tr>
      <td><strong>Pixel</strong></td>
      <td style="text-align: center">Dot</td>
      <td style="text-align: center">No</td>
    </tr>
  </tbody>
</table>

<h2 id="required-r-packages">Required <strong>R</strong> packages</h2>

<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">
</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="n">library</span><span class="p">(</span><span class="n">dplyr</span><span class="p">)</span><span class="w">
</span><span class="n">library</span><span class="p">(</span><span class="n">RColorBrewer</span><span class="p">)</span><span class="w">
</span></code></pre></div></div>

<h2 id="working-with-square-grids">Working with square grids</h2>

<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>

<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">
  </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">
  </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">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">
</span><span class="p">)</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="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">
  </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">

</span><span class="c1"># Projecting and cleaning</span><span class="w">
</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">
</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">
</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">
</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">

</span><span class="c1"># Create my own color palette</span><span class="w">
</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">
</span></code></pre></div></div>

<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
be set in the same unit as the projection (in this case, meters). Pay special
attention to this because if the parameter is too small, meaning that the grid
is too dense, <strong>R</strong> could crash easily.</p>

<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">
  </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">
  </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">
  </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">
  </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">
</span><span class="p">)</span><span class="w">

</span><span class="c1"># To sf</span><span class="w">
</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">

</span><span class="c1"># We identify the grids that belong to an entity by assessing the centroid</span><span class="w">
</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">
</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">
</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">

</span><span class="c1"># Fishnet</span><span class="w">
</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">
  </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">
  </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">
  </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">
</span><span class="p">)</span><span class="w">

</span><span class="c1"># Let's add the data frame</span><span class="w">
</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">
  </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">
  </span><span class="n">st_drop_geometry</span><span class="p">(</span><span class="n">initial</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">
  </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">

</span><span class="c1"># Now let's create the puzzle</span><span class="w">
</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">
  </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">
  </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">
  </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">
</span><span class="p">)</span><span class="w"> </span><span class="c1"># This changes!!!</span><span class="w">

</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">
  </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">
  </span><span class="n">st_drop_geometry</span><span class="p">(</span><span class="n">initial</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">
  </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">

</span><span class="c1"># Plot</span><span class="w">
</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">
</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">
</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">
</span></code></pre></div></div>

<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>

<h2 id="going-hex">Going hex</h2>

<p>Extremely easy. We just need to change the <code class="language-plaintext highlighter-rouge">square</code> parameter of
<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>

<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">
  </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">
  </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">
  </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">
  </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">
</span><span class="p">)</span><span class="w">
</span><span class="c1"># Make sf</span><span class="w">
</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">

</span><span class="c1"># We identify the grids that belong to an entity by assessing the centroid</span><span class="w">
</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">
</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">
</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">

</span><span class="c1"># Honeycomb</span><span class="w">
</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">
  </span><span class="n">grid_new</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="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">
  </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">
  </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">
</span><span class="p">)</span><span class="w">

</span><span class="c1"># Let's add the data frame</span><span class="w">
</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">
  </span><span class="n">Honeygeom</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">
  </span><span class="n">st_drop_geometry</span><span class="p">(</span><span class="n">initial</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">
  </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">

</span><span class="c1"># Now let's create the hexbin</span><span class="w">

</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">
  </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">
  </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">
  </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">
  </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">
</span><span class="p">)</span><span class="w">

</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">
  </span><span class="n">Hexbingeom</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">
  </span><span class="n">st_drop_geometry</span><span class="p">(</span><span class="n">initial</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">
  </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">

</span><span class="c1"># Plot</span><span class="w">
</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">
</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">
</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">
</span></code></pre></div></div>

<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>

<h2 id="pixel-it">Pixel it!</h2>

<p>Also quite easy, just a couple more tweaks, still using <code class="language-plaintext highlighter-rouge">st_make_grid</code>.</p>

<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">
  </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">
  </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">
  </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">
</span><span class="p">)</span><span class="w">

</span><span class="c1"># Make sf</span><span class="w">
</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">

</span><span class="c1"># We identify the grids that belong to an entity by assessing the centroid</span><span class="w">
</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">
</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">
</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">
</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">
  </span><span class="n">grid_new</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="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">
  </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">
  </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">
</span><span class="p">)</span><span class="w">
</span><span class="c1"># Let's add the data frame</span><span class="w">
</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">
  </span><span class="n">Pixelgeom</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">
  </span><span class="n">st_drop_geometry</span><span class="p">(</span><span class="n">initial</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">
  </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">

</span><span class="c1"># Plot</span><span class="w">
</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">
</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">
</span></code></pre></div></div>

<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>

<h2 id="wrap-up">Wrap up</h2>

<p>Finally, I wrapped all that in a function named <code class="language-plaintext highlighter-rouge">stdh_gridpol</code>. See the code in
<a href="https://github.com/dieghernan/dieghernan.github.io/tree/master/assets/functions">my repo</a>:</p>

<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">
                         </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="nf">as.integer</span><span class="p">(</span><span class="w">
                           </span><span class="nf">min</span><span class="p">(</span><span class="w">
                             </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">
                             </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">
                           </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">
                         </span><span class="p">),</span><span class="w">
                         </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">
  </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">
    </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">
  </span><span class="p">}</span><span class="w">
  </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">
    </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">
  </span><span class="p">}</span><span class="w">

  </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">
    </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">
    </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">
  </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">
    </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">
  </span><span class="p">}</span><span class="w">

  </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">

  </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">
    </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">
  </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">
    </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">
  </span><span class="p">}</span><span class="w">
  </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">
    </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">
      </span><span class="n">gridsize</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">initial</span><span class="p">),</span><span class="w">
      </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">
    </span><span class="p">)</span><span class="w">
  </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">
    </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">
      </span><span class="n">target</span><span class="p">,</span><span class="w">
      </span><span class="n">gridsize</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">initial</span><span class="p">),</span><span class="w">
      </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">
      </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">
    </span><span class="p">)</span><span class="w">
  </span><span class="p">}</span><span class="w">
  </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">
  </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">
    </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">
    </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">
  </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">
    </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">
    </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">
    </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">
  </span><span class="p">}</span><span class="w">
  </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">
    </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">
      </span><span class="n">grid_new</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="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">
      </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">
      </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">
    </span><span class="p">)</span><span class="w">
  </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">
    </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">
      </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">
      </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">
      </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">
      </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">
    </span><span class="p">)</span><span class="w">
  </span><span class="p">}</span><span class="w">
  </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">
    </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">
      </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">
      </span><span class="n">st_drop_geometry</span><span class="p">(</span><span class="n">initial</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">
      </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">
    </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">
    </span><span class="nf">return</span><span class="p">(</span><span class="n">fin</span><span class="p">)</span><span class="w">
  </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">
    </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">
    </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">
  </span><span class="p">}</span><span class="w">
</span><span class="p">}</span><span class="w">
</span><span class="c1"># End of the function-----</span><span class="w">

</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">
</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">
</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">
</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">
</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">
</span></code></pre></div></div>

<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>

<p>And that’s it! The function <code class="language-plaintext highlighter-rouge">stdh_gridpol</code> has some alert mechanisms, such as
accepting 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>
is computed so that the shortest dimension has 40 cells.</p>
</div>
				]]>
			</description>
			<link>https://dieghernan.github.io/201906_Beautiful1/</link>
			<category>posts</category>
		    <category>beautiful_maps</category><category>giscoR</category><category>maps</category><category>r_bloggers</category><category>rspatial</category><category>rstats</category><category>sf</category><media:title type="html"><![CDATA[Beautiful maps with <strong>R</strong> (I): Fishnets, honeycombs and pixels ]]></media:title>
      <media:content url="https://dieghernan.github.io/assets/img/blog/20190602_imgpost-1.webp" medium="image"/>
      <media:thumbnail url="https://dieghernan.github.io/assets/img/blog/20190602_imgpost-1.webp" /><guid isPermaLink="true">https://dieghernan.github.io/201906_Beautiful1/</guid>
      <pubDate>Sun, 02 Jun 2019 00:00:00 +0200</pubDate>
		</item><item>
			<title>Leaflet, R, Markdown, Jekyll and GitHub</title>
			<description>
				<![CDATA[	
 				<h3>Make it work in 6 steps - A short tutorial</h3>
    		<p>5 min.</p>
				<div><p>Recently, I have been struggling when trying to embed a
<a href="https://rstudio.github.io/leaflet">leaflet</a> map created with
<strong>RStudio</strong> on my blog, hosted on GitHub via
<a href="https://jekyllrb.com">Jekyll</a> (<strong>Spoiler</strong>: <a href="https://dieghernan.github.io/201905_Where-in-the-world/">I succeeded
<i class="fa fa-thumbs-up"></i></a>).
In my case, I use the <a href="https://dieghernan.github.io/chulapa/"><span class="chulapa">Chulapa</span></a>
remote theme that I created.</p>

<p><strong>Index</strong></p>

<ol>
  <li>The generated ToC will be an ordered list</li>
</ol>

<p>Ready? Let’s go!</p>

<h3 id="the-githubjekyll-part">The GitHub/Jekyll part</h3>

<p>The first step is to install the required libraries on your GitHub
page. As Jekyll basically transforms Markdown into HTML, this step
is a matter of <strong>what to include</strong> and <strong>where</strong> in your own repository.</p>

<h4 id="1-what-to-include">1. What to include</h4>

<p>This part is not really hard. When looking at the source code of the
<a href="https://rstudio.github.io/leaflet/">Leaflet for R</a> site, you can see this
chunk:</p>

<div class="language-html highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nt">&lt;head&gt;</span>
  <span class="c">&lt;!--code--&gt;</span>

  <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>
  <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>
  <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>
  <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>
  <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>

  ...
  <span class="c">&lt;!--more libraries--&gt;</span>
  ...

  <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>
  <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>

  <span class="c">&lt;!--code--&gt;</span>
<span class="nt">&lt;/head&gt;</span>
</code></pre></div></div>

<p>So now we have it! The only thing to remember is that we need to load
the libraries from the <strong>leaflet</strong> server
(<code class="language-plaintext highlighter-rouge">https://rstudio.github.io/leaflet</code>), meaning that we have to prepend
that URL to the libraries in our installation:</p>

<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>
<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>
<span class="nt">&lt;link</span>
  <span class="na">href=</span><span class="s">"https://rstudio.github.io/leaflet/libs/bootstrap/css/flatly.min.css"</span>
  <span class="na">rel=</span><span class="s">"stylesheet"</span>
<span class="nt">/&gt;</span>

...
<span class="c">&lt;!--more libraries--&gt;</span>
...

<span class="nt">&lt;link</span>
  <span class="na">href=</span><span class="s">"https://rstudio.github.io/leaflet/libs/rstudio_leaflet/rstudio_leaflet.css"</span>
  <span class="na">rel=</span><span class="s">"stylesheet"</span>
<span class="nt">/&gt;</span>
<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>
</code></pre></div></div>

<p>You can have a look at my implementation in
<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>

<h4 id="2-where-to-include">2. Where to include</h4>

<p>This is a little more complicated, depending on the structure of your
Jekyll template. The code chunk should be included in the <code class="language-plaintext highlighter-rouge">&lt;head&gt;</code>
section of your page, so you would need to find where to put it. In the
case of <span class="chulapa">Chulapa</span> it is on
<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>

<p>So now you just have to paste the code that you got in step 1 into the
<code class="language-plaintext highlighter-rouge">&lt;head&gt;</code>.</p>

<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
site, include these libraries only when you need them. In my case, I added
a custom variable in my YAML front matter for those posts with a leaflet
map, <code class="language-plaintext highlighter-rouge">leafletmap: true</code>. Go to step 4 for a working example.</p>

<h3 id="the-rstudio-part">The RStudio part</h3>

<h4 id="3-creating-the-leaflet-map">3. Creating the leaflet map</h4>

<p>Now it’s time to create a leaflet map with <strong>RStudio</strong>. I will keep it
simple for this post, so I took the first example provided in <a href="https://rstudio.github.io/leaflet/">Leaflet
for R - Introduction</a>.</p>

<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">

</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">
  </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">
  </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">
</span><span class="n">m</span><span class="w">  </span><span class="c1"># Print the map</span><span class="w">
</span></code></pre></div></div>

<p>It is assumed that you are <a href="https://rmarkdown.rstudio.com/authoring_quick_tour.html#rendering_output">creating a post with
<strong>RStudio</strong></a>,
so the code presented above should be embedded in an <code class="language-plaintext highlighter-rouge">.Rmd</code> file.</p>

<h4 id="4-set-up-the-yaml-front-matter-">4. Set up the YAML front matter <a name="step4"></a></h4>

<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
matter</a>.
Here it is <strong>essential</strong> to set up the option <code class="language-plaintext highlighter-rouge">always_allow_html: yes</code>,
as well as <code class="language-plaintext highlighter-rouge">output: github_document</code>. As an example, this post was
created with this front matter:</p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nn">---</span>
<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>
<span class="na">subtitle</span><span class="pi">:</span> <span class="s">Make it work in 6 steps - a short tutorial</span>
<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>
<span class="na">header_img</span><span class="pi">:</span> <span class="s">https://dieghernan.github.io/assets/figs/20190520_imgpost.webp</span>
<span class="na">leafletmap</span><span class="pi">:</span> <span class="kc">true</span>
<span class="na">always_allow_html</span><span class="pi">:</span> <span class="s">yes</span>
<span class="na">last_modified_at</span><span class="pi">:</span> <span class="s">2021-05-30</span>
<span class="na">output</span><span class="pi">:</span>
  <span class="na">md_document</span><span class="pi">:</span>
    <span class="na">variant</span><span class="pi">:</span> <span class="s">gfm</span>
    <span class="na">preserve_yaml</span><span class="pi">:</span> <span class="kc">true</span>
<span class="nn">---</span>
</code></pre></div></div>

<p>We are almost there! Now “Knit” your code and get the corresponding
<code class="language-plaintext highlighter-rouge">.md</code> file.</p>

<h3 id="the-markdown-part">The Markdown part</h3>

<h4 id="5-modifying-the-md-file"><del>5. Modifying the <code class="language-plaintext highlighter-rouge">.md</code> file</del></h4>

<p><strong>Update: This is no longer needed. I have kept it here for reference.
You can skip to the next section.</strong></p>

<p>Have a look at the <code class="language-plaintext highlighter-rouge">.md</code> code that you have just created. Although not
displayed in the preview, you can see in the file itself a chunk that
looks like this:</p>

<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>
  <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>
    <span class="p">...</span>
    <span class="dl">"</span><span class="s2">jsHooks</span><span class="dl">"</span><span class="p">:[]}</span>
<span class="nt">&lt;/script&gt;</span>
</code></pre></div></div>

<p>Actually that chunk is your leaflet map, created with <strong>RStudio</strong>. You
can’t see it now because you are previewing a <code class="language-plaintext highlighter-rouge">markdown</code> file in your
local PC, and the libraries installed in step 1 are installed on GitHub,
but we will solve that later.</p>

<p>Now you just need to paste this piece of code before that chunk:</p>

<div class="language-html highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c">&lt;!--html_preserve--&gt;</span>
<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>
  <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>
  <span class="p">...</span>
</code></pre></div></div>

<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
widget id (<code class="language-plaintext highlighter-rouge">7ab57412f7b1df4d5773</code> in the example) is the same in the
<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>

<p>The <code class="language-plaintext highlighter-rouge">style="width:100%; height:216px;</code> part controls the actual size of
the leaflet widget. In this case, the map will adapt to the width of
the page with a fixed height of 216px. I put <a href="#extra">some examples</a> of
different size options at the end of the post so you can have a look and see
which one is more suitable for your needs.</p>

<h4 id="6-publish-your-post">6. Publish your post</h4>

<p>Now you just have to publish your post as usual! If everything has been
properly set, when Jekyll builds your post it will include the
libraries in the header and make the magic happen, just like this:</p>

<div id="htmlwidget-60e5339b540855d29db4" style="width:672px;height:480px;" class="leaflet html-widget"></div>
<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>

<p class="alert alert-warning p-3 mx-2 my-3"><i class="fa fa-exclamation-triangle"></i> <strong>Warning:</strong> Have you checked
the YAML front matter of your <code class="language-plaintext highlighter-rouge">.md</code> file? Have another look, especially
if you have followed my Pro tip.</p>

<h3 id="gallery-size-of-a-leaflet-map-">Gallery: Size of a leaflet map <a name="extra"></a></h3>

<p><strong>A note:</strong> For a complete understanding of this section, it is
recommended to access it on multiple devices, so you can see the
different behavior on different screens. Google Chrome allows you to
simulate different devices <a href="https://developers.google.com/web/tools/chrome-devtools/device-mode/">(more info
here)</a>.</p>

<h4 id="fixed-size">Fixed size</h4>

<p>With these examples, you can see how to control the absolute size of the
leaflet map. The disadvantage of this method is that the size would be
fixed for all the devices, so maps sized for smartphones or tablets
wouldn’t look as nice on laptops, and vice versa.</p>

<h5 id="example-1-672x480px">Example 1: 672x480px</h5>

<p>Fixed size in pixels. The default on my machine:</p>

<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">
  </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="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">
  </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">
</span></code></pre></div></div>

<div id="htmlwidget-0e60ff221279290607a4" style="width:672px;height:480px;" class="leaflet html-widget"></div>
<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>

<h5 id="example-2-200x300px">Example 2: 200x300px</h5>

<p>Let’s go narrow and long with <code class="language-plaintext highlighter-rouge">html "width:200px;height:300px;"</code>:</p>

<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">
  </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="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">
</span><span class="p">)</span><span class="w"> </span><span class="o">%&gt;%</span><span class="w">
  </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="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">
  </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">
</span></code></pre></div></div>

<div id="htmlwidget-fb456eae6cf883f81850" style="width:200px;height:300px;" class="leaflet html-widget"></div>
<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>

<h4 id="responsive-size">Responsive size</h4>

<p><strong>Recommended option.</strong> These maps will adapt to the width of your
screen, no matter what device you are using.</p>

<h5 id="example-3-100-width">Example 3: 100% width</h5>

<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">
  </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="n">width</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"100%"</span><span class="w">
</span><span class="p">)</span><span class="w"> </span><span class="o">%&gt;%</span><span class="w">
  </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="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">
  </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">
</span></code></pre></div></div>

<div id="htmlwidget-d72518ef7cb92abb839a" style="width:100%;height:480px;" class="leaflet html-widget"></div>
<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>

</div>
				]]>
			</description>
			<link>https://dieghernan.github.io/201905_Leaflet_R_Jekyll/</link>
			<category>posts</category>
		    <category>html</category><category>jekyll</category><category>leaflet</category><category>maps</category><category>r_bloggers</category><category>rspatial</category><category>rstats</category><media:title type="html"><![CDATA[Leaflet, <strong>R</strong>, Markdown, Jekyll and GitHub ]]></media:title>
      <media:content url="https://dieghernan.github.io/assets/img/blog/20190520_imgpost.webp" medium="image"/>
      <media:thumbnail url="https://dieghernan.github.io/assets/img/blog/20190520_imgpost.webp" /><guid isPermaLink="true">https://dieghernan.github.io/201905_Leaflet_R_Jekyll/</guid>
      <pubDate>Mon, 20 May 2019 00:00:00 +0200</pubDate>
		</item><item>
			<title>Where in the world?</title>
			<description>
				<![CDATA[	
 				<h3>A leaflet map with the places I have flown</h3>
    		<p>1 min.</p>
				<div><p>This is a very personal post, where I just show the map of all the places I have
traveled to by plane.</p>

<div class="leaflet html-widget html-fill-item" id="htmlwidget-da93ff56d02bb57b98a0" style="width:672px;height:480px;"></div>
<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://rts.larioja.org/mapa-base/rioja_oscuro/{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,"minzoom":0,"maxzoom":18,"tilesize":256,"errortileurl":"","nowrap":false,"zoomoffset":0,"zoomreverse":false,"zindex":1,"detectretina":true,"attribution":"CC BY 4.0 <a href='https://www.iderioja.org'>www.iderioja.org<\/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>

<p class="alert alert-info p-3 mx-2 my-3 lead"><strong>✈️ 255,622.0 kms. flown so far.</strong></p>

<h2 id="top-cities">Top cities</h2>

<table>
  <thead>
    <tr>
      <th style="text-align: left">City</th>
      <th style="text-align: left">Country</th>
      <th style="text-align: right">N</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="text-align: left">Bilbao</td>
      <td style="text-align: left">Spain</td>
      <td style="text-align: right">66</td>
    </tr>
    <tr>
      <td style="text-align: left">London</td>
      <td style="text-align: left">United Kingdom</td>
      <td style="text-align: right">23</td>
    </tr>
    <tr>
      <td style="text-align: left">Edinburgh</td>
      <td style="text-align: left">United Kingdom</td>
      <td style="text-align: right">21</td>
    </tr>
    <tr>
      <td style="text-align: left">Barcelona</td>
      <td style="text-align: left">Spain</td>
      <td style="text-align: right">16</td>
    </tr>
    <tr>
      <td style="text-align: left">Brussels</td>
      <td style="text-align: left">Belgium</td>
      <td style="text-align: right">8</td>
    </tr>
    <tr>
      <td style="text-align: left">Berlin</td>
      <td style="text-align: left">Germany</td>
      <td style="text-align: right">6</td>
    </tr>
    <tr>
      <td style="text-align: left">Munich</td>
      <td style="text-align: left">Germany</td>
      <td style="text-align: right">6</td>
    </tr>
    <tr>
      <td style="text-align: left">Palma de Mallorca</td>
      <td style="text-align: left">Spain</td>
      <td style="text-align: right">6</td>
    </tr>
    <tr>
      <td style="text-align: left">Amsterdam</td>
      <td style="text-align: left">Netherlands</td>
      <td style="text-align: right">4</td>
    </tr>
    <tr>
      <td style="text-align: left">Frankfurt</td>
      <td style="text-align: left">Germany</td>
      <td style="text-align: right">4</td>
    </tr>
  </tbody>
</table>

<h2 id="top-countries">Top countries</h2>

<table>
  <thead>
    <tr>
      <th style="text-align: left">Country</th>
      <th style="text-align: left">Continent</th>
      <th style="text-align: right">N</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="text-align: left">Spain</td>
      <td style="text-align: left">Europe</td>
      <td style="text-align: right">101</td>
    </tr>
    <tr>
      <td style="text-align: left">United Kingdom</td>
      <td style="text-align: left">Europe</td>
      <td style="text-align: right">46</td>
    </tr>
    <tr>
      <td style="text-align: left">Germany</td>
      <td style="text-align: left">Europe</td>
      <td style="text-align: right">18</td>
    </tr>
    <tr>
      <td style="text-align: left">Belgium</td>
      <td style="text-align: left">Europe</td>
      <td style="text-align: right">8</td>
    </tr>
    <tr>
      <td style="text-align: left">France</td>
      <td style="text-align: left">Europe</td>
      <td style="text-align: right">6</td>
    </tr>
  </tbody>
</table>

<h2 id="top-continents">Top continents</h2>

<table>
  <thead>
    <tr>
      <th style="text-align: left">Continent</th>
      <th style="text-align: left">Region</th>
      <th style="text-align: right">N</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="text-align: left">Europe</td>
      <td style="text-align: left">Southern Europe</td>
      <td style="text-align: right">105</td>
    </tr>
    <tr>
      <td style="text-align: left">Europe</td>
      <td style="text-align: left">Northern Europe</td>
      <td style="text-align: right">52</td>
    </tr>
    <tr>
      <td style="text-align: left">Europe</td>
      <td style="text-align: left">Western Europe</td>
      <td style="text-align: right">38</td>
    </tr>
    <tr>
      <td style="text-align: left">Asia</td>
      <td style="text-align: left">Western Asia</td>
      <td style="text-align: right">6</td>
    </tr>
    <tr>
      <td style="text-align: left">North America</td>
      <td style="text-align: left">Northern America</td>
      <td style="text-align: right">6</td>
    </tr>
  </tbody>
</table>
</div>
				]]>
			</description>
			<link>https://dieghernan.github.io/201905_Where-in-the-world/</link>
			<category>posts</category>
		    <category>leaflet</category><category>maps</category><category>rspatial</category><category>rstats</category><media:title type="html"><![CDATA[Where in the world? ]]></media:title>
      <media:content url="https://dieghernan.github.io/assets/img/blog/201905_Where-in-the-world.webp" medium="image"/>
      <media:thumbnail url="https://dieghernan.github.io/assets/img/blog/201905_Where-in-the-world.webp" /><guid isPermaLink="true">https://dieghernan.github.io/201905_Where-in-the-world/</guid>
      <pubDate>Mon, 13 May 2019 00:00:00 +0200</pubDate>
		</item><item>
			<title>Cast a line to subsegments in R</title>
			<description>
				<![CDATA[	
 				<h3>User-defined function using the <strong>sf</strong> package</h3>
    		<p>3 min.</p>
				<div><p>This post introduces a user-defined function for casting <strong>sf</strong> objects of class
<code class="language-plaintext highlighter-rouge">LINESTRING</code> or <code class="language-plaintext highlighter-rouge">POLYGON</code> into substrings.</p>

<h2 id="required-r-packages">Required <strong>R</strong> packages</h2>

<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">
</span><span class="n">library</span><span class="p">(</span><span class="n">rnaturalearth</span><span class="p">)</span><span class="w">
</span><span class="n">library</span><span class="p">(</span><span class="n">dplyr</span><span class="p">)</span><span class="w">
</span></code></pre></div></div>

<h2 id="the-problem">The problem</h2>

<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>,
a powerful function that transforms geometries into other types of geometries
(i.e. <code class="language-plaintext highlighter-rouge">LINESTRING</code> to <code class="language-plaintext highlighter-rouge">POLYGON</code>, etc.).</p>

<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">
</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">
</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">
</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">
</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">
</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">
</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">
</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">
</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">
</span></code></pre></div></div>

<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>

<p>What I missed when using <code class="language-plaintext highlighter-rouge">st_cast</code> was the possibility of breaking
<code class="language-plaintext highlighter-rouge">LINESTRING</code> objects into subsegments:</p>

<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>

<h2 id="an-approach">An approach</h2>

<p>One possible solution is to create <code class="language-plaintext highlighter-rouge">LINESTRING</code> objects for each consecutive
pair of <code class="language-plaintext highlighter-rouge">POINT</code> objects across the original geometry. Let’s check it:</p>

<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">
</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">
  </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">
  </span><span class="n">st_cast</span><span class="p">(</span><span class="s2">"LINESTRING"</span><span class="p">)</span><span class="w">
</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">

</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">
  </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">
  </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">
    </span><span class="n">rbind</span><span class="p">(</span><span class="w">
      </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">
      </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">
    </span><span class="p">)</span><span class="w">
  </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">
  </span><span class="n">st_multilinestring</span><span class="p">()</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">test</span><span class="p">))</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">
</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">
</span></code></pre></div></div>

<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>

<h2 id="the-function-stdh_cast_substring">The function <code class="language-plaintext highlighter-rouge">stdh_cast_substring</code></h2>

<p>Finally, I wrapped the solution into a function and extended it a little bit:</p>

<ul>
  <li>
    <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
stops.</p>
  </li>
  <li>
    <p>The function accepts <strong>sf</strong> objects with several rows or <code class="language-plaintext highlighter-rouge">sfc</code> objects with
several geometries, and returns the same class as the input. In the case of
<strong>sf</strong> objects, the input <code class="language-plaintext highlighter-rouge">data.frame</code> is added.</p>
  </li>
  <li>
    <p>By default, the output is a <code class="language-plaintext highlighter-rouge">MULTILINESTRING</code> geometry. This has the benefit
that the output has the same number of geometries as the input. This can be
modified 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
<code class="language-plaintext highlighter-rouge">MULTILINESTRING</code> object into <code class="language-plaintext highlighter-rouge">LINESTRING</code>.</p>
  </li>
</ul>

<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">
  </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">

  </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">
    </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">
  </span><span class="p">}</span><span class="w">
  </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">
    </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">
    </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">
      </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">
      </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">
        </span><span class="n">rbind</span><span class="p">(</span><span class="w">
          </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">
          </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">
        </span><span class="p">)</span><span class="w">
      </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">
      </span><span class="n">st_multilinestring</span><span class="p">()</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="w">

    </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">
      </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">
    </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">
      </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">
    </span><span class="p">}</span><span class="w">
  </span><span class="p">}</span><span class="w">
  </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">
  </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">
    </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">
  </span><span class="p">}</span><span class="w">

  </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">
    </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">
  </span><span class="p">}</span><span class="w">
  </span><span class="nf">return</span><span class="p">(</span><span class="n">endgeom</span><span class="p">)</span><span class="w">
</span><span class="p">}</span><span class="w">
</span></code></pre></div></div>

<p>The function could be improved in terms of performance. Given that it works at
the coordinate level, high-resolution objects introduce some delay.</p>

<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">
  </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">
  </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">
</span><span class="p">)</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">

</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">
  </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">
  </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">
</span><span class="p">)</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">



</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">
</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">
</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">
</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">
</span></code></pre></div></div>

<table>
  <thead>
    <tr>
      <th style="text-align: left">x</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="text-align: left">0.1729319 secs</td>
    </tr>
  </tbody>
</table>

<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">
</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">
</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">
</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">
</span></code></pre></div></div>

<table>
  <thead>
    <tr>
      <th style="text-align: left">x</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="text-align: left">2.288558 secs</td>
    </tr>
  </tbody>
</table>

<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">
</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">
</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">
</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">
</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">
</span></code></pre></div></div>

<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>

<p>There is a difference in performance: <code class="language-plaintext highlighter-rouge">test100</code> has 15 polygons decomposed
into 914 substrings, while <code class="language-plaintext highlighter-rouge">test50</code> has 80 polygons decomposed into 8,414
substrings. In that sense, the original <code class="language-plaintext highlighter-rouge">st_cast</code> is much faster, although
this solution may work well in most cases.</p>
</div>
				]]>
			</description>
			<link>https://dieghernan.github.io/201905_Cast-to-subsegments/</link>
			<category>posts</category>
		    <category>function</category><category>r_bloggers</category><category>rnaturalearth</category><category>rspatial</category><category>rstats</category><category>sf</category><media:title type="html"><![CDATA[Cast a line to subsegments in R ]]></media:title>
      <media:content url="https://dieghernan.github.io/assets/img/blog//20190505_benchmarkfunction-1.webp" medium="image"/>
      <media:thumbnail url="https://dieghernan.github.io/assets/img/blog//20190505_benchmarkfunction-1.webp" /><guid isPermaLink="true">https://dieghernan.github.io/201905_Cast-to-subsegments/</guid>
      <pubDate>Sun, 05 May 2019 00:00:00 +0200</pubDate>
		</item><item>
			<title>Using the CountryCodes database and sf package</title>
			<description>
				<![CDATA[	
 				<h3>Vignette of the CountryCodes project</h3>
    		<p>2 min.</p>
				<div><p>This vignette shows how to use the database provided in the GitHub project
<a href="https://dieghernan.github.io/projects/countrycodes/">Country Codes and International Organizations &amp; Groups</a>
with the <strong>sf</strong> package in <strong>R</strong>.</p>

<h2 id="required-r-packages">Required <strong>R</strong> packages</h2>

<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">
</span><span class="n">library</span><span class="p">(</span><span class="n">jsonlite</span><span class="p">)</span><span class="w">
</span><span class="n">library</span><span class="p">(</span><span class="n">rnaturalearth</span><span class="p">)</span><span class="w">
</span><span class="n">library</span><span class="p">(</span><span class="n">dplyr</span><span class="p">)</span><span class="w">
</span></code></pre></div></div>

<h2 id="reading-the-data">Reading the data</h2>

<p>The first step is to read the provided database (in this example, the <code class="language-plaintext highlighter-rouge">json</code>
file) and extract one international organization. In this example, we will plot
the <a href="https://en.wikipedia.org/wiki/Commonwealth_of_Nations">Commonwealth of Nations</a>.</p>

<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">
</span><span class="c1"># Identify Commonwealth acronym</span><span class="w">
</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">
  </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">

</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">
</span></code></pre></div></div>

<table>
  <thead>
    <tr>
      <th style="text-align: left"> </th>
      <th style="text-align: left">org_name</th>
      <th style="text-align: left">org_id</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="text-align: left">25</td>
      <td style="text-align: left">Commonwealth</td>
      <td style="text-align: left">C</td>
    </tr>
    <tr>
      <td style="text-align: left">26</td>
      <td style="text-align: left">Central American Common Market</td>
      <td style="text-align: left">CACM</td>
    </tr>
    <tr>
      <td style="text-align: left">30</td>
      <td style="text-align: left">Caribbean Community and Common Market</td>
      <td style="text-align: left">CARICOM</td>
    </tr>
    <tr>
      <td style="text-align: left">42</td>
      <td style="text-align: left">Commonwealth of Independent States</td>
      <td style="text-align: left">CIS</td>
    </tr>
    <tr>
      <td style="text-align: left">43</td>
      <td style="text-align: left">Common Market for Eastern and Southern Africa</td>
      <td style="text-align: left">COMESA</td>
    </tr>
    <tr>
      <td style="text-align: left">115</td>
      <td style="text-align: left">Southern Cone Common Market</td>
      <td style="text-align: left">MERCOSUR</td>
    </tr>
  </tbody>
</table>

<p>In our case, the value to search for is <code class="language-plaintext highlighter-rouge">C</code>. A function that extracts the
membership from the <code class="language-plaintext highlighter-rouge">json</code> database is also provided:</p>

<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">
                       </span><span class="n">orgtosearch</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w">
  </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">
  </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">
    </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">
  </span><span class="p">})</span><span class="w">
  </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">
  </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">
  </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">
  </span><span class="nf">return</span><span class="p">(</span><span class="n">df2</span><span class="p">)</span><span class="w">
</span><span class="p">}</span><span class="w">
</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">
</span></code></pre></div></div>

<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
of each country.</p>

<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">
  </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">
  </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">
</span></code></pre></div></div>

<table>
  <thead>
    <tr>
      <th style="text-align: left">C</th>
      <th style="text-align: right">n</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="text-align: left">member</td>
      <td style="text-align: right">53</td>
    </tr>
    <tr>
      <td style="text-align: left">NA</td>
      <td style="text-align: right">222</td>
    </tr>
  </tbody>
</table>

<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">
  </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">
  </span><span class="n">select</span><span class="p">(</span><span class="w">
    </span><span class="n">ISO_3166_3</span><span class="p">,</span><span class="w">
    </span><span class="n">NAME.EN</span><span class="p">,</span><span class="w">
    </span><span class="n">C</span><span class="w">
  </span><span class="p">)</span><span class="w"> </span><span class="o">%&gt;%</span><span class="w">
  </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="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">
</span></code></pre></div></div>

<table>
  <thead>
    <tr>
      <th style="text-align: left">ISO_3166_3</th>
      <th style="text-align: left">NAME.EN</th>
      <th style="text-align: left">C</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="text-align: left">ATG</td>
      <td style="text-align: left">Antigua &amp; Barbuda</td>
      <td style="text-align: left">member</td>
    </tr>
    <tr>
      <td style="text-align: left">AUS</td>
      <td style="text-align: left">Australia</td>
      <td style="text-align: left">member</td>
    </tr>
    <tr>
      <td style="text-align: left">BHS</td>
      <td style="text-align: left">Bahamas</td>
      <td style="text-align: left">member</td>
    </tr>
    <tr>
      <td style="text-align: left">BGD</td>
      <td style="text-align: left">Bangladesh</td>
      <td style="text-align: left">member</td>
    </tr>
    <tr>
      <td style="text-align: left">BRB</td>
      <td style="text-align: left">Barbados</td>
      <td style="text-align: left">member</td>
    </tr>
    <tr>
      <td style="text-align: left">BLZ</td>
      <td style="text-align: left">Belize</td>
      <td style="text-align: left">member</td>
    </tr>
  </tbody>
</table>

<h2 id="replacing-the-data-on-a-map">Replacing the data on a map</h2>

<p>In this example the <strong>rnaturalearth</strong> package is used for retrieving an <code class="language-plaintext highlighter-rouge">sf</code>
object. 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
the dedicated database.</p>

<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">
  </span><span class="s2">"countries"</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="w">
</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">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">
  </span><span class="n">full_join</span><span class="p">(</span><span class="n">df_org</span><span class="p">)</span><span class="w">

</span><span class="c1"># We also add tiny countries</span><span class="w">
</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">
  </span><span class="s2">"tiny_countries"</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="w">
</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">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">
  </span><span class="n">full_join</span><span class="p">(</span><span class="n">df_org</span><span class="p">)</span><span class="w">

</span><span class="c1"># Identify dependencies</span><span class="w">
</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">
  </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">
  </span><span class="n">select</span><span class="p">(</span><span class="w">
    </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">
    </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">
  </span><span class="p">)</span><span class="w">
</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">
</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">
</span></code></pre></div></div>

<h2 id="plotting-a-map-wikipedia-style">Plotting a map: Wikipedia style</h2>

<p>Now we will try to plot a map resembling the one presented in the
<a href="https://en.wikipedia.org/wiki/Commonwealth_of_Nations">Wikipedia page</a> for the
Commonwealth.</p>

<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>

<p>The map we will generate is presented in a Robinson projection, and the color
palette will be based on the <a href="https://en.wikipedia.org/wiki/Wikipedia:WikiProject_Maps/Conventions/Orthographic_maps">Wikipedia convention for Orthographic Maps</a>,
since it is the one used in the example.</p>

<div class="language-r highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># Projecting the map</span><span class="w">
</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">
</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">

</span><span class="c1"># Bounding box</span><span class="w">
</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">
  </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">
  </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">
  </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">
  </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">
  </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">
</span><span class="p">))</span><span class="w"> </span><span class="o">%&gt;%</span><span class="w">
  </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">
  </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">
  </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">
  </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">

</span><span class="c1"># Plotting</span><span class="w">
</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">
</span><span class="n">plot</span><span class="p">(</span><span class="n">bbox</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">"#FFFFFF"</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">"#AAAAAA"</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="w">
</span><span class="p">)</span><span class="w">
</span><span class="n">plot</span><span class="p">(</span><span class="w">
  </span><span class="n">st_geometry</span><span class="p">(</span><span class="n">testmap_rob</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">"#B9B9B9"</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">"#FFFFFF"</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.1</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="w">
</span><span class="p">)</span><span class="w">

</span><span class="n">plot</span><span class="p">(</span><span class="w">
  </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">
    </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="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">
  </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">
  </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">
  </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">
</span><span class="p">)</span><span class="w">

</span><span class="c1"># Finally, add tiny countries</span><span class="w">
</span><span class="c1"># All</span><span class="w">
</span><span class="n">plot</span><span class="p">(</span><span class="w">
  </span><span class="n">st_geometry</span><span class="p">(</span><span class="n">tiny_rob</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">"#000000"</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">"#B9B9B9"</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">pch</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="m">21</span><span class="w">
</span><span class="p">)</span><span class="w">
</span><span class="c1"># Dependencies</span><span class="w">
</span><span class="n">plot</span><span class="p">(</span><span class="w">
  </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">
    </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">
    </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">
  </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">
  </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">
  </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">add</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nb">T</span><span class="w">
</span><span class="p">)</span><span class="w">
</span><span class="c1"># Independent</span><span class="w">
</span><span class="n">plot</span><span class="p">(</span><span class="w">
  </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">
    </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">
    </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">
  </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">
  </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">
  </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">add</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nb">T</span><span class="w">
</span><span class="p">)</span><span class="w">
</span><span class="n">plot</span><span class="p">(</span><span class="n">bbox</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">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">
  </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">
  </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">
</span><span class="p">)</span><span class="w">
</span></code></pre></div></div>

<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>
</div>
				]]>
			</description>
			<link>https://dieghernan.github.io/201904_Using-CountryCodes/</link>
			<category>posts</category>
		    <category>maps</category><category>r_bloggers</category><category>rnaturalearth</category><category>rspatial</category><category>rstats</category><category>sf</category><category>vignette</category><media:title type="html"><![CDATA[Using the CountryCodes database and <strong>sf</strong> package ]]></media:title>
      <media:content url="https://dieghernan.github.io/assets/img/blog/20190427_mapfin-1.webp" medium="image"/>
      <media:thumbnail url="https://dieghernan.github.io/assets/img/blog/20190427_mapfin-1.webp" /><guid isPermaLink="true">https://dieghernan.github.io/201904_Using-CountryCodes/</guid>
      <pubDate>Sat, 27 Apr 2019 00:00:00 +0200</pubDate>
		</item><item>
			<title>Country codes &amp;amp; organizations</title>
			<description>
				<![CDATA[	
 				<h3>A database with geocodes</h3>
    		<p>2 min.</p>
				<div><p>Complete database of countries and territories, their different country codes
under common standards (ISO-3166, GEC <em>(formerly FIPS)</em>, M49 (<em>UN</em>), STANAG
(<em>NATO</em>), NUTS (<em>EU</em>), etc.) and their membership in different international
organizations.</p>

<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>

<p><strong><a href="https://dieghernan.github.io/201904_Using-CountryCodes/">Vignette: Using country codes</a></strong></p>

<h2 id="a-country-codes-csv">A. Country codes <code class="language-plaintext highlighter-rouge">.csv</code></h2>

<p>Main <code class="language-plaintext highlighter-rouge">.csv</code> file
<a href="https://github.com/dieghernan/Country-Codes-and-International-Organizations/tree/master/outputs/Countrycodes.csv">(link)</a>
containing:</p>

<ul>
  <li>Country and regional codes</li>
  <li>Currency, dependency status and sovereignty information</li>
  <li>Names in English and Spanish as provided by <a href="http://cldr.unicode.org/translation/displaynames/country-names">Unicode CLDR</a></li>
  <li>Additional information (demographics, capital, area, etc.)</li>
</ul>

<h3 id="codes-included">Codes included</h3>

<table>
  <thead>
    <tr>
      <th>Field</th>
      <th>Description</th>
      <th>Source</th>
      <th>Notes</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">ISO_3166_1</code></td>
      <td>ISO 3166-1 numeric</td>
      <td>Wikipedia</td>
      <td> </td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">ISO_3166_2</code></td>
      <td>ISO 3166-1 alpha-2</td>
      <td>Wikipedia</td>
      <td> </td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">ISO_3166_3</code></td>
      <td>ISO 3166-1 alpha-3</td>
      <td>Wikipedia</td>
      <td> </td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">FIPS_GEC</code></td>
      <td>Geopolitical Entities and Codes (GEC)</td>
      <td>CIA World Factbook</td>
      <td><a href="https://www.cia.gov/library/publications/the-world-factbook/appendix/appendix-d.html">Formerly FIPS 1PUB 10-4</a></td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">STANAG</code></td>
      <td>STANAG 1059 Country Codes</td>
      <td>CIA World Factbook</td>
      <td>Used by NATO</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">M49</code></td>
      <td>UN Country Code</td>
      <td>UN Stats</td>
      <td> </td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">NUTS</code></td>
      <td>NUTS 0 code</td>
      <td>Wikipedia</td>
      <td>Used by EU</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">geonameId</code></td>
      <td>geonameId</td>
      <td>geonames</td>
      <td> </td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">continentcode</code></td>
      <td>geonames Continent Code</td>
      <td>geonames</td>
      <td> </td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">regioncode</code></td>
      <td>UN Regional Code</td>
      <td>UN Stats</td>
      <td> </td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">interregioncode</code></td>
      <td>Interregional Code</td>
      <td>UN Stats</td>
      <td> </td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">subregioncode</code></td>
      <td>Subregion Code</td>
      <td>UN Stats</td>
      <td> </td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">ISO_3166_3.sov</code></td>
      <td>Sovereign code</td>
      <td>Wikipedia, Statoids</td>
      <td>If non-independent</td>
    </tr>
  </tbody>
</table>

<h3 id="other-information-included">Other information included</h3>

<ul>
  <li>Currency</li>
  <li>Dependency status</li>
  <li>Names in English and Spanish for countries, continents, regions and capitals</li>
  <li>Population, area (km<sup>2</sup>) and developed region</li>
</ul>

<h2 id="b-international-organizations-csv">B. International organizations <code class="language-plaintext highlighter-rouge">.csv</code></h2>

<p>A single <code class="language-plaintext highlighter-rouge">.csv</code> file
<a href="https://github.com/dieghernan/Country-Codes-and-International-Organizations/tree/master/outputs/CountrycodesOrgs.csv">(link)</a>
describing the membership status of each country across 186 international
organizations.</p>

<table>
  <thead>
    <tr>
      <th>Field</th>
      <th>Description</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">ISO_3166_2</code></td>
      <td>Matches Countrycodes <code class="language-plaintext highlighter-rouge">.csv</code></td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">ISO_3166_3</code></td>
      <td>Matches Countrycodes <code class="language-plaintext highlighter-rouge">.csv</code></td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">NAME.EN</code></td>
      <td>Matches Countrycodes <code class="language-plaintext highlighter-rouge">.csv</code></td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">source</code></td>
      <td>Main data source</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">org_name</code></td>
      <td>Name of the organization</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">org_id</code></td>
      <td>Abbreviation or internal ID</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">org_member</code></td>
      <td>Membership status</td>
    </tr>
  </tbody>
</table>

<h2 id="c-full-json-file-json">C. Full JSON file <code class="language-plaintext highlighter-rouge">.json</code></h2>

<p>This <code class="language-plaintext highlighter-rouge">.json</code> file
<a href="https://github.com/dieghernan/Country-Codes-and-International-Organizations/tree/master/outputs/Countrycodesfull.json">(link)</a>
combines the previous files:</p>

<div class="language-json highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">[</span><span class="w">
  </span><span class="err">...</span><span class="w">
  </span><span class="p">{</span><span class="w">
    </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">
    </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">
    </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">
    </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">
    </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">
    </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">
    </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">
    </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">
    </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">
    </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">
    </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">
    </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">
    </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">
    </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">
    </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">
    </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">
    </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">
    </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">
    </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">
    </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">
    </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">
    </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">
    </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">
    </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">
    </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">
    </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">
    </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">
    </span><span class="err">...</span><span class="w">
    </span><span class="p">],</span><span class="w">
    </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">
    </span><span class="s2">"member"</span><span class="p">,</span><span class="w">
    </span><span class="err">...</span><span class="w">
    </span><span class="p">]</span><span class="w">
  </span><span class="p">},</span><span class="w">
  </span><span class="err">...</span><span class="w">
</span><span class="p">]</span><span class="w">
</span></code></pre></div></div>

<p>A complementary function (intended to be used in <strong>R</strong>) has been developed:</p>

<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">
                      </span><span class="n">orgtosearch</span><span class="w"> </span><span class="c1">#org id</span><span class="w">
</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w">
  </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">
  </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">
    </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">
  </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">
  </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">
  </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">
  </span><span class="nf">return</span><span class="p">(</span><span class="n">df2</span><span class="p">)</span><span class="w">
</span><span class="p">}</span><span class="w">
</span></code></pre></div></div>

<h2 id="d-data-sources">D. Data sources</h2>

<ul>
  <li>Wikipedia, the free encyclopedia
    <ul>
      <li><a href="https://en.wikipedia.org/wiki/ISO_3166-1">ISO-3166</a></li>
      <li><a href="https://es.wikipedia.org/wiki/Nomenclatura_de_las_Unidades_Territoriales_Estad%C3%ADsticas">NUTS</a></li>
    </ul>
  </li>
  <li><a href="https://www.cia.gov/library/publications/the-world-factbook/index.html">The World Factbook</a> - CIA</li>
  <li><a href="https://unstats.un.org/unsd/methodology/m49/overview/">United Nations Statistical Division</a></li>
  <li><a href="https://www.geonames.org/">geonames</a></li>
  <li><a href="https://restcountries.com/">REST COUNTRIES</a></li>
  <li><a href="https://github.com/unicode-cldr">Unicode Common Locale Data Repository (CLDR) Project</a></li>
  <li><a href="http://www.statoids.com/">http://www.statoids.com/</a></li>
</ul>
</div>
				]]>
			</description>
			<link>https://dieghernan.github.io/projects/Country-Codes-and-International-Organizations/</link>
			<category>projects</category>
		    <category>R</category><category>csv</category><category>dataset</category><category>json</category><category>project</category><category>webscraping</category><media:title type="html"><![CDATA[Country codes & organizations ]]></media:title>
      <media:content url="https://dieghernan.github.io/assets/img/misc/countrycodes.png" medium="image"/>
      <media:thumbnail url="https://dieghernan.github.io/assets/img/misc/countrycodes.png" /><guid isPermaLink="true">https://dieghernan.github.io/projects/Country-Codes-and-International-Organizations/</guid>
      <pubDate>Thu, 11 Apr 2019 00:00:00 +0200</pubDate>
		</item><item>
			<title>Bzel</title>
			<description>
				<![CDATA[	
 				<h3>A Pebble <i class="fas fa-skull-crossbones"></i> project</h3>
    		<p>1 min.</p>
				<div><p><strong>Project discontinued</strong> due to the shutdown of Pebble. {: .alert .alert-danger
.p-3 .mx-2 .mb-3 .lead}</p>

<p><strong>Bzel</strong> integrates the bezel into your watch face. Display minutes as digits,
as a moving dot or as a fill in the bezel.</p>

<p><img src="https://raw.githubusercontent.com/dieghernan/Bzel/master/store/BannerBzel.png" alt="Bzel watch face with minutes displayed around the bezel." /></p>

<p>::: text-center
<a class="btn btn-primary my-3 text-white" href="https://apps.rebble.io/en_US/application/59280895b67f9f43f80004c9" role="button">Download
from Rebble Appstore</a>
:::</p>

<h2 id="features">Features</h2>

<ul>
  <li>Clock mode:
    <ul>
      <li>Digital: Minute display based on analog movement</li>
      <li>Dot: Moving dot as a minute marker</li>
      <li>Bezel: A bar moving around the bezel as a minute marker</li>
    </ul>
  </li>
  <li>Autodetection of 12h/24h mode based on your watch settings</li>
</ul>

<h2 id="take-your-pick">Take your pick</h2>

<ul>
  <li>Pebble Health: Display daily steps.</li>
  <li>Date - Get the weekday based on the language set on your Pebble.</li>
  <li>Weather: Current conditions in °C or °F.</li>
  <li>Choose your weather provider:
    <ul>
      <li><a href="https://www.yahoo.com/?ilc=401">Yahoo.com</a> <em>No API key required at this
moment</em></li>
      <li><a href="https://www.wunderground.com/?apiref=fb6856330e74c168">Wunderground</a></li>
      <li><a href="https://openweathermap.org/">OpenWeatherMap</a></li>
    </ul>
  </li>
  <li>Implementation of <a href="https://www.pmkey.xyz">pmkey.xyz</a></li>
  <li>Location based on your selected weather provider</li>
  <li>Night theme displayed between sunset and sunrise</li>
</ul>

<h2 id="internationalization">Internationalization</h2>

<p>Automatic weekday translation is supported for:</p>

<ul>
  <li>English</li>
  <li>Spanish</li>
  <li>German</li>
  <li>French</li>
  <li>Portuguese</li>
  <li>Italian</li>
</ul>

<h2 id="future-developments">Future developments</h2>

<ul class="task-list">
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" checked="checked" />Location for weather</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" checked="checked" />Square support</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" checked="checked" />New minute mode: bezel</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" checked="checked" />Steps</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" />More health metrics</li>
</ul>

<h2 id="screenshots">Screenshots</h2>

<p>:::::: row
::: {.col-sm .mb-1}</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>    &lt;img src="https://raw.githubusercontent.com/dieghernan/Bzel/master/store/BezelPTR.gif" alt="Animated Bzel watch face on Pebble Time Round."&gt;
</code></pre></div></div>
<p>:::</p>

<p>::: {.col-sm .mb-1}</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>    &lt;img src="https://raw.githubusercontent.com/dieghernan/Bzel/master/store/BezelPT.gif" alt="Animated Bzel watch face on Pebble Time."&gt;
</code></pre></div></div>
<p>:::</p>

<p>::: {.col-sm .mb-1}</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>    &lt;img src="https://raw.githubusercontent.com/dieghernan/Bzel/master/store/BezelBW.gif" alt="Animated Bzel watch face on a monochrome Pebble watch."&gt;
</code></pre></div></div>
<p>:::
::::::</p>

<h2 id="attributions">Attributions</h2>

<h3 id="fonts">Fonts</h3>

<ul>
  <li><a href="https://erikflowers.github.io/weather-icons">Weather Icons</a> by Eric Flowers,
modified and fitted to the regular alphabet instead of Unicode values.</li>
  <li>Custom font for icons created via <a href="http://fontastic.me/">Fontastic</a>.</li>
  <li>Gotham Fonts downloaded from <a href="http://fontsgeek.com">fontsgeek.com</a></li>
</ul>

<h3 id="weather-providers">Weather providers</h3>

<p>:::::: row
::: col
<a href="https://www.yahoo.com/?ilc=401"><img src="https://poweredby.yahoo.com/purple.png" alt="Powered by Yahoo" /></a>
:::</p>

<p>::: col
<a href="https://www.wunderground.com/?apiref=fb6856330e74c168"><img src="https://icons.wxug.com/logos/PNG/wundergroundLogo_4c.png" alt="Weather Underground" width="120" /></a>
:::</p>

<p>::: col
<a href="https://openweathermap.org/"><img src="https://openweathermap.org/themes/openweathermap/assets/vendor/owm/img/icons/logo_60x60.png" alt="OpenWeatherMap" width="60" /></a>
:::
::::::</p>

<h3 id="others">Others</h3>

<p><a href="https://www.pmkey.xyz">Master Key</a> is a service for Pebble users. Get a unique
PIN and add API keys for your favorite online services. Please check
<a href="https://www.pmkey.xyz">www.pmkey.xyz</a> for more info.</p>

<h2 id="license">License</h2>

<p>Developed under license
<a href="https://raw.githubusercontent.com/dieghernan/Bzel/master/LICENSE">MIT</a>.</p>

<p><strong>Made in Madrid, Spain ❤️</strong></p>
</div>
				]]>
			</description>
			<link>https://dieghernan.github.io/projects/Bzel/</link>
			<category>projects</category>
		    <category>C</category><category>discontinued</category><category>javascript</category><category>pebble</category><category>project</category><category>watchface</category><media:title type="html"><![CDATA[Bzel ]]></media:title>
      <media:content url="https://raw.githubusercontent.com/dieghernan/Bzel/master/store/BannerBzel.png" medium="image"/>
      <media:thumbnail url="https://raw.githubusercontent.com/dieghernan/Bzel/master/store/BannerBzel.png" /><guid isPermaLink="true">https://dieghernan.github.io/projects/Bzel/</guid>
      <pubDate>Thu, 25 May 2017 00:00:00 +0200</pubDate>
		</item><item>
			<title>7egment</title>
			<description>
				<![CDATA[	
 				<h3>A Pebble <i class="fas fa-skull-crossbones"></i> project</h3>
    		<p>1 min.</p>
				<div><p class="alert alert-danger p-3 mx-2 mb-3 lead"><strong>Project discontinued</strong> due to the shutdown of Pebble.</p>

<p><strong>7egment</strong> 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.</p>

<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>

<div class="text-center">
<a class="btn btn-primary my-3 text-white" href="https://apps.rebble.io/en_US/application/591ead370dfc32aacf000204?section=watchfaces" role="button">Download from Rebble Appstore</a>
</div>

<h2 id="features">Features</h2>

<ul>
  <li>Autodetection of 12h/24h mode based on your watch settings</li>
  <li>Internationalization: Automatic weekday translation is supported for:
    <ul>
      <li>English</li>
      <li>Spanish</li>
      <li>German</li>
      <li>French</li>
      <li>Portuguese</li>
      <li>Italian</li>
    </ul>
  </li>
</ul>

<h2 id="options">Options</h2>

<ul>
  <li>Choose colors for the background, frame and text</li>
  <li>Three-band design. Make it match your tie!</li>
  <li>Weather: Current conditions in °C or °F.</li>
  <li>Choose your weather provider:
    <ul>
      <li><a href="https://www.wunderground.com">Wunderground</a></li>
      <li><a href="https://openweathermap.org/">OpenWeatherMap</a></li>
    </ul>
  </li>
  <li>Implementation of <a href="https://www.pmkey.xyz">pmkey.xyz</a></li>
  <li>Location based on your selected weather provider</li>
  <li>Bluetooth and GPS warnings</li>
  <li>Night theme displayed between sunset and sunrise</li>
</ul>

<h2 id="screenshots">Screenshots</h2>

<div class="row">
<div class="col-sm mb-1">
        <img src="https://raw.githubusercontent.com/dieghernan/7egment/master/store/PC.gif" alt="Animated 7egment watch face on Pebble Classic." />
</div>
<div class="col-sm mb-1">
        <img src="https://raw.githubusercontent.com/dieghernan/7egment/master/store/PT.gif" alt="Animated 7egment watch face on Pebble Time." />
</div>
<div class="col-sm mb-1">
        <img src="https://raw.githubusercontent.com/dieghernan/7egment/master/store/PTR.gif" alt="Animated 7egment watch face on Pebble Time Round." />
</div>
</div>

<h2 id="attributions">Attributions</h2>

<h3 id="fonts">Fonts</h3>

<ul>
  <li><a href="http://www.keshikan.net/fonts-e.html">DSEG7Modern-Bold</a> by Keshikan けしかん.</li>
  <li><a href="https://fontsgeek.com/fonts/Digital7-Regular">Digital7-Regular</a> downloaded from <a href="http://fontsgeek.com">fontsgeek.com</a></li>
</ul>

<h3 id="weather-providers">Weather providers</h3>

<div class="row">
<div class="col">
<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>
</div>
<div class="col">
<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>
</div>
</div>

<h3 id="others">Others</h3>

<p><a href="https://www.pmkey.xyz">Master Key</a> is a service for Pebble users. Get a unique
PIN and add API keys for your favorite online services. Please check
<a href="https://www.pmkey.xyz">www.pmkey.xyz</a> for more info.</p>

<h2 id="license">License</h2>

<p>Developed under license <a href="https://raw.githubusercontent.com/dieghernan/7egment/master/LICENSE">MIT</a>.</p>

<p><strong>Made in Madrid, Spain ❤️</strong></p>
</div>
				]]>
			</description>
			<link>https://dieghernan.github.io/projects/7egment/</link>
			<category>projects</category>
		    <category>C</category><category>discontinued</category><category>javascript</category><category>pebble</category><category>project</category><category>watchface</category><media:title type="html"><![CDATA[7egment ]]></media:title>
      <media:content url="https://raw.githubusercontent.com/dieghernan/7egment/master/store/Banner.png" medium="image"/>
      <media:thumbnail url="https://raw.githubusercontent.com/dieghernan/7egment/master/store/Banner.png" /><guid isPermaLink="true">https://dieghernan.github.io/projects/7egment/</guid>
      <pubDate>Wed, 17 May 2017 00:00:00 +0200</pubDate>
		</item><item>
			<title>Sfera</title>
			<description>
				<![CDATA[	
 				<h3>A Pebble <i class="fas fa-skull-crossbones"></i> project</h3>
    		<p>1 min.</p>
				<div><p class="alert alert-danger p-3 mx-2 mb-3 lead"><strong>Project discontinued</strong> due to the shutdown of Pebble.</p>

<p><strong>Sfera</strong> 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.</p>

<p><img src="https://raw.githubusercontent.com/dieghernan/Sfera/master/assets/SferaBanner.png" alt="Sfera watch face on Pebble Time Round." /></p>

<div class="text-center">
<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" role="button">Download from Rebble Appstore</a>
</div>

<h2 id="features">Features</h2>

<ul>
  <li>Clock mode:
    <ul>
      <li>Analog: Classic analog watch face</li>
      <li>Digital: Centered hour and minute display based on analog movement</li>
      <li>Dual: Analog and digital, all in one</li>
      <li>Mix: Digital hour and analog minute</li>
    </ul>
  </li>
  <li>Autodetection of 12h/24h mode based on your watch settings</li>
</ul>

<h2 id="take-your-pick">Take your pick</h2>

<ul>
  <li>Date - Get the weekday based on the language set on your Pebble.</li>
  <li>Dots as minute markers - choose your color</li>
  <li>Battery level displayed beautifully as an arc near the bezel. Choose your color and, below 20%, it turns red!</li>
  <li>Weather: Current conditions in °C or °F.</li>
  <li>Choose your weather provider:
    <ul>
      <li><a href="https://www.yahoo.com/?ilc=401">Yahoo.com</a> <em>No API key required at this moment</em></li>
      <li><a href="https://www.wunderground.com/?apiref=fb6856330e74c168">Wunderground</a></li>
      <li><a href="https://openweathermap.org/">OpenWeatherMap</a></li>
    </ul>
  </li>
  <li>Implementation of <a href="https://www.pmkey.xyz">pmkey.xyz</a></li>
  <li>Location based on your selected weather provider</li>
  <li>Night theme displayed between sunset and sunrise</li>
</ul>

<h2 id="internationalization">Internationalization</h2>

<p>Automatic weekday translation is supported for:</p>

<ul>
  <li>English</li>
  <li>Spanish</li>
  <li>German</li>
  <li>French</li>
  <li>Portuguese</li>
  <li>Italian</li>
</ul>

<h2 id="future-developments">Future developments</h2>

<ul class="task-list">
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" checked="checked" />12/24h mode</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" checked="checked" />Night theme</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" checked="checked" />Several weather providers available</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" checked="checked" /><a href="https://www.pmkey.xyz">pmkey.xyz</a> implemented for easy API key management</li>
</ul>

<h2 id="screenshots">Screenshots</h2>

<p><img src="https://raw.githubusercontent.com/dieghernan/Sfera/master/assets/SferaGif.gif" alt="Animated Sfera watch face on Pebble Time Round." /></p>

<h2 id="attributions">Attributions</h2>

<h3 id="fonts">Fonts</h3>

<ul>
  <li><a href="https://erikflowers.github.io/weather-icons">Weather Icons</a> by Eric Flowers,
modified and fitted to the regular alphabet instead of Unicode values.</li>
  <li>Custom font for icons created via <strong>Fontastic</strong> downloaded from <a href="http://fontsgeek.com">fontsgeek.com</a></li>
</ul>

<h3 id="weather-providers">Weather providers</h3>

<div class="row">
<div class="col">
<a href="https://www.yahoo.com/?ilc=401"><img src="https://poweredby.yahoo.com/purple.png" alt="Powered by Yahoo" /></a>
</div>
<div class="col">
<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>
</div>
<div class="col">
<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>
</div>
</div>

<h3 id="others">Others</h3>

<p><a href="https://www.pmkey.xyz">Master Key</a> is a service for Pebble users. Get a unique
PIN and add API keys for your favorite online services. Please check
<a href="https://www.pmkey.xyz">www.pmkey.xyz</a> for more info.</p>

<h2 id="license">License</h2>

<p>Developed under license <a href="https://raw.githubusercontent.com/dieghernan/Sfera/master/LICENSE">MIT</a>.</p>

<p><strong>Made in Madrid, Spain ❤️</strong></p>
</div>
				]]>
			</description>
			<link>https://dieghernan.github.io/projects/Sfera/</link>
			<category>projects</category>
		    <category>C</category><category>discontinued</category><category>javascript</category><category>pebble</category><category>project</category><category>watchface</category><media:title type="html"><![CDATA[Sfera ]]></media:title>
      <media:content url="https://raw.githubusercontent.com/dieghernan/Sfera/master/assets/SferaBanner.png" medium="image"/>
      <media:thumbnail url="https://raw.githubusercontent.com/dieghernan/Sfera/master/assets/SferaBanner.png" /><guid isPermaLink="true">https://dieghernan.github.io/projects/Sfera/</guid>
      <pubDate>Tue, 14 Mar 2017 00:00:00 +0100</pubDate>
		</item><item>
			<title>TextWatch Clima</title>
			<description>
				<![CDATA[	
 				<h3>A Pebble <i class="fas fa-skull-crossbones"></i> project</h3>
    		<p>1 min.</p>
				<div><p class="alert alert-danger p-3 mx-2 mb-3 lead"><strong>Project discontinued</strong> due to the shutdown of Pebble.</p>

<p><strong>TextWatch Clima</strong> upgrades the classic TextWatch watch face by adding a set of
new capabilities.</p>

<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>

<p><strong>Available for all the Classic, Time and Pebble 2 models</strong></p>

<div class="text-center">
<a class="btn btn-primary my-3 text-white" href="https://apps.rebble.io/en_US/application/58a94da90dfc32d35b0002f8?section=watchfaces" role="button">Download from Rebble Appstore</a>
</div>

<h2 id="features">Features</h2>

<ul>
  <li>Exact time in natural language</li>
  <li>Autofit to screen</li>
</ul>

<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>

<h2 id="take-your-pick">Take your pick</h2>

<ul>
  <li>Date format: Day Month / Month Day</li>
  <li>Fuzzy time option</li>
  <li>Text animation</li>
  <li>Language
    <ul>
      <li>Spanish</li>
      <li>English</li>
      <li>German (thanks to <a href="https://github.com/rodher">rodher</a>)</li>
      <li>French</li>
      <li>Italian</li>
      <li>Portuguese</li>
      <li>Norwegian</li>
      <li>Danish</li>
      <li>Swedish</li>
      <li>Esperanto</li>
      <li>Dutch</li>
      <li>Catalan * <em>More available on request</em></li>
    </ul>
  </li>
  <li>Battery bar display</li>
  <li>Weather: Current conditions in °C or °F.</li>
  <li>Night theme displayed between sunset and sunrise</li>
  <li>Choose your weather provider:
    <ul>
      <li><strong>Yahoo</strong> <em>No API key required at this moment</em></li>
      <li><strong><a href="https://www.wunderground.com/?apiref=fb6856330e74c168">Wunderground</a></strong></li>
      <li><strong><a href="https://openweathermap.org/">OpenWeatherMap</a></strong></li>
    </ul>
  </li>
  <li><strong>Implementation of <a href="https://www.pmkey.xyz">pmkey.xyz</a></strong></li>
</ul>

<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>

<h2 id="future-developments">Future developments</h2>

<ul class="task-list">
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" checked="checked" />Fuzzy time</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" checked="checked" />Battery</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" checked="checked" />Option for animations</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" checked="checked" />Option for non-pmkey users</li>
  <li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" disabled="disabled" checked="checked" />More languages (Swedish, Esperanto…)</li>
</ul>

<h2 id="attributions">Attributions</h2>

<h3 id="fonts">Fonts</h3>

<ul>
  <li><a href="https://erikflowers.github.io/weather-icons">Weather Icons</a> by Eric Flowers,
modified and fitted to the regular alphabet instead of Unicode values.</li>
  <li>Custom font for icons created via <a href="http://fontastic.me/">Fontastic</a>.</li>
  <li>Gotham Fonts downloaded from <a href="http://fontsgeek.com">fontsgeek.com</a></li>
</ul>

<h3 id="weather-providers">Weather providers</h3>

<div class="row">
<div class="col">
<a href="https://www.yahoo.com/?ilc=401"><img src="https://poweredby.yahoo.com/purple.png" alt="Powered by Yahoo" /></a>
</div>
<div class="col">
<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>
</div>
<div class="col">
<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>
</div>
</div>

<h3 id="others">Others</h3>

<ul>
  <li><a href="https://www.pmkey.xyz">Master Key</a> is a service for Pebble users. Get a
unique PIN and add API keys for your favorite online services. Please check
<a href="https://www.pmkey.xyz">www.pmkey.xyz</a> for more info.</li>
  <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>
</ul>

<h2 id="screenshots">Screenshots</h2>

<div class="row">
<div class="col-sm mb-1">
        <img src="https://raw.githubusercontent.com/dieghernan/TextWatchClima/master/store/ScrShClass.gif" alt="Animated TextWatch Clima watch face on Pebble Classic." />
</div>
<div class="col-sm mb-1">
        <img src="https://raw.githubusercontent.com/dieghernan/TextWatchClima/master/store/ScrShTime.gif" alt="Animated TextWatch Clima watch face on Pebble Time." />
</div>
<div class="col-sm mb-1">
        <img src="https://raw.githubusercontent.com/dieghernan/TextWatchClima/master/store/ScrShRound.gif" alt="Animated TextWatch Clima watch face on Pebble Time Round." />
</div>
</div>

<h2 id="license">License</h2>

<p>Developed under license <a href="https://github.com/dieghernan/TextWatchES_Weather/blob/master/MIT%20License">MIT</a>.</p>

<p><strong>Made in Madrid, Spain ❤️</strong></p>
</div>
				]]>
			</description>
			<link>https://dieghernan.github.io/projects/TextWatchClima/</link>
			<category>projects</category>
		    <category>C</category><category>discontinued</category><category>javascript</category><category>pebble</category><category>project</category><category>watchface</category><media:title type="html"><![CDATA[TextWatch Clima ]]></media:title>
      <media:content url="https://raw.githubusercontent.com/dieghernan/TextWatchClima/master/store/BannerRound.png" medium="image"/>
      <media:thumbnail url="https://raw.githubusercontent.com/dieghernan/TextWatchClima/master/store/BannerRound.png" /><guid isPermaLink="true">https://dieghernan.github.io/projects/TextWatchClima/</guid>
      <pubDate>Thu, 16 Feb 2017 00:00:00 +0100</pubDate>
		</item></channel>
</rss>