Chulapa
2026-03-14T21:01:57+01:00
https://dieghernan.github.io/atom.xml
One world | Projects, maps and coding
Projects, maps and coding
dieghernan
https://x.com/dhernangomez
(c) 2026, dieghernan
https://dieghernan.github.io/assets/img/favicons/android-chrome-72x72.png
https://dieghernan.github.io/assets/img/site/banner.png
Introducing geobounds
2026-02-12T00:00:00+01:00
2026-02-12T00:00:00+01:00
https://dieghernan.github.io/202602_geobounds/
<img src='https://dieghernan.github.io/assets/img/blog/202602-overlaps-1.webp' >
<p>3 min.</p>
<p>If you’ve ever worked with spatial data in R, 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 to access 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 <code class="language-plaintext highlighter-rouge">sf</code> objects with a single function call. No manual downloads. No
shapefile messing.</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">|></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="" 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">|></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="" 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">|></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 & 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 overlapping in 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="" 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">|></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 & 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="" 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"><-</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">|></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">#> 26.5 Mb</span><span class="w">
</span><span class="n">norway_simp</span><span class="w"> </span><span class="o"><-</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">|></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">#> 1.5 Mb</span><span class="w">
</span><span class="n">norway_all</span><span class="w"> </span><span class="o"><-</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 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="" 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 geobounds?</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">rnaturalearth</h3>
<p>A very popular package to access Natural Earth datasets directly from R. 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">giscoR</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">osmdata</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 would help you in your GIS joruney.</p>
<p>Happy mapping!</p>
dieghernanhttps://x.com/dhernangomez
<p>If you’ve ever worked with spatial data in R, this may ring a bell…</p>
Mapping Antarctica
2025-10-25T00:00:00+02:00
2025-10-25T00:00:00+02:00
https://dieghernan.github.io/202510_mapping-antarctica/
<h3>Cool maps from the South Pole</h3>
<img src='https://dieghernan.github.io/assets/img/blog/202510_good_pol-1.webp' >
<p>6 min.</p>
<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"><-</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">%>%</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">|></span><span class="w">
</span><span class="c1"># Ortho proj centered in 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" width="100%" /></p>
<p>The shapefile contains a visible “lollipop” cut that looks unnatural in an
orthographic projection. I correct it manually by:</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 max</span><span class="w">
</span><span class="n">ant_explode</span><span class="w"> </span><span class="o"><-</span><span class="w"> </span><span class="n">antarct</span><span class="w"> </span><span class="o">|></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">#> [1] 778</span><span class="w">
</span><span class="c1"># Max polygon</span><span class="w">
</span><span class="n">ant_max</span><span class="w"> </span><span class="o"><-</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"><-</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">|></span><span class="w">
</span><span class="n">as_tibble</span><span class="p">()</span><span class="w"> </span><span class="o">|></span><span class="w">
</span><span class="c1"># Add id for 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" 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"><-</span><span class="w"> </span><span class="n">coords</span><span class="w"> </span><span class="o">|></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">|></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" 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">|></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">|></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">|></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">|></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" width="50%" /><img src="https://dieghernan.github.io/assets/img/blog/202510_final_sol-2.webp" 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"><-</span><span class="w"> </span><span class="n">coords</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="w"> </span><span class="o">|></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">|></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">|></span><span class="w">
</span><span class="n">as.matrix</span><span class="p">()</span><span class="w"> </span><span class="o">|></span><span class="w">
</span><span class="nf">list</span><span class="p">()</span><span class="w"> </span><span class="o">|></span><span class="w">
</span><span class="n">st_polygon</span><span class="p">()</span><span class="w"> </span><span class="o">|></span><span class="w">
</span><span class="n">st_sfc</span><span class="p">()</span><span class="w"> </span><span class="o">|></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"><-</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"><-</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">|></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">|></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">|></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">|></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">#> Simple feature collection with 1 feature and 1 field</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: -2583099 ymin: -2458296 xmax: 2690846 ymax: 2233395</span><span class="w">
</span><span class="c1">#> Projected CRS: +proj=ortho +lat_0=-90 +lon_0=0</span><span class="w">
</span><span class="c1">#> # A tibble: 1 × 2</span><span class="w">
</span><span class="c1">#> NAME geometry</span><span class="w">
</span><span class="c1">#> * <chr> <MULTIPOLYGON [m]></span><span class="w">
</span><span class="c1">#> 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" 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"><-</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">|></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" 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"><-</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">|></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">|></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" 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; 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"><-</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"><-</span><span class="w"> </span><span class="n">grats</span><span class="w"> </span><span class="o">|></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">|></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"><-</span><span class="w"> </span><span class="n">df</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="w"> </span><span class="o">|></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">|></span><span class="w">
</span><span class="n">st_union</span><span class="p">()</span><span class="w"> </span><span class="o">|></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"><-</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">|></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"><-</span><span class="w"> </span><span class="n">merid</span><span class="w"> </span><span class="o">|></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">|></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"><-</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"><-</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"><-</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">|></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" 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" /></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">#> Simple feature collection with 1 feature and 1 field</span><span class="w">
</span><span class="c1">#> Geometry type: POLYGON</span><span class="w">
</span><span class="c1">#> Dimension: XY</span><span class="w">
</span><span class="c1">#> Bounding box: xmin: -2447764 ymin: -2125910 xmax: 2690846 ymax: 2233395</span><span class="w">
</span><span class="c1">#> Projected CRS: +proj=ortho +lat_0=-90 +lon_0=0</span><span class="w">
</span><span class="c1">#> NAME geometry</span><span class="w">
</span><span class="c1">#> 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"><-</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">|></span><span class="w">
</span><span class="n">st_union</span><span class="p">()</span><span class="w"> </span><span class="o">|></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">|></span><span class="w">
</span><span class="n">st_collection_extract</span><span class="p">()</span><span class="w"> </span><span class="o">|></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"><-</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">|></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"><-</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">|></span><span class="w">
</span><span class="n">st_as_sf</span><span class="p">()</span><span class="w"> </span><span class="o">|></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" 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"><-</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">|></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"><-</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"><-</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">></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"><-</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" width="100%" /></p>
dieghernanhttps://x.com/dhernangomez
<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>
Implementing <code>group_by</code> count in Liquid
2025-02-28T00:00:00+01:00
2025-02-28T00:00:00+01:00
https://dieghernan.github.io/202502_liquid-group-by/
<h3>See the magic happening</h3>
<img src='https://dieghernan.github.io/assets/img/blog/og_jekyll.webp' >
<p>5 min.</p>
<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">=>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 on Jekyll <code class="language-plaintext highlighter-rouge">=>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"><!-- Jekyll < 4.1.0 result --></span>
{"name"=>"tag A", "items"=>["tag A"], "size"=>1}{"name"=>"Tag B", "items"=>["Tag B"], "size"=>1}{"name"=>"Virtualbox", "items"=>["Virtualbox"], "size"=>1}{"name"=>"netcat", "items"=>["netcat"], "size"=>1}{"name"=>"whois", "items"=>["whois"], "size"=>1}{"name"=>"dig", "items"=>["dig"], "size"=>1} ... {"name"=>"Hydra", "items"=>["Hydra"], "size"=>1}
<span class="c"><!-- Jekyll >= 4.1.0 result --></span>
{"name"=>"", "items"=>["tag A", "Tag B", "Virtualbox", "netcat", "whois", "dig", ... , "Hydra"], "size"=>26}
</code></pre></div></div>
<p>So basically, counting items was not easy anymore. I developed a solution in
pure Liquid (which happens to be a quite verbose language out of 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,
hence they may change as I add more posts. The results of the table should
be the same as the 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"><!-- Allocating array to group_by: replacement --></span>
<span class="c"><!-- Unique values --></span>
{% assign single_tags = alltags | uniq %}
<span class="c"><!-- Arrays to populate --></span>
{% assign count_tags = '' | split: ',' %}
<span class="c"><!-- Iterator 0 to number of unique tags - 1 (size = number of unique tags) --></span>
{% assign n_tags = single_tags | size | minus: 1 %}
{% for i in (0..n_tags) %}
<span class="c"><!-- Populate --></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"><!-- Display single_tags and count_tags as a table --></span>
<span class="nt"><table></span>
<span class="nt"><caption></span>Display count of tags on this site <span class="nt"></caption></span>
<span class="nt"><tr></span>
<span class="nt"><th></span>Tag<span class="nt"></th></span>
<span class="nt"><th></span>Count<span class="nt"></th></span>
<span class="nt"></tr></span>
{% for i in (0..n_tags) %}
<span class="nt"><tr></span>
<span class="nt"><td></span>{{ single_tags[i] }}<span class="nt"></td></span>
<span class="nt"><td></span>{{ count_tags[i] }}<span class="nt"></td></span>
<span class="nt"></tr></span>
{% endfor %}
<span class="nt"></table></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>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>webscrapping</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 if a tag presents the number of occurrences in the main loop:</p>
<div class="language-html highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"><!-- Used in https://github.com/mmistakes/minimal-mistakes/blob/master/_includes/posts-taxonomy.html --></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"><table></span>
<span class="nt"><caption></span>Display sorted count of tags on this site <span class="nt"></caption></span>
<span class="nt"><tr></span>
<span class="nt"><th></span>Tag<span class="nt"></th></span>
<span class="nt"><th></span>Count (desc sorted)<span class="nt"></th></span>
<span class="nt"></tr></span>
{%- for i in (0..n_tags) %}
<span class="nt"><tr></span>
<span class="nt"><td></span>{{ sorted_tags[i] }}<span class="nt"></td></span>
<span class="nt"><td></span>{{ sorted_count_tags[i] }}<span class="nt"></td></span>
<span class="nt"></tr></span>
{%- endfor -%}
<span class="nt"></table></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>webscrapping</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"><!-- Counting --></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"><!-- Extra: sort --></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>
dieghernanhttps://x.com/dhernangomez
This post explains implementing group_by count in Liquid for Jekyll,
addressing issues with Jekyll 4.1.0 and providing a solution.
Happy Valentine’s Day
2025-02-17T00:00:00+01:00
2025-02-17T00:00:00+01:00
https://dieghernan.github.io/202502_st_valentine/
<h3>Do you know the Bonne projection?</h3>
<img src='https://dieghernan.github.io/assets/img/blog/202402_bonne_proj.webp' >
<p>1 min.</p>
<p>Do you know the <a href="https://en.wikipedia.org/wiki/Bonne_projection">Bonne
Projection</a>? This is a very
special one, as used on whole world’s mapping produces this result. 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"><-</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"><-</span><span class="w"> </span><span class="n">world</span><span class="w"> </span><span class="o">%>%</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">%>%</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">%>%</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="Happy Valentine's Day" width="100%" /></p>
dieghernanhttps://x.com/dhernangomez
<p>Do you know the <a href="https://en.wikipedia.org/wiki/Bonne_projection">Bonne
Projection</a>? This is a very
special one, as used on whole world’s mapping produces this result. Happy
Valentine’s Day!</p>
Optimize your images with R and reSmush.it
2024-02-05T00:00:00+01:00
2024-02-05T00:00:00+01:00
https://dieghernan.github.io/202402_optimize-images-r/
<h3>Introducing the resmush package</h3>
<img src='https://dieghernan.github.io/assets/img/misc/compress-img.png' >
<p>5 min.</p>
<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 on WordPress, Drupal, or 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
serves as well as 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="Ko-fi reSmush.it donations" class="kofiimg" />Support reSmush.it on Ko-fi</span></a>
</div>
<h2 id="why-the-resmush-package">Why the resmush 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 5Mb 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 would discuss <a href="#other-alternatives">at the end of this
post</a>, but in one line, the reSmush.it API performs fast
with minimal configuration for a wide range of formats without needing an API
key.</p>
<h2 id="using-the-resmush-package">Using the resmush 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"><-</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">%>%</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"><-</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"><-</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="Original file" 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>Cool, but the file has a size of 1.7 Mb. So we can use <code class="language-plaintext highlighter-rouge">resmush_file()</code> to
reduce it, see:</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">#> ══ resmush summary ══════════════════════════════════════════</span><span class="w">
</span><span class="c1">#> ℹ Input: 1 file with size 1.7 Mb</span><span class="w">
</span><span class="c1">#> ✔ 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">#> 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">%>%</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="Optimized file" 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 resmushed 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="Original online figure" />
</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="Optimized figure" />
</a>
<p class="caption">
Original picture (left/top) 1.7 Mb and optimized picture (right/bottom) 762.2 Kb
(Compression 55.46%). Click in 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"><-</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">%>%</span><span class="w">
</span><span class="n">`class<-`</span><span class="p">(</span><span class="s2">"object_size"</span><span class="p">)</span><span class="w"> </span><span class="o">%>%</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"><-</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">%>%</span><span class="w">
</span><span class="n">`class<-`</span><span class="p">(</span><span class="s2">"object_size"</span><span class="p">)</span><span class="w"> </span><span class="o">%>%</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"><-</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">%>%</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"><-</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">%>%</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">%>%</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"><-</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"><-</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="Original online figure" />
</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="Optimized online figure" />
</a>
<p class="caption">
Original picture (left/top) 1.3 Mb and optimized picture (right/bottom) 985 Kb
(Compression 26.63%). Click in 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: Formats admitted.</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>
dieghernanhttps://x.com/dhernangomez
Compress the size of your images with R, resmush and reSmush.it
Beautiful Maps with R (V): Point densities
2023-12-16T00:00:00+01:00
2023-12-16T00:00:00+01:00
https://dieghernan.github.io/202312_bertin_dots/
<h3>Bertin’s dot density maps with R and GHSL</h3>
<img src='https://dieghernan.github.io/assets/img/blog/202312_finalmap.webp' >
<p>8 min.</p>
<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="Jacques Bertin, Sémiologie graphique. Les diagrammes. Les réseaux. Les cartes
(1967)" /></p>
<p>In this post I would create a similar map for Iberia, and additionally I would
show how to create a variation using a hexagonal grid instead of a rectangular
one. This is the first 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 would 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 would use as a
base a circular layout with Iberia in the middle (that would be our observation
window), so we can get the corresponding shapes and create a buffer around it.</p>
<p>After that, we would extract the population spatial distribution from <a href="https://ghsl.jrc.ec.europa.eu/download.php">GHSL -
Global Human Settlement Layer</a>. We
would use the global file with a resolution of 1 km on 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 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"><-</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">%>%</span><span class="w">
</span><span class="n">st_geometry</span><span class="p">()</span><span class="w"> </span><span class="o">%>%</span><span class="w">
</span><span class="n">st_union</span><span class="p">()</span><span class="w"> </span><span class="o">%>%</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">%>%</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">%>%</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"><-</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">%>%</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">%>%</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"><-</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">%>%</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">%>%</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"><-</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="plot of chunk 202312_basemap" /></p>
<p>That would be our base map. Now we download programmatically the GHSL data and
we would 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
would allow 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"><-</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 would store the file, you would need to modify the folder</span><span class="w">
</span><span class="n">fname</span><span class="w"> </span><span class="o"><-</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"><-</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">#> Name Length Date</span><span class="w">
</span><span class="c1">#> 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">#> 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">#> 3 GHSL_Data_Package_2023.pdf 9761851 2023-10-27 14:30:00</span><span class="w">
</span><span class="c1">#> 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"><-</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"><-</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"><-</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"><-</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">#> [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="plot of chunk 202312_base_raster-1" /></p>
<h2 id="data-wrangling">Data wrangling</h2>
<p>The GHSL information contains the estimated population on each grid. However the
file has a high resolution (more than 2 millions of 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 that we aggregate, we would 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 would use categories for the
final map, so we would 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">#> [1] 1511</span><span class="w">
</span><span class="n">factor</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">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 would contain 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"><-</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"><-</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"><-</span><span class="w"> </span><span class="n">pop_agg</span><span class="w"> </span><span class="o">%>%</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">%>%</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">%>%</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">%>%</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">%>%</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"><</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"><</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"><</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"><</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"><</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"><</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 would 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"><-</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">"< 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">"<span style='color:grey'>Inhabitants per km<sup>2</sup></span>"</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="plot of chunk 202312_base_raster-1" /></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, that is,
by definition, a rectangular grid. I would like also to experiment with
hexagonal grids (i.e. grid of hexagons) since I have the feeling that looks more
“natural” than the rectangular ones, that presents a regularity hardly seen in
the wild.</p>
<p>The issue here is that <code class="language-plaintext highlighter-rouge">terra</code> does not produce this type of grids, however it
is possible to create them with <code class="language-plaintext highlighter-rouge">sf::st_make_grid()</code>, so the workflow for this
altenative is:</p>
<ol>
<li>Create a hexagonal grid, where each hexagon represents a similar area than
each cell on the aggregated raster.</li>
<li>Extract the values of the raster to the new grid.</li>
<li>Finally, follow the same steps on data wrangling and plotting.</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. Luckly, 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"><-</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">%>%</span><span class="w">
</span><span class="n">pull</span><span class="p">()</span><span class="w"> </span><span class="o">%>%</span><span class="w">
</span><span class="n">mean</span><span class="p">()</span><span class="w"> </span><span class="o">%>%</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">#> 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"><-</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"><-</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">#> [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">#> [1] 10100</span><span class="w">
</span><span class="n">area_km2</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">pop_agg_sf</span><span class="p">)</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="s2">"km^2"</span><span class="p">)</span><span class="w"> </span><span class="o">%>%</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"><-</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 on each hexagonal grid.</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"><-</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">%>%</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">></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="plot of chunk 202312_base_raster-1" /></p>
<p>Finally we just compute densities, create categories and finally 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"><-</span><span class="w"> </span><span class="n">pop_agg_sf</span><span class="w"> </span><span class="o">%>%</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">%>%</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">%>%</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">%>%</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">%>%</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"><</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"><</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"><</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"><</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"><</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"><</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"><-</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">"< 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">"<span style='color:grey'>Inhabitants per km<sup>2</sup></span>"</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="plot of chunk 202312_finalmap_hex" /></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>
dieghernanhttps://x.com/dhernangomez
Another way to represent demographics on a map.
Star Map with R
2023-01-25T00:00:00+01:00
2023-01-25T00:00:00+01:00
https://dieghernan.github.io/202301_star-map-R/
<h3>Creating Star Map Visualizations Based on Location and Date</h3>
<img src='https://dieghernan.github.io/celestial_data/assets/img/ogimage.webp' >
<p>13 min.</p>
<p>A couple of weeks ago I was doing my daily check on
<a href="https://stackoverflow.com/questions/tagged/sf">StackOverflow</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>? Answer is: Of course! In fact, <a href="https://kimnewzealand.github.io/">Kim
Fitter</a> already worked on this two years ago,
see his <a href="https://kimnewzealand.github.io/2019/02/21/celestial-maps/">Celestial
Maps</a>. So I decided
to put some work on this.</p>
<p>Since then, I also learnt that Benjamin and myself have been working on parallel
on the same topic. He is preparing a <strong>R</strong> package named
<a href="https://github.com/benyamindsmith/starBliss"><code class="language-plaintext highlighter-rouge">starBliss</code></a> and hopefully this
post would be of some help.</p>
<p class="alert alert-info p-3 mx-2 mb-3">I have very little knowledge on this topic, so if you find errors or
have any suggestions please let me know in the <strong>Comments</strong> section below</p>
<h2 id="first-things-first-the-data">First things first: The data</h2>
<p>The initial data source of all these projects (Kim, Benjamin and myself) is the
same, and it is provided on 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 on
<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 <code class="language-plaintext highlighter-rouge">sf</code>
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 (some of them as the
corresponding to the Milky Way or 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>, that provides all these
files on several spatial formats. Please <a href="https://github.com/dieghernan/celestial_data">check out the
repo</a> to know more about it.</p>
<h2 id="creating-a-star-map-with-r">Creating a Star Map with R</h2>
<p>The first step is loading a bunch of libraries that would help us on 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">## Wrange 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-funs">Helper funs</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 labeller 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"><-</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"><-</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"><-</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"><-</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"><-</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"><-</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</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"><-</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"><-</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"><-</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"><-</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"><-</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"><-</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">></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"><-</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">></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"><-</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>,
that I ported to <strong>R</strong> (<code class="language-plaintext highlighter-rouge">get_mst()</code>). As per some of the research that I did
this function computes the <a href="https://en.wikipedia.org/wiki/Sidereal_time">Mean Sidereal
Time</a> (MST) given a specific
longitude (maybe then is more accurate Local Sidereal Time? Just wondering)
expressed in degrees, following the formulas provided by Meeus (1998). If you
want to know more on 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>
<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 would use to adjust the projection of
our Star Map. This would provide the rotation observed on <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"><-</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"><-</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"><-</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"><-</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"><-</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"><-</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"><-</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"><-</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"><-</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"><-</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">></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"><-</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"><-</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"><-</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"><-</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"><-</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"><-</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"><-</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"><-</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"><-</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 an spherical outline. That means that we would need
to perform an 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 <code class="language-plaintext highlighter-rouge">s2</code> 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"><-</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"><-</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"><-</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"><-</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"><-</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"><-</span><span class="w"> </span><span class="n">the_geom</span><span class="w"> </span><span class="o">%>%</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">%>%</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">%>%</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">%>%</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">%>%</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">%>%</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"><-</span><span class="w"> </span><span class="n">the_cut</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_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"><-</span><span class="w"> </span><span class="n">the_cut</span><span class="w"> </span><span class="o">%>%</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"><-</span><span class="w"> </span><span class="n">the_cut</span><span class="w"> </span><span class="o">%>%</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">%>%</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, that we would geocode with <code class="language-plaintext highlighter-rouge">nominatimlite</code>.</p>
</li>
<li>
<p>A specific moment of 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"><-</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"><-</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"><-</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">%>%</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">#> # A tibble: 1 × 3</span><span class="w">
</span><span class="c1">#> address lat lon</span><span class="w">
</span><span class="c1">#> <chr> <dbl> <dbl></span><span class="w">
</span><span class="c1">#> 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"><-</span><span class="w"> </span><span class="n">desired_place_geo</span><span class="w"> </span><span class="o">%>%</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">%>%</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">#> lat lon </span><span class="w">
</span><span class="c1">#> 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 now the latitude and
longitude of our desired location, we can easily get that with the <code class="language-plaintext highlighter-rouge">lutz</code>
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">#> [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"><-</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">#> [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"><-</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">#> [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 creates this kind of maps (I won’t post links) includes
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">#> [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">%>%</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">#> [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, that would help us to
crop the celestial data objects.</p>
<p>I noticed also 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"><-</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"><-</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">#> lon lat </span><span class="w">
</span><span class="c1">#> 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"><-</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">#> [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"><-</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"><-</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"><-</span><span class="w"> </span><span class="n">hemisphere_s2</span><span class="w"> </span><span class="o">%>%</span><span class="w">
</span><span class="n">st_as_sf</span><span class="p">()</span><span class="w"> </span><span class="o">%>%</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">%>%</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 selected 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"><-</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"><-</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"><-</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="plot of chunk 20230125_mw" 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"><-</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="plot of chunk 20230125_mw" 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"><-</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="plot of chunk 20230125_const" 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"><-</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="plot of chunk 20230125_const" 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"><-</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="plot of chunk 20230125_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"><-</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="plot of chunk 20230125_stars" width="100%" /></p>
<h3 id="graticules">Graticules</h3>
<p>We are going also to include graticules, so the Earth 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"><-</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="plot of chunk 20230125_grat" 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 dont 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"><-</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="plot of chunk 20230125_grat" width="100%" /></p>
<h2 id="visualization-with-ggplot2">Visualization with <code class="language-plaintext highlighter-rouge">ggplot2</code></h2>
<p>We are almost set! For preparing the final map, first we are going to create the
corresponding labels, that would be included as <code class="language-plaintext highlighter-rouge">caption</code> on the <code class="language-plaintext highlighter-rouge">ggplot2</code> 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"><-</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"><-</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"><-</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">#> 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"><-</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">#> 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"><-</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">#> STAR MAP</span><span class="w">
</span><span class="c1">#> MADRID, SPAIN</span><span class="w">
</span><span class="c1">#> 22 SEP 2015 03:45 CEST</span><span class="w">
</span><span class="c1">#> 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 to 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
<code class="language-plaintext highlighter-rouge">ggshadow</code> 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"><-</span><span class="w"> </span><span class="n">const_end</span><span class="w"> </span><span class="o">%>%</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">%>%</span><span class="w">
</span><span class="n">st_coordinates</span><span class="p">()</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="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="plot of chunk 20230125_celestial_map" 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 on 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 whole 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"><-</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"><-</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">%>%</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">%>%</span><span class="w">
</span><span class="n">st_coordinates</span><span class="p">()</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="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="plot of chunk 20230125_celestial_map_cn" 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 the
<a href="https://www.jsdelivr.com/">jsDelivr</a>, that distribute 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">↑</a></p>
</li>
</ol>
</div>
dieghernanhttps://x.com/dhernangomez
<p>A couple of weeks ago I was doing my daily check on
<a href="https://stackoverflow.com/questions/tagged/sf">StackOverflow</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>
Celestial Data
2023-01-23T00:00:00+01:00
2023-01-23T00:00:00+01:00
https://dieghernan.github.io/projects/celestial-data/
<h3>A compilation of celestial data files</h3>
<img src='https://dieghernan.github.io/celestial_data/assets/img/ogimage.webp' >
<p>1 min.</p>
<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 in GeoJSON and GeoPackage
format of celestial objects as of J2000 epoch.</p>
<p>The original files were provided on 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 on this project consists on the same data provided on
<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 to \([-180, -90, 180, 90]\).</p>
</li>
<li>
<p>Date is provided on WGS84 - World Geodetic System 1984
(<a href="https://epsg.io/4326">EPSG:4326</a>).</p>
</li>
<li>
<p>All geometries 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"><!-- From GitHub --></span>
https://raw.githubusercontent.com/dieghernan/celestial_data/main/data/mw.min.geojson
<span class="c"><!-- From the Website --></span>
https://dieghernan.github.io/celestial_data/data/mw.min.geojson
<span class="c"><!-- From jsDelivr --></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 is provided in GeoJSON (<code class="language-plaintext highlighter-rouge">*.geojson</code>) and GeoPackage (<code class="language-plaintext highlighter-rouge">*.gpkg</code>) format.
Additionally, for GeoJSON formats a minified version (<code class="language-plaintext highlighter-rouge">*.min.geojson</code>) is
also provided.</p>
<p>The data source can be found on 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 on <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., & 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>
dieghernanhttps://x.com/dhernangomez
This project provides several datasets in GeoJSON and GeoPackage format of celestial objects as of J2000 epoch.
Hillshade, colors and marginal plots with tidyterra (II)
2022-12-12T00:00:00+01:00
2022-12-12T00:00:00+01:00
https://dieghernan.github.io/202212_tidyterra-hillshade-2/
<h3>The rain in Spain does not stay mainly in the plain</h3>
<img src='https://dieghernan.github.io/assets/img/blog/20221212_finalplot-1.webp' >
<p>13 min.</p>
<p><em>This is the second post of the series “Hillshade, colors and
marginal plots with tidyterra”. In this post I would explore an approach for
annotating marginal plots to a ggplot2 map of a SpatRaster, including
information of 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, specially from the 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 hard statement is made on <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 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>On this post I would 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>On this post we would 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>Well, the plain (or as we name it <em>La Meseta Central</em>) covers a large area of
the inner land of Spain, with an average altitude of 650 meters over the 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 to 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"><-</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">%>%</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">%>%</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">%>%</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">%>%</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 <- tempdir()</span><span class="w">
</span><span class="n">mydir</span><span class="w"> </span><span class="o"><-</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"><-</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"><-</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"><-</span><span class="w"> </span><span class="n">r_init</span><span class="w"> </span><span class="o">%>%</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"><-</span><span class="w"> </span><span class="n">r</span><span class="w"> </span><span class="o">%>%</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">%>%</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">></span><span class="w"> </span><span class="m">600</span><span class="w"> </span><span class="o">&</span><span class="w"> </span><span class="n">alt</span><span class="w"> </span><span class="o"><</span><span class="w"> </span><span class="m">1100</span><span class="p">)</span><span class="w"> </span><span class="o">%>%</span><span class="w">
</span><span class="n">drop_na</span><span class="p">()</span><span class="w"> </span><span class="o">%>%</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">%>%</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">%>%</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">%>%</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"><-</span><span class="w"> </span><span class="n">exploded</span><span class="w"> </span><span class="o">%>%</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">%>%</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">></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">%>%</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="plot of chunk 20221212_plan_alt" width="100%" /></p>
<p>We can create a now plot similar to the one produced in the <a href="https://dieghernan.github.io/202210_tidyterra-hillshade/">previous
post</a> to identify the
plain. In first place I create a base layer with a representation of the
hillshade, that we would 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"><-</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"><-</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"><-</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"><-</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"><-</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"><-</span><span class="w"> </span><span class="n">hill</span><span class="w"> </span><span class="o">%>%</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">%>%</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">%>%</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"><-</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 dont 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"><-</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="plot of chunk 20221212_hill" 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"><-</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">%>%</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"><-</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">#> [1] 0 3500</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">9</span><span class="w">
</span><span class="n">plot_esp</span><span class="w"> </span><span class="o"><-</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="plot of chunk 20221212_hill_overlay" width="100%" /></p>
<h2 id="the-rain-in-spain">The rain in Spain</h2>
<p>Let’s check now wheter 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/">WordClim</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"><-</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">#> class : SpatRaster </span><span class="w">
</span><span class="c1">#> dimensions : 1980, 2760, 12 (nrow, ncol, nlyr)</span><span class="w">
</span><span class="c1">#> resolution : 0.008333333, 0.008333333 (x, y)</span><span class="w">
</span><span class="c1">#> extent : -18.5, 4.5, 27.5, 44 (xmin, xmax, ymin, ymax)</span><span class="w">
</span><span class="c1">#> coord. ref. : lon/lat WGS 84 (EPSG:4326) </span><span class="w">
</span><span class="c1">#> source : ESP_wc2.1_30s_prec.tif </span><span class="w">
</span><span class="c1">#> 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">#> min values : 0, 1, 1, 0, 0, 0, ... </span><span class="w">
</span><span class="c1">#> 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"><-</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">#> class : SpatRaster </span><span class="w">
</span><span class="c1">#> dimensions : 1980, 2760, 1 (nrow, ncol, nlyr)</span><span class="w">
</span><span class="c1">#> resolution : 0.008333333, 0.008333333 (x, y)</span><span class="w">
</span><span class="c1">#> extent : -18.5, 4.5, 27.5, 44 (xmin, xmax, ymin, ymax)</span><span class="w">
</span><span class="c1">#> coord. ref. : lon/lat WGS 84 (EPSG:4326) </span><span class="w">
</span><span class="c1">#> source(s) : memory</span><span class="w">
</span><span class="c1">#> name : sum </span><span class="w">
</span><span class="c1">#> min value : 8 </span><span class="w">
</span><span class="c1">#> 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"><-</span><span class="w"> </span><span class="n">precip_avg</span><span class="w"> </span><span class="o">%>%</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">%>%</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">%>%</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"><-</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="plot of chunk 20221212_prepare_precip" 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 <code class="language-plaintext highlighter-rouge">colorspace</code> 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"><-</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="plot of chunk 20221212_mypal" 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"><-</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"><-</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="plot of chunk 20221212_precip_end" width="100%" /></p>
<p>We can now check that the rain in Spain falls mainly in the Atlantic coast
(North of 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 title axes to the main plot, so we
can insert those marginal plots easily on 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"><-</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="plot of chunk 20221212_precip_for_margin" width="100%" /></p>
<h3 id="profiling-marginal-plots">Profiling marginal plots</h3>
<p>On the following code, I am just drafting how 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"><-</span><span class="w"> </span><span class="n">precip_avg_mask</span><span class="w"> </span><span class="o">%>%</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">%>%</span><span class="w">
</span><span class="n">drop_na</span><span class="p">()</span><span class="w"> </span><span class="o">%>%</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">%>%</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"><-</span><span class="w"> </span><span class="n">precip_avg_mask</span><span class="w"> </span><span class="o">%>%</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">%>%</span><span class="w">
</span><span class="n">drop_na</span><span class="p">()</span><span class="w"> </span><span class="o">%>%</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">%>%</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"><-</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"><-</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"><-</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"><-</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"><-</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="plot of chunk 20221212_profile_marg" 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="plot of chunk 20221212_profile_marg" width="100%" /></p>
<h3 id="putting-all-the-pieces-together">Putting all the pieces together</h3>
<p>Finally, we would 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"><-</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="plot of chunk 20221212_prepare_axis" 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"><-</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="plot of chunk 20221212_prepare_axis" 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"><-</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"><-</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"><-</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"><-</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="plot of chunk 20221212_finalplot" 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 with 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"><-</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"><-</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">%>%</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">%>%</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"><-</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"><-</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"><-</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"><-</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"><-</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"><-</span><span class="w"> </span><span class="n">hill</span><span class="w"> </span><span class="o">%>%</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">%>%</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">%>%</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"><-</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"><-</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"><-</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"><-</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">%>%</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">%>%</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">%>%</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">%>%</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"><-</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"><-</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"><-</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"><-</span><span class="w"> </span><span class="n">precip_end</span><span class="w"> </span><span class="o">%>%</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">%>%</span><span class="w">
</span><span class="n">drop_na</span><span class="p">()</span><span class="w"> </span><span class="o">%>%</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">%>%</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"><-</span><span class="w"> </span><span class="n">precip_end</span><span class="w"> </span><span class="o">%>%</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">%>%</span><span class="w">
</span><span class="n">drop_na</span><span class="p">()</span><span class="w"> </span><span class="o">%>%</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">%>%</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"><-</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"><-</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"><-</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"><-</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"><-</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"><-</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="plot of chunk 20221212_simplified" width="100%" /></p>
</details>
dieghernanhttps://x.com/dhernangomez
Add marginal plots to a SpatRaster map on ggplot2
Hillshade, colors and marginal plots with tidyterra (I)
2022-10-17T00:00:00+02:00
2022-10-17T00:00:00+02:00
https://dieghernan.github.io/202210_tidyterra-hillshade/
<h3>How to overlay SpatRasters</h3>
<img src='https://dieghernan.github.io/assets/img/blog/20221017-6-finalplot-1.webp' >
<p>8 min.</p>
<p><em>This is the first post of a series of two, showing how to overlay a SpatRaster
on top of a Hillshade background. Next post would show how to add marginal plots
including information of 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 mappings is a very common technique, that allows
to produce informative yet beautiful maps. If you are interested on this topic
and you work with <strong>R</strong>, you would 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="swissmap" /></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, last developments on the <strong>R</strong> package
ecosystem (<code class="language-plaintext highlighter-rouge">terra</code>, <code class="language-plaintext highlighter-rouge">sf</code> and support of both classes on <code class="language-plaintext highlighter-rouge">ggplot2</code>, development
of <code class="language-plaintext highlighter-rouge">ggnewscale</code>, etc.) can make even easier the task of producing such type 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. On this first post of the series I would
replicate that technique with a slight variation (e.g. not making use of
<code class="language-plaintext highlighter-rouge">ggnewscale</code>) and I would discuss a bit on the potential choice of a color
palette for this kind of maps.</p>
<h2 id="libraries">Libraries</h2>
<p>I would 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>First step is to get the altitude data. I use here the package <code class="language-plaintext highlighter-rouge">geodata</code> for
simplicity, but you can use as well <code class="language-plaintext highlighter-rouge">elevatr</code> that is much more complete.
However <code class="language-plaintext highlighter-rouge">elevatr</code> produces the result as <code class="language-plaintext highlighter-rouge">RasterLayers</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"><-</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"><-</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">#> class : SpatRaster </span><span class="w">
</span><span class="c1">#> dimensions : 588, 1176, 1 (nrow, ncol, nlyr)</span><span class="w">
</span><span class="c1">#> resolution : 0.008333333, 0.008333333 (x, y)</span><span class="w">
</span><span class="c1">#> extent : 20.1, 29.9, 43.5, 48.4 (xmin, xmax, ymin, ymax)</span><span class="w">
</span><span class="c1">#> coord. ref. : lon/lat WGS 84 (EPSG:4326) </span><span class="w">
</span><span class="c1">#> source : ROU_elv_msk.tif </span><span class="w">
</span><span class="c1">#> name : ROU_elv_msk </span><span class="w">
</span><span class="c1">#> min value : -4 </span><span class="w">
</span><span class="c1">#> 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"><-</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"><-</span><span class="w"> </span><span class="n">r_init</span><span class="w"> </span><span class="o">%>%</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">#> class : SpatRaster </span><span class="w">
</span><span class="c1">#> dimensions : 588, 1176, 1 (nrow, ncol, nlyr)</span><span class="w">
</span><span class="c1">#> resolution : 0.008333333, 0.008333333 (x, y)</span><span class="w">
</span><span class="c1">#> extent : 20.1, 29.9, 43.5, 48.4 (xmin, xmax, ymin, ymax)</span><span class="w">
</span><span class="c1">#> coord. ref. : lon/lat WGS 84 (EPSG:4326) </span><span class="w">
</span><span class="c1">#> source : memory </span><span class="w">
</span><span class="c1">#> name : alt </span><span class="w">
</span><span class="c1">#> min value : 0 </span><span class="w">
</span><span class="c1">#> max value : 2481</span><span class="w">
</span></code></pre></div></div>
<p>We can now have a quick look to 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="plot of chunk 20221017-1-autoplot" width="100%" /></p>
<h2 id="hillshading">Hillshading</h2>
<p>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 would not go into details. Basically what we want to create is a layer that
approximates the potential “texture” of the surface based on the elevation and
the sun position. This is straightforward with <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"><-</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"><-</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"><-</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"><-</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"><-</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">#> 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="plot of chunk 20221017-2-hillroye" 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
<code class="language-plaintext highlighter-rouge">ggplot2</code> 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 reescale 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 a 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
the users often forgot about it), but we can force to plot all the cells by
using <code class="language-plaintext highlighter-rouge">maxcell = Inf</code>. On this approach for using <code class="language-plaintext highlighter-rouge">fill</code> the value <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 is 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"><-</span><span class="w"> </span><span class="n">hill</span><span class="w"> </span><span class="o">%>%</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">%>%</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">%>%</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"><-</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 dont use aes</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">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="plot of chunk 20221017-3-hillalt" 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 to low elevations while orange, browns and whites are associared to
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 desertic areas would not be appropiated 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"><-</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="plot of chunk 20221017-regular-gradient" width="100%" /></p>
<p>For that reason, tidyterra 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"><-</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="plot of chunk 20221017-hypso-gradient" width="100%" /></p>
<p>Can you notice the difference? In the first map greens are the dominant color.
However greens are representing a wide range of elevations (0-750 meters) that
correspond with 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 exclusively the color palette.</p>
<p>For producing our map we are going to assess visually the result of a selection
of palettes provided by <code class="language-plaintext highlighter-rouge">tidyterra</code>. 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 this scales is that we need also to adjust the <code class="language-plaintext highlighter-rouge">limits</code>
argument of the functions to make <code class="language-plaintext highlighter-rouge">ggplot2</code> 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"><-</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">%>%</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"><-</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"><-</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">%>%</span><span class="w"> </span><span class="n">as.vector</span><span class="p">()</span><span class="w">
</span><span class="c1">#> [1] 0 2481</span><span class="w">
</span><span class="n">r_limits</span><span class="w">
</span><span class="c1">#> [1] 0 2500</span><span class="w">
</span><span class="c1"># Now lets 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"><-</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"><-</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="plot of chunk 20221017-4-explorepals" width="50%" /><img src="https://dieghernan.github.io/assets/img/blog/20221017-4-explorepals-2.webp" alt="plot of chunk 20221017-4-explorepals" width="50%" /><img src="https://dieghernan.github.io/assets/img/blog/20221017-4-explorepals-3.webp" alt="plot of chunk 20221017-4-explorepals" width="50%" /><img src="https://dieghernan.github.io/assets/img/blog/20221017-4-explorepals-4.webp" alt="plot of chunk 20221017-4-explorepals" width="50%" /><img src="https://dieghernan.github.io/assets/img/blog/20221017-4-explorepals-5.webp" alt="plot of chunk 20221017-4-explorepals" width="50%" /><img src="https://dieghernan.github.io/assets/img/blog/20221017-4-explorepals-6.webp" alt="plot of chunk 20221017-4-explorepals" 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 <code class="language-plaintext highlighter-rouge">tidyterra</code>
<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"><-</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="plot of chunk 20221017-5-blend" 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"><-</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"><-</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"><-</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"><-</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"><-</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"><-</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"><-</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"><-</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="plot of chunk 20221017-6-finalplot" 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>. <doi:10.5281/zenodo.6572471>
<a href="https://doi.org/10.5281/zenodo.6572471">https://doi.org/10.5281/zenodo.6572471</a>.</p>
dieghernanhttps://x.com/dhernangomez
Using shadow effects on relief mappings is a very common technique, that allows to produce informative yet beautiful maps.
Introducing tidyterra
2022-05-25T00:00:00+02:00
2022-05-25T00:00:00+02:00
https://dieghernan.github.io/202205_tidyterra/
<h3>Easily work and ggplot SpatRasters</h3>
<img src='https://dieghernan.github.io/assets/img/blog/20220525_easteregg-2.webp' >
<p>4 min.</p>
<p>If you have been playing around with <strong>R</strong> for a while, probably you are
familiarized 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="plot of chunk 20220525_volcano" width="100%" /></p>
<p>This represents the topographic information of 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>On this post I introduce the <a href="https://github.com/dieghernan/tidyterra">tidyterra
package</a>, recently added to
<a href="https://CRAN.R-project.org/package=tidyterra">CRAN</a> and I would show you how to
geotag the <code class="language-plaintext highlighter-rouge">volcano</code> dataset. We would produce also ggplot2 maps using the
functions of <code class="language-plaintext highlighter-rouge">tidyterra</code>.</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 <code class="language-plaintext highlighter-rouge">maptiles</code> we can have a glimpse of
the location of Maungawhau using map tiles (as Google Maps uses). We would use
<code class="language-plaintext highlighter-rouge">tidyterra</code> 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"><-</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"><-</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"><-</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"><-</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"><-</span><span class="w"> </span><span class="n">box</span><span class="w"> </span><span class="o">%>%</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"><-</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"><-</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="plot of chunk 20220525_tile" width="100%" /></p>
<p>So well, here you go. A neat and 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
geo-tagged map tile)? Let’s check it out</p>
<h2 id="working-with-spatrasters">Working with SpatRasters</h2>
<p>Thanks to the <code class="language-plaintext highlighter-rouge">terra</code> 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"><-</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="plot of chunk 20220525_volcano_raster" 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"><-</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="plot of chunk 20220525_volcano_raster" 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">#> class : SpatRaster </span><span class="w">
</span><span class="c1">#> dimensions : 87, 61, 1 (nrow, ncol, nlyr)</span><span class="w">
</span><span class="c1">#> resolution : 1, 1 (x, y)</span><span class="w">
</span><span class="c1">#> extent : 0, 61, 0, 87 (xmin, xmax, ymin, ymax)</span><span class="w">
</span><span class="c1">#> coord. ref. : </span><span class="w">
</span><span class="c1">#> source : memory </span><span class="w">
</span><span class="c1">#> name : lyr.1 </span><span class="w">
</span><span class="c1">#> min value : 94 </span><span class="w">
</span><span class="c1">#> 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 of 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://geomorphometry.org/volcano-maungawhau/">Volcano
Maungawhau</a>), that 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"><-</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"><-</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"><-</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">#> class : SpatRaster </span><span class="w">
</span><span class="c1">#> dimensions : 87, 61, 1 (nrow, ncol, nlyr)</span><span class="w">
</span><span class="c1">#> resolution : 10, 10 (x, y)</span><span class="w">
</span><span class="c1">#> extent : 2667400, 2668010, 6478700, 6479570 (xmin, xmax, ymin, ymax)</span><span class="w">
</span><span class="c1">#> 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 for 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"><-</span><span class="w"> </span><span class="n">template</span><span class="w"> </span><span class="o">%>%</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">%>%</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">#> class : SpatRaster </span><span class="w">
</span><span class="c1">#> dimensions : 87, 61, 1 (nrow, ncol, nlyr)</span><span class="w">
</span><span class="c1">#> resolution : 10, 10 (x, y)</span><span class="w">
</span><span class="c1">#> extent : 2667400, 2668010, 6478700, 6479570 (xmin, xmax, ymin, ymax)</span><span class="w">
</span><span class="c1">#> coord. ref. : NZGD49 / New Zealand Map Grid (EPSG:27200) </span><span class="w">
</span><span class="c1">#> source : memory </span><span class="w">
</span><span class="c1">#> name : elevation </span><span class="w">
</span><span class="c1">#> min value : 94 </span><span class="w">
</span><span class="c1">#> 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="plot of chunk 20220525_create_volcano2" 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="plot of chunk 20220525_create_volcano2" 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 compliment,
<code class="language-plaintext highlighter-rouge">tidyterra</code> includes a <code class="language-plaintext highlighter-rouge">.tif</code> file with the same dimensions that 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 <code class="language-plaintext highlighter-rouge">tidyterra</code> possibilities:</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"><-</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">#> class : SpatRaster </span><span class="w">
</span><span class="c1">#> dimensions : 174, 122, 1 (nrow, ncol, nlyr)</span><span class="w">
</span><span class="c1">#> resolution : 5, 5 (x, y)</span><span class="w">
</span><span class="c1">#> extent : 1756969, 1757579, 5917003, 5917873 (xmin, xmax, ymin, ymax)</span><span class="w">
</span><span class="c1">#> coord. ref. : NZGD2000 / New Zealand Transverse Mercator 2000 (EPSG:2193) </span><span class="w">
</span><span class="c1">#> source : volcano2.tif </span><span class="w">
</span><span class="c1">#> name : elevation </span><span class="w">
</span><span class="c1">#> min value : 76.26222 </span><span class="w">
</span><span class="c1">#> 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="plot of chunk 20220525_easteregg" 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"><-</span><span class="w"> </span><span class="n">volcano2_easter</span><span class="w"> </span><span class="o">%>%</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">></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="plot of chunk 20220525_easteregg" 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="plot of chunk 20220525_easteregg" 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="plot of chunk 20220525_easteregg" width="100%" /></p>
dieghernanhttps://x.com/dhernangomez
tidyterra provides tidyverse methods for terra objects and geom functions for plotting with ggplot2.
Unknown pleasures with R
2022-05-01T00:00:00+02:00
2022-05-01T00:00:00+02:00
https://dieghernan.github.io/202205_Unknown-pleasures-R/
<h3>Joyplot elevation maps with ggridges and terra</h3>
<img src='https://dieghernan.github.io/assets/img/blog/20220501_joyplots.webp' >
<p>8 min.</p>
<p>On 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="Craft
Pulsars" /></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 of the process Bernand Summer (lead
guitar 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 on <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="Cambridge: CP 1919 Pulsar
Image" /></p>
<p>Saville presented a black and white version, producing a cover that reaches an
iconic status in the ’80s. This cover has been reproduced in the form of
tattoos, fashion clothes, merchandising, video games and even 3-D sculptures:</p>
<p><img src="https://dieghernan.github.io/assets/img/misc/unknown_pleasures-cover.jpg" alt="Joy Division - Unknown pleasure
cover" /></p>
<p>If you are interested on knowing more about this fascinating history of science
and design you can find it on <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, this kind of plots have become very popular, being known as <strong>ridge
plots</strong> or <strong>joyplots</strong>, in honor of Joy Division. On this post, I would produce
“joyplots” with R for specific regions of the world using the 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, 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 on this post I would work completely on
<strong>R</strong>.</p>
<p>Some initial considerations we may need to bear in mind:</p>
<ul>
<li>
<p>On this post I will use <code class="language-plaintext highlighter-rouge">geom_ridgline()</code> instead of
<code class="language-plaintext highlighter-rouge">geom_density_ridges()</code>. This would provide us with more control on the
final plot, but it has a point of attention: <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 on 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 with the number of rows of our raster. A very detailed
raster (e.g. lots of rows) would produce a much 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 on selecting our region of interest (<code class="language-plaintext highlighter-rouge">sf</code> object) and
extracting the elevation data. We can achieve that with <code class="language-plaintext highlighter-rouge">giscoR</code> and <code class="language-plaintext highlighter-rouge">elevatr</code>.
In this post I would 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 sf 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"><-</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">%>%</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 <code class="language-plaintext highlighter-rouge">elevatr</code>. We can also adjust the
zoom level as needed. You can find a good guidance on the zoom levels on the
<a href="https://wiki.openstreetmap.org/wiki/Zoom_levels">OpenStreetMaps 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"><-</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">%>%</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">%>%</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"><-</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">#> [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="plot of chunk 20220501_andalucia_dem" 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 increasing the size of the cells) 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"><-</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"><-</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">#> [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="plot of chunk 20220501_andalucia_dem_agg" width="100%" /></p>
<p>We can check how the number of rows have decreased. Also, the plot shows that we
have now less 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 the valid values are equal or greater than zero.</p>
</li>
<li>
<p>We would replace the <code class="language-plaintext highlighter-rouge">NAs</code> produced when masking the raster to zero. We
would use this later to decide whether to remove or not some parts of the
plot.</p>
</li>
</ul>
<p>After that, we would 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"><</span><span class="w"> </span><span class="m">0</span><span class="p">]</span><span class="w"> </span><span class="o"><-</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"><-</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"><-</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">#> # A tibble: 12,848 x 3</span><span class="w">
</span><span class="c1">#> x y elev</span><span class="w">
</span><span class="c1">#> <dbl> <dbl> <dbl></span><span class="w">
</span><span class="c1">#> 1 77184. 4306315. 0</span><span class="w">
</span><span class="c1">#> 2 81049. 4306315. 0</span><span class="w">
</span><span class="c1">#> 3 84914. 4306315. 0</span><span class="w">
</span><span class="c1">#> 4 88779. 4306315. 0</span><span class="w">
</span><span class="c1">#> 5 92644. 4306315. 0</span><span class="w">
</span><span class="c1">#> 6 96510. 4306315. 0</span><span class="w">
</span><span class="c1">#> 7 100375. 4306315. 0</span><span class="w">
</span><span class="c1">#> 8 104240. 4306315. 0</span><span class="w">
</span><span class="c1">#> 9 108105. 4306315. 0</span><span class="w">
</span><span class="c1">#> 10 111970. 4306315. 0</span><span class="w">
</span><span class="c1">#> # ... 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 would show you how to perform
those adjustment with the <code class="language-plaintext highlighter-rouge">units</code> 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"><-</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">#> [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"><-</span><span class="w"> </span><span class="n">dem_df</span><span class="w"> </span><span class="o">%>%</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">#> # A tibble: 12,848 x 6</span><span class="w">
</span><span class="c1">#> x y elev x_mile y_mile elev_mile</span><span class="w">
</span><span class="c1">#> [m] [m] [m] [mi] [mi] [mi]</span><span class="w">
</span><span class="c1">#> 1 77184. 4306315. 0 48.0 2676. 0</span><span class="w">
</span><span class="c1">#> 2 81049. 4306315. 0 50.4 2676. 0</span><span class="w">
</span><span class="c1">#> 3 84914. 4306315. 0 52.8 2676. 0</span><span class="w">
</span><span class="c1">#> 4 88779. 4306315. 0 55.2 2676. 0</span><span class="w">
</span><span class="c1">#> 5 92644. 4306315. 0 57.6 2676. 0</span><span class="w">
</span><span class="c1">#> 6 96510. 4306315. 0 60.0 2676. 0</span><span class="w">
</span><span class="c1">#> 7 100375. 4306315. 0 62.4 2676. 0</span><span class="w">
</span><span class="c1">#> 8 104240. 4306315. 0 64.8 2676. 0</span><span class="w">
</span><span class="c1">#> 9 108105. 4306315. 0 67.2 2676. 0</span><span class="w">
</span><span class="c1">#> 10 111970. 4306315. 0 69.6 2676. 0</span><span class="w">
</span><span class="c1">#> # ... 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 an 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="plot of chunk 20220501_andalucia_ridges" 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="plot of chunk 20220501_andalucia_joyplot" 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="plot of chunk 20220501_andalucia_ridges_dens" 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> allow 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="plot of chunk 20220501_andalucia_landonly" width="100%" /></p>
<h3 id="with-colors">With colors</h3>
<p>We can apply different colors to the plot. Note that <code class="language-plaintext highlighter-rouge">ggridges</code> only accepts
different <code class="language-plaintext highlighter-rouge">aes</code> by row, and 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"><-</span><span class="w"> </span><span class="n">dem_df</span><span class="w"> </span><span class="o">%>%</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="plot of chunk 20220501_andalucia_colors" width="100%" /></p>
<h3 id="combine-with-another-objects">Combine with another objects</h3>
<p>Like using a <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"><-</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">%>%</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">%>%</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="plot of chunk 20220501_andalucia_combine" width="100%" /></p>
<p>Or maybe 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"><-</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">%>%</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="plot of chunk 20220501_andalucia_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">↑</a></p>
</li>
</ol>
</div>
dieghernanhttps://x.com/dhernangomez
Create ridgelines (AKA joyplots) of territories using elevation data with R, sf, terra and ggridges.
Corona timelapse
2022-03-14T00:00:00+01:00
2025-02-17T00:00:00+01:00
https://dieghernan.github.io/202203_Corona-timelapse/
<h3>Travel restrictions amidst the COVID crisis across time - A German perspective</h3>
<img src='https://dieghernan.github.io/corona-atlas.de/timelapse/frames/D2021-04-16.png' >
<p>1 min.</p>
<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="corona-timelapse" /></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 to travels abroad amid the COVID crisis.</p>
<p>Despite the drastic variations in this regard that most foreign countries have experienced during 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 assesment 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>
Rodrigo Hernangómezhttps://uselessness.science
<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>
Insets with ggplot2 and tmap - and mapsf!
2022-03-03T00:00:00+01:00
2022-03-03T00:00:00+01:00
https://dieghernan.github.io/202203_insetmaps/
<h3>A map on a map</h3>
<img src='https://dieghernan.github.io/assets/img/blog/20220303_inset.webp' >
<p>3 min.</p>
<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 on your visualization. An inset map is nothing more than a smaller map usually included on 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 its geographical location would imply an imperfect visualization, or even to include small units that otherwise won’t 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 would show how to produce these insets using the <code class="language-plaintext highlighter-rouge">ggplot2</code> and the <code class="language-plaintext highlighter-rouge">tmap</code> packages. In short: <strong>use <code class="language-plaintext highlighter-rouge">cowplot</code> package</strong>.</p>
<h2 id="test-case-canary-island-as-an-inset">Test case: Canary Island as an inset</h2>
<p>On this example, I would create a map of Spain using <code class="language-plaintext highlighter-rouge">mapSpain</code> and creating 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"><-</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="plot of chunk 20220303_truemap" width="100%" /></p>
<p>I would use a different CRS for each part of Spain. In the case of mainland Spain I would use ETRS89 / UTM 30N (<a href="https://epsg.io/25830">EPSG:25830</a>) and for the Canary Islands I would 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"><-</span><span class="w"> </span><span class="n">regions</span><span class="w"> </span><span class="o">%>%</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">%>%</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="plot of chunk 20220303_mainsub" 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"><-</span><span class="w"> </span><span class="n">regions</span><span class="w"> </span><span class="o">%>%</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">%>%</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="plot of chunk 20220303_mainsub" width="100%" /></p>
<p>So that was easy! Just a couple of maps using <code class="language-plaintext highlighter-rouge">ggplot2</code>. Let’s start mixing and matching!</p>
<h2 id="on-ggplot2">On <code class="language-plaintext highlighter-rouge">ggplot2</code></h2>
<p>We have already created two quick maps on <code class="language-plaintext highlighter-rouge">ggplot2</code>. Now, to produce our map with insets we would:</p>
<ol>
<li>
<p>Produce two plots: The main plot and the sub plot providing a minimal style. We would store them as <code class="language-plaintext highlighter-rouge">ggplot2</code> objects.</p>
</li>
<li>
<p>We would combine both objects with <code class="language-plaintext highlighter-rouge">cowplot</code>.</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"><-</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 would 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"><-</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 <code class="language-plaintext highlighter-rouge">cowplot</code> we can combine both maps on 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 sub plot 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="plot of chunk 20220303_insetggplot" width="100%" /></p>
<p>Note also that this approach is valid not only for maps, but for all type of plot produced by <code class="language-plaintext highlighter-rouge">ggplot2</code>, since this package is not specific for 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"><-</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"><-</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"># Non-sense 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="plot of chunk 20220303_insetggplot_nonsense" width="100%" /></p>
<h2 id="on-tmap">On <code class="language-plaintext highlighter-rouge">tmap</code></h2>
<p>We can follow a similar approach on <code class="language-plaintext highlighter-rouge">tmap</code>. On versions v3.x.x (there is a new <a href="https://github.com/r-tmap/tmap/issues/599">revamped version on 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 <code class="language-plaintext highlighter-rouge">cowplot</code> 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"><-</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"><-</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"><-</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"><-</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 that we have these new “grobs”, we can use the same approach than we applied to <code class="language-plaintext highlighter-rouge">ggplot2</code> 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="plot of chunk 20220303_insettmap" width="100%" /></p>
<h2 id="update-on-mapsf">Update: On <code class="language-plaintext highlighter-rouge">mapsf</code></h2>
<p><a href="https://rgeomatic.hypotheses.org/">Timotheé Giraud</a> (AKA <a href="https://twitter.com/rgeomatic">\@rgeomatic</a>), the developer of <code class="language-plaintext highlighter-rouge">mapsf</code>, shared also 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="plot of chunk 20220303_insetmapsf" width="100%" /></p>
dieghernanhttps://x.com/dhernangomez
A common challenge when creating maps is how to include an inset map on your visualization. An inset map is a smaller map usually included on a corner that may provide additional context to the overall map, or may include map units than won't be usually represented properly.
Beautiful Maps with R (IV): Fun with flags revisited
2022-01-28T00:00:00+01:00
2022-01-28T00:00:00+01:00
https://dieghernan.github.io/202201_maps-flags/
<h3>Any picture as a basemap</h3>
<img src='https://dieghernan.github.io/assets/img/blog/20220128_flag-1.webp' >
<p>2 min.</p>
<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
allows to geotag images, using an 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 a 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&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>— 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 received also 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'.</p>— 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 remembers me to 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 rasterpic we have now an alternative tool for creating maps using images,
and this quick post would show you how to do it.</p>
<p>I would replicate the Africa map presented on my previous plot, but this time I
would use newer packages, as
<a href="https://cran.r-project.org/package=giscoR"><strong>giscoR</strong></a> package, and the
development version of
<a href="https://github.com/paleolimbot/ggspatial/pull/92"><strong>ggspatial</strong></a> (not released
yet), that adds support to <code class="language-plaintext highlighter-rouge">SpatRaster</code> object on <strong>ggplot2</strong>. The flags would
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"><-</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"><-</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"><-</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="plot of chunk 20220128_africa" 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"><-</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"><-</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"><-</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"><-</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"><-</span><span class="w"> </span><span class="n">africa</span><span class="w"> </span><span class="o">%>%</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"><-</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"><-</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="plot of chunk 20220128_flag" width="100%" /></p>
dieghernanhttps://x.com/dhernangomez
On 27 Jan. 2022 my package rasterpic was accepted on CRAN (Hooray!!). This package allows to geotag images, using an spatial object (from sf or terra) as a geographic reference.
Corona Atlas
2021-04-30T00:00:00+02:00
2025-02-17T00:00:00+01:00
https://dieghernan.github.io/projects/corona-atlas/
<h3>Interactive map of the international COVID-19 risk areas as designated by the German authorities.</h3>
<img src='https://dieghernan.github.io/corona-atlas.de/assets/img/og_corona_atlas.png' >
<p>1 min.</p>
<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-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 on <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 a map via <a href="https://rmarkdown.rstudio.com/">{rmarkdown}</a> using <a href="http://rstudio.github.io/leaflet/">{leaflet}</a>, <a href="https://dieghernan.github.io/giscoR/">{giscoR}</a> and some packages included on the <a href="https://www.tidyverse.org/">tidyverse</a>.
For the deployment, map logic has moved to Javascript to escalate with multiple languages.</p>
<p><a href="/202203_Corona-timelapse">Read more on this post</a></p>
dieghernanhttps://x.com/dhernangomez
Interactive map of the international COVID-19 risk areas as designated by the German authorities. The data is updated periodically from the website of the Robert Koch Institute.
spain-munic-bot
2021-01-29T00:00:00+01:00
2021-01-29T00:00:00+01:00
https://dieghernan.github.io/projects/spain-munic-bot/
<h3>A twitter bot written in R.</h3>
<img src='https://dieghernan.github.io/spain-munic-bot/assets/img/sample.png' >
<p>1 min.</p>
<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 {mapSpain} posted with {rtweet} 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 a 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">📦 R packages</h2>
<p>Core packages used in the project are:</p>
<ul>
<li><a href="https://ropenspain.github.io/mapSpain/">{mapSpain}</a> for the location of the municipalities, base polygons and coordinates and imagery,</li>
<li><a href="https://docs.ropensci.org/osmdata/">{osmdata}</a> for the streets,</li>
<li><a href="https://mtennekes.github.io/tmap/">{tmap}</a> for plotting,</li>
<li><a href="https://docs.ropensci.org/rtweet/">{rtweet}</a> for posting,</li>
</ul>
<p>Other packages used are {sf}, {dplyr} and another common supporting packages.</p>
dieghernanhttps://x.com/dhernangomez
Twitter bot - random municipalities of Spain with {mapSpain} posted with {rtweet} via a GitHub Action
Leaflet-providersESP
2020-10-26T00:00:00+01:00
2020-10-26T00:00:00+01:00
https://dieghernan.github.io/projects/leaflet-providersESP/
<h3>Plugin for Leaflet.js</h3>
<img src='https://dieghernan.github.io/assets/img/misc/leaflet-providersesp.png' >
<p>1 min.</p>
<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 organisms of 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 on <a href="https://dieghernan.github.io/leaflet-providersESP/">https://dieghernan.github.io/leaflet-providersESP/</a></p>
<p>This code would generate 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"><!DOCTYPE html></span>
<span class="nt"><html></span>
<span class="nt"><head></span>
<span class="nt"><title></span>Minimal page | leaflet-providersESP<span class="nt"></title></span>
<span class="nt"><meta</span> <span class="na">charset=</span><span class="s">"utf-8"</span> <span class="nt">/></span>
<span class="nt"><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">></span>
<span class="c"><!-- Load Leaflet --></span>
<span class="nt"><link</span> <span class="na">rel=</span><span class="s">"stylesheet"</span> <span class="na">href=</span><span class="s">"https://unpkg.com/[email protected]/dist/leaflet.css"</span> <span class="nt">/></span>
<span class="nt"><script </span><span class="na">src=</span><span class="s">"https://unpkg.com/[email protected]/dist/leaflet.js"</span><span class="nt">></script></span>
<span class="c"><!-- Install leaflet-providersESP --></span>
<span class="nt"><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">></script></span>
<span class="c"><!-- Display map full page --></span>
<span class="nt"><style></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="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="nt"></style></span>
<span class="nt"></head></span>
<span class="nt"><body></span>
<span class="c"><!-- Create map --></span>
<span class="nt"><div</span> <span class="na">id=</span><span class="s">"mapid"</span><span class="nt">></div></span>
<span class="c"><!-- Puerta del Sol - IDErioja server --></span>
<span class="nt"><script></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="s1">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.7038400</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="s1">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"></script></span>
<span class="nt"></body></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 class="mt-5 mb-2" id="all-providers">All providers</h2>
<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/allproviders/" allowfullscreen="" loading="lazy"></iframe>
</div>
dieghernanhttps://x.com/dhernangomez
Leaflet plugin for adding WMS/WMTS provided by public organisms of Spain.
Head/Tails breaks on the <code>classInt</code> package.
2020-04-05T00:00:00+02:00
2020-04-05T00:00:00+02:00
https://dieghernan.github.io/202004_headtails/
<img src='https://dieghernan.github.io/assets/img/blog/20200405_finalplot-1.webp' >
<p>11 min.</p>
<blockquote class="blockquote">
<p class="small font-italic">There are far more ordinary people (say, 80 percent) than extraordinary people (say, 20 percent); 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)) on the <code class="language-plaintext highlighter-rouge">classIntervals</code> function of the <code class="language-plaintext highlighter-rouge">classInt</code> package. A step-by-step example is presented in order to clarify the method. A case study using <code class="language-plaintext highlighter-rouge">spData::afcon</code> is also included, making use of other additional packages as <code class="language-plaintext highlighter-rouge">sf</code>.</p>
<h2 id="introduction">Introduction</h2>
<p>The <strong>Head/tail breaks</strong>, sometimes referred as <strong>ht-index</strong> (Jiang and Yin (2013)), is a classification scheme introduced by Jiang (2013) in order to find groupings or hierarchy for data with a heavy-tailed distribution.</p>
<p>Heavy-tailed distributions are heavily right skewed, with a minority of large values in the head and a majority of small values in the tail. This imbalance between the head and tail, or between many small values and a few large values, can be expressed as <em>“far more small things than large things”</em>.</p>
<p>Heavy tailed distributions are commonly characterized by a power law, a lognormal or an exponential function. Nature, society, finance (Vasicek (2002)) and our daily lives are full of rare and extreme events,
which are termed “black swan events” (Taleb (2008)). This line of thinking provides a good reason to reverse our thinking by focusing on low-frequency events.</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"><-</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"><-</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="plot of chunk 20200405_charheavytail" /><img src="https://dieghernan.github.io/assets/img/blog/20200405_charheavytail-2.webp" alt="plot of chunk 20200405_charheavytail" /></p>
<h2 id="breaking-method">Breaking method</h2>
<p>The method itself consists on 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>On each iteration, compute \(\mu = \sum_{i=1}^{n} a_i \:\:\: \forall \: a_i \in v\).</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>Assess if the proportion of \(head\) over \(v\) is lower or equal than a given threshold:
\(\frac{|head|}{|v|} \le thresold\)</li>
<li>If 3 is <code class="language-plaintext highlighter-rouge">TRUE</code>, repeat 1 to 3 until the condition is <code class="language-plaintext highlighter-rouge">FALSE</code> or no more partitions are possible (i.e. \(head\) has less than two elements).</li>
</ol>
<p>It is important to note that, at the beginning of a new iteration, \(v\) is replaced by \(head\). The underlying hypothesis is to create partitions until the head and the tail are balanced in terms of distribution.So the stopping criteria is satisfied when the last head and the last tail are evenly balanced.</p>
<p>In terms of threshold, Jiang, Liu, and Jia (2013) set 40% as a good approximation, meaning that if the \(head\) contains more than 40% of the observations the distribution is not considered 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 <= 40%):
Head/tail Breaks (head);
End Function
</code></pre></div></div>
<p>A step-by-step example in <strong>R</strong> (for illustrative purposes) has been developed:</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"><-</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"><-</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"><-</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"><-</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"><-</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"><-</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"><-</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"><-</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"><-</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">></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"><-</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"><-</span><span class="w"> </span><span class="n">prop</span><span class="w"> </span><span class="o"><</span><span class="w"> </span><span class="n">thr</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">head</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">sum_table</span><span class="w"> </span><span class="o"><-</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"><-</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"><-</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"><-</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="plot of chunk 20200405_stepbystep" /><img src="https://dieghernan.github.io/assets/img/blog/20200405_stepbystep-2.webp" alt="plot of chunk 20200405_stepbystep" /><img src="https://dieghernan.github.io/assets/img/blog/20200405_stepbystep-3.webp" alt="plot of chunk 20200405_stepbystep" /><img src="https://dieghernan.github.io/assets/img/blog/20200405_stepbystep-4.webp" alt="plot of chunk 20200405_stepbystep" /></p>
<p>As it can be seen, in each iteration the resulting head gradually loses the high-tail property, until the stopping condition is met.</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 resulting breaks are then defined as <code class="language-plaintext highlighter-rouge">breaks = c(min(var), mu1, mu2, ..., mu_n, max(var))</code>.</p>
<h2 id="implementation-on-classint-package">Implementation on <code class="language-plaintext highlighter-rouge">classInt</code> package</h2>
<p>The implementation in the <code class="language-plaintext highlighter-rouge">classIntervals</code> function should replicate the 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"><-</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 naturally determined, however the <code class="language-plaintext highlighter-rouge">thr</code> parameter could help to adjust the final number. A lower value on <code class="language-plaintext highlighter-rouge">thr</code> would provide less breaks while a larger <code class="language-plaintext highlighter-rouge">thr</code> would 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"><-</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"><-</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="plot of chunk 20200405_examplesimp" /><img src="https://dieghernan.github.io/assets/img/blog/20200405_examplesimp-2.webp" alt="plot of chunk 20200405_examplesimp" /><img src="https://dieghernan.github.io/assets/img/blog/20200405_examplesimp-3.webp" alt="plot of chunk 20200405_examplesimp" /><img src="https://dieghernan.github.io/assets/img/blog/20200405_examplesimp-4.webp" alt="plot of chunk 20200405_examplesimp" /></p>
<p>The method always returns at least one break, corresponding to <code class="language-plaintext highlighter-rouge">mean(var)</code>.</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 would compare <code class="language-plaintext highlighter-rouge">headtails</code> vs. <code class="language-plaintext highlighter-rouge">fisher</code>, that is the alias for the Fisher-Jenks algorithm and it 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 <code class="language-plaintext highlighter-rouge">spData</code> package, plus some additional spatial information in order 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 to 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"><-</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="plot of chunk 20200405_summspdata" /><img src="https://dieghernan.github.io/assets/img/blog/20200405_summspdata-2.webp" alt="plot of chunk 20200405_summspdata" /></p>
<p>The data shows that EG and SU data present a clear hierarchy over the rest of values. As per the histogram, we can confirm a heavy-tailed distribution and therefore the <em>“far more small things than large things”</em> principle.</p>
<p>As a testing proof, on top of <code class="language-plaintext highlighter-rouge">headtails</code> and <code class="language-plaintext highlighter-rouge">fisher</code> we would use also <code class="language-plaintext highlighter-rouge">quantile</code> to have a broader view on the different breaking styles. As <code class="language-plaintext highlighter-rouge">quantile</code> is a position-based metric, it doesn’t account for the magnitude of F(x) (hierarchy), so the breaks are solely defined by the position of x on the distribution.</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"><-</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"><-</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"><-</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"><-</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"><-</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"><-</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="plot of chunk 20200405_breaksample" /><img src="https://dieghernan.github.io/assets/img/blog/20200405_breaksample-2.webp" alt="plot of chunk 20200405_breaksample" /><img src="https://dieghernan.github.io/assets/img/blog/20200405_breaksample-3.webp" alt="plot of chunk 20200405_breaksample" /></p>
<p>It is observed that the top three classes of <code class="language-plaintext highlighter-rouge">headtails</code> enclose 5 observations, whereas <code class="language-plaintext highlighter-rouge">fisher</code> includes 13 observations. In terms of classification, <code class="language-plaintext highlighter-rouge">headtails</code> breaks focuses more on extreme values.</p>
<p>The next plot compares a continuous distribution of <code class="language-plaintext highlighter-rouge">totcon</code> re-escalated to a range of <code class="language-plaintext highlighter-rouge">[1,nclass]</code> versus the distribution across breaks for each style. The continuous distribution has been offset by -0.5 in order to align the continuous and the discrete distributions.</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"><-</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"><-</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"><-</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"><-</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"><-</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"><-</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"><-</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"><-</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="plot of chunk 20200405_benchmarkbreaks" /></p>
<p>It can be observed that the distribution of <code class="language-plaintext highlighter-rouge">headtails</code> breaks is also heavy-tailed, and closer to the original distribution. On the other extreme, “quantile” provides a quasi-uniform distribution, ignoring the <code class="language-plaintext highlighter-rouge">totcon</code> hierarchy</p>
<p>In terms of data visualization, we compare here the final map using the techniques mentioned above. On this plotting exercise, a choropleth map would be created.</p>
<p>Additionally, a high-granularity choropleth map is created with a greater number of classes, in order to compare and contrast the actual grouping options against a more granular approach.</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"><-</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"><-</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"><-</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"><-</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 <- st_join(africa[, "admin"], afcon.sf)</span><span class="w">
</span><span class="n">afcon.sf</span><span class="w"> </span><span class="o"><-</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"><-</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="plot of chunk 20200405_finalplot" /></p>
<p>As per the results, <code class="language-plaintext highlighter-rouge">headtails</code> seems to provide a better understanding of the most extreme values when the result is compared against the high-granularity plot. The <code class="language-plaintext highlighter-rouge">quantile</code> style, as expected, just provides a clustering without taking into account the real hierarchy. The <code class="language-plaintext highlighter-rouge">fisher</code> plot is in-between of these two interpretations.</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 of the context. While <code class="language-plaintext highlighter-rouge">headtails</code> highlights the outliers, it fails on providing a good clustering on the tail, while <code class="language-plaintext highlighter-rouge">fisher</code> seems to reflect better these patterns. This can be observed on the values of Western Africa and the Niger River Basin, where <code class="language-plaintext highlighter-rouge">headtails</code> doesn’t highlight any special cluster of conflicts, <code class="language-plaintext highlighter-rouge">fisher</code> suggests a potential cluster, aligned with the high-granularity plot. This can be confirmed on 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 on <code class="language-plaintext highlighter-rouge">classInt</code> corresponds to head/tails 1.0 as named on this article. <a href="#fnref:1" class="reversefootnote" role="doc-backlink">↑</a></p>
</li>
</ol>
</div>
dieghernanhttps://x.com/dhernangomez
<blockquote class="blockquote">
<p class="small font-italic">There are far more ordinary people (say, 80 percent) than extraordinary people (say, 20 percent); 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>
COVID19 Microsite
2020-04-04T00:00:00+02:00
2020-04-04T00:00:00+02:00
https://dieghernan.github.io/projects/COVID19
<h3>Tracking the outbreak in Spain by region</h3>
<img src='https://dieghernan.github.io/COVID19/assets/img/header.png' >
<p>1 min.</p>
<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 COVID19 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="FallecidosEvo" /></p>
<p class="caption">Overall deceases in Spain by COVID19 - Evolution</p>
dieghernanhttps://x.com/dhernangomez
<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>
New features on cartography package
2020-02-17T00:00:00+01:00
2020-02-17T00:00:00+01:00
https://dieghernan.github.io/202002_cartography1/
<h3>Vignette of the package expansion</h3>
<img src='https://dieghernan.github.io/assets/img/blog/20200217_wordcloud2-1.webp' >
<p>6 min.</p>
<h2 id="introduction">Introduction</h2>
<p>The aim of this document is to describe the new features added to <code class="language-plaintext highlighter-rouge">cartography</code> on 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 those maps that needs to be printed on black and white, as academic papers. These maps also are 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"><-</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"><-</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"><-</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><span class="n">df</span><span class="w"> </span><span class="o"><-</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"><-</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"><-</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="plot of chunk 20200217_hatched-min" /></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">&</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"><-</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="plot of chunk 20200217_hatched" /></p>
<p><code class="language-plaintext highlighter-rouge">legendHatched</code> honors the order on the parameters. In this case, two <code class="language-plaintext highlighter-rouge">dot</code> patterns are presents, 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 and in the previous case, <code class="language-plaintext highlighter-rouge">lty = c(1, 1, 3)</code> respect that order.</p>
<h3 id="example-3">Example 3</h3>
<p><code class="language-plaintext highlighter-rouge">hatchedLayer</code> also could be useful for plotting several dimensions on the same map, in combination with another functions 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"><-</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"><-</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"><-</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"><-</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="plot of chunk 20200217_hatched-adv" /></p>
<h2 id="png-layer"><code class="language-plaintext highlighter-rouge">png</code> 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 a <code class="language-plaintext highlighter-rouge">.svg</code> 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">%>%</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"><-</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="plot of chunk 20200217_pnglayer" /></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"><-</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"><-</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">%>%</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="plot of chunk 20200217_png-adv" /></p>
<h2 id="wordcloudlayer">wordcloudLayer</h2>
<p>A word cloud (or tag cloud) is a visual representation of text data. On a mapping context, this representation is useful for including several information at a glance.</p>
<p>Wordcloud layers fitted into a map shape provide a good trade-off between physical location, scale and labels. Size and colors of the words are also based on the frequency of the factor to be plotted, highlighting the most frequent terms over the rest.</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="plot of chunk 20200217_wordcloud1" /></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">%>%</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">%>%</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">%>%</span><span class="w"> </span><span class="n">st_union</span><span class="w"> </span><span class="o">%>%</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">%>%</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="plot of chunk 20200217_wordcloud2" /></p>
dieghernanhttps://x.com/dhernangomez
<h2 id="introduction">Introduction</h2>
We’ll miss you, UK
2020-02-06T00:00:00+01:00
2020-09-07T00:00:00+02:00
https://dieghernan.github.io/202002_Brexit/
<h3>Brexit and the consequences</h3>
<img src='https://dieghernan.github.io/assets/img/blog/20200602_imgpost-1.webp' >
<p>1 min.</p>
<p>This is just a super-quick post regarding Brexit. Leaving apart economical, political and social considerations, there is another consequence, now we are one less 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"><-</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">%>%</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"><-</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"><-</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">%>%</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">%>%</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">%>%</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="plot of chunk 20200602_imgpost" /></p>
dieghernanhttps://x.com/dhernangomez
<p>This is just a super-quick post regarding Brexit. Leaving apart economical, political and social considerations, there is another consequence, now we are one less in the EU.</p>
Beautiful Maps with R (III): Patterns and hatched maps
2019-12-12T00:00:00+01:00
2020-02-17T00:00:00+01:00
https://dieghernan.github.io/201912_Beautiful3/
<h3>A solution for b/w and academic maps.</h3>
<img src='https://dieghernan.github.io/assets/img/blog/20191212_imgpost-1.webp' >
<p>2 min.</p>
<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 on <code class="language-plaintext highlighter-rouge">cartography >v.2.4.0</code> on functions <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>. Just install it via <code class="language-plaintext highlighter-rouge">install.packages("cartography")</code>. A dedicated blog post with examples on this <a href="../202002_cartography1">link</a>.</p>
<p>On this post I would show how to produce different filling patterns that could be added over your shapefiles with the <code class="language-plaintext highlighter-rouge">cartography</code> package.</p>
<h2 id="required-r-packages">Required R 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"><-</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="plot of chunk 20191212_showfun" /></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="plot of chunk 20191212_playing" /></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 the <code class="language-plaintext highlighter-rouge">legendHatched</code>. 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 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 would 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="plot of chunk 20191212_playinglegend" /></p>
<p>I hope that you find this functions useful. Enjoy and nice mapping!</p>
<p><img src="https://dieghernan.github.io/assets/img/blog/20191212_imgpost-1.webp" title="plot of chunk 20191212_imgpost" alt="plot of chunk 20191212_imgpost" style="display: block; margin: auto;" /></p>
dieghernanhttps://x.com/dhernangomez
<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 on <code class="language-plaintext highlighter-rouge">cartography >v.2.4.0</code> on functions <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>. Just install it via <code class="language-plaintext highlighter-rouge">install.packages("cartography")</code>. A dedicated blog post with examples on this <a href="../202002_cartography1">link</a>.</p>
Quick R: Inset maps
2019-11-07T00:00:00+01:00
2019-11-07T00:00:00+01:00
https://dieghernan.github.io/201911_QuickR/
<h3>An alternative using plot()</h3>
<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' >
<p>3 min.</p>
<p>How to place an inset map in <strong>R</strong>? There are many solutions out there using the <code class="language-plaintext highlighter-rouge">ggplot2</code> 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>, <code class="language-plaintext highlighter-rouge">sf</code> and <code class="language-plaintext highlighter-rouge">ggplot2</code></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 R 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 & Basille</h2>
<p>I would 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 would focus only in 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"><-</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"><-</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">%>%</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">%>%</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="plot of chunk 20191108_main" /></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">%>%</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">%>%</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="plot of chunk 20191108_Alaska" /></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">%>%</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">%>%</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="plot of chunk 20191108_Hawaii" /></p>
<h2 id="insetting">Insetting</h2>
<p>From now on, I just focus on the inset part, using the <code class="language-plaintext highlighter-rouge">fig()</code> option on <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>So being <code class="language-plaintext highlighter-rouge">x1</code> and <code class="language-plaintext highlighter-rouge">y1</code> the starting points and <code class="language-plaintext highlighter-rouge">x2</code>, <code class="language-plaintext highlighter-rouge">y2</code> the final points, we just 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 & Basille here and I just worked it 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">%>%</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">%>%</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">%>%</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">%>%</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">%>%</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">%>%</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="plot of chunk 20191108_inset" /></p>
<p>Results may vary depending of the size of the original plot (Mainland USA) and your plotting device and 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> that 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" /></p>
dieghernanhttps://x.com/dhernangomez
<p>How to place an inset map in <strong>R</strong>? There are many solutions out there using the <code class="language-plaintext highlighter-rouge">ggplot2</code> 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>, <code class="language-plaintext highlighter-rouge">sf</code> and <code class="language-plaintext highlighter-rouge">ggplot2</code></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>
Wikipedia Maps (I): Organ donor rates
2019-10-16T00:00:00+02:00
2019-10-16T00:00:00+02:00
https://dieghernan.github.io/201910_WikiMap1/
<h3>A choropleth map with <strong>R</strong></h3>
<img src='https://dieghernan.github.io/assets/img/blog/20191016_imgpost.webp' >
<p>2 min.</p>
<p>This is a quick post on how to create a map as per 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 2019-02-10 although the data refers to 2017 (Source: <a href="http://www.irodat.org/?p=database">IRODaT</a>).</p>
<h2 id="webscrapping">Webscrapping</h2>
<p>First step is to webscrap Wikipedia in order to get the final table. For doing so, I will use the <code class="language-plaintext highlighter-rouge">rvest</code> library. You can get the <code class="language-plaintext highlighter-rouge">xpath</code> you want to webscrap 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"><-</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">%>%</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">%>%</span><span class="w">
</span><span class="n">html_table</span><span class="p">()</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="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">%>%</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"><-</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">%>%</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-all-together">Merging all together</h2>
<p>Now let’s join and have a look to see what is going on. We use the <code class="language-plaintext highlighter-rouge">countrycode</code> package to retrieve the ISO3 codes of our scrapped 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"><-</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"><-</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">%>%</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 some things to bear in mind:</p>
<ul>
<li>Obviously the colors. Wikipedia already provides a good guidance for this. I would make use of the <code class="language-plaintext highlighter-rouge">RColorBrewer</code> library, which implements <a href="http://colorbrewer2.org/#type=sequential&scheme=PuBu&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 would choose to use the <a href="https://en.wikipedia.org/wiki/Robinson_projection">Robinson projection</a>.</li>
<li>I should produce an <code class="language-plaintext highlighter-rouge">.svg</code> file following also the naming convention.</li>
</ul>
<p>Some libraries then to use: <code class="language-plaintext highlighter-rouge">RColorBrewer</code>, <code class="language-plaintext highlighter-rouge">rsvg</code> and specially one of my favourites, <code class="language-plaintext highlighter-rouge">cartography</code>:</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"><-</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">%>%</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">%>%</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">%>%</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">%>%</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">%>%</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="img" /></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>
dieghernanhttps://x.com/dhernangomez
<p>This is a quick post on how to create a map as per 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 2019-02-10 although the data refers to 2017 (Source: <a href="http://www.irodat.org/?p=database">IRODaT</a>).</p>
Beautiful Maps with R (II): Fun with flags
2019-06-18T00:00:00+02:00
2023-01-23T00:00:00+01:00
https://dieghernan.github.io/201906_Beautiful2/
<h3>Put a picture on your map</h3>
<img src='https://dieghernan.github.io/assets/img/blog/20190618_imgpost-1.webp' >
<p>3 min.</p>
<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 on <code class="language-plaintext highlighter-rouge">cartography >v.2.4.0</code> on functions <a href="http://riatelab.github.io/cartography/docs/reference/getPngLayer.html"><code class="language-plaintext highlighter-rouge">getPngLayer</code></a>. Just install it via <code class="language-plaintext highlighter-rouge">install.packages("cartography")</code>. A dedicated blog post with examples on 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> <code class="language-plaintext highlighter-rouge">cartography</code> is in maintenance mode. You can use <code class="language-plaintext highlighter-rouge">rasterpic</code> + <code class="language-plaintext highlighter-rouge">tidyterra</code> 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 of your map? You are in the right post. 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 in the option provided by <code class="language-plaintext highlighter-rouge">cartography::getPngLayer()</code>, that basically converts your image into a raster (see also this article of <a href="https://www.stat.auckland.ac.nz/people/pmur002">Paul Murrell</a>, <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 R 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>, that is the first-level administrative division of the country. <a href="https://en.wikipedia.org/wiki/Autonomous_communities_of_Spain">Wikipedia</a> shows an initial map identifying also the flag of each territory.</p>
<p>For that, I will use <code class="language-plaintext highlighter-rouge">mapSpain</code>, that uses information from <code class="language-plaintext highlighter-rouge">giscoR</code>, whose source is the geodata available in <a href="https://ec.europa.eu/eurostat"><strong>Eurostat</strong></a>. I would also use <code class="language-plaintext highlighter-rouge">giscoR</code> 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"><-</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"><-</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"><-</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="plot of chunk 20190618_preparing" /></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. So 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"><-</span><span class="w"> </span><span class="n">Spain</span><span class="w"> </span><span class="o">%>%</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"><-</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"><-</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"><-</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"><-</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="plot of chunk 20190618_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>, otherwise the plot would 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"><-</span><span class="w"> </span><span class="n">Spain</span><span class="w"> </span><span class="o">%>%</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"><-</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"><-</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"><-</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="plot of chunk 20190618_svg" /></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">%>%</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"><-</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"><-</span><span class="w"> </span><span class="n">Spain</span><span class="w"> </span><span class="o">%>%</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="plot of chunk 20190618_allCCAA" /></p>
<p>We are done now. If you have suggestion you can leave a comment. As always, if you enjoyed the post you can share it on your preferred social network.</p>
dieghernanhttps://x.com/dhernangomez
Want to use a flag (or any *.png file) as a background of your map? You are in the right post.
Beautiful Maps with <strong>R</strong> (I): Fishnets, Honeycombs and Pixels
2019-06-02T00:00:00+02:00
2019-06-02T00:00:00+02:00
https://dieghernan.github.io/201906_Beautiful1/
<h3>Awesome simplified maps with R</h3>
<img src='https://dieghernan.github.io/assets/img/blog/20190602_imgpost-1.webp' >
<p>5 min.</p>
<p>Sometimes you want to produce maps with special layouts. I specially like maps with modified geometries, e.g. simplifiying the original shapes to squares or dots. When doing a little search over 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> that 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> <code class="language-plaintext highlighter-rouge">sp</code> package instead of my personal fav, the <code class="language-plaintext highlighter-rouge">sf</code> package, (the post was published in 2016, note that author has also moved to the <code class="language-plaintext highlighter-rouge">sf</code> package since then). So I decided to explore further options with <code class="language-plaintext highlighter-rouge">sf</code>.</p>
<p>The approach is similar (using grids over a map and work with that) but using <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 also producing dots over the geometries. So basically I produced 5 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 R 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"><-</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">%>%</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">%>%</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"><-</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">%>%</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"><-</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"><-</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"><-</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"><-</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 established in the same unit that the projection (in this case is meters). Pay special attention on this, given that 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"><-</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"><-</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 belongs to a entity by assessing the centroid</span><span class="w">
</span><span class="n">cent_grid</span><span class="w"> </span><span class="o"><-</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"><-</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"><-</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"><-</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"># Lets add the df</span><span class="w">
</span><span class="n">Fishnet</span><span class="w"> </span><span class="o"><-</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">%>%</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">%>%</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 lets create the Puzzle</span><span class="w">
</span><span class="n">Puzzlegeom</span><span class="w"> </span><span class="o"><-</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"><-</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">%>%</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">%>%</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="plot of chunk 20190602_squares" /></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"><-</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"><-</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 belongs to a entity by assessing the centroid</span><span class="w">
</span><span class="n">cent_grid</span><span class="w"> </span><span class="o"><-</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"><-</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"><-</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"><-</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"># Lets add the df</span><span class="w">
</span><span class="n">Honeycomb</span><span class="w"> </span><span class="o"><-</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">%>%</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">%>%</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 lets create the Hexbin</span><span class="w">
</span><span class="n">Hexbingeom</span><span class="w"> </span><span class="o"><-</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"><-</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">%>%</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">%>%</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="plot of chunk 20190602_hex" /></p>
<h2 id="pixel-it">Pixel it!</h2>
<p>Also quite easy, just a couple of tweaks more, always 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"><-</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"><-</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 belongs to a entity by assessing the centroid</span><span class="w">
</span><span class="n">cent_grid</span><span class="w"> </span><span class="o"><-</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"><-</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"><-</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"><-</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"># Lets add the df</span><span class="w">
</span><span class="n">Pixel</span><span class="w"> </span><span class="o"><-</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">%>%</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">%>%</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="plot of chunk 20190602_pix" /></p>
<h2 id="wrap-up">Wrap up</h2>
<p>So finally I wrapped all that in a function (see the code in <a href="https://github.com/dieghernan/dieghernan.github.io/tree/master/assets/functions">my repo</a>), that I named <code class="language-plaintext highlighter-rouge">stdh_gridpol</code>:</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"><-</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"><-</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"><-</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"><-</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"><-</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"><-</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"><-</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"><-</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"><-</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"><-</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"><-</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"><-</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"><-</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"><-</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"><-</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"><-</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"><-</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"><-</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">%>%</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">%>%</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"><-</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"><-</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"><-</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"><-</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"><-</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"><-</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"><-</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="plot of chunk 20190602_functionex" /></p>
<p>And that’s it! The function <code class="language-plaintext highlighter-rouge">stdh_gridpol</code> has some alert mechanisms, 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 in a way that the shortest dimension would have 40 cells.</p>
dieghernanhttps://x.com/dhernangomez
<p>Sometimes you want to produce maps with special layouts. I specially like maps with modified geometries, e.g. simplifiying the original shapes to squares or dots. When doing a little search over 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> that 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>
Leaflet, <strong>R</strong>, Markdown, Jekyll and GitHub
2019-05-20T00:00:00+02:00
2021-05-30T00:00:00+02:00
https://dieghernan.github.io/201905_Leaflet_R_Jekyll/
<h3>Make it work in 6 steps - a short tutorial</h3>
<img src='https://dieghernan.github.io/assets/img/blog/20190520_imgpost.webp' >
<p>5 min.</p>
<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 in 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 created by myself.</p>
<p><strong>Index</strong></p>
<ol id="markdown-toc">
<li><a href="#the-githubjekyll-part" id="markdown-toc-the-githubjekyll-part">The GitHub/Jekyll part</a> <ol>
<li><a href="#1-what-to-include" id="markdown-toc-1-what-to-include">1. What to include</a></li>
<li><a href="#2where-to-include" id="markdown-toc-2where-to-include">2.Where to include</a></li>
</ol>
</li>
<li><a href="#the-rstudio-part" id="markdown-toc-the-rstudio-part">The RStudio part</a> <ol>
<li><a href="#3-creating-the-leaflet-map" id="markdown-toc-3-creating-the-leaflet-map">3. Creating the leaflet map</a></li>
<li><a href="#4-set-up-the-yaml-front-matter-" id="markdown-toc-4-set-up-the-yaml-front-matter-">4. Set up the YAML front matter <a name="step4"></a></a></li>
</ol>
</li>
<li><a href="#the-markdown-part" id="markdown-toc-the-markdown-part">The Markdown part</a> <ol>
<li><a href="#5-modifying-the-md-file" id="markdown-toc-5-modifying-the-md-file"><del>5. Modifying the <code class="language-plaintext highlighter-rouge">.md</code> file</del></a></li>
<li><a href="#6-publish-your-post" id="markdown-toc-6-publish-your-post">6. Publish your post</a></li>
</ol>
</li>
<li><a href="#gallery-size-of-a-leaflet-map-" id="markdown-toc-gallery-size-of-a-leaflet-map-">Gallery: Size of a leaflet map <a name="extra"></a></a> <ol>
<li><a href="#fixed-size" id="markdown-toc-fixed-size">Fixed size</a> <ol>
<li><a href="#example-1-672x480px" id="markdown-toc-example-1-672x480px">Example 1: 672x480px</a></li>
<li><a href="#example-2-200x300px" id="markdown-toc-example-2-200x300px">Example 2: 200x300px</a></li>
</ol>
</li>
<li><a href="#responsive-size" id="markdown-toc-responsive-size">Responsive size</a> <ol>
<li><a href="#example-3-100-width" id="markdown-toc-example-3-100-width">Example 3: 100% width</a></li>
</ol>
</li>
</ol>
</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 requested libraries in your GitHub
page. As Jekyll basically transforms <code class="language-plaintext highlighter-rouge">markdown</code> into <code class="language-plaintext highlighter-rouge">html</code>, 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 having a look to the source code of
<a href="https://rstudio.github.io/leaflet/">Leaflet for R</a> site it can be seen
this chunk:</p>
<div class="language-html highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nt"><head></span>
<span class="c"><!--code--></span>
<span class="nt"><script </span><span class="na">src=</span><span class="s">"libs/jquery/jquery.min.js"</span><span class="nt">></script></span>
<span class="nt"><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">/></span>
<span class="nt"><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">/></span>
<span class="nt"><script </span><span class="na">src=</span><span class="s">"libs/bootstrap/js/bootstrap.min.js"</span><span class="nt">></script></span>
<span class="nt"><script </span><span class="na">src=</span><span class="s">"libs/bootstrap/shim/html5shiv.min.js"</span><span class="nt">></script></span>
...
<span class="c"><!--more libraries--></span>
...
<span class="nt"><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">/></span>
<span class="nt"><script </span><span class="na">src=</span><span class="s">"libs/leaflet-binding/leaflet.js"</span><span class="nt">></script></span>
<span class="c"><!--code--></span>
<span class="nt"></head></span>
</code></pre></div></div>
<p>So now we have it! The only thing to remember is that we need <strong>to load
the libraries from the leaflet server
(<code class="language-plaintext highlighter-rouge">https://rstudio.github.io/leaflet</code>)</strong>, 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"><script </span><span class="na">src=</span><span class="s">"https://rstudio.github.io/leaflet/libs/jquery/jquery.min.js"</span><span class="nt">></script></span>
<span class="nt"><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">/></span>
<span class="nt"><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">/></span>
...
<span class="c"><!--more libraries--></span>
...
<span class="nt"><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">/></span>
<span class="nt"><script </span><span class="na">src= </span><span class="s">"https://rstudio.github.io/leaflet/libs/leaflet-binding/leaflet.js"</span><span class="nt">></script></span>
</code></pre></div></div>
<p>You can have a look of my implementation on
<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="2where-to-include">2.Where to include</h4>
<p>This a little bit more complicated, depending on the structure of your
Jekyll template. The code chunk should be included in the <code class="language-plaintext highlighter-rouge"><head></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 in the <code class="language-plaintext highlighter-rouge"><head></code> the code that you got on
step 1.</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 it. 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 just 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"><-</span><span class="w"> </span><span class="n">leaflet</span><span class="p">()</span><span class="w"> </span><span class="o">%>%</span><span class="w">
</span><span class="n">addTiles</span><span class="p">()</span><span class="w"> </span><span class="o">%>%</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 the 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, <strong>R</strong>, 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 not needed any more! I still leave it here for info.
You can skip to the next section.</strong></p>
<p>Have a look to 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"><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">></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"></script></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 would solve it 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"><!--html_preserve--></span>
<span class="nt"><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">></div></span>
<span class="nt"><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">></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"><div></code> and in the <code class="language-plaintext highlighter-rouge"><script></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 would adapt to the width of
the page with a fixed height of 216px. I put <a href="#extra">some examples</a> at
the end of the post of different size options 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 would include the
libraries in the header and make the magic happens, 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":"© <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, specially
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 tables
wouldn’t look as nice in laptops, etc. and vice versa.</p>
<h5 id="example-1-672x480px">Example 1: 672x480px</h5>
<p>Fixed size in pixels. By default in 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">%>%</span><span class="w">
</span><span class="n">addTiles</span><span class="p">()</span><span class="w"> </span><span class="o">%>%</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">%>%</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":"© <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">%>%</span><span class="w">
</span><span class="n">addTiles</span><span class="p">()</span><span class="w"> </span><span class="o">%>%</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">%>%</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":"© <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 would 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">%>%</span><span class="w">
</span><span class="n">addTiles</span><span class="p">()</span><span class="w"> </span><span class="o">%>%</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">%>%</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":"© <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>
dieghernanhttps://x.com/dhernangomez
<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 in 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 created by myself.</p>
Where in the world?
2019-05-13T00:00:00+02:00
2019-05-13T00:00:00+02:00
https://dieghernan.github.io/201905_Where-in-the-world/
<h3>A leaflet map with the places I have flown</h3>
<img src='https://dieghernan.github.io/assets/img/blog/201905_Where-in-the-world.webp' >
<p>1 min.</p>
<p>This is a very personal post, where I just show the map of all the
places I have traveled by plain</p>
<!--html_preserve-->
<div class="leaflet html-widget html-fill-item" id="htmlwidget-377442f1f9831abb6bee" style="width:672px;height:480px;"></div>
<script type="application/json" data-for="htmlwidget-377442f1f9831abb6bee">{"x":{"options":{"minZoom":1.5,"crs":{"crsClass":"L.CRS.EPSG3857","code":null,"proj4def":null,"projectedBounds":null,"options":{}}},"calls":[{"method":"addProviderTiles","args":["CartoDB.DarkMatter",null,null,{"detectRetina":true}]},{"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,40.97692,-36.832,43.35652,47.58958,51.38267,55.61792,53.42133,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.81461,175.679,-1.79061,7.52991,-2.71909,12.65597,-6.27008,-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.26469089193384,11.41427527850815,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,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":[-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.88285231874199,28.95105341447321,29.01921325814695,29.08733182106532,29.15540907487859,29.22344499158437,29.29143954352697,29.35939270339655,29.42730444422854,29.4951747394027,29.56300356264254,29.6307908880145,29.69853668992718,29.76624094313064,29.83390362271554,29.9015247041125,29.96910416309124,30.03664197575983,30.10413811856393,30.17159256828599,30.23900530204451,30.3063762972932,30.37370553182022,30.44099298374739,30.50823863152938,30.57544245395294,30.64260443013606,30.70972453952722,30.77680276190452,30.84383907737492,30.91083346637338,30.97778590966212,31.04469638832972,31.11156488379033,31.17839137778288,31.24517585237019,31.3119182899382,31.37861867319509,31.44527698517049,31.5118932092146,31.57846732899737,31.64499932850769,31.71148919205246,31.77793690425586,31.8443424500584,31.91070581471609,31.97702698379965,32.0433059431936,32.10954267909535,32.17573717801447,32.2418894267717,32.3079994124982,32.37406712263456,32.44009254493005,32.50607566744164,32.57201647853324,32.6379149668747,32.70377112144109,32.76958493151165,32.83535638666901,32.90108547679834,32.96677219208634,33.03241652302047,33.09801846038805,33.16357799527529,33.22909511906649,33.2945698234431,33.36000210038284,33.4253919421588,33.49073934133856,33.55604429078326,33.62130678364674,33.68652681337461,33.75170437370335,33.81683945865944,33.88193206255839,33.94698218000391,34.01198980588693,34.07695493538478,34.14187756396018,34.2067576873604,34.27159530161632,34.33639040304155,34.40114298823144,34.46585305406228,34.53052059769028,34.59514561655069,34.6597281083569,34.72426807109953,34.78876550304546,34.85322040273694,34.9176327689907,34.98200260089696,35.04632989781859,35.1106146593901,35.1748568855168,35.23905657637379,35.30321373240515,35.36732835432288,35.43140044310609],"lat":[40.95699643072666,40.9370326496792,40.91702870944215,40.89698466262258,40.87690056184959,40.85677645977388,40.83661240906722,40.81640846242205,40.79616467255101,40.77588109218641,40.75555777407985,40.73519477100177,40.71479213574091,40.69434992110391,40.67386817991488,40.65334696501489,40.63278632926156,40.6121863255286,40.59154700670537,40.5708684256964,40.55015063542102,40.5293936888128,40.50859763881927,40.4877625384013,40.46688844053282,40.44597539820025,40.42502346440218,40.40403269214889,40.38300313446186,40.36193484437344,40.34082787492637,40.31968227917334,40.2984981101766,40.2772754210075,40.25601426474611,40.23471469448074,40.21337676330758,40.19200052433023,40.17058603065937,40.14913333541222,40.12764249171222,40.10611355268858,40.08454657147591,40.06294160121376,40.04129869504623,40.01961790612158,39.99789928759181,39.97614289261229,39.95434877434131,39.9325169859397,39.91064758057047,39.88874061139835,39.86679613158945,39.84481419431083,39.82279485273014,39.8007381600152,39.77864416933367,39.75651293385257,39.73434450673797,39.71213894115458,39.6898962902654,39.66761660723131,39.64529994521065,39.62294635735893,39.60055589682842,39.57812861676776,39.55566457032161,39.53316381063025,39.51062639082927,39.48805236404913,39.46544178341485,39.44279470204564,39.42011117305449,39.39739124954788,39.37463498462537,39.35184243137927,39.32901364289428,39.30614867224711,39.28324757250618,39.26031039673121,39.23733719797291,39.21432802927265,39.19128294366203,39.16820199416266,39.1450852337857,39.12193271553161,39.09874449238971,39.07552061733799,39.05226114334263,39.02896612335773,39.00563561032499,38.98226965717333,38.95886831681864,38.93543164216333,38.91195968609615,38.88845250149176,38.86491014121042,38.84133265809772,38.81772010498422,38.79407253468514]}]],[[{"lng":[28.49890894838501,28.18282862833802,27.86637636834799,27.54955957844045,27.23238574892664,26.91486244911288,26.59699732597079,26.2787981027684,25.9602725776629,25.64142862225521,25.32227418010701,25.00281726522073,24.68306596048302,24.3630284160723,24.0427128478311,23.72212753560363,23.40128082153957,23.08018110836451,22.75883685761808,22.4372565878603,22.11544887284708,21.7934223396758,21.47118566690179,21.14874758262642,20.82611686255815,20.50330232804717,20.18031284409468,19.85715731733801,19.53384469401236,19.21038395789043,18.88678412820099,18.56305425752743,18.2392034296874,17.91524075759496,17.59117538110601,17.2670164648485,16.94277319603853,16.61845478228352,16.29407044937372,15.9696294390633,15.64514100684236,15.32061441970092,14.99605895388646,14.67148389265601,14.34689852402425,14.02231213850891,13.69773402687466,13.37317347787691,13.04863977600677,12.72414219923837,12.3996900167801,12.07529248683074,11.75095885434197,11.4266983487885,11.10252018194709,10.77843354568563,10.45444760976371,10.13057151964574,9.806814394327946,9.483185324180456,9.159693368805602,8.836347554913651,8.513156874217161,8.190130281345033,7.867276691777423,7.544604979802608,7.222123976496828,6.899842467728239,6.57776919218593,6.255912839435037,5.934282047998884,5.612885403469193,5.291731436645156,4.970828621702335,4.650185374392231,4.329810050273327,4.009710942974434,3.689896282491072,3.370374233515632,3.051152893802033,2.732240292565498,2.413644388918121,2.095373070340813,1.777434151192153,1.459835371254759,1.142584394319574,0.8256888068085917,0.5091561164364368,0.1929937509111688,-0.1227909433253135,-0.4381907023169492,-0.7531983457729964,-1.067806778207058,-1.38200899003544,-1.695798058634643,-2.009167149357876,-2.322109516510412,-2.63461850428377,-2.94668754764863,-3.258310173206481],"lat":[41.0168954170103,41.05600842896288,41.09425681939688,41.13163841418375,41.16815108207314,41.20379273523094,41.23856132976911,41.27245486626727,41.30547139028548,41.33760899286789,41.36886581103725,41.39924002827964,41.42872987501937,41.4573336290837,41.48504961615694,41.51187621022395,41.53781183400253,41.56285495936447,41.58700410774514,41.61025785054114,41.63261480949597,41.65407365707328,41.67463311681772,41.69429196370282,41.71304902446602,41.73090317793041,41.74785335531298,41.76389854051931,41.77903777042448,41.79327013513985,41.8065947782657,41.81901089712962,41.83051774301017,41.84111462134616,41.85080089193087,41.85957596909158,41.86743932185384,41.8743904740908,41.88042900465705,41.88555454750735,41.88976679179976,41.89306548198339,41.89545041787051,41.89692145469315,41.89747850314395,41.89712152940146,41.8958505551397,41.89366565752196,41.89056696917909,41.88655467817197,41.88162902793834,41.87579031722412,41.86903889999904,41.86137518535695,41.85279963740039,41.84331277511013,41.8329151721992,41.82160745695187,41.80939031204746,41.79626447436929,41.78223073479881,41.76728993799487,41.75144298215874,41.73469081878449,41.7170344523952,41.69847494026531,41.67901339212881,41.65865096987397,41.63738888722453,41.61522840940759,41.59217085280844,41.56821758461267,41.54337002243547,41.51762963393877,41.4909979364361,41.46347649648568,41.43506692947177,41.4057708991748,41.37559011733027,41.34452634317692,41.31258138299435,41.27975708963024,41.24605536201788,41.2114781446837,41.17602742724556,41.13970524390198,41.10251367291247,41.06445483606951,41.02553089816215,40.98574406643193,40.94509659002114,40.90359075941385,40.86122890586995,40.81801340085268,40.77394665544976,40.72903111978856,40.68326928244556,40.63666366985063,40.58921684568594,40.54093141028049]}]],[[{"lng":[27.17274823384753,27.1885581042417,27.2043796299856,27.22021282991527,27.23605772289976,27.25191432784116,27.26778266367476,27.28366274936902,27.29955460392572,27.31545824637999,27.33137369580038,27.34730097128899,27.36324009198145,27.37919107704706,27.39515394568885,27.41112871714362,27.42711541068206,27.4431140456088,27.45912464126247,27.4751472170158,27.49118179227567,27.50722838648321,27.52328701911383,27.53935770967736,27.55544047771804,27.57153534281467,27.58764232458066,27.60376144266408,27.61989271674775,27.63603616654936,27.65219181182143,27.66835967235153,27.68453976796224,27.70073211851131,27.71693674389163,27.73315366403144,27.74938289889429,27.76562446847919,27.78187839282065,27.79814469198876,27.81442338608929,27.83071449526373,27.84701803968938,27.86333403957949,27.87966251518321,27.89600348678577,27.91235697470853,27.92872299930905,27.94510158098118,27.96149274015511,27.97789649729749,27.99431287291147,28.01074188753681,28.02718356174993,28.04363791616403,28.06010497142912,28.07658474823213,28.09307726729697,28.10958254938465,28.12610061529332,28.14263148585834,28.1591751819524,28.17573172448561,28.19230113440549,28.20888343269716,28.22547864038339,28.2420867785246,28.25870786821908,28.27534193060295,28.29198898685031,28.30864905817331,28.32532216582221,28.34200833108548,28.35870757528987,28.37541991980052,28.39214538602102,28.40888399539348,28.42563576939866,28.44240072955599,28.45917889742371,28.47597029459893,28.49277494271769,28.50959286345511,28.52642407852539,28.54326860968196,28.56012647871754,28.5769977074642,28.59388231779354,28.61078033161661,28.62769177088418,28.64461665758666,28.66155501375432,28.6785068614573,28.6954722228057,28.71245111994968,28.72944357507959,28.74644961042594,28.76346924825964,28.78050251089194,28.7975494206746],"lat":[38.31908176033861,38.34577140004269,38.37245891551667,38.39914430315808,38.42582755935762,38.45250868049908,38.47918766295933,38.50586450310831,38.53253919730903,38.55921174191753,38.58588213328285,38.61255036774709,38.63921644164527,38.66588035130545,38.69254209304857,38.71920166318855,38.74585905803225,38.77251427387937,38.79916730702256,38.82581815374729,38.85246681033191,38.87911327304759,38.90575753815831,38.93239960192086,38.9590394605848,38.98567711039248,39.01231254757896,39.03894576837205,39.06557676899227,39.09220554565281,39.11883209455957,39.14545641191108,39.17207849389853,39.19869833670571,39.22531593650903,39.25193128947749,39.27854439177261,39.30515523954854,39.3317638289519,39.35837015612184,39.38497421719001,39.41157600828053,39.43817552550997,39.46477276498737,39.49136772281416,39.51796039508418,39.54455077788367,39.57113886729122,39.59772465937777,39.62430815020658,39.65088933583325,39.67746821230564,39.70404477566387,39.73061902194038,39.75719094715976,39.78376054733888,39.81032781848675,39.83689275660461,39.86345535768584,39.89001561771595,39.91657353267254,39.94312909852539,39.9696823112363,39.99623316675913,40.0227816610398,40.04932779001626,40.07587154961844,40.10241293576828,40.12895194437966,40.15548857135838,40.18202281260226,40.20855466400091,40.23508412143588,40.2616111807806,40.28813583790031,40.31465808865208,40.3411779288848,40.36769535443912,40.39421036114748,40.42072294483405,40.44723310131474,40.4737408263971,40.50024611588045,40.52674896555571,40.55324937120549,40.57974732860396,40.60624283351694,40.6327358817018,40.65922646890749,40.68571459087448,40.71220024333477,40.73868342201184,40.76516412262068,40.79164234086767,40.81811807245069,40.844591313059,40.87106205837323,40.89753030406542,40.92399604579892,40.95045927922845]}]],[[{"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.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.258310173206481,-2.946687547648631,-2.63461850428377,-2.322109516510413,-2.009167149357877,-1.695798058634644,-1.382008990035438,-1.067806778207057,-0.7531983457729953,-0.4381907023169481,-0.1227909433253135,0.1929937509111688,0.5091561164364368,0.8256888068085917,1.142584394319572,1.459835371254758,1.777434151192152,2.095373070340811,2.413644388918124,2.7322402925655,3.051152893802033,3.370374233515633,3.689896282491072,4.009710942974434,4.329810050273327,4.650185374392231,4.970828621702335,5.291731436645156,5.612885403469191,5.934282047998882,6.255912839435036,6.577769192185934,6.899842467728241,7.222123976496828,7.544604979802608,7.867276691777423,8.190130281345033,8.513156874217161,8.836347554913651,9.159693368805602,9.483185324180456,9.806814394327944,10.13057151964573,10.45444760976371,10.77843354568564,11.10252018194709,11.42669834878851,11.75095885434197,12.07529248683074,12.3996900167801,12.72414219923837,13.04863977600677,13.37317347787691,13.69773402687466,14.02231213850891,14.34689852402425,14.67148389265601,14.99605895388646,15.32061441970092,15.64514100684236,15.9696294390633,16.29407044937372,16.61845478228352,16.94277319603853,17.2670164648485,17.59117538110601,17.91524075759496,18.2392034296874,18.56305425752743,18.88678412820099,19.21038395789042,19.53384469401236,19.85715731733801,20.18031284409468,20.50330232804717,20.82611686255815,21.14874758262642,21.47118566690179,21.7934223396758,22.11544887284708,22.4372565878603,22.75883685761809,23.08018110836451,23.40128082153957,23.72212753560363,24.0427128478311,24.3630284160723,24.68306596048302,25.00281726522073,25.32227418010701,25.64142862225522,25.9602725776629,26.27879810276841,26.59699732597079,26.91486244911288,27.23238574892664,27.54955957844045,27.86637636834799,28.18282862833802,28.49890894838501],"lat":[40.54093141028049,40.58921684568594,40.63666366985063,40.68326928244557,40.72903111978855,40.77394665544976,40.81801340085268,40.86122890586995,40.90359075941385,40.94509659002114,40.98574406643193,41.02553089816215,41.06445483606951,41.10251367291247,41.13970524390198,41.17602742724556,41.2114781446837,41.24605536201789,41.27975708963024,41.31258138299434,41.34452634317692,41.37559011733027,41.4057708991748,41.43506692947177,41.46347649648568,41.4909979364361,41.51762963393877,41.54337002243547,41.56821758461266,41.59217085280844,41.61522840940759,41.63738888722453,41.65865096987397,41.67901339212881,41.69847494026531,41.7170344523952,41.73469081878449,41.75144298215874,41.76728993799487,41.78223073479881,41.79626447436929,41.80939031204746,41.82160745695186,41.83291517219921,41.84331277511012,41.85279963740039,41.86137518535696,41.86903889999904,41.87579031722412,41.88162902793834,41.88655467817197,41.89056696917909,41.89366565752196,41.89585055513969,41.89712152940146,41.89747850314395,41.89692145469315,41.89545041787051,41.89306548198339,41.88976679179976,41.88555454750735,41.88042900465705,41.8743904740908,41.86743932185384,41.85957596909158,41.85080089193087,41.84111462134616,41.83051774301017,41.81901089712962,41.80659477826571,41.79327013513985,41.77903777042448,41.76389854051931,41.74785335531298,41.73090317793041,41.71304902446602,41.69429196370282,41.67463311681772,41.65407365707328,41.63261480949597,41.61025785054115,41.58700410774514,41.56285495936446,41.53781183400253,41.51187621022395,41.48504961615694,41.4573336290837,41.42872987501937,41.39924002827964,41.36886581103725,41.33760899286789,41.30547139028548,41.27245486626727,41.23856132976911,41.20379273523094,41.16815108207314,41.13163841418375,41.09425681939687,41.05600842896288,41.0168954170103]}]],[[{"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.60392322691088,23.60392322691088,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],"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.852938178386769],[43.3011,-2.91061,2.282855055701629],[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],[40.97692,28.81461,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],[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.852938178386769,"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>
<!--/html_preserve-->
<p class="alert alert-info p-3 mx-2 my-3 lead"><strong>✈️ 251,536.4 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">62</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">97</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">16</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">101</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">36</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>
dieghernanhttps://x.com/dhernangomez
<p>This is a very personal post, where I just show the map of all the
places I have traveled by plain</p>
Cast a line to subsegments in R
2019-05-05T00:00:00+02:00
2019-05-05T00:00:00+02:00
https://dieghernan.github.io/201905_Cast-to-subsegments/
<h3>User-defined function using sf package</h3>
<img src='https://dieghernan.github.io/assets/img/blog//20190505_benchmarkfunction-1.webp' >
<p>3 min.</p>
<p>This post introduces a used-defined function used for casting <code class="language-plaintext highlighter-rouge">sf</code> objects of <code class="language-plaintext highlighter-rouge">class</code> <code class="language-plaintext highlighter-rouge">LINESTRING</code> or <code class="language-plaintext highlighter-rouge">POLYGON</code> into sub-strings.</p>
<h2 id="required-r-packages">Required R 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 <code class="language-plaintext highlighter-rouge">sf</code>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 very powerful function that transforms geometries into other different 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"><-</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"><-</span><span class="w"> </span><span class="n">italy</span><span class="w"> </span><span class="o">%>%</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"><-</span><span class="w"> </span><span class="n">italy_pol</span><span class="w"> </span><span class="o">%>%</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"><-</span><span class="w"> </span><span class="n">italy_lin</span><span class="w"> </span><span class="o">%>%</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="plot of chunk 20190505_italycast" /></p>
<p>What I missed when using <code class="language-plaintext highlighter-rouge">st_cast</code> is the possibility to “break” the <code class="language-plaintext highlighter-rouge">LINESTRING</code> objects into sub-segments:</p>
<p><img src="https://dieghernan.github.io/assets/img/blog/20190505_italycastsub-1.webp" alt="plot of chunk 20190505_italycastsub" /></p>
<h2 id="an-approach">An approach</h2>
<p>So one possible solution could be 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"><-</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">%>%</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">%>%</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"><-</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">%>%</span><span class="w">
</span><span class="n">st_multilinestring</span><span class="p">()</span><span class="w"> </span><span class="o">%>%</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">%>%</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="plot of chunk 20190505_testspain" /></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> returns an error and stops.</p>
</li>
<li>
<p>The function accepts <code class="language-plaintext highlighter-rouge">sf</code> with several rows or <code class="language-plaintext highlighter-rouge">sfc</code> objects with several geometries, and returns the same class of input. In the case of <code class="language-plaintext highlighter-rouge">sf</code> 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 output has the same number of geometries than the input. This can be modified setting the parameter <code class="language-plaintext highlighter-rouge">to</code> as <code class="language-plaintext highlighter-rouge">LINESTRING</code>, that in fact 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"><-</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"><-</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"><-</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"><-</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">%>%</span><span class="w">
</span><span class="n">st_multilinestring</span><span class="p">()</span><span class="w"> </span><span class="o">%>%</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"><-</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"><-</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"><-</span><span class="w"> </span><span class="n">endgeom</span><span class="w"> </span><span class="o">%>%</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"><-</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"><-</span><span class="w"> </span><span class="n">endgeom</span><span class="w"> </span><span class="o">%>%</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 a coordinate level, for high-resolution objects it has some degree of 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"><-</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">%>%</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"><-</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">%>%</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"><-</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"><-</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"><-</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"><-</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"><-</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"><-</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="plot of chunk 20190505_benchmarkfunction" /></p>
<p>It can be seen a difference in terms of performance, noting that <code class="language-plaintext highlighter-rouge">test100</code> has 15 polygons decomposed in 914 sub-strings while <code class="language-plaintext highlighter-rouge">test50</code> has 80 polygons to 8,414 sub-strings. 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>
dieghernanhttps://x.com/dhernangomez
<p>This post introduces a used-defined function used for casting <code class="language-plaintext highlighter-rouge">sf</code> objects of <code class="language-plaintext highlighter-rouge">class</code> <code class="language-plaintext highlighter-rouge">LINESTRING</code> or <code class="language-plaintext highlighter-rouge">POLYGON</code> into sub-strings.</p>
Using CountryCodes database and sf package
2019-04-27T00:00:00+02:00
2019-04-27T00:00:00+02:00
https://dieghernan.github.io/201904_Using-CountryCodes/
<h3>vignette of the CountryCodes project</h3>
<img src='https://dieghernan.github.io/assets/img/blog/20190427_mapfin-1.webp' >
<p>2 min.</p>
<p>This vignette is an example of use of the database provided in the Github project <a href="https://dieghernan.github.io/projects/countrycodes/">Country Codes and International Organizations & Groups</a>
by using the <code class="language-plaintext highlighter-rouge">sf</code> package in R.</p>
<h2 id="required-r-packages">Required R 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 consists on reading the database provided (in this example the <code class="language-plaintext highlighter-rouge">json</code> file) and extracting 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"><-</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"><-</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">%>%</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 is <strong>C</strong>. It is provided also a function that extract the membership from the <code class="language-plaintext highlighter-rouge">json</code> database:</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="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"><-</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="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"><-</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><span class="n">df_org</span><span class="w"> </span><span class="o"><-</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 <strong>C</strong>, 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">%>%</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">%>%</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">%>%</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">%>%</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">%>%</span><span class="w">
</span><span class="n">head</span><span class="p">()</span><span class="w"> </span><span class="o">%>%</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 & 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 <code class="language-plaintext highlighter-rouge">rnaturalearth</code> 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.
and replacing the <code class="language-plaintext highlighter-rouge">dataframe</code>for 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"><-</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">%>%</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">%>%</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 add also tiny countries</span><span class="w">
</span><span class="n">tiny</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="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">%>%</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">%>%</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"><-</span><span class="w"> </span><span class="n">df_org</span><span class="w"> </span><span class="o">%>%</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">%>%</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"><-</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"><-</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-map-wikipedia-style">Plotting map: Wikipedia style</h2>
<p>Now we would 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="Wiki" /></p>
<p>The map we will generate is presented under a Robinson projection and the color palette will be based in 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"><-</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"><-</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"><-</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">%>%</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">%>%</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">%>%</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">%>%</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">%>%</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"># By last, 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">%>%</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">%>%</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">%>%</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">%>%</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="plot of chunk 20190427_mapfin" /></p>
dieghernanhttps://x.com/dhernangomez
<p>This vignette is an example of use of the database provided in the Github project <a href="https://dieghernan.github.io/projects/countrycodes/">Country Codes and International Organizations & Groups</a>
by using the <code class="language-plaintext highlighter-rouge">sf</code> package in R.</p>
Country Codes & Organizations
2019-04-11T00:00:00+02:00
2019-04-11T00:00:00+02:00
https://dieghernan.github.io/projects/Country-Codes-and-International-Organizations/
<h3>A database with geocodes</h3>
<img src='https://dieghernan.github.io/assets/img/misc/countrycodes.png' >
<p>2 min.</p>
<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 ans sovereignty info</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: Country, Continents & Regions, capital</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 with 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 with 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 with 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.eu/">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>
dieghernanhttps://x.com/dhernangomez
<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>
Bzel
2017-05-25T00:00:00+02:00
2017-05-25T00:00:00+02:00
https://dieghernan.github.io/projects/Bzel/
<h3>A Pebble <i class="fas fa-skull-crossbones"></i> project</h3>
<img src='https://raw.githubusercontent.com/dieghernan/Bzel/master/store/BannerBzel.png' >
<p>1 min.</p>
<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>Bzel</strong> intregates the bezel into your watchface. 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="Banner" /></p>
<div class="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>
</div>
<h2 id="features">Features</h2>
<ul>
<li>Clock mode:
<ul>
<li>Digital: Minute display based on analog movement</li>
<li>Dot: Moving dot as minute marker</li>
<li>Bezel: A bar moving around the bezel as minute marker</li>
</ul>
</li>
<li>Autodetection of 12h/24h 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 on °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>Autotranslating of weekday 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 and loc</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>
<div class="row">
<div class="col-sm mb-1">
<img src="https://raw.githubusercontent.com/dieghernan/Bzel/master/store/BezelPTR.gif" alt="gif" />
</div>
<div class="col-sm mb-1">
<img src="https://raw.githubusercontent.com/dieghernan/Bzel/master/store/BezelPT.gif" alt="gif" />
</div>
<div class="col-sm mb-1">
<img src="https://raw.githubusercontent.com/dieghernan/Bzel/master/store/BezelBW.gif" alt="gif" />
</div>
</div>
<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 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="wp" /></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="wp" /></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="wp" /></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/Bzel/master/LICENSE">MIT</a>.</p>
<p><strong>Made in Madrid, Spain ❤️</strong></p>
dieghernanhttps://x.com/dhernangomez
Bzel intregates the bezel into your watchface. Display minutes as digits, as a moving dot or as a fill in the bezel
7egment
2017-05-17T00:00:00+02:00
2017-05-17T00:00:00+02:00
https://dieghernan.github.io/projects/7egment/
<h3>A Pebble <i class="fas fa-skull-crossbones"></i> project</h3>
<img src='https://raw.githubusercontent.com/dieghernan/7egment/master/store/Banner.png' >
<p>1 min.</p>
<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 watchface based on the classic 7-segment display that adds your location and the 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="Banner" /></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 based on your watch settings</li>
<li>Internationalization: Autotranslating of weekday 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 background colors, frame and text</li>
<li>3 Bands design. Make it match your tie!</li>
<li>Weather: Current conditions on °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="gif" />
</div>
<div class="col-sm mb-1">
<img src="https://raw.githubusercontent.com/dieghernan/7egment/master/store/PT.gif" alt="gif" />
</div>
<div class="col-sm mb-1">
<img src="https://raw.githubusercontent.com/dieghernan/7egment/master/store/PTR.gif" alt="gif" />
</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="wp" /></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="wp" /></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>
dieghernanhttps://x.com/dhernangomez
7egment is a customizable watchface based on the classic 7-segment display that adds your location and the current weather information in the language used on your watch and smartphone.
Sfera
2017-03-14T00:00:00+01:00
2017-03-14T00:00:00+01:00
https://dieghernan.github.io/projects/Sfera/
<h3>A Pebble <i class="fas fa-skull-crossbones"></i> project</h3>
<img src='https://raw.githubusercontent.com/dieghernan/Sfera/master/assets/SferaBanner.png' >
<p>1 min.</p>
<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 watchface that gets the most of the smartwatch capabilities. Set your preferences and enjoy this beautifully designed watchface.</p>
<p><img src="https://raw.githubusercontent.com/dieghernan/Sfera/master/assets/SferaBanner.png" alt="Banner" /></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&query=Sfera&section=watchfaces" role="button">Download from Rebble Appstore</a>
</div>
<h2 id="features">Features</h2>
<ul>
<li>Clock mode:
<ul>
<li>Analog: Classic analog watchface</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 Analogic Minute</li>
</ul>
</li>
<li>Autodetection of 12h/24h 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 on °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>Autotranslating of weekday 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 managing your API keys</li>
</ul>
<h2 id="screenshots">Screenshots</h2>
<p><img src="https://raw.githubusercontent.com/dieghernan/Sfera/master/assets/SferaGif.gif" alt="GIF" /></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 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="wp" /></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="wp" /></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="wp" /></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>
dieghernanhttps://x.com/dhernangomez
Sfera for Pebble Time Round is a highly customizable watchface that gets the most of the smartwatch capabilities. Set your preferences and enjoy this beautifully designed watchface.
TextWatch Clima
2017-02-16T00:00:00+01:00
2017-02-16T00:00:00+01:00
https://dieghernan.github.io/projects/TextWatchClima/
<h3>A Pebble <i class="fas fa-skull-crossbones"></i> project</h3>
<img src='https://raw.githubusercontent.com/dieghernan/TextWatchClima/master/store/BannerRound.png' >
<p>1 min.</p>
<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 watchface adding a bunch of new capabilities.</p>
<p><img src="https://raw.githubusercontent.com/dieghernan/TextWatchClima/master/store/BannerRound.png" alt="banner" /></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 hour in natural language</li>
<li>Autofit to screen</li>
</ul>
<p><img src="https://raw.githubusercontent.com/dieghernan/TextWatchClima/master/store/BannerTime.png" alt="banner" /></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>Animation on text</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</li>
<li><em>More at request</em></li>
</ul>
</li>
<li>Battery bar display</li>
<li>Weather: Current conditions on °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="banner" /></p>
<h2 id="next-developments">Next 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 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="wp" /></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="wp" /></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="wp" /></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="gif" />
</div>
<div class="col-sm mb-1">
<img src="https://raw.githubusercontent.com/dieghernan/TextWatchClima/master/store/ScrShTime.gif" alt="gif" />
</div>
<div class="col-sm mb-1">
<img src="https://raw.githubusercontent.com/dieghernan/TextWatchClima/master/store/ScrShRound.gif" alt="gif" />
</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>
dieghernanhttps://x.com/dhernangomez
TextWatch Clima upgrades the classic TextWatch watchface adding a bunch of new capabilities.