1 + 1
[1] 2
+\n\n\n\n```{=html}\n\n```\n"},"formats":{"html":{"execute":{"fig-width":7,"fig-height":5,"fig-format":"retina","fig-dpi":96,"df-print":"default","error":false,"eval":true,"cache":null,"freeze":true,"echo":true,"output":true,"warning":true,"include":true,"keep-md":false,"keep-ipynb":false,"ipynb":null,"enabled":null,"daemon":null,"daemon-restart":false,"debug":false,"ipynb-filters":[],"engine":"markdown"},"render":{"keep-tex":false,"keep-yaml":false,"keep-source":false,"keep-hidden":false,"prefer-html":false,"output-divs":true,"output-ext":"html","fig-align":"default","fig-pos":null,"fig-env":null,"code-fold":"none","code-overflow":"wrap","code-link":false,"code-line-numbers":false,"code-tools":false,"tbl-colwidths":"auto","merge-includes":true,"latex-auto-mk":true,"latex-auto-install":true,"latex-clean":true,"latex-max-runs":10,"latex-makeindex":"makeindex","latex-makeindex-opts":[],"latex-tlmgr-opts":[],"latex-input-paths":[],"latex-output-dir":null,"link-external-icon":false,"link-external-newwindow":false,"self-contained-math":false,"format-resources":[]},"pandoc":{"standalone":true,"wrap":"none","default-image-extension":"png","to":"html","output-file":"index.html"},"language":{},"metadata":{"lang":"en","fig-responsive":true,"quarto-version":"1.0.38","editor":"visual","theme":{"light":["flatly","../../styles.scss"],"dark":["darkly","../../styles-dark.scss"]},"mainfont":"IBM Plex Sans","code-copy":true,"title-block-banner":true,"title":"Relative Elevation Model","date":"2022-02-03","categories":["QGIS"]},"extensions":{"book":{"multiFile":true}}}}} \ No newline at end of file diff --git a/.quarto/idx/posts/Seathwaite-blender/index.qmd.json b/.quarto/idx/posts/Seathwaite-blender/index.qmd.json new file mode 100644 index 0000000..c584285 --- /dev/null +++ b/.quarto/idx/posts/Seathwaite-blender/index.qmd.json @@ -0,0 +1 @@ +{"title":"An attempt at mapping with Blender","markdown":{"yaml":{"title":"An attempt at mapping with Blender","date":"2021-11-14","categories":["Blender","30DayMapChallenge2021"]},"containsRefs":false,"markdown":"\n\nInspired by [Owen Powell's excellent Blender creations](https://owenpowell.wordpress.com/30-day-map-challenge-2020/) over the course of last year's challenge, I had a go using Blender for the first time, mapping the area around Seathwaite Tarn in the Lake District.\n\n\n\nI used 1m DTMs from [DEFRA](https://environment.data.gov.uk/DefraDataDownload/) and [OS Open Zoomstack](https://www.ordnancesurvey.co.uk/business-government/products/open-zoomstack) for the water and forest features.\n"},"formats":{"html":{"execute":{"fig-width":7,"fig-height":5,"fig-format":"retina","fig-dpi":96,"df-print":"default","error":false,"eval":true,"cache":null,"freeze":true,"echo":true,"output":true,"warning":true,"include":true,"keep-md":false,"keep-ipynb":false,"ipynb":null,"enabled":null,"daemon":null,"daemon-restart":false,"debug":false,"ipynb-filters":[],"engine":"markdown"},"render":{"keep-tex":false,"keep-yaml":false,"keep-source":false,"keep-hidden":false,"prefer-html":false,"output-divs":true,"output-ext":"html","fig-align":"default","fig-pos":null,"fig-env":null,"code-fold":"none","code-overflow":"wrap","code-link":false,"code-line-numbers":false,"code-tools":false,"tbl-colwidths":"auto","merge-includes":true,"latex-auto-mk":true,"latex-auto-install":true,"latex-clean":true,"latex-max-runs":10,"latex-makeindex":"makeindex","latex-makeindex-opts":[],"latex-tlmgr-opts":[],"latex-input-paths":[],"latex-output-dir":null,"link-external-icon":false,"link-external-newwindow":false,"self-contained-math":false,"format-resources":[]},"pandoc":{"standalone":true,"wrap":"none","default-image-extension":"png","to":"html","output-file":"index.html"},"language":{},"metadata":{"lang":"en","fig-responsive":true,"quarto-version":"1.0.38","editor":"visual","theme":{"light":["flatly","../../styles.scss"],"dark":["darkly","../../styles-dark.scss"]},"mainfont":"IBM Plex Sans","code-copy":true,"title-block-banner":true,"title":"An attempt at mapping with Blender","date":"2021-11-14","categories":["Blender","30DayMapChallenge2021"]},"extensions":{"book":{"multiFile":true}}}}} \ No newline at end of file diff --git a/.quarto/idx/posts/UK-numbered-roads/index.qmd.json b/.quarto/idx/posts/UK-numbered-roads/index.qmd.json new file mode 100644 index 0000000..2470055 --- /dev/null +++ b/.quarto/idx/posts/UK-numbered-roads/index.qmd.json @@ -0,0 +1 @@ +{"title":"Colouring by Numbers","markdown":{"yaml":{"title":"Colouring by Numbers","date":"2021-11-02","categories":["QGIS","30DayMapChallenge2021"]},"containsRefs":false,"markdown":"\n\nWhiling away the finite hours of my life reading Wikipedia, I came across a [map](https://commons.wikimedia.org/wiki/File:United_Kingdom_A_road_zones.svg) purporting to show different regions for the UK's numbered roads. Immediately I questioned its accuracy: I live firmly within the '1' zone, and while it is true that most of my local numbered roads begin with 1 I'm also a frequent driver on the local A428, A505, and A603, so surely the regions mapped can't be accurate. Naturally, the only course of action was to map out this hypothesis myself, using data from Ordnance Survey's [Open Zoomstack](https://www.ordnancesurvey.co.uk/business-government/products/open-zoomstack). The answer is that the Wikipedia map is *mostly* accurate, although there is definitely some overlap:\n\n\n\nI used a symbology expression in QGIS to colour the roads by number:\n\n\n\n(I believe this is what the kids call a Hit Tweet)\n\n\n\nMy first attempt at making a relative elevation model in QGIS, following excellent tutorials by @geo_coe
\n\n--- Matthew Law (@Iawmatthew) February 3, 2022\n\n
📍 Rakaia River 🇳🇿 https://t.co/yWM9IqeROd pic.twitter.com/IiBtZ0MpmO\n\n
\n\n\n\n```{=html}\n\n```\n"},"formats":{"html":{"execute":{"fig-width":7,"fig-height":5,"fig-format":"retina","fig-dpi":96,"df-print":"default","error":false,"eval":true,"cache":null,"freeze":true,"echo":true,"output":true,"warning":true,"include":true,"keep-md":false,"keep-ipynb":false,"ipynb":null,"enabled":null,"daemon":null,"daemon-restart":false,"debug":false,"ipynb-filters":[],"engine":"markdown"},"render":{"keep-tex":false,"keep-yaml":false,"keep-source":false,"keep-hidden":false,"prefer-html":false,"output-divs":true,"output-ext":"html","fig-align":"default","fig-pos":null,"fig-env":null,"code-fold":"none","code-overflow":"wrap","code-link":false,"code-line-numbers":false,"code-tools":false,"tbl-colwidths":"auto","merge-includes":true,"latex-auto-mk":true,"latex-auto-install":true,"latex-clean":true,"latex-max-runs":10,"latex-makeindex":"makeindex","latex-makeindex-opts":[],"latex-tlmgr-opts":[],"latex-input-paths":[],"latex-output-dir":null,"link-external-icon":false,"link-external-newwindow":false,"self-contained-math":false,"format-resources":[]},"pandoc":{"standalone":true,"wrap":"none","default-image-extension":"png","to":"html","output-file":"index.html"},"language":{},"metadata":{"lang":"en","fig-responsive":true,"quarto-version":"1.0.38","editor":"visual","theme":{"light":["flatly","../../styles.scss"],"dark":["darkly","../../styles-dark.scss"]},"mainfont":"IBM Plex Sans","code-copy":true,"title-block-banner":true,"title":"Colouring by Numbers","date":"2021-11-02","categories":["QGIS","30DayMapChallenge2021"]},"extensions":{"book":{"multiFile":true}}}}} \ No newline at end of file diff --git a/.quarto/idx/posts/custom-chart-popup-carto/index.qmd.json b/.quarto/idx/posts/custom-chart-popup-carto/index.qmd.json new file mode 100644 index 0000000..a3e7529 --- /dev/null +++ b/.quarto/idx/posts/custom-chart-popup-carto/index.qmd.json @@ -0,0 +1 @@ +{"title":"Custom chart popups in CARTO Builder","markdown":{"yaml":{"title":"Custom chart popups in CARTO Builder","date":"2021-05-12","categories":["CARTO"],"draft":true},"containsRefs":false,"markdown":"\n\nhttps://gdsl.carto.com/u/matthewlaw/builder/4a6f861b-6674-4320-8163-fccb7f845b73/embed\n\nCARTO Builder is a web application which allows you to access the core of CARTO's visualisation and analytics functionality without having to get your hands dirty using one or more of their many developer libraries ([React](https://docs.carto.com/react/overview/), [deck.gl](https://docs.carto.com/deck-gl/overview/), [Mapbox GL](https://docs.carto.com/mapbox-gl/overview/), etc) and APIs ([SQL](https://carto.com/developers/sql-api/), [Maps](https://carto.com/developers/maps-api/), etc). While it makes it easy to quickly produce nice interactive, data-rich maps, the user is sometimes constrained by the default data visualisation options.\n\nPop-up tooltips appear when the user clicks on a location within England, displaying the name of the LSOA clicked, the IMD decile into which it falls, and a bar chart showing its score for each of the domains of deprivation. In this way, the user can query the data in which they are interested and see 'on-demand' details about a certain area (Kirk, 2019: 216). This visualisation intentionally obscures the specific values of each score, as their scale and values will be meaningless to almost all users; for example the health and disability domain score ranges from -3.215 to 3.547 while the living environment domain score ranges from 0.126 to 91.602. Instead, seven new columns were created scaling each of these domain scores from 0 to 300, based on their minimum and maximum values. These values were then used to specify the pixel widths of the bars in the bar chart, using inline CSS within custom HTML for the pop-up to achieve this, adapting code from Gully-Santiago (2014). In this way, the user can see how an LSOA ranks in each of the domains compared to others in England, but without each variable requiring a large amount of screen real estate and necessitating either scrolling or omitting some domains.\n"},"formats":{"html":{"execute":{"fig-width":7,"fig-height":5,"fig-format":"retina","fig-dpi":96,"df-print":"default","error":false,"eval":true,"cache":null,"freeze":true,"echo":true,"output":true,"warning":true,"include":true,"keep-md":false,"keep-ipynb":false,"ipynb":null,"enabled":null,"daemon":null,"daemon-restart":false,"debug":false,"ipynb-filters":[],"engine":"markdown"},"render":{"keep-tex":false,"keep-yaml":false,"keep-source":false,"keep-hidden":false,"prefer-html":false,"output-divs":true,"output-ext":"html","fig-align":"default","fig-pos":null,"fig-env":null,"code-fold":"none","code-overflow":"wrap","code-link":false,"code-line-numbers":false,"code-tools":false,"tbl-colwidths":"auto","merge-includes":true,"latex-auto-mk":true,"latex-auto-install":true,"latex-clean":true,"latex-max-runs":10,"latex-makeindex":"makeindex","latex-makeindex-opts":[],"latex-tlmgr-opts":[],"latex-input-paths":[],"latex-output-dir":null,"link-external-icon":false,"link-external-newwindow":false,"self-contained-math":false,"format-resources":[]},"pandoc":{"standalone":true,"wrap":"none","default-image-extension":"png","to":"html","output-file":"index.html"},"language":{},"metadata":{"lang":"en","fig-responsive":true,"quarto-version":"1.0.38","editor":"visual","theme":{"light":["flatly","../../styles.scss"],"dark":["darkly","../../styles-dark.scss"]},"mainfont":"IBM Plex Sans","code-copy":true,"title-block-banner":true,"title":"Custom chart popups in CARTO Builder","date":"2021-05-12","categories":["CARTO"],"draft":true},"extensions":{"book":{"multiFile":true}}}}} \ No newline at end of file diff --git a/.quarto/idx/posts/green-London-webmap/index.qmd.json b/.quarto/idx/posts/green-London-webmap/index.qmd.json new file mode 100644 index 0000000..6fae152 --- /dev/null +++ b/.quarto/idx/posts/green-London-webmap/index.qmd.json @@ -0,0 +1 @@ +{"title":"Web Map of Green London","markdown":{"yaml":{"title":"Web Map of Green London","date":"2021-11-25","categories":["QGIS","30DayMapChallenge2021"],"image":"images/zooms.jpeg"},"containsRefs":false,"markdown":"\n\nFull interactive map:\n\n```{=html}\n\n```\n([Fullscreen version here](https://matthewlaw.xyz/green-London-map/))\n\nThe map was made in QGIS with the 'Generate XYZ Tiles' tool and data from a few different sources:\n\n- Forests, woods, and orchards from OpenStreetMap\n\n- Street trees from the [London Datastore](https://data.london.gov.uk/dataset/local-authority-maintained-trees)\n\n- Building outlines, roads, and place names from Ordnance Survey's [Open Zoomstack](https://www.ordnancesurvey.co.uk/business-government/products/open-zoomstack)\n\n- Greenspaces from Ordnance Survey's [Open Greenspace](https://www.ordnancesurvey.co.uk/business-government/products/open-map-greenspace)\n\nThe tree data also highlights the effect of the infamous tree ban in the London borough of Brent (shown below with a dotted outline):\n\n\n"},"formats":{"html":{"execute":{"fig-width":7,"fig-height":5,"fig-format":"retina","fig-dpi":96,"df-print":"default","error":false,"eval":true,"cache":null,"freeze":true,"echo":true,"output":true,"warning":true,"include":true,"keep-md":false,"keep-ipynb":false,"ipynb":null,"enabled":null,"daemon":null,"daemon-restart":false,"debug":false,"ipynb-filters":[],"engine":"markdown"},"render":{"keep-tex":false,"keep-yaml":false,"keep-source":false,"keep-hidden":false,"prefer-html":false,"output-divs":true,"output-ext":"html","fig-align":"default","fig-pos":null,"fig-env":null,"code-fold":"none","code-overflow":"wrap","code-link":false,"code-line-numbers":false,"code-tools":false,"tbl-colwidths":"auto","merge-includes":true,"latex-auto-mk":true,"latex-auto-install":true,"latex-clean":true,"latex-max-runs":10,"latex-makeindex":"makeindex","latex-makeindex-opts":[],"latex-tlmgr-opts":[],"latex-input-paths":[],"latex-output-dir":null,"link-external-icon":false,"link-external-newwindow":false,"self-contained-math":false,"format-resources":[]},"pandoc":{"standalone":true,"wrap":"none","default-image-extension":"png","to":"html","output-file":"index.html"},"language":{},"metadata":{"lang":"en","fig-responsive":true,"quarto-version":"1.0.38","editor":"visual","theme":{"light":["flatly","../../styles.scss"],"dark":["darkly","../../styles-dark.scss"]},"mainfont":"IBM Plex Sans","code-copy":true,"title-block-banner":true,"title":"Web Map of Green London","date":"2021-11-25","categories":["QGIS","30DayMapChallenge2021"],"image":"images/zooms.jpeg"},"extensions":{"book":{"multiFile":true}}}}} \ No newline at end of file diff --git a/.quarto/idx/posts/mapdeck-experiment/index.qmd.json b/.quarto/idx/posts/mapdeck-experiment/index.qmd.json new file mode 100644 index 0000000..93db174 --- /dev/null +++ b/.quarto/idx/posts/mapdeck-experiment/index.qmd.json @@ -0,0 +1 @@ +{"title":"`mapdeck` Experiment","markdown":{"yaml":{"title":"`mapdeck` Experiment","date":"2021-11-16","categories":["R","30DayMapChallenge2021"],"image":"images/paste-B7AAF38C.png"},"containsRefs":false,"markdown":"\n\nA first experiment using [`mapdeck`](https://symbolixau.github.io/mapdeck/index.html), an R wrapper for [deck.gl](https://deck.gl) and [Mapbox](https://www.mapbox.com/), to create an interactive web map of a thoroughly urban chunk of Barcelona:\n\n\n\n\n\n\n\nFull interactive map:\n\n```{=html}\n\n```\n"},"formats":{"html":{"execute":{"fig-width":7,"fig-height":5,"fig-format":"retina","fig-dpi":96,"df-print":"default","error":false,"eval":true,"cache":null,"freeze":true,"echo":true,"output":true,"warning":true,"include":true,"keep-md":false,"keep-ipynb":false,"ipynb":null,"enabled":null,"daemon":null,"daemon-restart":false,"debug":false,"ipynb-filters":[],"engine":"markdown"},"render":{"keep-tex":false,"keep-yaml":false,"keep-source":false,"keep-hidden":false,"prefer-html":false,"output-divs":true,"output-ext":"html","fig-align":"default","fig-pos":null,"fig-env":null,"code-fold":"none","code-overflow":"wrap","code-link":false,"code-line-numbers":false,"code-tools":false,"tbl-colwidths":"auto","merge-includes":true,"latex-auto-mk":true,"latex-auto-install":true,"latex-clean":true,"latex-max-runs":10,"latex-makeindex":"makeindex","latex-makeindex-opts":[],"latex-tlmgr-opts":[],"latex-input-paths":[],"latex-output-dir":null,"link-external-icon":false,"link-external-newwindow":false,"self-contained-math":false,"format-resources":[]},"pandoc":{"standalone":true,"wrap":"none","default-image-extension":"png","to":"html","output-file":"index.html"},"language":{},"metadata":{"lang":"en","fig-responsive":true,"quarto-version":"1.0.38","editor":"visual","theme":{"light":["flatly","../../styles.scss"],"dark":["darkly","../../styles-dark.scss"]},"mainfont":"IBM Plex Sans","code-copy":true,"title-block-banner":true,"title":"`mapdeck` Experiment","date":"2021-11-16","categories":["R","30DayMapChallenge2021"],"image":"images/paste-B7AAF38C.png"},"extensions":{"book":{"multiFile":true}}}}} \ No newline at end of file diff --git a/.quarto/idx/posts/pigs-of-Europe/index.qmd.json b/.quarto/idx/posts/pigs-of-Europe/index.qmd.json new file mode 100644 index 0000000..6efef6b --- /dev/null +++ b/.quarto/idx/posts/pigs-of-Europe/index.qmd.json @@ -0,0 +1 @@ +{"title":"Pigs Points","markdown":{"yaml":{"title":"Pigs Points","date":"2021-11-09","categories":["QGIS","30DayMapChallenge2021"]},"containsRefs":false,"markdown":"\n\n\n\nFor the 'monochrome' day of the #30DayMapChallenge I made a fairly simple univariate map: the number of pigs per thousand people, visualised with points: denser points = more pigs per capita. I got the data from [Eurostat](https://appsso.eurostat.ec.europa.eu/nui/show.do?dataset=ef_lsk_gpig) (one of the mythical Brexit dividends is that since leaving the UE (and Eurostat) the UK is excluded from these kinds of map) via the [eurostat](https://ropengov.github.io/eurostat/) R package.\n\nTo link the point density to the pigs per person, I used the Expression String Builder in QGIS -- I played around with this for a bit to get a satisfactory spread of density\n\n\n\nOne of the surprises of the Challenge was that this map highlighted the Spanish region of Aragon as the pig capital of Europe -- I didn't give this fact much thought when making the map but it subsequently found its way to Aragonese Twitter, and so for a few days my replies were filled with Spanish comments on the map.\n\n\n\n#30DayMapChallenge Day 2: Lines
\n\n--- Matthew Law (@Iawmatthew) November 2, 2021\n\n
Great British roads, coloured by their numbers pic.twitter.com/aT5Vp0W89a\n\n
\n\n\n\n```{=html}\n\n```\n"},"formats":{"html":{"execute":{"fig-width":7,"fig-height":5,"fig-format":"retina","fig-dpi":96,"df-print":"default","error":false,"eval":true,"cache":null,"freeze":true,"echo":true,"output":true,"warning":true,"include":true,"keep-md":false,"keep-ipynb":false,"ipynb":null,"enabled":null,"daemon":null,"daemon-restart":false,"debug":false,"ipynb-filters":[],"engine":"markdown"},"render":{"keep-tex":false,"keep-yaml":false,"keep-source":false,"keep-hidden":false,"prefer-html":false,"output-divs":true,"output-ext":"html","fig-align":"default","fig-pos":null,"fig-env":null,"code-fold":"none","code-overflow":"wrap","code-link":false,"code-line-numbers":false,"code-tools":false,"tbl-colwidths":"auto","merge-includes":true,"latex-auto-mk":true,"latex-auto-install":true,"latex-clean":true,"latex-max-runs":10,"latex-makeindex":"makeindex","latex-makeindex-opts":[],"latex-tlmgr-opts":[],"latex-input-paths":[],"latex-output-dir":null,"link-external-icon":false,"link-external-newwindow":false,"self-contained-math":false,"format-resources":[]},"pandoc":{"standalone":true,"wrap":"none","default-image-extension":"png","to":"html","output-file":"index.html"},"language":{},"metadata":{"lang":"en","fig-responsive":true,"quarto-version":"1.0.38","editor":"visual","theme":{"light":["flatly","../../styles.scss"],"dark":["darkly","../../styles-dark.scss"]},"mainfont":"IBM Plex Sans","code-copy":true,"title-block-banner":true,"title":"Pigs Points","date":"2021-11-09","categories":["QGIS","30DayMapChallenge2021"]},"extensions":{"book":{"multiFile":true}}}}} \ No newline at end of file diff --git a/.quarto/idx/posts/post-with-code/index.qmd.json b/.quarto/idx/posts/post-with-code/index.qmd.json new file mode 100644 index 0000000..4fcee47 --- /dev/null +++ b/.quarto/idx/posts/post-with-code/index.qmd.json @@ -0,0 +1 @@ +{"title":"Post With Code","markdown":{"yaml":{"title":"Post With Code","author":"Harlow Malloc","date":"2022-08-19","categories":["news","code","analysis"],"image":"image.jpg","draft":true},"containsRefs":false,"markdown":"\n\nThis is a post with executable code.\n\n```{r}\n1 + 1\n```\n"},"formats":{"html":{"execute":{"fig-width":7,"fig-height":5,"fig-format":"retina","fig-dpi":96,"df-print":"default","error":false,"eval":true,"cache":null,"freeze":true,"echo":true,"output":true,"warning":true,"include":true,"keep-md":false,"keep-ipynb":false,"ipynb":null,"enabled":null,"daemon":null,"daemon-restart":false,"debug":false,"ipynb-filters":[],"engine":"knitr"},"render":{"keep-tex":false,"keep-yaml":false,"keep-source":false,"keep-hidden":false,"prefer-html":false,"output-divs":true,"output-ext":"html","fig-align":"default","fig-pos":null,"fig-env":null,"code-fold":"none","code-overflow":"wrap","code-link":false,"code-line-numbers":false,"code-tools":false,"tbl-colwidths":"auto","merge-includes":true,"latex-auto-mk":true,"latex-auto-install":true,"latex-clean":true,"latex-max-runs":10,"latex-makeindex":"makeindex","latex-makeindex-opts":[],"latex-tlmgr-opts":[],"latex-input-paths":[],"latex-output-dir":null,"link-external-icon":false,"link-external-newwindow":false,"self-contained-math":false,"format-resources":[]},"pandoc":{"standalone":true,"wrap":"none","default-image-extension":"png","to":"html","output-file":"index.html"},"language":{},"metadata":{"lang":"en","fig-responsive":true,"quarto-version":"1.0.38","editor":"visual","theme":{"light":["flatly","../../styles.scss"],"dark":["darkly","../../styles-dark.scss"]},"mainfont":"IBM Plex Sans","code-copy":true,"title-block-banner":true,"title":"Post With Code","author":"Harlow Malloc","date":"2022-08-19","categories":["news","code","analysis"],"image":"image.jpg","draft":true},"extensions":{"book":{"multiFile":true}}}}} \ No newline at end of file diff --git a/.quarto/idx/posts/projection-collection-sinusoidal/index.qmd.json b/.quarto/idx/posts/projection-collection-sinusoidal/index.qmd.json new file mode 100644 index 0000000..108907e --- /dev/null +++ b/.quarto/idx/posts/projection-collection-sinusoidal/index.qmd.json @@ -0,0 +1 @@ +{"title":"Sinusoidal Map for The Projection Collection","markdown":{"yaml":{"title":"Sinusoidal Map for The Projection Collection","date":"2022-06-08","categories":["QGIS"],"image":"images/54 - Sinusoidal Law.png"},"containsRefs":false,"markdown":"\n\nMy contribution to Daniel Huffman's [Projection Collection](https://somethingaboutmaps.wordpress.com/2022/06/07/projection-cards-now-a-reality/) project, a set of trading cards where card each is a different map projection.\n\n\n\nThe map itself is a [Sinusoidal Projection](https://en.wikipedia.org/wiki/Sinusoidal_projection), and was made in QGIS using the '1981' polygons from [Project Linework](https://www.projectlinework.org/). The style is supposed to be vaguely reminiscent of a monochrome green CRT monitor -- I think it was the combination of the projection's bulge and the word 'sinusoidal' which brought that aesthetic to mind when I made the map.\n\nIt was really nice to get to map alongside (in a sense) many cartographers whose work I really admire by contributing to the project.\n\n\n"},"formats":{"html":{"execute":{"fig-width":7,"fig-height":5,"fig-format":"retina","fig-dpi":96,"df-print":"default","error":false,"eval":true,"cache":null,"freeze":true,"echo":true,"output":true,"warning":true,"include":true,"keep-md":false,"keep-ipynb":false,"ipynb":null,"enabled":null,"daemon":null,"daemon-restart":false,"debug":false,"ipynb-filters":[],"engine":"markdown"},"render":{"keep-tex":false,"keep-yaml":false,"keep-source":false,"keep-hidden":false,"prefer-html":false,"output-divs":true,"output-ext":"html","fig-align":"default","fig-pos":null,"fig-env":null,"code-fold":"none","code-overflow":"wrap","code-link":false,"code-line-numbers":false,"code-tools":false,"tbl-colwidths":"auto","merge-includes":true,"latex-auto-mk":true,"latex-auto-install":true,"latex-clean":true,"latex-max-runs":10,"latex-makeindex":"makeindex","latex-makeindex-opts":[],"latex-tlmgr-opts":[],"latex-input-paths":[],"latex-output-dir":null,"link-external-icon":false,"link-external-newwindow":false,"self-contained-math":false,"format-resources":[]},"pandoc":{"standalone":true,"wrap":"none","default-image-extension":"png","to":"html","output-file":"index.html"},"language":{},"metadata":{"lang":"en","fig-responsive":true,"quarto-version":"1.0.38","editor":"visual","theme":{"light":["flatly","../../styles.scss"],"dark":["darkly","../../styles-dark.scss"]},"mainfont":"IBM Plex Sans","code-copy":true,"title-block-banner":true,"title":"Sinusoidal Map for The Projection Collection","date":"2022-06-08","categories":["QGIS"],"image":"images/54 - Sinusoidal Law.png"},"extensions":{"book":{"multiFile":true}}}}} \ No newline at end of file diff --git a/.quarto/idx/posts/welcome/index.qmd.json b/.quarto/idx/posts/welcome/index.qmd.json new file mode 100644 index 0000000..0427395 --- /dev/null +++ b/.quarto/idx/posts/welcome/index.qmd.json @@ -0,0 +1 @@ +{"title":"Welcome To My Blog","markdown":{"yaml":{"title":"Welcome To My Blog","author":"Tristan O'Malley","date":"2022-08-16","categories":["news"],"draft":true},"containsRefs":false,"markdown":"\n\nThis is the first post in a Quarto blog. Welcome!\n\n\n\nSince this post doesn't specify an explicit `image`, the first image in the post will be used in the listing page of posts.\n"},"formats":{"html":{"execute":{"fig-width":7,"fig-height":5,"fig-format":"retina","fig-dpi":96,"df-print":"default","error":false,"eval":true,"cache":null,"freeze":true,"echo":true,"output":true,"warning":true,"include":true,"keep-md":false,"keep-ipynb":false,"ipynb":null,"enabled":null,"daemon":null,"daemon-restart":false,"debug":false,"ipynb-filters":[],"engine":"markdown"},"render":{"keep-tex":false,"keep-yaml":false,"keep-source":false,"keep-hidden":false,"prefer-html":false,"output-divs":true,"output-ext":"html","fig-align":"default","fig-pos":null,"fig-env":null,"code-fold":"none","code-overflow":"wrap","code-link":false,"code-line-numbers":false,"code-tools":false,"tbl-colwidths":"auto","merge-includes":true,"latex-auto-mk":true,"latex-auto-install":true,"latex-clean":true,"latex-max-runs":10,"latex-makeindex":"makeindex","latex-makeindex-opts":[],"latex-tlmgr-opts":[],"latex-input-paths":[],"latex-output-dir":null,"link-external-icon":false,"link-external-newwindow":false,"self-contained-math":false,"format-resources":[]},"pandoc":{"standalone":true,"wrap":"none","default-image-extension":"png","to":"html","output-file":"index.html"},"language":{},"metadata":{"lang":"en","fig-responsive":true,"quarto-version":"1.0.38","editor":"visual","theme":{"light":["flatly","../../styles.scss"],"dark":["darkly","../../styles-dark.scss"]},"mainfont":"IBM Plex Sans","code-copy":true,"title-block-banner":true,"title":"Welcome To My Blog","author":"Tristan O'Malley","date":"2022-08-16","categories":["news"],"draft":true},"extensions":{"book":{"multiFile":true}}}}} \ No newline at end of file diff --git a/.quarto/listing/listing-cache.json b/.quarto/listing/listing-cache.json new file mode 100644 index 0000000..225bb3c --- /dev/null +++ b/.quarto/listing/listing-cache.json @@ -0,0 +1,7 @@ +{ + "listingMap": { + "index.qmd": [ + "posts" + ] + } +} \ No newline at end of file diff --git a/.quarto/preview/lock b/.quarto/preview/lock new file mode 100644 index 0000000..e95e8f2 --- /dev/null +++ b/.quarto/preview/lock @@ -0,0 +1 @@ +14373 \ No newline at end of file diff --git a/CNAME b/CNAME new file mode 100644 index 0000000..0e42cc2 --- /dev/null +++ b/CNAME @@ -0,0 +1,2 @@ +matthewlaw.xyz +www.matthewlaw.xyz diff --git a/README.md b/README.md new file mode 100644 index 0000000..c5e92b7 --- /dev/null +++ b/README.md @@ -0,0 +1,2 @@ +# matthew-law.github.io + diff --git a/_freeze/posts/post-with-code/index/execute-results/html.json b/_freeze/posts/post-with-code/index/execute-results/html.json new file mode 100644 index 0000000..0dae459 --- /dev/null +++ b/_freeze/posts/post-with-code/index/execute-results/html.json @@ -0,0 +1,14 @@ +{ + "hash": "245e6f6ebfce339bbcbc3e9096254afd", + "result": { + "markdown": "---\ntitle: \"Post With Code\"\nauthor: \"Harlow Malloc\"\ndate: \"2022-08-19\"\ncategories: [news, code, analysis]\nimage: \"image.jpg\"\n---\n\n\nThis is a post with executable code.\n\n\n::: {.cell}\n\n```{.r .cell-code}\n1 + 1\n```\n\n::: {.cell-output .cell-output-stdout}\n```\n[1] 2\n```\n:::\n:::\n", + "supporting": [], + "filters": [ + "rmarkdown/pagebreak.lua" + ], + "includes": {}, + "engineDependencies": {}, + "preserve": {}, + "postProcess": true + } +} \ No newline at end of file diff --git a/_freeze/site_libs/clipboard/clipboard.min.js b/_freeze/site_libs/clipboard/clipboard.min.js new file mode 100644 index 0000000..41c6a0f --- /dev/null +++ b/_freeze/site_libs/clipboard/clipboard.min.js @@ -0,0 +1,7 @@ +/*! + * clipboard.js v2.0.10 + * https://clipboardjs.com/ + * + * Licensed MIT © Zeno Rocha + */ +!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.ClipboardJS=e():t.ClipboardJS=e()}(this,function(){return n={686:function(t,e,n){"use strict";n.d(e,{default:function(){return o}});var e=n(279),i=n.n(e),e=n(370),u=n.n(e),e=n(817),c=n.n(e);function a(t){try{return document.execCommand(t)}catch(t){return}}var f=function(t){t=c()(t);return a("cut"),t};var l=function(t){var e,n,o,r=1\n\n#30DayMapChallenge Day 9: Monochrome
\n\n--- Matthew Law (@Iawmatthew) November 9, 2021\n\n
🐖 Pigs of Europe 🇪🇺 pic.twitter.com/8E27dljpyk\n\n
${missingFields[0]}
field.`,
+ message: `The items being returned for this search do not include all the required fields. Please ensure that your index items include the ${missingFields[0]}
field or use index-fields
in your _quarto.yml
file to specify the field names.`,
+ };
+ } else if (missingFields.length > 1) {
+ const missingFieldList = missingFields
+ .map((field) => {
+ return `${field}
`;
+ })
+ .join(", ");
+
+ throw {
+ name: `Error: Search index is missing the following fields: ${missingFieldList}.`,
+ message: `The items being returned for this search do not include all the required fields. Please ensure that your index items includes the following fields: ${missingFieldList}, or use index-fields
in your _quarto.yml
file to specify the field names.`,
+ };
+ }
+ }
+}
+
+let lastQuery = null;
+function showCopyLink(query, options) {
+ const language = options.language;
+ lastQuery = query;
+ // Insert share icon
+ const inputSuffixEl = window.document.body.querySelector(
+ ".aa-Form .aa-InputWrapperSuffix"
+ );
+
+ if (inputSuffixEl) {
+ let copyButtonEl = window.document.body.querySelector(
+ ".aa-Form .aa-InputWrapperSuffix .aa-CopyButton"
+ );
+
+ if (copyButtonEl === null) {
+ copyButtonEl = window.document.createElement("button");
+ copyButtonEl.setAttribute("class", "aa-CopyButton");
+ copyButtonEl.setAttribute("type", "button");
+ copyButtonEl.setAttribute("title", language["search-copy-link-title"]);
+ copyButtonEl.onmousedown = (e) => {
+ e.preventDefault();
+ e.stopPropagation();
+ };
+
+ const linkIcon = "bi-clipboard";
+ const checkIcon = "bi-check2";
+
+ const shareIconEl = window.document.createElement("i");
+ shareIconEl.setAttribute("class", `bi ${linkIcon}`);
+ copyButtonEl.appendChild(shareIconEl);
+ inputSuffixEl.prepend(copyButtonEl);
+
+ const clipboard = new window.ClipboardJS(".aa-CopyButton", {
+ text: function (_trigger) {
+ const copyUrl = new URL(window.location);
+ copyUrl.searchParams.set(kQueryArg, lastQuery);
+ copyUrl.searchParams.set(kResultsArg, "1");
+ return copyUrl.toString();
+ },
+ });
+ clipboard.on("success", function (e) {
+ // Focus the input
+
+ // button target
+ const button = e.trigger;
+ const icon = button.querySelector("i.bi");
+
+ // flash "checked"
+ icon.classList.add(checkIcon);
+ icon.classList.remove(linkIcon);
+ setTimeout(function () {
+ icon.classList.remove(checkIcon);
+ icon.classList.add(linkIcon);
+ }, 1000);
+ });
+ }
+
+ // If there is a query, show the link icon
+ if (copyButtonEl) {
+ if (lastQuery && options["copy-button"]) {
+ copyButtonEl.style.display = "flex";
+ } else {
+ copyButtonEl.style.display = "none";
+ }
+ }
+ }
+}
+
+/* Search Index Handling */
+// create the index
+var fuseIndex = undefined;
+async function readSearchData() {
+ // Initialize the search index on demand
+ if (fuseIndex === undefined) {
+ // create fuse index
+ const options = {
+ keys: [
+ { name: "title", weight: 20 },
+ { name: "section", weight: 20 },
+ { name: "text", weight: 10 },
+ ],
+ ignoreLocation: true,
+ threshold: 0.1,
+ };
+ const fuse = new window.Fuse([], options);
+
+ // fetch the main search.json
+ const response = await fetch(offsetURL("search.json"));
+ if (response.status == 200) {
+ return response.json().then(function (searchDocs) {
+ searchDocs.forEach(function (searchDoc) {
+ fuse.add(searchDoc);
+ });
+ fuseIndex = fuse;
+ return fuseIndex;
+ });
+ } else {
+ return Promise.reject(
+ new Error(
+ "Unexpected status from search index request: " + response.status
+ )
+ );
+ }
+ }
+ return fuseIndex;
+}
+
+function inputElement() {
+ return window.document.body.querySelector(".aa-Form .aa-Input");
+}
+
+function focusSearchInput() {
+ setTimeout(() => {
+ const inputEl = inputElement();
+ if (inputEl) {
+ inputEl.focus();
+ }
+ }, 50);
+}
+
+/* Panels */
+const kItemTypeDoc = "document";
+const kItemTypeMore = "document-more";
+const kItemTypeItem = "document-item";
+const kItemTypeError = "error";
+
+function renderItem(
+ item,
+ createElement,
+ state,
+ setActiveItemId,
+ setContext,
+ refresh
+) {
+ switch (item.type) {
+ case kItemTypeDoc:
+ return createDocumentCard(
+ createElement,
+ "file-richtext",
+ item.title,
+ item.section,
+ item.text,
+ item.href
+ );
+ case kItemTypeMore:
+ return createMoreCard(
+ createElement,
+ item,
+ state,
+ setActiveItemId,
+ setContext,
+ refresh
+ );
+ case kItemTypeItem:
+ return createSectionCard(
+ createElement,
+ item.section,
+ item.text,
+ item.href
+ );
+ case kItemTypeError:
+ return createErrorCard(createElement, item.title, item.text);
+ default:
+ return undefined;
+ }
+}
+
+function createDocumentCard(createElement, icon, title, section, text, href) {
+ const iconEl = createElement("i", {
+ class: `bi bi-${icon} search-result-icon`,
+ });
+ const titleEl = createElement("p", { class: "search-result-title" }, title);
+ const titleContainerEl = createElement(
+ "div",
+ { class: "search-result-title-container" },
+ [iconEl, titleEl]
+ );
+
+ const textEls = [];
+ if (section) {
+ const sectionEl = createElement(
+ "p",
+ { class: "search-result-section" },
+ section
+ );
+ textEls.push(sectionEl);
+ }
+ const descEl = createElement("p", {
+ class: "search-result-text",
+ dangerouslySetInnerHTML: {
+ __html: text,
+ },
+ });
+ textEls.push(descEl);
+
+ const textContainerEl = createElement(
+ "div",
+ { class: "search-result-text-container" },
+ textEls
+ );
+
+ const containerEl = createElement(
+ "div",
+ {
+ class: "search-result-container",
+ },
+ [titleContainerEl, textContainerEl]
+ );
+
+ const linkEl = createElement(
+ "a",
+ {
+ href: offsetURL(href),
+ class: "search-result-link",
+ },
+ containerEl
+ );
+
+ const classes = ["search-result-doc", "search-item"];
+ if (!section) {
+ classes.push("document-selectable");
+ }
+
+ return createElement(
+ "div",
+ {
+ class: classes.join(" "),
+ },
+ linkEl
+ );
+}
+
+function createMoreCard(
+ createElement,
+ item,
+ state,
+ setActiveItemId,
+ setContext,
+ refresh
+) {
+ const moreCardEl = createElement(
+ "div",
+ {
+ class: "search-result-more search-item",
+ onClick: (e) => {
+ // Handle expanding the sections by adding the expanded
+ // section to the list of expanded sections
+ toggleExpanded(item, state, setContext, setActiveItemId, refresh);
+ e.stopPropagation();
+ },
+ },
+ item.title
+ );
+
+ return moreCardEl;
+}
+
+function toggleExpanded(item, state, setContext, setActiveItemId, refresh) {
+ const expanded = state.context.expanded || [];
+ if (expanded.includes(item.target)) {
+ setContext({
+ expanded: expanded.filter((target) => target !== item.target),
+ });
+ } else {
+ setContext({ expanded: [...expanded, item.target] });
+ }
+
+ refresh();
+ setActiveItemId(item.__autocomplete_id);
+}
+
+function createSectionCard(createElement, section, text, href) {
+ const sectionEl = createSection(createElement, section, text, href);
+ return createElement(
+ "div",
+ {
+ class: "search-result-doc-section search-item",
+ },
+ sectionEl
+ );
+}
+
+function createSection(createElement, title, text, href) {
+ const descEl = createElement("p", {
+ class: "search-result-text",
+ dangerouslySetInnerHTML: {
+ __html: text,
+ },
+ });
+
+ const titleEl = createElement("p", { class: "search-result-section" }, title);
+ const linkEl = createElement(
+ "a",
+ {
+ href: offsetURL(href),
+ class: "search-result-link",
+ },
+ [titleEl, descEl]
+ );
+ return linkEl;
+}
+
+function createErrorCard(createElement, title, text) {
+ const descEl = createElement("p", {
+ class: "search-error-text",
+ dangerouslySetInnerHTML: {
+ __html: text,
+ },
+ });
+
+ const titleEl = createElement("p", {
+ class: "search-error-title",
+ dangerouslySetInnerHTML: {
+ __html: ` ${title}`,
+ },
+ });
+ const errorEl = createElement("div", { class: "search-error" }, [
+ titleEl,
+ descEl,
+ ]);
+ return errorEl;
+}
+
+function positionPanel(pos) {
+ const panelEl = window.document.querySelector(
+ "#quarto-search-results .aa-Panel"
+ );
+ const inputEl = window.document.querySelector(
+ "#quarto-search .aa-Autocomplete"
+ );
+
+ if (panelEl && inputEl) {
+ panelEl.style.top = `${Math.round(panelEl.offsetTop)}px`;
+ if (pos === "start") {
+ panelEl.style.left = `${Math.round(inputEl.left)}px`;
+ } else {
+ panelEl.style.right = `${Math.round(inputEl.offsetRight)}px`;
+ }
+ }
+}
+
+/* Highlighting */
+// highlighting functions
+function highlightMatch(query, text) {
+ if (text) {
+ const start = text.toLowerCase().indexOf(query.toLowerCase());
+ if (start !== -1) {
+ const startMark = "";
+ const endMark = "";
+
+ const end = start + query.length;
+ text =
+ text.slice(0, start) +
+ startMark +
+ text.slice(start, end) +
+ endMark +
+ text.slice(end);
+ const startInfo = clipStart(text, start);
+ const endInfo = clipEnd(
+ text,
+ startInfo.position + startMark.length + endMark.length
+ );
+ text =
+ startInfo.prefix +
+ text.slice(startInfo.position, endInfo.position) +
+ endInfo.suffix;
+
+ return text;
+ } else {
+ return text;
+ }
+ } else {
+ return text;
+ }
+}
+
+function clipStart(text, pos) {
+ const clipStart = pos - 50;
+ if (clipStart < 0) {
+ // This will just return the start of the string
+ return {
+ position: 0,
+ prefix: "",
+ };
+ } else {
+ // We're clipping before the start of the string, walk backwards to the first space.
+ const spacePos = findSpace(text, pos, -1);
+ return {
+ position: spacePos.position,
+ prefix: "",
+ };
+ }
+}
+
+function clipEnd(text, pos) {
+ const clipEnd = pos + 200;
+ if (clipEnd > text.length) {
+ return {
+ position: text.length,
+ suffix: "",
+ };
+ } else {
+ const spacePos = findSpace(text, clipEnd, 1);
+ return {
+ position: spacePos.position,
+ suffix: spacePos.clipped ? "…" : "",
+ };
+ }
+}
+
+function findSpace(text, start, step) {
+ let stepPos = start;
+ while (stepPos > -1 && stepPos < text.length) {
+ const char = text[stepPos];
+ if (char === " " || char === "," || char === ":") {
+ return {
+ position: step === 1 ? stepPos : stepPos - step,
+ clipped: stepPos > 1 && stepPos < text.length,
+ };
+ }
+ stepPos = stepPos + step;
+ }
+
+ return {
+ position: stepPos - step,
+ clipped: false,
+ };
+}
+
+// removes highlighting as implemented by the mark tag
+function clearHighlight(searchterm, el) {
+ const childNodes = el.childNodes;
+ for (let i = childNodes.length - 1; i >= 0; i--) {
+ const node = childNodes[i];
+ if (node.nodeType === Node.ELEMENT_NODE) {
+ if (
+ node.tagName === "MARK" &&
+ node.innerText.toLowerCase() === searchterm.toLowerCase()
+ ) {
+ el.replaceChild(document.createTextNode(node.innerText), node);
+ } else {
+ clearHighlight(searchterm, node);
+ }
+ }
+ }
+}
+
+// highlight matches
+function highlight(term, el) {
+ const termRegex = new RegExp(term, "ig");
+ const childNodes = el.childNodes;
+
+ // walk back to front avoid mutating elements in front of us
+ for (let i = childNodes.length - 1; i >= 0; i--) {
+ const node = childNodes[i];
+
+ if (node.nodeType === Node.TEXT_NODE) {
+ // Search text nodes for text to highlight
+ const text = node.nodeValue;
+
+ let startIndex = 0;
+ let matchIndex = text.search(termRegex);
+ if (matchIndex > -1) {
+ const markFragment = document.createDocumentFragment();
+ while (matchIndex > -1) {
+ const prefix = text.slice(startIndex, matchIndex);
+ markFragment.appendChild(document.createTextNode(prefix));
+
+ const mark = document.createElement("mark");
+ mark.appendChild(
+ document.createTextNode(
+ text.slice(matchIndex, matchIndex + term.length)
+ )
+ );
+ markFragment.appendChild(mark);
+
+ startIndex = matchIndex + term.length;
+ matchIndex = text.slice(startIndex).search(new RegExp(term, "ig"));
+ if (matchIndex > -1) {
+ matchIndex = startIndex + matchIndex;
+ }
+ }
+ if (startIndex < text.length) {
+ markFragment.appendChild(
+ document.createTextNode(text.slice(startIndex, text.length))
+ );
+ }
+
+ el.replaceChild(markFragment, node);
+ }
+ } else if (node.nodeType === Node.ELEMENT_NODE) {
+ // recurse through elements
+ highlight(term, node);
+ }
+ }
+}
+
+/* Link Handling */
+// get the offset from this page for a given site root relative url
+function offsetURL(url) {
+ var offset = getMeta("quarto:offset");
+ return offset ? offset + url : url;
+}
+
+// read a meta tag value
+function getMeta(metaName) {
+ var metas = window.document.getElementsByTagName("meta");
+ for (let i = 0; i < metas.length; i++) {
+ if (metas[i].getAttribute("name") === metaName) {
+ return metas[i].getAttribute("content");
+ }
+ }
+ return "";
+}
+
+function algoliaSearch(query, limit, algoliaOptions) {
+ const { getAlgoliaResults } = window["@algolia/autocomplete-preset-algolia"];
+
+ const applicationId = algoliaOptions["application-id"];
+ const searchOnlyApiKey = algoliaOptions["search-only-api-key"];
+ const indexName = algoliaOptions["index-name"];
+ const indexFields = algoliaOptions["index-fields"];
+ const searchClient = window.algoliasearch(applicationId, searchOnlyApiKey);
+ const searchParams = algoliaOptions["params"];
+ const searchAnalytics = !!algoliaOptions["analytics-events"];
+
+ return getAlgoliaResults({
+ searchClient,
+ queries: [
+ {
+ indexName: indexName,
+ query,
+ params: {
+ hitsPerPage: limit,
+ clickAnalytics: searchAnalytics,
+ ...searchParams,
+ },
+ },
+ ],
+ transformResponse: (response) => {
+ if (!indexFields) {
+ return response.hits.map((hit) => {
+ return hit.map((item) => {
+ return {
+ ...item,
+ text: highlightMatch(query, item.text),
+ };
+ });
+ });
+ } else {
+ const remappedHits = response.hits.map((hit) => {
+ return hit.map((item) => {
+ const newItem = { ...item };
+ ["href", "section", "title", "text"].forEach((keyName) => {
+ const mappedName = indexFields[keyName];
+ if (
+ mappedName &&
+ item[mappedName] !== undefined &&
+ mappedName !== keyName
+ ) {
+ newItem[keyName] = item[mappedName];
+ delete newItem[mappedName];
+ }
+ });
+ newItem.text = highlightMatch(query, newItem.text);
+ return newItem;
+ });
+ });
+ return remappedHits;
+ }
+ },
+ });
+}
+
+function fuseSearch(query, fuse, fuseOptions) {
+ return fuse.search(query, fuseOptions).map((result) => {
+ const addParam = (url, name, value) => {
+ const anchorParts = url.split("#");
+ const baseUrl = anchorParts[0];
+ const sep = baseUrl.search("\\?") > 0 ? "&" : "?";
+ anchorParts[0] = baseUrl + sep + name + "=" + value;
+ return anchorParts.join("#");
+ };
+
+ return {
+ title: result.item.title,
+ section: result.item.section,
+ href: addParam(result.item.href, kQueryArg, query),
+ text: highlightMatch(query, result.item.text),
+ };
+ });
+}
diff --git a/_site/sitemap.xml b/_site/sitemap.xml
new file mode 100644
index 0000000..a9d92fc
--- /dev/null
+++ b/_site/sitemap.xml
@@ -0,0 +1,59 @@
+
++ ++ +```{=html} + +``` diff --git a/posts/Rakaia-REM/thumbnail.png b/posts/Rakaia-REM/thumbnail.png new file mode 100644 index 0000000..40dd896 Binary files /dev/null and b/posts/Rakaia-REM/thumbnail.png differ diff --git a/posts/Seathwaite-blender/.DS_Store b/posts/Seathwaite-blender/.DS_Store new file mode 100644 index 0000000..fc5c08f Binary files /dev/null and b/posts/Seathwaite-blender/.DS_Store differ diff --git a/posts/Seathwaite-blender/images/Seathwaite.png b/posts/Seathwaite-blender/images/Seathwaite.png new file mode 100755 index 0000000..b7d9853 Binary files /dev/null and b/posts/Seathwaite-blender/images/Seathwaite.png differ diff --git a/posts/Seathwaite-blender/index.qmd b/posts/Seathwaite-blender/index.qmd new file mode 100644 index 0000000..731b70d --- /dev/null +++ b/posts/Seathwaite-blender/index.qmd @@ -0,0 +1,11 @@ +--- +title: "An attempt at mapping with Blender" +date: "2021-11-14" +categories: [Blender, 30DayMapChallenge2021] +--- + +Inspired by [Owen Powell's excellent Blender creations](https://owenpowell.wordpress.com/30-day-map-challenge-2020/) over the course of last year's challenge, I had a go using Blender for the first time, mapping the area around Seathwaite Tarn in the Lake District. + + + +I used 1m DTMs from [DEFRA](https://environment.data.gov.uk/DefraDataDownload/) and [OS Open Zoomstack](https://www.ordnancesurvey.co.uk/business-government/products/open-zoomstack) for the water and forest features. diff --git a/posts/UK-numbered-roads/.DS_Store b/posts/UK-numbered-roads/.DS_Store new file mode 100644 index 0000000..e50235e Binary files /dev/null and b/posts/UK-numbered-roads/.DS_Store differ diff --git a/posts/UK-numbered-roads/UK numbered roads.jpeg b/posts/UK-numbered-roads/UK numbered roads.jpeg new file mode 100644 index 0000000..2fc3c35 Binary files /dev/null and b/posts/UK-numbered-roads/UK numbered roads.jpeg differ diff --git a/posts/UK-numbered-roads/colouring expression.jpeg b/posts/UK-numbered-roads/colouring expression.jpeg new file mode 100644 index 0000000..e6b5c34 Binary files /dev/null and b/posts/UK-numbered-roads/colouring expression.jpeg differ diff --git a/posts/UK-numbered-roads/index.qmd b/posts/UK-numbered-roads/index.qmd new file mode 100644 index 0000000..2694753 --- /dev/null +++ b/posts/UK-numbered-roads/index.qmd @@ -0,0 +1,31 @@ +--- +title: "Colouring by Numbers" +date: "2021-11-02" +categories: [QGIS, 30DayMapChallenge2021] +--- + +Whiling away the finite hours of my life reading Wikipedia, I came across a [map](https://commons.wikimedia.org/wiki/File:United_Kingdom_A_road_zones.svg) purporting to show different regions for the UK's numbered roads. Immediately I questioned its accuracy: I live firmly within the '1' zone, and while it is true that most of my local numbered roads begin with 1 I'm also a frequent driver on the local A428, A505, and A603, so surely the regions mapped can't be accurate. Naturally, the only course of action was to map out this hypothesis myself, using data from Ordnance Survey's [Open Zoomstack](https://www.ordnancesurvey.co.uk/business-government/products/open-zoomstack). The answer is that the Wikipedia map is *mostly* accurate, although there is definitely some overlap: + + + +I used a symbology expression in QGIS to colour the roads by number: + + + +(I believe this is what the kids call a Hit Tweet) + ++ +My first attempt at making a relative elevation model in QGIS, following excellent tutorials by @geo_coe
+ +--- Matthew Law (@Iawmatthew) February 3, 2022 + +
📍 Rakaia River 🇳🇿 https://t.co/yWM9IqeROd pic.twitter.com/IiBtZ0MpmO + +
+ ++ +```{=html} + +``` diff --git a/posts/_metadata.yml b/posts/_metadata.yml new file mode 100644 index 0000000..3e9dd01 --- /dev/null +++ b/posts/_metadata.yml @@ -0,0 +1,8 @@ +# options specified here will apply to all posts in this folder + +# freeze computational output +# (see https://quarto.org/docs/projects/code-execution.html#freeze) +freeze: true + +# Enable banner style title blocks +title-block-banner: true diff --git a/posts/custom-chart-popup-carto/.DS_Store b/posts/custom-chart-popup-carto/.DS_Store new file mode 100644 index 0000000..e50235e Binary files /dev/null and b/posts/custom-chart-popup-carto/.DS_Store differ diff --git a/posts/custom-chart-popup-carto/index.qmd b/posts/custom-chart-popup-carto/index.qmd new file mode 100644 index 0000000..f83249a --- /dev/null +++ b/posts/custom-chart-popup-carto/index.qmd @@ -0,0 +1,12 @@ +--- +title: "Custom chart popups in CARTO Builder" +date: "2021-05-12" +categories: [CARTO] +draft: true +--- + +https://gdsl.carto.com/u/matthewlaw/builder/4a6f861b-6674-4320-8163-fccb7f845b73/embed + +CARTO Builder is a web application which allows you to access the core of CARTO's visualisation and analytics functionality without having to get your hands dirty using one or more of their many developer libraries ([React](https://docs.carto.com/react/overview/), [deck.gl](https://docs.carto.com/deck-gl/overview/), [Mapbox GL](https://docs.carto.com/mapbox-gl/overview/), etc) and APIs ([SQL](https://carto.com/developers/sql-api/), [Maps](https://carto.com/developers/maps-api/), etc). While it makes it easy to quickly produce nice interactive, data-rich maps, the user is sometimes constrained by the default data visualisation options. + +Pop-up tooltips appear when the user clicks on a location within England, displaying the name of the LSOA clicked, the IMD decile into which it falls, and a bar chart showing its score for each of the domains of deprivation. In this way, the user can query the data in which they are interested and see 'on-demand' details about a certain area (Kirk, 2019: 216). This visualisation intentionally obscures the specific values of each score, as their scale and values will be meaningless to almost all users; for example the health and disability domain score ranges from -3.215 to 3.547 while the living environment domain score ranges from 0.126 to 91.602. Instead, seven new columns were created scaling each of these domain scores from 0 to 300, based on their minimum and maximum values. These values were then used to specify the pixel widths of the bars in the bar chart, using inline CSS within custom HTML for the pop-up to achieve this, adapting code from Gully-Santiago (2014). In this way, the user can see how an LSOA ranks in each of the domains compared to others in England, but without each variable requiring a large amount of screen real estate and necessitating either scrolling or omitting some domains. diff --git a/posts/green-London-webmap/.DS_Store b/posts/green-London-webmap/.DS_Store new file mode 100644 index 0000000..ac7f0df Binary files /dev/null and b/posts/green-London-webmap/.DS_Store differ diff --git a/posts/green-London-webmap/images/.DS_Store b/posts/green-London-webmap/images/.DS_Store new file mode 100644 index 0000000..a17b20f Binary files /dev/null and b/posts/green-London-webmap/images/.DS_Store differ diff --git a/posts/green-London-webmap/images/paste-8B86746D.png b/posts/green-London-webmap/images/paste-8B86746D.png new file mode 100644 index 0000000..4e730be Binary files /dev/null and b/posts/green-London-webmap/images/paste-8B86746D.png differ diff --git a/posts/green-London-webmap/images/zooms.jpeg b/posts/green-London-webmap/images/zooms.jpeg new file mode 100644 index 0000000..6b7a448 Binary files /dev/null and b/posts/green-London-webmap/images/zooms.jpeg differ diff --git a/posts/green-London-webmap/index.qmd b/posts/green-London-webmap/index.qmd new file mode 100644 index 0000000..70049a8 --- /dev/null +++ b/posts/green-London-webmap/index.qmd @@ -0,0 +1,27 @@ +--- +title: "Web Map of Green London" +date: "2021-11-25" +categories: [QGIS, 30DayMapChallenge2021] +image: "images/zooms.jpeg" +--- + +Full interactive map: + +```{=html} + +``` +([Fullscreen version here](https://matthewlaw.xyz/green-London-map/)) + +The map was made in QGIS with the 'Generate XYZ Tiles' tool and data from a few different sources: + +- Forests, woods, and orchards from OpenStreetMap + +- Street trees from the [London Datastore](https://data.london.gov.uk/dataset/local-authority-maintained-trees) + +- Building outlines, roads, and place names from Ordnance Survey's [Open Zoomstack](https://www.ordnancesurvey.co.uk/business-government/products/open-zoomstack) + +- Greenspaces from Ordnance Survey's [Open Greenspace](https://www.ordnancesurvey.co.uk/business-government/products/open-map-greenspace) + +The tree data also highlights the effect of the infamous tree ban in the London borough of Brent (shown below with a dotted outline): + + diff --git a/posts/mapdeck-experiment/.DS_Store b/posts/mapdeck-experiment/.DS_Store new file mode 100644 index 0000000..d4119cb Binary files /dev/null and b/posts/mapdeck-experiment/.DS_Store differ diff --git a/posts/mapdeck-experiment/images/paste-307E0D0C.png b/posts/mapdeck-experiment/images/paste-307E0D0C.png new file mode 100644 index 0000000..cc29823 Binary files /dev/null and b/posts/mapdeck-experiment/images/paste-307E0D0C.png differ diff --git a/posts/mapdeck-experiment/images/paste-B7AAF38C.png b/posts/mapdeck-experiment/images/paste-B7AAF38C.png new file mode 100644 index 0000000..c221ff1 Binary files /dev/null and b/posts/mapdeck-experiment/images/paste-B7AAF38C.png differ diff --git a/posts/mapdeck-experiment/images/paste-BA071FA6.png b/posts/mapdeck-experiment/images/paste-BA071FA6.png new file mode 100644 index 0000000..2ceccd7 Binary files /dev/null and b/posts/mapdeck-experiment/images/paste-BA071FA6.png differ diff --git a/posts/mapdeck-experiment/index.qmd b/posts/mapdeck-experiment/index.qmd new file mode 100644 index 0000000..b9e8871 --- /dev/null +++ b/posts/mapdeck-experiment/index.qmd @@ -0,0 +1,20 @@ +--- +title: "`mapdeck` Experiment" +date: "2021-11-16" +categories: [R, 30DayMapChallenge2021] +image: "images/paste-B7AAF38C.png" +--- + +A first experiment using [`mapdeck`](https://symbolixau.github.io/mapdeck/index.html), an R wrapper for [deck.gl](https://deck.gl) and [Mapbox](https://www.mapbox.com/), to create an interactive web map of a thoroughly urban chunk of Barcelona: + + + + + + + +Full interactive map: + +```{=html} + +``` diff --git a/posts/pigs-of-Europe/.DS_Store b/posts/pigs-of-Europe/.DS_Store new file mode 100644 index 0000000..7d56ea1 Binary files /dev/null and b/posts/pigs-of-Europe/.DS_Store differ diff --git a/posts/pigs-of-Europe/images/Pigs-of-Europe.png b/posts/pigs-of-Europe/images/Pigs-of-Europe.png new file mode 100644 index 0000000..1c43475 Binary files /dev/null and b/posts/pigs-of-Europe/images/Pigs-of-Europe.png differ diff --git a/posts/pigs-of-Europe/images/pig-points.jpeg b/posts/pigs-of-Europe/images/pig-points.jpeg new file mode 100644 index 0000000..87ffb35 Binary files /dev/null and b/posts/pigs-of-Europe/images/pig-points.jpeg differ diff --git a/posts/pigs-of-Europe/index.qmd b/posts/pigs-of-Europe/index.qmd new file mode 100644 index 0000000..383fc6b --- /dev/null +++ b/posts/pigs-of-Europe/index.qmd @@ -0,0 +1,31 @@ +--- +title: "Pigs Points" +date: "2021-11-09" +categories: [QGIS, 30DayMapChallenge2021] +--- + + + +For the 'monochrome' day of the #30DayMapChallenge I made a fairly simple univariate map: the number of pigs per thousand people, visualised with points: denser points = more pigs per capita. I got the data from [Eurostat](https://appsso.eurostat.ec.europa.eu/nui/show.do?dataset=ef_lsk_gpig) (one of the mythical Brexit dividends is that since leaving the UE (and Eurostat) the UK is excluded from these kinds of map) via the [eurostat](https://ropengov.github.io/eurostat/) R package. + +To link the point density to the pigs per person, I used the Expression String Builder in QGIS -- I played around with this for a bit to get a satisfactory spread of density + + + +One of the surprises of the Challenge was that this map highlighted the Spanish region of Aragon as the pig capital of Europe -- I didn't give this fact much thought when making the map but it subsequently found its way to Aragonese Twitter, and so for a few days my replies were filled with Spanish comments on the map. + ++ +#30DayMapChallenge Day 2: Lines
+ +--- Matthew Law (@Iawmatthew) November 2, 2021 + +
Great British roads, coloured by their numbers pic.twitter.com/aT5Vp0W89a + +
+ ++ +```{=html} + +``` diff --git a/posts/post-with-code/image.jpg b/posts/post-with-code/image.jpg new file mode 100644 index 0000000..3ec04c8 Binary files /dev/null and b/posts/post-with-code/image.jpg differ diff --git a/posts/post-with-code/index.qmd b/posts/post-with-code/index.qmd new file mode 100644 index 0000000..f598c78 --- /dev/null +++ b/posts/post-with-code/index.qmd @@ -0,0 +1,14 @@ +--- +title: "Post With Code" +author: "Harlow Malloc" +date: "2022-08-19" +categories: [news, code, analysis] +image: "image.jpg" +draft: true +--- + +This is a post with executable code. + +```{r} +1 + 1 +``` diff --git a/posts/projection-collection-sinusoidal/.DS_Store b/posts/projection-collection-sinusoidal/.DS_Store new file mode 100644 index 0000000..f4e4e4c Binary files /dev/null and b/posts/projection-collection-sinusoidal/.DS_Store differ diff --git a/posts/projection-collection-sinusoidal/images/.DS_Store b/posts/projection-collection-sinusoidal/images/.DS_Store new file mode 100644 index 0000000..a8e482f Binary files /dev/null and b/posts/projection-collection-sinusoidal/images/.DS_Store differ diff --git a/posts/projection-collection-sinusoidal/images/54 - Sinusoidal (Law).pdf b/posts/projection-collection-sinusoidal/images/54 - Sinusoidal (Law).pdf new file mode 100644 index 0000000..bab785b Binary files /dev/null and b/posts/projection-collection-sinusoidal/images/54 - Sinusoidal (Law).pdf differ diff --git a/posts/projection-collection-sinusoidal/images/54 - Sinusoidal Law.png b/posts/projection-collection-sinusoidal/images/54 - Sinusoidal Law.png new file mode 100644 index 0000000..bc185ca Binary files /dev/null and b/posts/projection-collection-sinusoidal/images/54 - Sinusoidal Law.png differ diff --git a/posts/projection-collection-sinusoidal/images/Law Sinusoidal.png b/posts/projection-collection-sinusoidal/images/Law Sinusoidal.png new file mode 100644 index 0000000..c927a4d Binary files /dev/null and b/posts/projection-collection-sinusoidal/images/Law Sinusoidal.png differ diff --git a/posts/projection-collection-sinusoidal/images/cards 2.webp b/posts/projection-collection-sinusoidal/images/cards 2.webp new file mode 100644 index 0000000..7307d6a Binary files /dev/null and b/posts/projection-collection-sinusoidal/images/cards 2.webp differ diff --git a/posts/projection-collection-sinusoidal/images/cards.jpeg b/posts/projection-collection-sinusoidal/images/cards.jpeg new file mode 100644 index 0000000..c97a451 Binary files /dev/null and b/posts/projection-collection-sinusoidal/images/cards.jpeg differ diff --git a/posts/projection-collection-sinusoidal/index.qmd b/posts/projection-collection-sinusoidal/index.qmd new file mode 100644 index 0000000..6733bf2 --- /dev/null +++ b/posts/projection-collection-sinusoidal/index.qmd @@ -0,0 +1,16 @@ +--- +title: "Sinusoidal Map for The Projection Collection" +date: "2022-06-08" +categories: [QGIS] +image: "images/54 - Sinusoidal Law.png" +--- + +My contribution to Daniel Huffman's [Projection Collection](https://somethingaboutmaps.wordpress.com/2022/06/07/projection-cards-now-a-reality/) project, a set of trading cards where card each is a different map projection. + + + +The map itself is a [Sinusoidal Projection](https://en.wikipedia.org/wiki/Sinusoidal_projection), and was made in QGIS using the '1981' polygons from [Project Linework](https://www.projectlinework.org/). The style is supposed to be vaguely reminiscent of a monochrome green CRT monitor -- I think it was the combination of the projection's bulge and the word 'sinusoidal' which brought that aesthetic to mind when I made the map. + +It was really nice to get to map alongside (in a sense) many cartographers whose work I really admire by contributing to the project. + + diff --git a/posts/welcome/index.qmd b/posts/welcome/index.qmd new file mode 100644 index 0000000..573f05f --- /dev/null +++ b/posts/welcome/index.qmd @@ -0,0 +1,13 @@ +--- +title: "Welcome To My Blog" +author: "Tristan O'Malley" +date: "2022-08-16" +categories: [news] +draft: true +--- + +This is the first post in a Quarto blog. Welcome! + + + +Since this post doesn't specify an explicit `image`, the first image in the post will be used in the listing page of posts. diff --git a/posts/welcome/thumbnail.jpg b/posts/welcome/thumbnail.jpg new file mode 100644 index 0000000..8e3107c Binary files /dev/null and b/posts/welcome/thumbnail.jpg differ diff --git a/profile.jpg b/profile.jpg new file mode 100644 index 0000000..e3ea707 Binary files /dev/null and b/profile.jpg differ diff --git a/styles-dark.scss b/styles-dark.scss new file mode 100644 index 0000000..1f4a985 --- /dev/null +++ b/styles-dark.scss @@ -0,0 +1,22 @@ +/*-- scss:defaults --*/ + +@import 'https://fonts.googleapis.com/css2?family=Atkinson+Hyperlegible&display=swap'; +@import 'https://fonts.googleapis.com/css2?family=IBM+Plex+Sans&display=swap'; +// @import 'https://fonts.googleapis.com/css2?family=IBM+Plex+Mono&display=swap'; + +$font-family: "IMB Plex Sans", sans-serif; +$font-family-serif: "Atkinson Hyperlegible", sans-serif; + +$primary: #2c2c2c; + +// Base document colors +//$body-bg: #f8f9fa; +//$body-color: black; +//$link-color: grey; + +//$navbar-bg: #f8f9fa; +//$navbar-fg: black; +// $navbar-hl: + +/*-- scss:rules --*/ + diff --git a/styles.scss b/styles.scss new file mode 100644 index 0000000..f81757a --- /dev/null +++ b/styles.scss @@ -0,0 +1,20 @@ +/*-- scss:defaults --*/ + +@import 'https://fonts.googleapis.com/css2?family=Atkinson+Hyperlegible&display=swap'; +@import 'https://fonts.googleapis.com/css2?family=IBM+Plex+Sans&display=swap'; +// @import 'https://fonts.googleapis.com/css2?family=IBM+Plex+Mono&display=swap'; + +$font-family: "IMB Plex Sans", sans-serif; +$font-family-serif: "Atkinson Hyperlegible", sans-serif; + +// Base document colors +//$body-bg: #f8f9fa; +$body-color: black; +//$link-color: grey; + +$navbar-bg: #f8f9fa; +$navbar-fg: black; +// $navbar-hl: + +/*-- scss:rules --*/ ++ +#30DayMapChallenge Day 9: Monochrome
+ +--- Matthew Law (@Iawmatthew) November 9, 2021 + +
🐖 Pigs of Europe 🇪🇺 pic.twitter.com/8E27dljpyk + +