Writing
Blog &
Writing.
Technical writing on GeoAI, spatial data science, open-source tools, and geospatial research.
H3 Hierarchy and Compaction: Multi-Resolution Spatial Analysis
Learn how H3's hierarchical structure enables multi-resolution analysis, how parent-child relationships work across resolution levels, and how the compactCells and uncompactCells functions reduce redundant spatial representations. Includes interactive browser demos and practical code examples.
Archive
All Posts
H3 Catchment Analysis: Modelling Service Areas with Hexagonal Grids
Use H3's k-ring and grid distance functions to build precise spatial buffers and accessibility zones
Traditional circular buffers distort space and ignore real-world geometry. H3's hexagonal rings give you scale-consistent spatial catchments that work the same way across the entire Earth's surface.
Read more
H3 Density Mapping: Visualising Urban Point Data as Hexagonal Heatmaps
Transform scattered coordinates into meaningful density patterns using H3's spatial aggregation
Raw GPS coordinates are noisy, overwhelming, and hard to interpret at scale. H3's hexagonal grid transforms thousands of points into clear, legible density maps — and the core aggregation logic fits in under ten lines.
Read more
What Do Large Language Models Know About Place?
LLMs encode an implicit geography of human experience — and understanding its limits matters for anyone building location-aware AI applications
When you ask an LLM to describe Nottingham, it does not retrieve a database record. It draws on a statistical distillation of everything written about Nottingham by people who have been there, lived there, passed through, or read about it. That is an unusual kind of geographical knowledge — rich, associative, and deeply human, but also skewed, incomplete, and geographically uneven.
Read more
Streaming LLM API Responses in Python: A Complete Production Guide
Handle token-by-token output, implement back-pressure, manage rate limits, and build fault-tolerant wrappers around OpenAI-compatible APIs
Streaming is the difference between an AI product that feels fast and one that feels slow. Instead of waiting 10–30 seconds for a completed response, a streaming API delivers each token as it is generated. This post covers the full picture: HTTP server-sent events, Python async generators, rate limit handling, and building a robust wrapper you can drop into a production application.
Read more
How to Use Rust and WebAssembly for Real-Time Data Processing in the Browser
Compile performance-critical Rust logic to WASM and run it at near-native speed inside any modern web browser — no server round-trip, no bottleneck
WebAssembly finally makes it practical to run genuinely fast computation inside a browser tab. When you combine it with Rust — a language designed around zero-cost abstractions and memory safety — you get a pipeline that can process tens of thousands of records per frame without blocking the UI thread. This post walks through the full workflow: writing the Rust crate, compiling to WASM, and wiring it into a JavaScript frontend.
Read more
Building High-Throughput Spatial Pipelines with Go Concurrency
Using goroutines, channels, and context cancellation to process millions of geospatial records in parallel
Go's concurrency primitives are among the most ergonomic in any systems language. This post shows how to put goroutines and channels to work on a real problem: processing large spatial datasets at speed.
Read more
Self-Hosted Vector Tiles with PMTiles and MapLibre GL JS
Serve a fully interactive web map from a single static file — no tile server, no backend, no infrastructure
Vector tiles have become the standard for interactive web mapping, but running a tile server has always been the barrier to entry. PMTiles changes this: it is a single-file archive format that lets browsers fetch individual tiles via HTTP range requests, turning any static host — S3, GitHub Pages, a CDN — into a tile server.
Read more
Location-Aware Search with Elasticsearch Geo Queries
Combining full-text relevance with geo_distance, bounding box filtering, and spatial decay scoring
Elasticsearch's geospatial capabilities let you ask questions that pure text search cannot answer: not just 'find documents about coffee' but 'find the most relevant coffee shop within 500 metres of where I am standing, weighted by recency and rating'. This post walks through how to build that kind of query from first principles.
Read more