<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/"><channel><title>Christian Beiwinkel</title><link>https://bwnkl.de/</link><description>Recent content on Christian Beiwinkel</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Mon, 21 Sep 2026 16:09:45 +0200</lastBuildDate><atom:link href="https://bwnkl.de/index.xml" rel="self" type="application/rss+xml"/><item><title>Fast dynamic area exclusion in Valhalla</title><link>https://bwnkl.de/posts/valhalla-exclude-polygons-rtree/</link><pubDate>Mon, 21 Sep 2026 16:09:45 +0200</pubDate><guid>https://bwnkl.de/posts/valhalla-exclude-polygons-rtree/</guid><description>&lt;p&gt;&lt;img src="https://bwnkl.de/images/polygons_5.png" alt=""&gt;&lt;/p&gt;&lt;p&gt;One of the big pros of Valhalla is that it lets you tweak requests at runtime, without needing to rebuild the entire graph from scratch. In Valhalla, we call this philosophy dynamic costing, and it lets us do a lot of cool things. One such thing that Valhalla has been capable of for some time is to let the user pass a list of polygons and avoid the edges intersecting with these in path finding. In this blog post, I want to show you how we have recently significantly sped this avoiding mechanism up so that you can now avoid areas large in size, number, or complexity.&lt;/p&gt;</description><media:content url="https://bwnkl.de/images/polygons_5.png" medium="image"/></item><item><title>Valhalla's spatial index just got an update</title><link>https://bwnkl.de/posts/valhalla-bounding-circles/</link><pubDate>Sat, 04 Jul 2026 11:27:12 +0100</pubDate><guid>https://bwnkl.de/posts/valhalla-bounding-circles/</guid><description>&lt;p&gt;&lt;img src="https://bwnkl.de/images/circles_34.png" alt=""&gt;&lt;/p&gt;&lt;p&gt;The good thing about joining an open source project is that you don&amp;rsquo;t have to start from scratch. The bad thing about it is that you &lt;em&gt;can&amp;rsquo;t&lt;/em&gt; start from scratch: often, you are limited by what&amp;rsquo;s been done already. But those limits can also present great opportunities to work on unique problems that require unique solutions.&lt;/p&gt;&#10;&lt;p&gt;In this post, I want to write about my endeavor to speed up &lt;a href="https://github.com/valhalla/valhalla/"&gt;Valhalla&lt;/a&gt;&amp;rsquo;s spatial search by improving the spatial index on its graph edges. This started as a conversation I had with &lt;a href="https://github.com/kevinkreiser/"&gt;Kevin Kreiser&lt;/a&gt; about two years ago, about making Valhalla&amp;rsquo;s path finding around excluded areas faster. He said he&amp;rsquo;d had an idea for an improved spatial index a while ago, with the goal to speed up the location search, and so I was immediately hooked.&lt;/p&gt;</description><media:content url="https://bwnkl.de/images/circles_34.png" medium="image"/></item><item><title>Test driving cista's serializable hash map</title><link>https://bwnkl.de/posts/gers-mapping-using-cista/</link><pubDate>Mon, 11 May 2026 11:14:52 +0200</pubDate><guid>https://bwnkl.de/posts/gers-mapping-using-cista/</guid><description>&lt;p&gt;I have been frequently running into the same problem where I need to produce a large, static mapping once, and then read it many times. Take my Valhalla live traffic implementation for example: TomTom started offering a new location referencing method with their Orbis product last year, where instead of sending OpenLR messages, they provide GERS or OSM identifiers along with start and end offsets in meters and a direction, for which you can then lookup affected edges in your road network (read more about it in &lt;a href="https://developer.tomtom.com/intermediate-traffic-service/documentation/tomtom-orbis-maps/service/tomtom-traffic-flow-intermediate-service-protobuf#identifier-based-location-referencing-using-gers-ids"&gt;TomTom&amp;rsquo;s docs&lt;/a&gt;). This is great, because OpenLR is just unnecessary overhead if the producer and consumer of a traffic API are using the same road network under the hood. However, this mapping of &lt;code&gt;GERS ID -&amp;gt; [...valhalla_edges]&lt;/code&gt; is not trivial to construct because it involves sorting the valhalla edges topologically to correctly identify affected edges given the start and end offsets, and because we&amp;rsquo;re talking about tens of millions of unique GERS identifiers for a whole continent.&lt;/p&gt;</description></item><item><title>The Ultimate Guide to Traffic in Valhalla – Part 1: Historical Traffic</title><link>https://bwnkl.de/posts/valhalla-historical-traffic/</link><pubDate>Tue, 16 Sep 2025 12:25:15 +0200</pubDate><guid>https://bwnkl.de/posts/valhalla-historical-traffic/</guid><description>&lt;p&gt;Valhalla is one one of the few Open Source Routing engines with first class support for historical and live traffic, as well as incidents. The key difficulty with supporting these, is that there is no unified standard in how this information is provided: every vendor offers products differently and so Valhalla&amp;rsquo;s approach is to facilitate this functionality in a way that is vendor independent: no matter where your data comes from and how it looks like, you should be able to feed it into Valhalla given the interfaces provided. Using these interfaces correctly though requires some knowledge around some Valhalla lingo, especially around its tiled structure and edge and tile identifiers. This can make the developer experience quite tedious. That&amp;rsquo;s why the public repo has been bombarded with questions about traffic ingestion, and that&amp;rsquo;s why, after working with many organisations on these topics, I&amp;rsquo;ve decided to write down some of my experience in a series of articles. There are some small examples and code snippets scattered around GitHub, but I feel like a solid walk through is in order to try to explain the steps necessary to get any traffic data into Valhalla.&lt;/p&gt;</description></item><item><title>Public GTFS Enriched Valhalla Test Server for Cologne</title><link>https://bwnkl.de/posts/gtfs-test-server/</link><pubDate>Sat, 15 Feb 2025 07:48:33 +0100</pubDate><guid>https://bwnkl.de/posts/gtfs-test-server/</guid><description>&lt;p&gt;I have spun up a little test server available to the public to showcase Valhalla&amp;rsquo;s transit&#10;routing capabilities.&#10;Part of the motivation is to lower the barrier for users to try Valhalla&amp;rsquo;s multimodal routing, since&#10;I&amp;rsquo;ve recently seen many people struggling with getting a GTFS enabled service off the ground.&lt;/p&gt;&#10;&lt;p&gt;It includes the city of Cologne/Germany (and most of Bonn as well) and the publicly available GTFS&#10;feed from the VRS, which should include all of the KVB&amp;rsquo;s transit.&lt;/p&gt;</description></item><item><title>Indoor Routing with Valhalla</title><link>https://bwnkl.de/posts/indoor-routing/</link><pubDate>Wed, 12 Feb 2025 10:04:00 +0100</pubDate><guid>https://bwnkl.de/posts/indoor-routing/</guid><description>&lt;p&gt;I have recently done some work on Valhalla&amp;rsquo;s indoor routing capabilities. There was basic support for it,&#10;but many things weren&amp;rsquo;t working as expected. I believe I was able to improve some aspects, yet there are&#10;still loose ends. This blog post is my attempt at describing what changed, where indoor routing with&#10;Valhalla is today and what&amp;rsquo;s yet to be implemented.&lt;/p&gt;&#10;&lt;p&gt;Generally, indoor routing was first enabled by simply adding the objects of interest (most notably&#10;corridors, stairs, and elevators) to the graph build. Thanks to the OSM schema already encoding topology,&#10;this is enough to simply add these components as nodes and edges to the graph. But there are particularities&#10;about indoor routing that need special handling, and most of my time was spent on problems specific to&#10;level traversal.&lt;/p&gt;</description></item><item><title>Public Transit Isochrones with Valhalla</title><link>https://bwnkl.de/posts/transit-isochrones/</link><pubDate>Sat, 28 Sep 2024 19:03:39 +0200</pubDate><guid>https://bwnkl.de/posts/transit-isochrones/</guid><description>&lt;p&gt;&lt;img src="https://bwnkl.de/sf-gtfs.png" alt="Isochrone map for a location in San Francisco"&gt;&lt;/p&gt;&#10;&lt;p&gt;I keep getting questions about the state of isochrones in conjunction with transit routing in Valhalla. There&amp;rsquo;s been support for it&#10;for a couple of years now, and with Valhalla being able to read GTFS feeds directly, it&amp;rsquo;s really easy to set up yourself. So here&amp;rsquo;s really just&#10;a short recipe to get a GTFS feed into Valhalla and see some isochrone results.&lt;/p&gt;</description><media:content url="https://bwnkl.de/sf-gtfs.png" medium="image"/></item></channel></rss>