class: center, middle, inverse, title-slide .title[ # Introduction to Geospatial Techniques for Social Scientists in R ] .subtitle[ ## Introduction to GIS ] .author[ ### Stefan Jünger & Anne-Kathrin Stroppe ] .institute[ ###
GESIS Workshop
] .date[ ### April 23, 2024 ] --- layout: true --- ## About This Course This course will teach you how to exploit `R` and apply its geospatial techniques in a social science context. By the end of this course, you should... - Be comfortable with using geospatial data in `R` - Including importing, wrangling, and exploring geospatial data - Be able to create maps based on your very own processed geospatial data in `R` - Feel prepared for (your first steps in) spatial analysis --- ## Keep Calm and Carry On Learning/Using `R` <img src="data:image/png;base64,#../img/r_first_then.png" width="50%" style="display: block; margin: auto;" /> <small><small>Illustration by [Allison Horst](https://github.com/allisonhorst/stats-illustrations) </small></small> --- ## We are (Necessarily) Selective There's a multitude of spatial `R` packages - We cannot cover all of them - and we cannot cover all functions - You may have used some we are not familiar with We will show the use of packages we exploit in practice - There's always another way of doing things in `R` - Don't hesitate to bring up your solutions **You can't learn everything at once, but you also don't have to!** --- ## Prerequisites for This Course .pull-left[ - Knowledge of `R`, its syntax, and internal logic - Affinity for using script-based languages - Don't be scared to wrangle data with complex structures - Working versions of `R` (and `Rstudio`) on your computer - Ideally, with the packages installed, we asked you upfront ] .pull-right[ <br> <br> <img src="data:image/png;base64,#../img/i-love-programming.jpg" width="75%" style="display: block; margin: auto;" /> ] --- ## About Us **Stefan Jünger** .pull-left[ <img src="data:image/png;base64,#../img/Stefan.png" width="50%" style="display: block; margin: auto;" /> ] .pull-right[ .small[ - Senior Researcher in the team Survey Data Augmentation at the GESIS department Survey Data Curation - Ph.D. in social sciences, University of Cologne ] ] .small[ - Research interests: - Quantitative methods, Geographic Information Systems (GIS) - Social inequalities - Attitudes towards minorities - Environmental attitudes - Reproducible research ] .small[ [stefan.juenger@gesis.org](mailto:stefan.juenger@gesis.org) | [https://stefanjuenger.github.io](https://stefanjuenger.github.io) ] --- ## About Us **Anne Stroppe** .pull-left[ <img src="data:image/png;base64,#../img/Anne.png" width="50%" style="display: block; margin: auto;" /> ] .pull-right[ - Research Associate in the SDA team at GESIS - Pursuing Ph.D. at the University of Mannheim (PolSci) ] - Research focuses: - Political and electoral geography - Attitudes towards the political system - Political engagement and conspiracy beliefs - Data quality and open science .small[ [anne-kathrin.stroppe@gesis.org](mailto:anne-kathrin.stroppe@gesis.org) ] --- ## About You .pull-left[ - What's your name? - Where do you work/research? What are you working on/researching? - What is your experience with `R` or other programming languages? - Do you already have experience with geospatial data? ] .pull-right[ <br> <img src="data:image/png;base64,#../img/so-tell-me-5be02d.jpg" width="800" style="display: block; margin: auto;" /> .tinyisher[.center[[Source](https://makeameme.org/meme/so-tell-me-5be02d)]] ] - **What do you want to use `R` and geospatial data for?** --- ## Preliminaries - The workshop consists of a combination of lectures and hands-on exercises - Feel free to ask questions at any time - Slides and other materials are available at .center[`https://github.com/StefanJuenger/gesis-workshop-geospatial-techniques-R-2024`] --- ## Download Materials <img src="data:image/png;base64,#../img/download_repo.png" width="75%" style="display: block; margin: auto;" /> --- ## Course Schedule <table class="table" style="color: black; margin-left: auto; margin-right: auto;"> <thead> <tr> <th style="text-align:left;"> Day </th> <th style="text-align:left;"> Time </th> <th style="text-align:left;"> Title </th> </tr> </thead> <tbody> <tr> <td style="text-align:left;color: gray !important;"> April 23 </td> <td style="text-align:left;color: gray !important;"> 10:00-11:30 </td> <td style="text-align:left;font-weight: bold;"> Introduction to GIS </td> </tr> <tr> <td style="text-align:left;color: gray !important;"> April 23 </td> <td style="text-align:left;color: gray !important;"> 11:45-13:00 </td> <td style="text-align:left;font-weight: bold;"> Vector Data </td> </tr> <tr> <td style="text-align:left;color: gray !important;color: gray !important;"> April 23 </td> <td style="text-align:left;color: gray !important;color: gray !important;"> 13:00-14:00 </td> <td style="text-align:left;font-weight: bold;color: gray !important;"> Lunch Break </td> </tr> <tr> <td style="text-align:left;color: gray !important;"> April 23 </td> <td style="text-align:left;color: gray !important;"> 14:00-15:30 </td> <td style="text-align:left;font-weight: bold;"> Mapping </td> </tr> <tr> <td style="text-align:left;color: gray !important;border-bottom: 1px solid"> April 23 </td> <td style="text-align:left;color: gray !important;border-bottom: 1px solid"> 15:45-17:00 </td> <td style="text-align:left;font-weight: bold;border-bottom: 1px solid"> Raster Data </td> </tr> <tr> <td style="text-align:left;color: gray !important;"> April 24 </td> <td style="text-align:left;color: gray !important;"> 09:00-10:30 </td> <td style="text-align:left;font-weight: bold;"> Advanced Data Import & Processing </td> </tr> <tr> <td style="text-align:left;color: gray !important;"> April 24 </td> <td style="text-align:left;color: gray !important;"> 10:45-12:00 </td> <td style="text-align:left;font-weight: bold;"> Applied Data Wrangling & Linking </td> </tr> <tr> <td style="text-align:left;color: gray !important;color: gray !important;"> April 24 </td> <td style="text-align:left;color: gray !important;color: gray !important;"> 12:00-13:00 </td> <td style="text-align:left;font-weight: bold;color: gray !important;"> Lunch Break </td> </tr> <tr> <td style="text-align:left;color: gray !important;"> April 24 </td> <td style="text-align:left;color: gray !important;"> 13:00-14:30 </td> <td style="text-align:left;font-weight: bold;"> Investigating Spatial Autocorrelation </td> </tr> <tr> <td style="text-align:left;color: gray !important;"> April 24 </td> <td style="text-align:left;color: gray !important;"> 14:45-16:00 </td> <td style="text-align:left;font-weight: bold;"> Spatial Econometrics & Outlook </td> </tr> </tbody> </table> --- ## Now <table class="table" style="color: black; margin-left: auto; margin-right: auto;"> <thead> <tr> <th style="text-align:left;"> Day </th> <th style="text-align:left;"> Time </th> <th style="text-align:left;"> Title </th> </tr> </thead> <tbody> <tr> <td style="text-align:left;color: gray !important;background-color: yellow !important;"> April 23 </td> <td style="text-align:left;color: gray !important;background-color: yellow !important;"> 10:00-11:30 </td> <td style="text-align:left;font-weight: bold;background-color: yellow !important;"> Introduction to GIS </td> </tr> <tr> <td style="text-align:left;color: gray !important;"> April 23 </td> <td style="text-align:left;color: gray !important;"> 11:45-13:00 </td> <td style="text-align:left;font-weight: bold;"> Vector Data </td> </tr> <tr> <td style="text-align:left;color: gray !important;color: gray !important;"> April 23 </td> <td style="text-align:left;color: gray !important;color: gray !important;"> 13:00-14:00 </td> <td style="text-align:left;font-weight: bold;color: gray !important;"> Lunch Break </td> </tr> <tr> <td style="text-align:left;color: gray !important;"> April 23 </td> <td style="text-align:left;color: gray !important;"> 14:00-15:30 </td> <td style="text-align:left;font-weight: bold;"> Mapping </td> </tr> <tr> <td style="text-align:left;color: gray !important;border-bottom: 1px solid"> April 23 </td> <td style="text-align:left;color: gray !important;border-bottom: 1px solid"> 15:45-17:00 </td> <td style="text-align:left;font-weight: bold;border-bottom: 1px solid"> Raster Data </td> </tr> <tr> <td style="text-align:left;color: gray !important;"> April 24 </td> <td style="text-align:left;color: gray !important;"> 09:00-10:30 </td> <td style="text-align:left;font-weight: bold;"> Advanced Data Import & Processing </td> </tr> <tr> <td style="text-align:left;color: gray !important;"> April 24 </td> <td style="text-align:left;color: gray !important;"> 10:45-12:00 </td> <td style="text-align:left;font-weight: bold;"> Applied Data Wrangling & Linking </td> </tr> <tr> <td style="text-align:left;color: gray !important;color: gray !important;"> April 24 </td> <td style="text-align:left;color: gray !important;color: gray !important;"> 12:00-13:00 </td> <td style="text-align:left;font-weight: bold;color: gray !important;"> Lunch Break </td> </tr> <tr> <td style="text-align:left;color: gray !important;"> April 24 </td> <td style="text-align:left;color: gray !important;"> 13:00-14:30 </td> <td style="text-align:left;font-weight: bold;"> Investigating Spatial Autocorrelation </td> </tr> <tr> <td style="text-align:left;color: gray !important;"> April 24 </td> <td style="text-align:left;color: gray !important;"> 14:45-16:00 </td> <td style="text-align:left;font-weight: bold;"> Spatial Econometrics & Outlook </td> </tr> </tbody> </table> --- ## Geographic Information in Social Science Research .pull-left[ Exploiting geographic information is not new. For example, Siegfried (1913) used soil composition information to explain election results in France. ] .pull-right[ <img src="data:image/png;base64,#../img/siegfried.png" width="75%" style="display: block; margin: auto;" /> .center[.tinyisher[https://images.fr.shopping.rakuten.com/photo/874882994.jpg]] ] --- ## The Chicago School! <img src="data:image/png;base64,#../img/park_etal.png" width="50%" style="display: block; margin: auto;" /> .tinyisher[Park et al. 1925] --- ## Integration in Theory .pull-left[ <img src="data:image/png;base64,#../img/nature_prejudice.png" width="65%" style="display: block; margin: auto;" /> .center[.tinyisher[https://i.gr-assets.com/images/S/compressed.photo.goodreads.com/books/1387595670l/7034925.jpg]] ] .pull-right[ A lot of classic theories inherently make use of space. For example, in Allport's (1954) contact theory, he at least implicitly assumes that people meet in a set space. ] --- ## Still relevant today So many studies still rely on these ideas but incorperate space directly, e.g., .pull-left[ .tinyisher[ - Iyer, A., & Pryce, G. (2023). Theorising the causal impacts of social frontiers: The social and psychological implications of discontinuities in the geography of residential mix. Urban Studies, 00420980231194834. https://doi.org/10.1177/00420980231194834 - Kent, J. (2022). Can urban fabric encourage tolerance? Evidence that the structure of cities influences attitudes toward migrants in Europe. Cities, 121, 103494. https://doi.org/10.1016/j.cities.2021.103494 - Schmidt, K., Jacobsen, J., & Iglauer, T. (2023). Proximity to refugee accommodations does not affect locals’ attitudes toward refugees: Evidence from Germany. European Sociological Review, jcad028. https://doi.org/10.1093/esr/jcad028 - Xu, A. Z. (2023). Segregation and the Spatial Externalities of Inequality: A Theory of Interdependence and Public Goods in Cities. American Political Science Review, 1–18. https://doi.org/10.1017/S0003055423000722 - ... - Jünger, S., & Schaeffer, M. (2023). Ethnic Diversity and Social Integration—What are the Consequences of Ethnic Residential Boundaries and Halos for Social Integration in Germany? KZfSS Kölner Zeitschrift Für Soziologie Und Sozialpsychologie. https://doi.org/10.1007/s11577-023-00888-1 ] ] .pull-right[ <img src="data:image/png;base64,#../img/xu2023.png" width="60%" style="display: block; margin: auto;" /> .center[.tinyisher[Xu 2023]] ] --- ## Data Landscape .pull-left[ Increased amount of available data - Quantitative and on a small spatial scale </br> <img src="data:image/png;base64,#../img/tools_today.png" width="60%" style="display: block; margin: auto;" /> ] .pull-right[ <img src="data:image/png;base64,#../img/geo_today.png" width="816" style="display: block; margin: auto;" /> Better tools - Personal computer with enough horsepower - Standard software, such as `R`, can be used as Geographic Information System (GIS) ] --- ## What Are Geospatial Data? .pull-left[ </br> Data with a direct spatial reference `\(\rightarrow\)` **geo-coordinates** - Information about geometries - Optional: Content in relation to the geometries ] .pull-right[ <img src="data:image/png;base64,#../img/fig_geometries.png" width="85%" style="display: block; margin: auto;" /> .tinyisher[Sources: OpenStreetMap / GEOFABRIK (2018), City of Cologne (2014), and the Statistical Offices of the Federation and the Länder (2016) / Jünger, 2019] ] --- ## Geospatial Data in This Course I In the folder called `./data`, you can find (most of) the data files prepped for all the exercises and slides. The following data are included: - Administrative borders of Germany (Prefix *VG250_*) are provided by the German [Federal Agency for Cartography and Geodesy](http://www.bkg.bund.de)(2018). Check out their [Open Data Portal](https://gdz.bkg.bund.de/index.php/default/open-data.html). - The locations of e-car charging stations in Germany are retrieved from the [Bundesnetzagentur](https://www.bundesnetzagentur.de/DE/Fachthemen/ElektrizitaetundGas/E-Mobilitaet/Ladesaeulenkarte/start.html). - Election Results for the German Right-Wing Populist Party *AfD* in the 2021 German federal election ([Der Bundeswahlleiter, Wiesbaden 2018](https://www.bundeswahlleiter.de/bundestagswahlen/2017/ergebnisse/weitere-ergebnisse.html)). --- ## Geospatial Data in This Course II - District attributes are from [INKAR](https://www.inkar.de/) and curated by Bundesinstitut für Bau-, Stadt- und Raumforschung (BBSR) - German Census 2011 data are provided by the [Federal Statistical Office Germany, Wiesbaden 2020](https://www.zensus2011.de/EN/Home/home_node.html) - Shapefiles, voting data, and car-related data for Cologne are gathered from the [Open Data Portal Cologne](https://www.offenedaten-koeln.de/) - Information about public transport stops and streets are from [OpenStreetMap](https://www.openstreetmap.org/) - Weather data are gathered from [Climate Data Center of the German Weather Service](https://www.dwd.de/DE/klimaumwelt/cdc/cdc_node.html) **Please make sure that if you reuse any of the provided data to cite the original data sources.** --- ## What Is GIS? Most common understanding: Geographic Information Systems (GIS) as specific software to process geospatial data for - Visualization - Analysis <img src="data:image/png;base64,#../img/gis.png" width="70%" style="display: block; margin: auto;" /> .center[.tinyisher[Screenshot of the Open Source GIS [`QGIS`](https://qgis.org)]] --- ## Data Specifics .pull-left[ </br> </br> <img src="data:image/png;base64,#../img/fig_3d_simple.png" width="9083" style="display: block; margin: auto;" /> .tinyisher[Sources: OpenStreetMap / GEOFABRIK (2018) and City of Cologne (2014)] ] .pull-right[ Formats - Vector data (points, lines, polygons) - Raster data (grids) Coordinate reference systems - Allow the projection on earth's surface - Differ in precision for specific purposes ] --- ## Layers Must Match! .pull-left[ .center[ (EPSG:3857) ] ] .pull-right[ .center[ (EPSG:3035) ] ] <img src="data:image/png;base64,#../img/fig_projections.png" width="9956" style="display: block; margin: auto;" /> .tinyisher[Source: Statistical Office of the European Union Eurostat (2018) / Jünger, 2019] --- ## Types of CRS Differentiating between different CRS is wild (at least for me...). You may hear from geographic, geocentric, projected, or local CRS in your research. What's the difference? - whether 2 dimensional (longitude, latitude) or 3 dimensional (+height) coordinates are used - the location of the coordinate system's origin (center of earth or not) - projection on a flat surface (transformation of longitudes and latitudes to x and y coordinates) - location (the smaller, the more precise are projections) *In practice, you shouldn't worry too much about CRS. Again, what matters is that they match.* --- class: middle <br> <img src="data:image/png;base64,#../img/layers_meme.jpg" width="70%" style="display: block; margin: auto;" /> --- ## Old Standard: `PROJ.4` Strings This is how your information about the CRS are defined in a classic standard: ``` +proj=laea +lat_0=52 +lon_0=10 +x_0=4321000 +y_0=3210000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ``` .tinyisher[Source: https://epsg.io/3035] (It's nothing you would type by hand) --- ## New Kid in Town: `WKT` (“Well Known Text”) ``` PROJCS["ETRS89 / LAEA Europe", GEOGCS["ETRS89", DATUM["European_Terrestrial_Reference_System_1989", SPHEROID["GRS 1980",6378137,298.257222101, AUTHORITY["EPSG","7019"]], TOWGS84[0,0,0,0,0,0,0], AUTHORITY["EPSG","6258"]], PRIMEM["Greenwich",0, AUTHORITY["EPSG","8901"]], UNIT["degree",0.0174532925199433, AUTHORITY["EPSG","9122"]], AUTHORITY["EPSG","4258"]], PROJECTION["Lambert_Azimuthal_Equal_Area"], PARAMETER["latitude_of_center",52], PARAMETER["longitude_of_center",10], PARAMETER["false_easting",4321000], PARAMETER["false_northing",3210000], UNIT["metre",1, AUTHORITY["EPSG","9001"]], AUTHORITY["EPSG","3035"]] ``` .tinyisher[Source: https://epsg.io/3035] --- ## Current Transition From `PROJ.4` to `WKT` in `R` There's a transition from the old standard of `PROJ.4` to `WKT` in many `R` packages. - sometimes, you'll get warnings - you should check what's causing the warning - in the best case, they will disappear in the future --- ## EPSG Codes .pull-left[ Eventually, it's not as challenging to work with CRS in `R` as it may seem - we don't have to use PROJ.4 or WKT strings directly Most of the times it's enough to use so-called EPSG Codes ("European Petroleum Survey Group Geodesy") - Small digit sequence ] .pull-right[ <br> <img src="data:image/png;base64,#../img/ImageEPSGlogo.gif" style="display: block; margin: auto;" /> .tinyisher[.center[[Source](http://geotiff.maptools.org/proj_list/guid7.html)]] ] --- ## More Details on Geospatial Data Let's learn about geospatial data as we learn about specific formats <img src="data:image/png;base64,#../img/Raster-and-Vector-data-types-as-representative-of-real-world-geographic-space_W640.jpg" width="50%" style="display: block; margin: auto;" /> .tinyisher[.center[[Source](https://dx.doi.org/10.13140/2.1.3030.1767)]] --- ## Packages in This Course We will use plenty of different packages during the course, but only a few are our main drivers (e.g., the `sf` package). Here's the list of packages .pull-left[ - [`dplyr`](https://cran.r-project.org/web/packages/dplyr/index.html) - [`ggplot2`](https://cran.r-project.org/web/packages/ggplot2/index.html) - **[`ggsn`](http://oswaldosantos.github.io/ggsn/)** - [`haven`](https://cran.r-project.org/web/packages/haven/index.html) - [`osmdata`](https://cran.r-project.org/web/packages/osmdata/index.html) - **[`OpenStreetMap`](https://cran.r-project.org/web/packages/OpenStreetMap/index.html)**\* - [`sf`](https://cran.r-project.org/web/packages/sf/index.html) - [`spatialreg`](https://cran.r-project.org/web/packages/spatialreg/index.html) ] .pull-right[ - [`spatstat`](https://cran.r-project.org/web/packages/spatstat/index.html) - [`sfdep`](https://cran.r-project.org/web/packages/sfdep/index.html) - [`spdep`](https://cran.r-project.org/web/packages/spdep/index.html) - [`terra`](https://cran.r-project.org/web/packages/terra/index.html) - **[`tidygeocoder`](https://cloud.r-project.org/web/packages/tidygeocoder/index.html)** - [`tmap`](https://cran.r-project.org/web/packages/tmap/index.html) - [`tmaptools`](https://cran.r-project.org/web/packages/tmaptools/index.html) - [`raster`](https://cran.r-project.org/web/packages/raster/index.html) - [`z11`](https://github.com/StefanJuenger/z11) ] .tinyisher[\* If you use a Mac, you may need to install Java: https://www.java.com/de/download/] --- class: middle ## Exercise 1_1_1: Package Installation [Exercise](https://stefanjuenger.github.io/gesis-workshop-geospatial-techniques-R-2024/exercises/1_1_1_Package_Installation.html) [Solution](https://stefanjuenger.github.io/gesis-workshop-geospatial-techniques-R-2024/solutions/1_1_1_Package_Installation.html) <!-- STOP WITH SLIDES HERE --> --- layout: false class: center background-image: url(data:image/png;base64,#../assets/img/the_end.png) background-size: cover .left-column[ </br> <img src="data:image/png;base64,#../img/Stefan.png" width="75%" style="display: block; margin: auto;" /> ] .right-column[ .left[.small[<svg viewBox="0 0 512 512" style="height:1em;position:relative;display:inline-block;top:.1em;" xmlns="http://www.w3.org/2000/svg"> <path d="M464 64H48C21.49 64 0 85.49 0 112v288c0 26.51 21.49 48 48 48h416c26.51 0 48-21.49 48-48V112c0-26.51-21.49-48-48-48zm0 48v40.805c-22.422 18.259-58.168 46.651-134.587 106.49-16.841 13.247-50.201 45.072-73.413 44.701-23.208.375-56.579-31.459-73.413-44.701C106.18 199.465 70.425 171.067 48 152.805V112h416zM48 400V214.398c22.914 18.251 55.409 43.862 104.938 82.646 21.857 17.205 60.134 55.186 103.062 54.955 42.717.231 80.509-37.199 103.053-54.947 49.528-38.783 82.032-64.401 104.947-82.653V400H48z"></path> </svg> [stefan.juenger@gesis.org](mailto:stefan.juenger@gesis.org)] .small[<svg viewBox="0 0 512 512" style="height:1em;position:relative;display:inline-block;top:.1em;" xmlns="http://www.w3.org/2000/svg"> <path d="M459.37 151.716c.325 4.548.325 9.097.325 13.645 0 138.72-105.583 298.558-298.558 298.558-59.452 0-114.68-17.219-161.137-47.106 8.447.974 16.568 1.299 25.34 1.299 49.055 0 94.213-16.568 130.274-44.832-46.132-.975-84.792-31.188-98.112-72.772 6.498.974 12.995 1.624 19.818 1.624 9.421 0 18.843-1.3 27.614-3.573-48.081-9.747-84.143-51.98-84.143-102.985v-1.299c13.969 7.797 30.214 12.67 47.431 13.319-28.264-18.843-46.781-51.005-46.781-87.391 0-19.492 5.197-37.36 14.294-52.954 51.655 63.675 129.3 105.258 216.365 109.807-1.624-7.797-2.599-15.918-2.599-24.04 0-57.828 46.782-104.934 104.934-104.934 30.213 0 57.502 12.67 76.67 33.137 23.715-4.548 46.456-13.32 66.599-25.34-7.798 24.366-24.366 44.833-46.132 57.827 21.117-2.273 41.584-8.122 60.426-16.243-14.292 20.791-32.161 39.308-52.628 54.253z"></path> </svg> [`@StefanJuenger`](https://twitter.com/StefanJuenger)] .small[<svg viewBox="0 0 496 512" style="height:1em;position:relative;display:inline-block;top:.1em;" xmlns="http://www.w3.org/2000/svg"> <path d="M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6zm-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3zm44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9zM244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8zM97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1zm-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7zm32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1zm-11.4-14.7c-1.6 1-1.6 3.6 0 5.9 1.6 2.3 4.3 3.3 5.6 2.3 1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2z"></path> </svg> [`StefanJuenger`](https://github.com/StefanJuenger)] .small[<svg viewBox="0 0 576 512" style="height:1em;position:relative;display:inline-block;top:.1em;" xmlns="http://www.w3.org/2000/svg"> <path d="M280.37 148.26L96 300.11V464a16 16 0 0 0 16 16l112.06-.29a16 16 0 0 0 15.92-16V368a16 16 0 0 1 16-16h64a16 16 0 0 1 16 16v95.64a16 16 0 0 0 16 16.05L464 480a16 16 0 0 0 16-16V300L295.67 148.26a12.19 12.19 0 0 0-15.3 0zM571.6 251.47L488 182.56V44.05a12 12 0 0 0-12-12h-56a12 12 0 0 0-12 12v72.61L318.47 43a48 48 0 0 0-61 0L4.34 251.47a12 12 0 0 0-1.6 16.9l25.5 31A12 12 0 0 0 45.15 301l235.22-193.74a12.19 12.19 0 0 1 15.3 0L530.9 301a12 12 0 0 0 16.9-1.6l25.5-31a12 12 0 0 0-1.7-16.93z"></path> </svg> [`https://stefanjuenger.github.io`](https://stefanjuenger.github.io)]] ]