<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"><channel><title>James Williams</title><description>James Williams is a geospatial data developer building production ETL, spatial platforms and geocoding infrastructure at national and global scale. Python, SQL, PostGIS, DuckDB, Spark, H3, FastAPI, Docker and AWS.</description><link>https://jameswil.com/</link><language>en</language><item><title>Web Application Development</title><link>https://jameswil.com/teaching/cmm721/</link><guid isPermaLink="true">https://jameswil.com/teaching/cmm721/</guid><description>Placeholder summary for CMM721. Replace with a real description of the module.</description><pubDate>Wed, 05 Aug 2026 10:39:24 GMT</pubDate><category>Teaching</category><category>Web development</category><category>JavaScript</category></item><item><title>Information Security</title><link>https://jameswil.com/teaching/cmm7xx/</link><guid isPermaLink="true">https://jameswil.com/teaching/cmm7xx/</guid><description>Placeholder summary for CMM7XX. Replace with a real description of the module.</description><pubDate>Wed, 05 Aug 2026 10:39:24 GMT</pubDate><category>Teaching</category><category>Information security</category><category>Cryptography</category></item><item><title>Introduction to Programming</title><link>https://jameswil.com/teaching/cmu410/</link><guid isPermaLink="true">https://jameswil.com/teaching/cmu410/</guid><description>Placeholder summary for CMU410. Replace with a real description of the module.</description><pubDate>Wed, 05 Aug 2026 10:39:24 GMT</pubDate><category>Teaching</category><category>Programming</category></item><item><title>Web Applications</title><link>https://jameswil.com/teaching/cmu421/</link><guid isPermaLink="true">https://jameswil.com/teaching/cmu421/</guid><description>Placeholder summary for CMU421. Replace with a real description of the module.</description><pubDate>Wed, 05 Aug 2026 10:39:24 GMT</pubDate><category>Teaching</category><category>Web development</category></item><item><title>Fundamentals of Web Design</title><link>https://jameswil.com/teaching/cmu422/</link><guid isPermaLink="true">https://jameswil.com/teaching/cmu422/</guid><description>Placeholder summary for CMU422. Replace with a real description of the module.</description><pubDate>Wed, 05 Aug 2026 10:39:24 GMT</pubDate><category>Teaching</category><category>Web design</category><category>HTML and CSS</category></item><item><title>Fundamentals of Systems and Networking</title><link>https://jameswil.com/teaching/cmu4xx/</link><guid isPermaLink="true">https://jameswil.com/teaching/cmu4xx/</guid><description>Placeholder summary for CMU4XX. Replace with a real description of the module.</description><pubDate>Wed, 05 Aug 2026 10:39:24 GMT</pubDate><category>Teaching</category><category>Networking</category><category>Systems</category></item><item><title>Advanced Web Development</title><link>https://jameswil.com/teaching/cmu529/</link><guid isPermaLink="true">https://jameswil.com/teaching/cmu529/</guid><description>Placeholder summary for CMU529. Replace with a real description of the module.</description><pubDate>Wed, 05 Aug 2026 10:39:24 GMT</pubDate><category>Teaching</category><category>Full stack</category><category>JavaScript</category></item><item><title>Cyber Security</title><link>https://jameswil.com/teaching/cmu540/</link><guid isPermaLink="true">https://jameswil.com/teaching/cmu540/</guid><description>Placeholder summary for CMU540. Replace with a real description of the module.</description><pubDate>Wed, 05 Aug 2026 10:39:24 GMT</pubDate><category>Teaching</category><category>Cyber security</category></item><item><title>Industry Project</title><link>https://jameswil.com/teaching/cmu597/</link><guid isPermaLink="true">https://jameswil.com/teaching/cmu597/</guid><description>Placeholder summary for CMU597. Replace with a real description of the module.</description><pubDate>Wed, 05 Aug 2026 10:39:24 GMT</pubDate><category>Teaching</category><category>Industry project</category><category>Professional practice</category></item><item><title>Software Security</title><link>https://jameswil.com/teaching/cmu5xx/</link><guid isPermaLink="true">https://jameswil.com/teaching/cmu5xx/</guid><description>Placeholder summary for CMU5XX. Replace with a real description of the module.</description><pubDate>Wed, 05 Aug 2026 10:39:24 GMT</pubDate><category>Teaching</category><category>Software security</category><category>Secure development</category></item><item><title>Information Security for Industry</title><link>https://jameswil.com/teaching/cmu5xx-infosec/</link><guid isPermaLink="true">https://jameswil.com/teaching/cmu5xx-infosec/</guid><description>Placeholder summary for CMU5XX-INFOSEC. Replace with a real description of the module.</description><pubDate>Wed, 05 Aug 2026 10:39:24 GMT</pubDate><category>Teaching</category><category>Information security</category><category>Industry</category></item><item><title>Dissertation</title><link>https://jameswil.com/teaching/cmu601/</link><guid isPermaLink="true">https://jameswil.com/teaching/cmu601/</guid><description>Placeholder summary for CMU601. Replace with a real description of the module.</description><pubDate>Wed, 05 Aug 2026 10:39:24 GMT</pubDate><category>Teaching</category><category>Supervision</category><category>Research methods</category></item><item><title>Ethical Hacking</title><link>https://jameswil.com/teaching/cmu6xx/</link><guid isPermaLink="true">https://jameswil.com/teaching/cmu6xx/</guid><description>Placeholder summary for CMU6XX. Replace with a real description of the module.</description><pubDate>Wed, 05 Aug 2026 10:39:24 GMT</pubDate><category>Teaching</category><category>Ethical hacking</category><category>Offensive security</category></item><item><title>Cyber Forensics</title><link>https://jameswil.com/teaching/cmu6xx-cf/</link><guid isPermaLink="true">https://jameswil.com/teaching/cmu6xx-cf/</guid><description>Placeholder summary for CMU6XX-CF. Replace with a real description of the module.</description><pubDate>Wed, 05 Aug 2026 10:39:24 GMT</pubDate><category>Teaching</category><category>Digital forensics</category><category>Cyber security</category></item><item><title>Applied Electrical and Electronic Engineering: Construction Project</title><link>https://jameswil.com/teaching/eeee1002/</link><guid isPermaLink="true">https://jameswil.com/teaching/eeee1002/</guid><description>Placeholder summary for EEEE1002. Replace with a real description of the module.</description><pubDate>Wed, 05 Aug 2026 10:39:24 GMT</pubDate><category>Teaching</category><category>Engineering</category><category>Project</category></item><item><title>Introduction to Software Engineering and Programming</title><link>https://jameswil.com/teaching/eeee1040/</link><guid isPermaLink="true">https://jameswil.com/teaching/eeee1040/</guid><description>Placeholder summary for EEEE1040. Replace with a real description of the module.</description><pubDate>Wed, 05 Aug 2026 10:39:24 GMT</pubDate><category>Teaching</category><category>Software engineering</category><category>Programming</category></item><item><title>HDL for Programmable Logic</title><link>https://jameswil.com/teaching/eeee4123/</link><guid isPermaLink="true">https://jameswil.com/teaching/eeee4123/</guid><description>Placeholder summary for EEEE4123. Replace with a real description of the module.</description><pubDate>Wed, 05 Aug 2026 10:39:24 GMT</pubDate><category>Teaching</category><category>HDL</category><category>Programmable logic</category></item><item><title>General capability barely predicts spatial reasoning in LLMs</title><link>https://jameswil.com/notes/general-capability-does-not-predict-spatial/</link><guid isPermaLink="true">https://jameswil.com/notes/general-capability-does-not-predict-spatial/</guid><description>I took the eleven top models on the Vellum leaderboard and asked them 46
spatial questions with machine-computed answers: GeoJSON axis order, great
circle distance and bearing, UTM zones including the Norway and Svalbard
exceptions, RFC 7946 winding order, and point-in-polygon on a concave ring.
One run, temperature 0, through OpenRouter.

The correlation between general capability and spatial score is **r = 0.19**.

| Model | Score | Answered | Of answered | Mean tokens | Vellum |
|---|---:|---:|---:|---:|---:|
| GPT-5.6 Sol | 97.6 | 97.6 | 100.0 | 711 | 47.2 |
| Claude Opus 5 | 95.7 | 100.0 | 95.7 | 532 | 64.7 |
| Claude Fable 5 | 91.3 | 100.0 | 91.3 | 415 | — |
| Claude Sonnet 5 | 91.3 | 91.3 | 100.0 | 844 | 57.4 |
| Claude Opus 4.8 | 69.6 | 100.0 | 69.6 | 37 | 57.9 |
| DeepSeek V4 Flash | 69.6 | 100.0 | 69.6 | 166 | 51.6 |
| GLM 5.2 | 63.0 | 69.6 | 90.6 | 1530 | 54.7 |
| DeepSeek V4 Pro | 56.5 | 60.9 | 92.9 | 2104 | 48.2 |
| Kimi K3 | 45.7 | 67.4 | 67.7 | 1715 | 56.0 |
| Kimi K2.6 | 28.3 | 30.4 | 92.9 | 3128 | 54.0 |
| Gemini 3.1 Pro | 26.1 | 100.0 | 26.1 | 195 | — |

The lowest-ranked model on general capability came first. The highest-ranked
came second. Below that the ordering scrambles entirely.

Three columns matter more than the score. **Answered** is the share that
produced anything within a 4,000-token budget. **Of answered** is accuracy on
those. **Mean tokens** shows why they differ: Kimi K2.6 spends 3,128 tokens
per question and answers 30% of them, but is right 93% of the time when it
finishes. It is not bad at geodesy, it runs out of room.

Reporting those as one number is a trap I fell into first time round. Capped
at 200 tokens, ten of eleven models scored zero on distance. They had not
failed, they had been truncated, and an empty response was being scored as a
wrong answer. The resulting leaderboard ranked models by terseness and looked
entirely plausible.

Axis order is near-solved: nine of eleven score 100. Bearing is not: four
score zero. Nobody should be computing geodesy in a language model anyway, but
plenty of [agent frameworks now do](/work/geon). It is also [why I assess
reading code](/notes/teaching-web-development-when-code-is-free).

*46 tasks, one run, $5.20. Ground truth computed, not written. Single run, so
no variance estimate.*</description><pubDate>Wed, 05 Aug 2026 00:00:00 GMT</pubDate><category>Note</category><category>Benchmarks</category><category>GeoAI</category><category>LLM</category></item><item><title>AnythingPOI: a fused, confidence-scored points of interest dataset</title><link>https://jameswil.com/work/anythingpoi/</link><guid isPermaLink="true">https://jameswil.com/work/anythingpoi/</guid><description>OpenStreetMap and Overture Maps conflated into one deduplicated, classified, openly licensed dataset. 22.7M points across six countries, every record carrying a confidence score and the evidence behind it.</description><pubDate>Tue, 04 Aug 2026 00:00:00 GMT</pubDate><category>Work</category><category>OpenStreetMap</category><category>Overture Maps</category><category>H3</category><category>DuckDB</category><category>GeoParquet</category><category>PMTiles</category><category>Open data</category></item><item><title>CDISAW: a queryable data infrastructure for slavery and armed conflict</title><link>https://jameswil.com/work/cdisaw/</link><guid isPermaLink="true">https://jameswil.com/work/cdisaw/</guid><description>A research platform that makes 53 incompatible datasets on slavery in war answerable as one corpus. 23.5M linked event records across five ontological layers, queried through a typology-first interface, with every query citable.</description><pubDate>Tue, 04 Aug 2026 00:00:00 GMT</pubDate><category>Work</category><category>PostGIS</category><category>FastAPI</category><category>Elasticsearch</category><category>H3</category><category>Docker</category><category>Ontology</category><category>Open data</category></item><item><title>GEON: an LLM-native format for representing places as meaning, not coordinates</title><link>https://jameswil.com/work/geon/</link><guid isPermaLink="true">https://jameswil.com/work/geon/</guid><description>An open text format that describes what a place is, how it works and how it feels, rather than where its vertices are. Three reference implementations, bidirectional GeoJSON conversion, and measurably fewer tokens than the format it complements.</description><pubDate>Tue, 04 Aug 2026 00:00:00 GMT</pubDate><category>Work</category><category>Open format</category><category>GeoAI</category><category>LLM</category><category>Python</category><category>Rust</category><category>TypeScript</category><category>Semantic data</category></item><item><title>Leisure Walking Systems Working Group: making place research buildable</title><link>https://jameswil.com/work/lwswg/</link><guid isPermaLink="true">https://jameswil.com/work/lwswg/</guid><description>An EPSRC-funded academic and industry initiative that produced open technical documentation, design frameworks and evaluation tools for place-based walking systems. 25+ documents across 8 research areas, published for practitioners rather than archived for academics.</description><pubDate>Tue, 04 Aug 2026 00:00:00 GMT</pubDate><category>Work</category><category>User research</category><category>Geospatial analysis</category><category>UX design</category><category>Policy frameworks</category><category>Open access</category></item><item><title>PARM-X: projecting live geospatial data onto physical city models</title><link>https://jameswil.com/work/parm-x/</link><guid isPermaLink="true">https://jameswil.com/work/parm-x/</guid><description>The interactive software layer for Nottingham&apos;s projection augmented relief model. Live council data, crowd simulations and public responses draped onto physical terrain across four synchronised screens, cutting a four-hour preparation process to minutes for executive planning sessions.</description><pubDate>Tue, 04 Aug 2026 00:00:00 GMT</pubDate><category>Work</category><category>React</category><category>TypeScript</category><category>Leaflet</category><category>Esri</category><category>H3</category><category>Three.js</category><category>Supabase</category><category>PostGIS</category></item><item><title>Topodex: contextual geocoding for conflict and human rights corpora</title><link>https://jameswil.com/work/topodex/</link><guid isPermaLink="true">https://jameswil.com/work/topodex/</guid><description>A Python library that makes geocoders accountable to the document they are reading. 894M+ places resolved across nine open sources, reranked against document context, with a six-category failure taxonomy and a coherence check over everywhere a document names.</description><pubDate>Tue, 04 Aug 2026 00:00:00 GMT</pubDate><category>Work</category><category>Python</category><category>NLP</category><category>Geocoding</category><category>Nominatim</category><category>Pleiades</category><category>OpenHistoricalMap</category><category>GeoAI</category></item><item><title>WalkGIS: linking video narratives to maps to capture sense of place</title><link>https://jameswil.com/work/walkgis/</link><guid isPermaLink="true">https://jameswil.com/work/walkgis/</guid><description>A contextual GIS that fuses first-person walk video, think-aloud narration and GPS into one synchronised environment, so what a walker said can be queried spatially. Analysis per walk fell from two or three weeks to one.</description><pubDate>Tue, 04 Aug 2026 00:00:00 GMT</pubDate><category>Work</category><category>Leaflet</category><category>Turf.js</category><category>JavaScript</category><category>Platial analysis</category><category>Qualitative GIS</category><category>HCI</category></item><item><title>WalkGrid: personalising urban walking through environmental similarity</title><link>https://jameswil.com/work/walkgrid/</link><guid isPermaLink="true">https://jameswil.com/work/walkgrid/</guid><description>A routing platform that curates walks by what makes them worth taking, from greenspace and heritage to air quality and safety, rather than by distance. 51 environmental features scored across a hexagonal grid, with route selection driven by natural language.</description><pubDate>Tue, 04 Aug 2026 00:00:00 GMT</pubDate><category>Work</category><category>H3</category><category>PostGIS</category><category>OSRM</category><category>LLM</category><category>Spatial similarity</category><category>Active travel</category><category>HCI</category></item><item><title>The curse of the .science domain: why this site moved to jameswil.com</title><link>https://jameswil.com/notes/moving-off-a-science-domain/</link><guid isPermaLink="true">https://jameswil.com/notes/moving-off-a-science-domain/</guid><description>This site used to live at jwilliams.science. It now lives at jameswil.com,
because a domain that some readers cannot open is not a domain.

The reason is the TLD, not the site. `.science` was cheap at launch and got
used accordingly, so it carries a poor reputation with the blocklists that
corporate proxies, university filters and mail gateways buy in wholesale. Those
lists work at the TLD level. Nothing on my site was ever assessed. Readers on
several Canadian networks simply got a block page, and a CV link that returns a
block page is worse than no link.

Mail is the sharper edge. A `.science` address in a From header is enough to
score a message into a junk folder before anything else about it is read, which
matters when the message is an application.

The lesson is dull and worth stating: a novelty TLD is not a saving, it is a
deliverability decision made once and paid for repeatedly. Old links redirect,
and the five references to the old domain still sitting in
[project](/work/anythingpoi) [pages](/work/lwswg) are next.</description><pubDate>Sat, 01 Aug 2026 00:00:00 GMT</pubDate><category>Note</category><category>Web</category><category>Domains</category><category>Meta</category></item><item><title>Teaching web development when writing the code is the cheap part</title><link>https://jameswil.com/notes/teaching-web-development-when-code-is-free/</link><guid isPermaLink="true">https://jameswil.com/notes/teaching-web-development-when-code-is-free/</guid><description>A first-year student can now produce a working CRUD app in an afternoon.
Assessing the artefact stopped being informative the moment that became true,
because the artefact no longer evidences anything about the student.

What has not become cheap is diagnosis. Generated code fails in ordinary ways:
a fetch that never handles the rejected promise, an auth check enforced in the
client and nowhere else, an N+1 query that is invisible at 20 rows and fatal at
20,000. A student who cannot read the code cannot see any of it, and the model
will not volunteer it. It is the same failure I measure elsewhere: [confident
output, no signal about whether it is
right](/notes/general-capability-does-not-predict-spatial).

So the marks moved. On [CMU422](/teaching/cmu422) and
[CMU529](/teaching/cmu529) the submission is still an
application, but it arrives as a repository: commit history, a README that
justifies the dependencies and the architecture, and a short written reflection
on what broke, what the student changed their mind about, and what they still
do not understand. A repo you cannot explain is a repo you did not build.

This is not a restriction on tool use, and policing that would fail anyway. It
is a change in what counts as the work. Reading code critically was always the
harder skill and we could previously get away with assuming it followed from
writing enough of it. It does not follow any more, so it has to be taught
directly.</description><pubDate>Tue, 14 Jul 2026 00:00:00 GMT</pubDate><category>Note</category><category>Teaching</category><category>Web development</category><category>LLM</category></item><item><title>POI conflation thresholds: why a 2% cross-source match rate is the honest answer</title><link>https://jameswil.com/notes/poi-conflation-match-rate/</link><guid isPermaLink="true">https://jameswil.com/notes/poi-conflation-match-rate/</guid><description>Two POIs sit 30 m apart with similar names. Same shop, or two shops? Every
conflation pipeline answers that question and almost none of them publish the
answer.

[AnythingPOI](/work/anythingpoi), which fuses OpenStreetMap and Overture Maps
into 22.7M points across six countries, uses three gates, all of which must
hold: 50 m Haversine, agreement
on Tier-1 category, and Jaro-Winkler name similarity of 0.85 on normalised
names. Candidates are blocked first by [H3 at resolution
11](/notes/h3-kring-is-not-the-radius-you-asked-for), which is the same
parameter choice in a different costume. Across six countries the gates match
1.4% to 3.2% of records.

The number looks like failure. Loosening it is trivial: take the gate to 150 m,
drop the category check, and the merged count climbs to something that reads
well in a table. What you have actually done is fuse the barber and the
newsagent that share a parade and a family name, and you cannot tell which of
your merges are real.

A cross-source match is worth something in the confidence score precisely
because it is rare. It means two independently built datasets agree. Inflate
the rate and you destroy the signal that made the field worth adding.

Recall is what this costs. Transliterated names go unmatched, and so does a
shopping centre whose centroid sits 200 m from its entrance. That is a
deliberate trade, and it belongs in the documentation rather than in a
footnote.</description><pubDate>Tue, 23 Jun 2026 00:00:00 GMT</pubDate><category>Note</category><category>Conflation</category><category>Open data</category><category>OpenStreetMap</category></item><item><title>Micro visualisations for spatial data: draw the geometry, not the number</title><link>https://jameswil.com/notes/micro-visualisations-spatial-data/</link><guid isPermaLink="true">https://jameswil.com/notes/micro-visualisations-spatial-data/</guid><description>A table of metres cannot say what a neighbourhood is shaped like. The [k-ring
that overshoots 400 m](/notes/h3-kring-is-not-the-radius-you-asked-for) reaches
furthest along six axes, so a shop 390 m away is inside or outside depending on
its bearing. Inline SVG draws that at the size of the text, inside the sentence
making the claim. Resolution 9 gives you &lt;svg class=&quot;fig-inline&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 15 15&quot; role=&quot;img&quot; aria-label=&quot;Resolution 9 footprint, with the 400 m target circle inside it.&quot;&gt;&lt;circle cx=&quot;7.5&quot; cy=&quot;7.5&quot; r=&quot;3.1&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;0.6&quot; stroke-dasharray=&quot;1.5 1.5&quot; opacity=&quot;0.6&quot;/&gt;&lt;polygon points=&quot;1.3,9.2 2.6,9.4 3.0,11.2 4.2,11.6 5.4,10.8 4.6,13.2 5.8,13.8 6.9,11.5 7.2,13.0 8.5,13.6 9.5,12.8 9.4,11.2 11.3,13.3 12.4,12.4 11.9,11.1 13.3,9.7 12.9,8.4 14.0,7.8 13.7,5.8 12.4,5.6 12.0,3.8 10.8,3.4 9.6,4.2 10.4,1.8 9.2,1.2 8.1,3.5 7.8,2.0 6.5,1.4 5.5,2.2 5.6,3.8 3.7,1.7 2.6,2.6 3.1,3.9 1.7,5.3 2.1,6.6 1.0,7.2&quot; fill=&quot;currentColor&quot; fill-opacity=&quot;0.14&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;0.8&quot; stroke-linejoin=&quot;round&quot;/&gt;&lt;/svg&gt; for a 400 m
walk, and resolution 11 gives you &lt;svg class=&quot;fig-inline&quot; width=&quot;15&quot; height=&quot;15&quot; viewBox=&quot;0 0 15 15&quot; role=&quot;img&quot; aria-label=&quot;Resolution 11 footprint, with the 400 m target circle inside it.&quot;&gt;&lt;circle cx=&quot;7.5&quot; cy=&quot;7.5&quot; r=&quot;6.5&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;0.6&quot; stroke-dasharray=&quot;1.5 1.5&quot; opacity=&quot;0.6&quot;/&gt;&lt;polygon points=&quot;1.0,7.8 1.1,8.5 1.6,9.1 2.1,9.6 2.6,10.0 2.8,10.6 3.2,11.0 3.5,11.5 4.0,11.8 4.3,12.4 4.7,12.9 5.2,13.5 5.8,13.8 6.5,13.7 7.2,13.5 7.8,13.5 8.4,13.4 9.1,13.4 9.6,13.0 10.3,13.1 11.1,13.0 11.8,12.9 12.1,12.1 12.4,11.4 12.6,10.8 12.6,10.1 13.1,9.6 13.2,9.0 13.5,8.4 13.7,7.8 14.0,7.2 13.9,6.5 13.4,5.9 12.9,5.4 12.4,5.0 12.2,4.4 11.8,4.0 11.5,3.5 11.0,3.2 10.7,2.6 10.3,2.1 9.8,1.5 9.2,1.2 8.5,1.3 7.8,1.5 7.2,1.5 6.6,1.6 5.9,1.6 5.4,2.0 4.7,1.9 3.9,2.0 3.2,2.1 2.9,2.9 2.6,3.6 2.4,4.2 2.4,4.9 1.9,5.4 1.8,6.0 1.5,6.6 1.3,7.2&quot; fill=&quot;currentColor&quot; fill-opacity=&quot;0.14&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;0.8&quot; stroke-linejoin=&quot;round&quot;/&gt;&lt;/svg&gt;. Same dashed 400 m target, same
15 px, and only the second is the neighbourhood you asked for. Overshoot falls &lt;svg class=&quot;fig-inline&quot; width=&quot;46&quot; height=&quot;11&quot; viewBox=&quot;-1 -1 48 13&quot; role=&quot;img&quot; aria-label=&quot;Sparkline of overshoot by resolution 7 to 12: 514, 130, 75, 32, 0 and 3 percent.&quot;&gt;&lt;polyline points=&quot;0.0,0.0 9.2,8.2 18.4,9.4 27.6,10.3 36.8,11.0 46.0,10.9&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;1.1&quot; stroke-linejoin=&quot;round&quot; stroke-linecap=&quot;round&quot;/&gt;&lt;/svg&gt;
from 514% to nothing.

At 64 px there is room for the boundary. Real H3 disks at 51.48 degrees north,
each scaled to its own footprint:

| Res | Footprint | Reach | Overshoot | Cells |
|---:|---|---:|---:|---:|
| 7 | &lt;svg class=&quot;fig-inline&quot; width=&quot;64&quot; height=&quot;64&quot; viewBox=&quot;0 0 64 64&quot; role=&quot;img&quot; aria-label=&quot;Resolution 7: the k-ring footprint, with the 400 m target circle drawn inside it to the same scale.&quot;&gt;&lt;circle cx=&quot;32.0&quot; cy=&quot;32.0&quot; r=&quot;3.3&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;0.7&quot; stroke-dasharray=&quot;2 2&quot; opacity=&quot;0.55&quot;/&gt;&lt;polygon points=&quot;5.2,42.3 15.3,45.5 16.3,56.2 27.4,61.3 35.6,54.8 46.1,59.6 56.1,51.5 53.4,40.2 61.5,33.5 58.8,21.7 48.7,18.5 47.7,7.9 36.6,2.7 28.4,9.2 17.9,4.4 7.9,12.5 10.5,23.8 2.5,30.5&quot; fill=&quot;currentColor&quot; fill-opacity=&quot;0.14&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;0.9&quot; stroke-linejoin=&quot;round&quot;/&gt;&lt;/svg&gt; | 2,457 m | +514% | 7 |
| 8 | &lt;svg class=&quot;fig-inline&quot; width=&quot;64&quot; height=&quot;64&quot; viewBox=&quot;0 0 64 64&quot; role=&quot;img&quot; aria-label=&quot;Resolution 8: the k-ring footprint, with the 400 m target circle drawn inside it to the same scale.&quot;&gt;&lt;circle cx=&quot;32.0&quot; cy=&quot;32.0&quot; r=&quot;8.8&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;0.7&quot; stroke-dasharray=&quot;2 2&quot; opacity=&quot;0.55&quot;/&gt;&lt;polygon points=&quot;11.8,39.8 9.9,49.9 18.9,57.7 28.5,54.1 36.8,62.1 48.9,58.0 50.2,46.7 60.3,42.9 61.4,33.5 52.2,24.2 54.1,14.1 45.1,6.3 35.5,9.9 27.2,1.9 15.1,6.0 13.8,17.3 3.7,21.1 2.6,30.5&quot; fill=&quot;currentColor&quot; fill-opacity=&quot;0.14&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;0.9&quot; stroke-linejoin=&quot;round&quot;/&gt;&lt;/svg&gt; | 922 m | +130% | 7 |
| 9 | &lt;svg class=&quot;fig-inline&quot; width=&quot;64&quot; height=&quot;64&quot; viewBox=&quot;0 0 64 64&quot; role=&quot;img&quot; aria-label=&quot;Resolution 9: the k-ring footprint, with the 400 m target circle drawn inside it to the same scale.&quot;&gt;&lt;circle cx=&quot;32.0&quot; cy=&quot;32.0&quot; r=&quot;14.0&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;0.7&quot; stroke-dasharray=&quot;2 2&quot; opacity=&quot;0.55&quot;/&gt;&lt;polygon points=&quot;4.2,39.5 9.9,40.5 11.7,48.4 17.1,50.4 22.5,46.6 18.9,57.7 24.4,60.4 29.2,49.8 30.7,56.7 36.4,59.6 41.1,55.8 40.5,48.7 48.9,58.0 53.9,53.9 51.8,48.0 58.0,42.0 56.3,35.8 61.3,33.5 59.8,24.5 54.0,23.5 52.3,15.6 46.9,13.6 41.5,17.4 45.1,6.3 39.6,3.6 34.8,14.2 33.3,7.3 27.6,4.4 22.9,8.2 23.5,15.3 15.1,6.0 10.1,10.1 12.2,16.0 6.0,22.0 7.7,28.2 2.7,30.5&quot; fill=&quot;currentColor&quot; fill-opacity=&quot;0.14&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;0.9&quot; stroke-linejoin=&quot;round&quot;/&gt;&lt;/svg&gt; | 702 m | +75% | 19 |
| 10 | &lt;svg class=&quot;fig-inline&quot; width=&quot;64&quot; height=&quot;64&quot; viewBox=&quot;0 0 64 64&quot; role=&quot;img&quot; aria-label=&quot;Resolution 10: the k-ring footprint, with the 400 m target circle drawn inside it to the same scale.&quot;&gt;&lt;circle cx=&quot;32.0&quot; cy=&quot;32.0&quot; r=&quot;20.8&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;0.7&quot; stroke-dasharray=&quot;2 2&quot; opacity=&quot;0.55&quot;/&gt;&lt;polygon points=&quot;5.0,33.4 7.9,35.8 7.9,41.3 10.6,42.9 9.9,46.4 12.1,48.1 11.8,52.2 16.3,56.1 23.1,49.5 22.4,57.1 25.6,55.8 27.8,58.3 30.7,57.2 33.5,60.0 35.2,52.5 40.0,61.8 46.1,59.6 47.7,56.1 48.5,52.3 53.6,49.5 53.7,46.1 57.2,44.9 57.4,41.8 61.1,39.8 61.5,36.7 58.5,33.4 59.0,30.6 56.1,28.2 56.1,22.8 53.4,21.1 54.1,17.6 51.9,15.9 52.2,11.8 47.7,7.9 40.9,14.5 41.6,6.9 38.4,8.2 36.2,5.7 33.3,6.8 30.5,4.0 28.8,11.5 24.0,2.2 17.9,4.4 16.3,7.9 15.5,11.7 10.4,14.5 10.3,17.9 6.8,19.1 6.6,22.2 2.9,24.2 2.5,27.3 5.5,30.6&quot; fill=&quot;currentColor&quot; fill-opacity=&quot;0.14&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;0.9&quot; stroke-linejoin=&quot;round&quot;/&gt;&lt;/svg&gt; | 527 m | +32% | 61 |
| 11 | &lt;svg class=&quot;fig-inline&quot; width=&quot;64&quot; height=&quot;64&quot; viewBox=&quot;0 0 64 64&quot; role=&quot;img&quot; aria-label=&quot;Resolution 11: the k-ring footprint, with the 400 m target circle drawn inside it to the same scale.&quot;&gt;&lt;circle cx=&quot;32.0&quot; cy=&quot;32.0&quot; r=&quot;29.1&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;0.7&quot; stroke-dasharray=&quot;2 2&quot; opacity=&quot;0.55&quot;/&gt;&lt;polygon points=&quot;2.9,33.5 3.4,36.5 5.6,39.1 7.7,41.3 10.0,43.2 10.8,45.8 12.5,47.8 14.1,49.9 16.4,51.2 17.8,53.9 19.6,56.4 21.6,59.1 24.4,60.2 27.6,59.7 30.6,59.2 33.4,58.8 36.2,58.5 39.1,58.4 41.6,56.9 44.8,57.1 48.0,56.7 51.5,56.1 52.8,52.8 53.9,49.7 54.8,46.8 55.1,43.8 57.0,41.6 57.8,38.9 58.8,36.2 59.9,33.5 61.1,30.5 60.6,27.5 58.4,24.9 56.3,22.7 54.0,20.8 53.2,18.2 51.5,16.2 49.9,14.1 47.6,12.8 46.2,10.1 44.4,7.6 42.4,4.9 39.6,3.8 36.4,4.3 33.4,4.8 30.6,5.2 27.8,5.5 24.9,5.6 22.4,7.1 19.2,6.9 16.0,7.3 12.5,7.9 11.2,11.2 10.1,14.3 9.2,17.2 8.9,20.2 7.0,22.4 6.2,25.1 5.2,27.8 4.1,30.5&quot; fill=&quot;currentColor&quot; fill-opacity=&quot;0.14&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;0.9&quot; stroke-linejoin=&quot;round&quot;/&gt;&lt;/svg&gt; | 401 m | +0% | 217 |
| 12 | &lt;svg class=&quot;fig-inline&quot; width=&quot;64&quot; height=&quot;64&quot; viewBox=&quot;0 0 64 64&quot; role=&quot;img&quot; aria-label=&quot;Resolution 12: the k-ring footprint, with the 400 m target circle drawn inside it to the same scale.&quot;&gt;&lt;circle cx=&quot;32.0&quot; cy=&quot;32.0&quot; r=&quot;29.3&quot; fill=&quot;none&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;0.7&quot; stroke-dasharray=&quot;2 2&quot; opacity=&quot;0.55&quot;/&gt;&lt;polygon points=&quot;5.1,33.4 6.6,36.0 7.6,38.5 8.5,41.0 9.5,43.5 10.4,46.0 11.4,48.7 12.2,51.8 13.9,54.3 16.9,55.2 19.8,55.9 22.6,56.5 25.3,57.1 27.9,57.7 30.6,58.3 33.4,59.0 36.4,60.0 39.7,60.6 43.1,60.9 45.6,58.6 47.7,56.2 49.5,53.6 51.3,51.3 53.1,49.1 55.0,46.9 56.9,44.7 59.2,42.4 61.1,39.8 61.0,36.6 60.0,33.5 58.9,30.6 57.4,28.0 56.4,25.5 55.5,23.0 54.5,20.5 53.6,18.0 52.6,15.3 51.8,12.2 50.1,9.7 47.1,8.8 44.2,8.1 41.4,7.5 38.7,6.9 36.1,6.3 33.4,5.7 30.6,5.0 27.6,4.0 24.3,3.4 20.9,3.1 18.4,5.4 16.3,7.8 14.5,10.4 12.7,12.7 10.9,14.9 9.0,17.1 7.1,19.3 4.8,21.6 2.9,24.2 3.0,27.4 4.0,30.5&quot; fill=&quot;currentColor&quot; fill-opacity=&quot;0.14&quot; stroke=&quot;currentColor&quot; stroke-width=&quot;0.9&quot; stroke-linejoin=&quot;round&quot;/&gt;&lt;/svg&gt; | 414 m | +3% | 1,519 |

Read the dashed circle, not the outline. At resolution 7 the target is a speck
inside the one cell you were given. By 11 it nearly fills a footprint that has
stopped being a hexagon, which is what 217 cells bought.

Each is under a kilobyte, needs no charting library, and has fixed `width` and
`height`, so it cannot shift the layout. `currentColor` serves both themes from
one file. Best of all, the script that computes the table emits the glyphs, so
the picture cannot drift from the numbers beside it.

A figure does not have to be a page wide to be a figure.</description><pubDate>Tue, 21 Apr 2026 00:00:00 GMT</pubDate><category>Note</category><category>Dataviz</category><category>SVG</category><category>H3</category></item><item><title>Choosing an H3 resolution for neighbourhood analysis: your k-ring is not the radius you asked for</title><link>https://jameswil.com/notes/h3-kring-is-not-the-radius-you-asked-for/</link><guid isPermaLink="true">https://jameswil.com/notes/h3-kring-is-not-the-radius-you-asked-for/</guid><description>Ask for a [400 m walkable neighbourhood](/work/walkgrid), the standard
five-minute walk, and H3
hands you something else. At resolution 9 you get 702 m. That is not a rounding
error, it is a neighbourhood 76% too big.

The cause is that `k` is an integer and the grid step is fixed. A disk grows in
whole rings, so its radius is wherever the grid happens to land, never the
number you asked for. Coarse resolutions land badly.

&lt;img class=&quot;fig-mono&quot; src=&quot;/notes/h3-neighbourhood-radius.svg&quot; alt=&quot;Bar chart of the radius actually reached when asking H3 for a 400 metre neighbourhood at 51.48 degrees north. Resolution 7 reaches 2,457 m using 7 cells; resolution 8, 922 m using 7 cells; resolution 9, 702 m using 19 cells; resolution 10, 527 m using 61 cells; resolution 11, 401 m using 217 cells; resolution 12, 414 m using 1,519 cells.&quot; /&gt;

Grown rather than estimated, at 51.48°N:

```python
k = 1
while disk_reach(cell, k) &lt; 400:
    k += 1
```

Resolution 9 reaches 702 m for 19 cells, resolution 10 reaches 527 m for 61,
and only [resolution 11](/notes/poi-conflation-match-rate), the resolution
[AnythingPOI](/work/anythingpoi) blocks on, lands at 401 m, for 217. Measuring the disk a second
way, as the radius of the circle of equal area, agrees: 769 m, 521 m, 371 m.

So each step costs roughly 3.5× the cells, and what it buys is boundary
accuracy. It is not buying finer cells, which mostly encode precision your
input data does not have.

Pick the resolution from the error you will accept on the boundary, then check
the cell count you can afford. Choosing on cell size alone is how a 400 m study
quietly becomes a 700 m one.

Cells are not equal-area, so these are numbers for 51°N. Rerun them at yours.</description><pubDate>Tue, 17 Feb 2026 00:00:00 GMT</pubDate><category>Note</category><category>H3</category><category>GIS</category><category>Spatial</category></item><item><title>Multi-Resolution H3 Walkability Surfaces: A Scalable Framework for Cross-City Pedestrian Environment Assessment</title><link>https://jameswil.com/publications/williams2026-hwsframework/</link><guid isPermaLink="true">https://jameswil.com/publications/williams2026-hwsframework/</guid><description>Introduction: Quantifying urban walkability at fine spatial resolution is essential for evidence-based active travel planning. Yet, existing indices typically rely on coarse administrative units or proprietary data, which impedes cross-city comparisons. This study presents the Hexagonal Walkability Surface (HWS) framework: a configuration-driven pipeline for computing multi-resolution walkability indices from geospatial data. Methods: HWS employs the H3 discrete global grid to tessellate city extents at four hierarchical resolutions (levels 8-11). Five pedestrian-environment features are extracted per hexagon: (1) footway and path density (pedestrian edge length per km²); (2) point-of-interest accessibility, combining in-cell counts with an inverse-distance-weighted proximity score; (3) land-use diversity as Shannon entropy of intersecting land-use classes; (4) greenspace proximity, integrating coverage proportion with distance decay; and (5) road-safety ratio of pedestrian-friendly to total edge length. Street network and land-use data are sourced from OpenStreetMap; place data is augmented with Overture Maps (2026-02-18) via DuckDB S3 queries. Features are min-max normalised and combined as a weighted composite score (0-100). Spatial autocorrelation (Getis-Ord Gi*) is used to identify clusters of walkability. Results: In Nottingham and Bristol, United Kingdom, the framework produces 1,178-57,700 and 2,581-126,518 hexagons per city, respectively, across resolutions 9-11. Across the resolutions, agreement is high (Spearman ρ = 0.963-0.971 between adjacent levels, all p &lt; 0.001), confirming multi-scale consistency. At resolution 9 (roughly neighbourhood scale), intra-urban variation is observed in both cities (σ = 11.4 and 10.1 score points respectively), with city-centre hexagons clustering as hotspots and peripheral areas as coldspots. Gini coefficients indicate greater inequality in walkability in Nottingham (0.36) than in Bristol (0.26). Conclusions: HWS provides a reproducible, data-agnostic methodology extensible to any city with OSM coverage. The multi-resolution design could support both strategic (neighbourhood) and street-block planning decisions. By making fine-grained walkability assessment accessible to researchers and planners without proprietary data or bespoke infrastructure, HWS lowers the barrier to evidence-based active travel policy at the urban scale.</description><pubDate>Thu, 01 Jan 2026 00:00:00 GMT</pubDate><category>Publication</category><category>Conference paper</category><category>Walkability</category><category>Hexagonal Grid</category><category>H3</category><category>Urban Analytics</category><category>OpenStreetMap</category><category>Overture Maps</category></item><item><title>Macro-Regional Spatial Patterns of Ambient Air Pollution and Avoidable Hospitalizations for Community-Acquired Pneumonia in Mexico (2013–2020)</title><link>https://jameswil.com/publications/hernandez-nava2026/</link><guid isPermaLink="true">https://jameswil.com/publications/hernandez-nava2026/</guid><description>Ambient air pollution significantly contributes to respiratory illnesses, yet little is known about how industrial emissions are linked to preventable hospitalizations across atmospheric basins in middle-income countries. This study develops a basin-based geo-matics framework to examine the spatial and temporal relationship between industrial pollutants and age- and sex-adjusted avoidable hospitalizations for community-acquired pneumonia (PQI 11) in Mexico from 2013 to 2020. Using state-level data grouped into eight macro-regions, we combine bivariate choropleth maps, Pearson correlations, linear regression, and longitudinal time-series analysis to identify spatial clusters of high risk and to estimate regional sensitivities to changes in PM2.5, SO2, NOx, and volatile organic compound emissions. The findings reveal notable regional differences: northern border states and the Mexico City metropolitan basin form persistent high–high clusters where elevated emissions coincide with high PQI 11 rates, while coastal and peninsular regions show lower hospitalization burdens despite medium emission levels. Although national industrial PM2.5 emissions decreased over the study period, several macro-regions—particularly CDMX_Edomex, Centro, and Centro Norte—experienced significant increases in avoidable hospitalizations and decoupled emission–health patterns. Correlation matrices and regression slopes suggest that the strength and even direction of links between pollutants and PQI 11 vary across macro-regions, with emission-responsive patterns in Centro Norte and weak or inverse relationships in Peninsula and Pacifico Sur. These findings demonstrate that national averages obscure critical spatial disparities and highlight the value of basin-based geomatics approaches for regional air-quality governance, spatial decision support, and primary-care planning aimed at reducing preventable respiratory hospitalizations.</description><pubDate>Thu, 01 Jan 2026 00:00:00 GMT</pubDate><category>Publication</category><category>Preprint</category><category>Air Pollution</category><category>Pneumonia</category><category>Hospitalizations</category><category>Mexico</category><category>Spatial Analysis</category><category>Public Health</category></item><item><title>Geospatial Experience-Oriented Notation (GEON): A Semantic Format for LLM-Native Spatial Intelligence</title><link>https://jameswil.com/publications/williams2026-geon/</link><guid isPermaLink="true">https://jameswil.com/publications/williams2026-geon/</guid><description>Existing geospatial data formats such as GeoJSON, Well-Known Text (WKT), and CityGML, are optimised for geometric computation and rendering. While effective for Geographic Information Systems (GIS), these approaches present limitations when used with Large Language Models (LLMs). For example, coordinate arrays carry no inherent semantic meaning, spatial relationships require computational geometry to extract, and the human experience of place is usually absent. This manuscript introduces foundational work on Geospatial Experience-Oriented Notation (GEON), a text-based format that bridges machine-optimised geospatial data and human-readable spatial descriptors. GEON encodes identity, geometry, purpose, experiential qualities, spatial relationships, temporal patterns, and data provenance in a readable and structured syntax designed for human comprehension and LLM reasoning. This manuscript presents the initial specification, reference implementations in Python, Rust, and JavaScript, and an empirical evaluation demonstrating how GEON achieves 20% fewer tokens than equivalent GeoJSON files, while encoding 31% more semantic facts per token. This manuscript explores the implementation and how LLMs reason about place-making, urban design interventions, and spatial intelligence tasks that existing formats struggle to support.</description><pubDate>Thu, 01 Jan 2026 00:00:00 GMT</pubDate><category>Publication</category><category>Preprint</category><category>Geospatial Data</category><category>Large Language Models</category><category>Spatial Intelligence</category><category>Place-Based Computing</category><category>Semantic Representation</category><category>Urban Computing</category></item><item><title>AnythingPOI - Australia POI Dataset v0.1</title><link>https://jameswil.com/publications/anything-poi-australia2026/</link><guid isPermaLink="true">https://jameswil.com/publications/anything-poi-australia2026/</guid><description>A unified, open point-of-interest (POI) dataset for Australia containing 1,735,980 POIs produced by the AnythingPOI pipeline, which fuses OpenStreetMap and Overture Maps Foundation data using H3-indexed spatial conflation, Jaro-Winkler name matching, and multi-signal confidence scoring. Source breakdown: OSM-only: 320,149 (18.4%) — from OpenStreetMap contributors (ODbL 1.0) Overture-only: 1,364,195 (78.6%) — from Overture Maps Foundation (CDLA-Permissive-2.0) Conflated (both sources matched): 51,636 (3.0%) Top categories: Professional &amp; Business, Retail, Food &amp; Beverage, Transportation, Healthcare. Full taxonomy: 18 Tier-1 categories, 196 Tier-2 subcategories. Contents: GeoParquet files (one per Tier-1 category), PMTiles v3 for interactive map visualisation, and coverage statistics CSVs. Each POI carries a confidence_score (0.01–0.99) reflecting the strength of the conflation evidence across spatial, name, website, phone, postcode, and Wikidata signals. Attribution: This dataset contains information from OpenStreetMap (© OpenStreetMap contributors, ODbL 1.0 — openstreetmap.org/copyright) and Overture Maps Foundation (CDLA-Permissive-2.0 — overturemaps.org). License: Open Database License (ODbL) 1.0. Any public use of this database or works produced from it must include the above attribution. Derivative databases must also be released under ODbL.</description><pubDate>Thu, 01 Jan 2026 00:00:00 GMT</pubDate><category>Publication</category><category>Dataset</category></item><item><title>AnythingPOI - Canada POI Dataset v0.1</title><link>https://jameswil.com/publications/anything-poi-canada2026/</link><guid isPermaLink="true">https://jameswil.com/publications/anything-poi-canada2026/</guid><description>A unified, open point-of-interest (POI) dataset for Canada containing 5,565,256 POIs produced by the AnythingPOI pipeline, which fuses OpenStreetMap and Overture Maps Foundation data using H3-indexed spatial conflation, Jaro-Winkler name matching, and multi-signal confidence scoring. Source breakdown: OSM-only: 451,872 (8.1%) — from OpenStreetMap contributors (ODbL 1.0) Overture-only: 5,037,979 (90.5%) — from Overture Maps Foundation (CDLA-Permissive-2.0) Conflated (both sources matched): 75,405 (1.4%) Top categories: Professional &amp; Business, Retail, Food &amp; Beverage, Healthcare, Services. Full taxonomy: 18 Tier-1 categories, 196 Tier-2 subcategories. Contents: GeoParquet files (one per Tier-1 category), PMTiles v3 for interactive map visualisation, and coverage statistics CSVs. Each POI carries a confidence_score (0.01–0.99) reflecting the strength of the conflation evidence across spatial, name, website, phone, postcode, and Wikidata signals. Attribution: This dataset contains information from OpenStreetMap (© OpenStreetMap contributors, ODbL 1.0 — openstreetmap.org/copyright) and Overture Maps Foundation (CDLA-Permissive-2.0 — overturemaps.org). License: Open Database License (ODbL) 1.0. Any public use of this database or works produced from it must include the above attribution. Derivative databases must also be released under ODbL.</description><pubDate>Thu, 01 Jan 2026 00:00:00 GMT</pubDate><category>Publication</category><category>Dataset</category></item><item><title>AnythingPOI - Germany POI Dataset v0.1</title><link>https://jameswil.com/publications/anything-poi-germany2026/</link><guid isPermaLink="true">https://jameswil.com/publications/anything-poi-germany2026/</guid><description>A unified, open point-of-interest (POI) dataset for Germany containing 6,763,796 POIs produced by the AnythingPOI pipeline, which fuses OpenStreetMap and Overture Maps Foundation data using H3-indexed spatial conflation, Jaro-Winkler name matching, and multi-signal confidence scoring. Source breakdown: OSM-only: 2,420,344 (35.8%) — from OpenStreetMap contributors (ODbL 1.0) Overture-only: 4,129,920 (61.1%) — from Overture Maps Foundation (CDLA-Permissive-2.0) Conflated (both sources matched): 213,532 (3.2%) Top categories: Professional &amp; Business, Transportation, Retail, Food &amp; Beverage, Other / Uncategorized. Full taxonomy: 18 Tier-1 categories, 196 Tier-2 subcategories. Contents: GeoParquet files (one per Tier-1 category), PMTiles v3 for interactive map visualisation, and coverage statistics CSVs. Each POI carries a confidence_score (0.01–0.99) reflecting the strength of the conflation evidence across spatial, name, website, phone, postcode, and Wikidata signals. Attribution: This dataset contains information from OpenStreetMap (© OpenStreetMap contributors, ODbL 1.0 — openstreetmap.org/copyright) and Overture Maps Foundation (CDLA-Permissive-2.0 — overturemaps.org). License: Open Database License (ODbL) 1.0. Any public use of this database or works produced from it must include the above attribution. Derivative databases must also be released under ODbL.</description><pubDate>Thu, 01 Jan 2026 00:00:00 GMT</pubDate><category>Publication</category><category>Dataset</category></item><item><title>AnythingPOI - Netherlands POI Dataset v0.1</title><link>https://jameswil.com/publications/anything-poi-netherlands2026/</link><guid isPermaLink="true">https://jameswil.com/publications/anything-poi-netherlands2026/</guid><description>A unified, open point-of-interest (POI) dataset for Netherlands containing 1,782,538 POIs produced by the AnythingPOI pipeline, which fuses OpenStreetMap and Overture Maps Foundation data using H3-indexed spatial conflation, Jaro-Winkler name matching, and multi-signal confidence scoring. Source breakdown: OSM-only: 280,707 (15.7%) — from OpenStreetMap contributors (ODbL 1.0) Overture-only: 1,451,063 (81.4%) — from Overture Maps Foundation (CDLA-Permissive-2.0) Conflated (both sources matched): 50,768 (2.8%) Top categories: Professional &amp; Business, Retail, Food &amp; Beverage, Services, Healthcare. Full taxonomy: 18 Tier-1 categories, 196 Tier-2 subcategories. Contents: GeoParquet files (one per Tier-1 category), PMTiles v3 for interactive map visualisation, and coverage statistics CSVs. Each POI carries a confidence_score (0.01–0.99) reflecting the strength of the conflation evidence across spatial, name, website, phone, postcode, and Wikidata signals. Attribution: This dataset contains information from OpenStreetMap (© OpenStreetMap contributors, ODbL 1.0 — openstreetmap.org/copyright) and Overture Maps Foundation (CDLA-Permissive-2.0 — overturemaps.org). License: Open Database License (ODbL) 1.0. Any public use of this database or works produced from it must include the above attribution. Derivative databases must also be released under ODbL.</description><pubDate>Thu, 01 Jan 2026 00:00:00 GMT</pubDate><category>Publication</category><category>Dataset</category></item><item><title>AnythingPOI - Türkiye POI Dataset v0.1</title><link>https://jameswil.com/publications/anything-poi-turkiye2026/</link><guid isPermaLink="true">https://jameswil.com/publications/anything-poi-turkiye2026/</guid><description>A unified, open point-of-interest (POI) dataset for Türkiye containing 2,201,304 POIs produced by the AnythingPOI pipeline, which fuses OpenStreetMap and Overture Maps Foundation data using H3-indexed spatial conflation, Jaro-Winkler name matching, and multi-signal confidence scoring. Source breakdown: OSM-only: 306,263 (13.9%) — from OpenStreetMap contributors (ODbL 1.0) Overture-only: 1,864,146 (84.7%) — from Overture Maps Foundation (CDLA-Permissive-2.0) Conflated (both sources matched): 30,895 (1.4%) Top categories: Retail, Professional &amp; Business, Food &amp; Beverage, Services, Community. Full taxonomy: 18 Tier-1 categories, 196 Tier-2 subcategories. Contents: GeoParquet files (one per Tier-1 category), PMTiles v3 for interactive map visualisation, and coverage statistics CSVs. Each POI carries a confidence_score (0.01–0.99) reflecting the strength of the conflation evidence across spatial, name, website, phone, postcode, and Wikidata signals. Attribution: This dataset contains information from OpenStreetMap (© OpenStreetMap contributors, ODbL 1.0 — openstreetmap.org/copyright) and Overture Maps Foundation (CDLA-Permissive-2.0 — overturemaps.org). License: Open Database License (ODbL) 1.0. Any public use of this database or works produced from it must include the above attribution. Derivative databases must also be released under ODbL.</description><pubDate>Thu, 01 Jan 2026 00:00:00 GMT</pubDate><category>Publication</category><category>Dataset</category></item><item><title>AnythingPOI - United Kingdom POI Dataset v0.1</title><link>https://jameswil.com/publications/anything-poi-uk2026/</link><guid isPermaLink="true">https://jameswil.com/publications/anything-poi-uk2026/</guid><description>A unified, open point-of-interest (POI) dataset for United Kingdom containing 4,622,174 POIs produced by the AnythingPOI pipeline, which fuses OpenStreetMap and Overture Maps Foundation data using H3-indexed spatial conflation, Jaro-Winkler name matching, and multi-signal confidence scoring. Source breakdown: OSM-only: 947,908 (20.5%) — from OpenStreetMap contributors (ODbL 1.0) Overture-only: 3,551,749 (76.8%) — from Overture Maps Foundation (CDLA-Permissive-2.0) Conflated (both sources matched): 122,517 (2.7%) Top categories: Professional &amp; Business, Retail, Food &amp; Beverage, Other / Uncategorized, Transportation. Full taxonomy: 18 Tier-1 categories, 196 Tier-2 subcategories. Contents: GeoParquet files (one per Tier-1 category), PMTiles v3 for interactive map visualisation, and coverage statistics CSVs. Each POI carries a confidence_score (0.01–0.99) reflecting the strength of the conflation evidence across spatial, name, website, phone, postcode, and Wikidata signals. Attribution: This dataset contains information from OpenStreetMap (© OpenStreetMap contributors, ODbL 1.0 — openstreetmap.org/copyright) and Overture Maps Foundation (CDLA-Permissive-2.0 — overturemaps.org). License: Open Database License (ODbL) 1.0. Any public use of this database or works produced from it must include the above attribution. Derivative databases must also be released under ODbL.</description><pubDate>Thu, 01 Jan 2026 00:00:00 GMT</pubDate><category>Publication</category><category>Dataset</category></item><item><title>A Framework for Curating Personalised Leisure Walking Experiences</title><link>https://jameswil.com/publications/williams2025-thesis/</link><guid isPermaLink="true">https://jameswil.com/publications/williams2025-thesis/</guid><description>How can a richer understanding of the leisure walking experience be used to support the curation of personalised route recommendations? Leisure walking is a personal and subjective experience that encompasses a range of multi-faceted expectations and narratives, this can include visiting points of interests, connecting with the environment, or engaging with the social fabric of places. The broad and disparate scope of these reasons and interests makes the process of recommending new and personalised leisure walking experiences difficult. Existing research exploring the recommendation of leisure walking experiences is often based on broad assumptions about walkers with little representation of subjective or contextual detail. Prior work in leisure walking fails to address the wide array of reasons for leisure walking and in turn representing these in personalised walking experiences. Based on the lack of personalisation of leisure walking experiences, this thesis investigates leisure walking from a user-centred perspective. Three grounded theory studies are conducted to understand leisure walking, capturing details on (1) leisure walking behaviours through a behaviour survey, (2) practitioner knowledge of the subject area through interviews with professionals, and (3) a rich understanding of the leisure walking experience through a think-aloud study. Grounded theory is used in this thesis to address the broad assumptions about walking, developing a theoretical understanding of leisure walking grounded in empirical studies. Using this grounded theory of leisure walking behaviours, professional perspectives, and walkers in-situ experiences, a framework is designed to support the curation of personalised leisure walking experiences. The framework represents the research related to three tasks of leisure walking: planning, doing, and reflecting. Using this understanding a demonstrator tool for curating personalised leisure walking experiences is designed based on forty-nine properties and considerations formed from the grounded theory. A think-aloud and in-depth interview study is conducted to evaluate the role of the tool in supporting the curation of personalised experiences based on the participants local knowledge of an area. The qualitative evaluation found that the system is able perform well in terms of matching local knowledge and supporting the curation of new experiences, often recommending routes that can either be explained by the participant or which match expectations. The thesis closes with a discussion on future opportunities for leisure walking technology, providing design considerations for supporting personalised leisure walking experiences.</description><pubDate>Wed, 01 Jan 2025 00:00:00 GMT</pubDate><category>Publication</category><category>Thesis</category><category>Leisure Walking</category><category>Route Recommendation</category><category>Personalisation</category><category>Mobile Geospatial Computing</category><category>Geospatial Computer Science</category></item><item><title>Diabetes Disparities in Mexico: A Spatio-Temporal and Marginalization Index Analysis</title><link>https://jameswil.com/publications/hernandez-nava2025-diabetes/</link><guid isPermaLink="true">https://jameswil.com/publications/hernandez-nava2025-diabetes/</guid><description>Understanding the geospatial and temporal distribution of diabetes mellitus in Mexico can be an essential tool in supporting vulnerable populations and addressing health inequalities. This article presents a spatio-temporal investigation of patients aged 18 years and older with diabetes mellitus in Mexico, associated with geographical area and a temporal range from 2005 to 2022. This approach includes calculating diabetes-related hospitalizations and deaths and its association with the margination index segmented into eight geographical areas of Mexico. Furthermore, this research stratifies based upon age group and type of medical institute of the health services in Mexico. The main contribution of this research is to explore the relationship between diabetes-related hospitalizations, deaths, geographical area, age, sex, and margination index of populations to support preventive action. The results highlight that adults between the ages of 45 and 64 years old who live in areas with a high margination index have a greater likelihood of suffering complications related to diabetes. The age-adjusted rate of DRAH shows that the Peninsula has the highest values among geographical areas. Research will now continue to explore mapping interventions to specific states and external datasets, to further extrapolate the results of the analysis.</description><pubDate>Wed, 01 Jan 2025 00:00:00 GMT</pubDate><category>Publication</category><category>Conference paper</category><category>Diabetes</category><category>Health Disparities</category><category>Spatial Analysis</category><category>Mexico</category><category>Marginalization Index</category><category>Public Health</category></item><item><title>PlaceAgents: Multi-Stop Pedestrian Itineraries as Platial Flows on Urban Networks</title><link>https://jameswil.com/publications/williams2025-place-agents/</link><guid isPermaLink="true">https://jameswil.com/publications/williams2025-place-agents/</guid><description>This article presents PlaceAgents, a framework for modelling multi-stop pedestrian itineraries on city networks using open and reproducible data. The approach uses the itinerary as the base behavioural unit and links three core principles: (1) access to open data sources, (2) enabling explicit assumptions about agents, and (3) the auditability of outputs.</description><pubDate>Wed, 01 Jan 2025 00:00:00 GMT</pubDate><category>Publication</category><category>Conference paper</category><category>Pedestrian Modelling</category><category>Agent-Based Modelling</category><category>Urban Networks</category><category>Platial Information</category><category>Spatial Data Science</category></item><item><title>PlaceCrafter: Curating Urban Functional Regions through Platial Clustering of OpenStreetMap Points of Interest</title><link>https://jameswil.com/publications/williams2025-place-crafter/</link><guid isPermaLink="true">https://jameswil.com/publications/williams2025-place-crafter/</guid><description>The world is not just made of streets, buildings, and zones; it is shaped by how people engage and interact with places in their everyday lives. This manuscript presents a web-based geospatial tool that enables the mapping of these lived places and locales named PlaceCrafter. PlaceCrafter supports researchers in identifying platial regions: functional, human-centred areas that cross administrative and formal boundaries. The framework is built on OpenStreetMap, combining (near) real-time clustering, analysis, and statistical validation of these platial regions. PlaceCrafter is an initial demonstration for exploring the subjective experiences of place through existing datasets and city structures.</description><pubDate>Wed, 01 Jan 2025 00:00:00 GMT</pubDate><category>Publication</category><category>Conference paper</category><category>Platial Information</category><category>OpenStreetMap</category><category>Geographic Information Systems</category><category>Clustering</category><category>Urban Planning</category><category>Place-based Computing</category></item><item><title>Towards a Framework for Personalising Leisure Walking Route Recommendations</title><link>https://jameswil.com/publications/williams2024/</link><guid isPermaLink="true">https://jameswil.com/publications/williams2024/</guid><description>This research investigates how a greater understanding of leisure walking can be used to support the personalisation and curation of new leisure walking experiences. Existing solutions are often limited in the range of routing properties a user has access to. The purpose of this research is to explore a richer understanding of how, what, why, and where leisure walkers engage with walks. Through a grounded theory approach combining a walking behaviour survey, a think-aloud study, and an expert interview study, a framework for personalising leisure walking route recommendations has been designed. The remaining work includes finalising the development of a web-based GIS demonstrator system for curating personalised routes and conducting an evaluation of this approach.</description><pubDate>Mon, 01 Jan 2024 00:00:00 GMT</pubDate><category>Publication</category><category>Conference paper</category><category>Leisure Walking</category><category>Route Recommendation</category><category>Mobile Geospatial Computing</category><category>Place-Based Information</category></item><item><title>Emerging Platial Narratives and Themes from a Leisure Walking Study</title><link>https://jameswil.com/publications/williams2023b/</link><guid isPermaLink="true">https://jameswil.com/publications/williams2023b/</guid><description>This article presents the preliminary results of a think-aloud leisure walking study, identifying the key themes and platial narratives. A think-aloud study was conducted to explore what and how leisure walkers engaged with while walking. Our emerging results are presented in the context of an approach to extracting and understanding the platial experience during the study. The early findings suggest that the types of places engaged with while walking and the characteristics of these places are varied, while navigation and wayfinding have an impact on the selected route and the changes that occur during the walk. Our future work will now focus on further analysing these results and using them to improve the recommendation of leisure walking routes.</description><pubDate>Sun, 01 Jan 2023 00:00:00 GMT</pubDate><category>Publication</category><category>Conference paper</category><category>Leisure Walking</category><category>Platial Information</category><category>Think-aloud Study</category><category>Route Recommendation</category><category>Mobile Geospatial Computing</category></item><item><title>Survey of leisure walking behaviours and activity tracking use</title><link>https://jameswil.com/publications/williams-coordinates/</link><guid isPermaLink="true">https://jameswil.com/publications/williams-coordinates/</guid><description>Williams, J., Pinchin, J., Hazzard, A. &amp; Priestnall, G. (2023). Survey of leisure walking behaviours and activity tracking use. Coordinates Magazine, 13-15. Coordinates.</description><pubDate>Sun, 01 Jan 2023 00:00:00 GMT</pubDate><category>Publication</category><category>Journal article</category><category>Navigation</category><category>Mobile Activity Tracking</category><category>Walking Behaviour</category><category>Mobile Geospatial Computing</category></item><item><title>WalkGIS: Exploring Platial Analysis of Leisure Walks via Linked Video Narratives</title><link>https://jameswil.com/publications/williams2023/</link><guid isPermaLink="true">https://jameswil.com/publications/williams2023/</guid><description>Extracting rich contextual information from study participants presents an interesting challenge when the expected results are uncertain. This article presents the design of a contextual geographic information system (GIS) to extract platial information from a multimodal data set (audio, video, and GPS) collected during a ‘think-aloud’ leisure walking study. WalkGIS enables transcriptions, labelling, and platial analysis to be performed within one system, with data being linked and coordinated to form linked video narratives.</description><pubDate>Sun, 01 Jan 2023 00:00:00 GMT</pubDate><category>Publication</category><category>Conference paper</category><category>Visual Analytics</category><category>Leisure Walking</category><category>Platial Information</category><category>Geographic Information Systems</category><category>Spatial Video Narratives</category></item><item><title>An Emerging Conceptual Model for Curating Engaging Leisure Walking Recommendations</title><link>https://jameswil.com/publications/williams2022b/</link><guid isPermaLink="true">https://jameswil.com/publications/williams2022b/</guid><description>Providing routes to leisure walkers requires alternative recommendation scenarios to those used in tourism routing systems. In this paper, we present an emerging conceptual model of three scenarios for curating leisure walking route recommendations. Our recommendation scenarios consider the highest ranked similar walks, routes for new application users, and a progressively changing route recommendation scenario. Conceptual models for these scenarios are presented and the challenges in completing this research are considered. Feedback received on these early conceptual models will be used to further design a recommendation framework for curating engaging leisure walking experiences.</description><pubDate>Sat, 01 Jan 2022 00:00:00 GMT</pubDate><category>Publication</category><category>Conference paper</category><category>Leisure Walking</category><category>Location Based Services</category><category>Route Recommendation</category><category>Mobile Geospatial Computing</category></item><item><title>Context for Leisure Walking Routes: A Vision for a Spatial-Platial Approach</title><link>https://jameswil.com/publications/williams2022/</link><guid isPermaLink="true">https://jameswil.com/publications/williams2022/</guid><description>Providing recommendations for interesting and engaging leisure walking routes is a complex problem due to the subjective and personal nature of the activity. Existing work has often focused on recommending the quickest or most popular walks. However, these routes often lack detail on the contextual and experiential factors of walks and do not attempt to match the requirements with those of users. This article presents a vision of how more contextual detail can be applied to walking routes. We consider how existing analysis and spatial data mining techniques, including real-time clustering, viewshed analysis, and colocation patterns, could be used to extend a place-based understanding of leisure walking routes. By using spatial methods to extrapolate a rich platial understanding of the locations of a walk, the proposed methods in this article will support an emerging framework for curating engaging leisure walking experiences, recommending routes beyond those of the quickest or the most popular.</description><pubDate>Sat, 01 Jan 2022 00:00:00 GMT</pubDate><category>Publication</category><category>Conference paper</category><category>Leisure Walking</category><category>Fuzzy Geospatial Data</category><category>Route Recommendations</category><category>Platial Information</category></item><item><title>CrowdTracing: Overcrowding Clustering and Detection System for Social Distancing</title><link>https://jameswil.com/publications/kanjo2021/</link><guid isPermaLink="true">https://jameswil.com/publications/kanjo2021/</guid><description>Kanjo, E., Anderez, D. O., Anwar, A., Al Shami, A. &amp; Williams, J. (2021). CrowdTracing: Overcrowding Clustering and Detection System for Social Distancing. 2021 IEEE International Smart Cities Conference (ISC2), 1-7. https://doi.org/10.1109/ISC253183.2021.9562914</description><pubDate>Fri, 01 Jan 2021 00:00:00 GMT</pubDate><category>Publication</category><category>Conference paper</category><category>COVID-19</category><category>Ubiquitous Computing</category><category>Wireless Probe Requests</category><category>Mobile Sensing</category><category>Clustering</category><category>People Count</category><category>DBSCAN</category><category>SOM</category></item><item><title>Survey of Leisure Walking Behaviours and Activity Tracking Use: Emerging Themes and Design Considerations</title><link>https://jameswil.com/publications/williams2021/</link><guid isPermaLink="true">https://jameswil.com/publications/williams2021/</guid><description>In this paper we present a work in progress analysis of a leisure walking behaviour survey that focuses on walkers&apos; habits and experiences. We are specifically interested in the use of mobile tracking applications in this context to help design and deploy future technologies that can better support engaging leisure walks through synthesising previous behaviours and experiences. This survey collected 329 responses relating to self-reported walking behaviour patterns and mobile activity tracker use. In the emerging analysis we identified design considerations for future walking-focused applications, emphasizing the subjective and personal nature of walking routes.</description><pubDate>Fri, 01 Jan 2021 00:00:00 GMT</pubDate><category>Publication</category><category>Conference paper</category><category>Mobile Activity Tracking</category><category>Walking Behaviour</category><category>Mobile Geospatial Computing</category></item><item><title>FinVis: Visualizing the Complex Nature of Financial Markets</title><link>https://jameswil.com/publications/williams-thesis2020/</link><guid isPermaLink="true">https://jameswil.com/publications/williams-thesis2020/</guid><description>Investors are constantly looking for insights through comparisons on stock market data to assist in the discovery of well-priced stocks. Modern stock market applications and research allow for a range of visualizations to be produced whilst enabling the viewing of complete datasets, however, these tools are often split, not providing queries and analysis in the same view, therefore, limiting the potential of the proposed solution. Within this thesis, a new system for performing analysis and comparison is proposed, a web-based application which is able to assist in the exploratory visual analysis and visualization generation of financial data. FinVis allows for over 500 stocks to be queried and 10,000 to be imported, before displaying interactive and customizable visualizations to assist in the discovery of bargains or good investments on the market. The application includes tools to save, store and load queries alongside a visual analytic display to enable customization and more complex individual views to be generated. A complete set of interactions are also provided to the user, whilst enabling all of this exploration to take place with real-time and historical data being provided through a financial API to the user’s web browser. The thesis enables future work within the area of exploratory financial visualization to take place, providing core concepts in a comparative nature to potential researchers and investors alike.</description><pubDate>Wed, 01 Jan 2020 00:00:00 GMT</pubDate><category>Publication</category><category>Thesis</category><category>Financial Visualization</category><category>Visual Analysis</category><category>Information Visualization</category><category>Financial Data</category><category>Stock Markets</category><category>Finance Analytics</category></item></channel></rss>