Cities as stories

Mark Padgham
rOpenSci & UrbanAnalyst
mpadge.eu

Helsinki

  • Road deaths (2025): 0
  • All roads max 30km/hr

Delft

  • Road deaths (2025): ? but 759 in NL, so > 0
  • Most roads max speed: ?

Highway speed distribution in Delft (Oct 2026)

hw speeds in delft

How can

Delft

reduce speeds?

Where can

Delft

reduce speeds?

Where can

Delft

reduce speeds?

  • Where?

  • When?

  • Which order?

Where can

Delft

reduce speeds?

What to do first?

What to do first?

End result

depends on

  • How

  • Where

  • When

What to do first?

End result

depends on

is a story

where only

Story: disconnected edges

where, when, & how

Story: completed paths

How can
Delft
learn from
Helsinki?

  • Input data

  • Processing & Algorithms

  • Output data

Spatial

Data

Vector, not raster

Spatial

Tabular

Data

Tabular

Data

xycolourshape
00
01redsquare
11circle
11red
21green
22
full empty

Tabular

Data

are

mostly empty

Tabular

Data

are

inefficient

Tabular

Data

keyxycolourshape
000
101redsquare
211circle
311red
421green
522

Tabular

Data

keyxy
000
101
211
311
421
522
keycolour
1red
3red
4green
colourproperties
redGoes fast
greenHelps people relax

Tabular

Data

keyxy
000
101
211
311
421
522
keyshape
1square
2circle
shapeproperties
squarePointy and hurts
circleBounces well

Multi

Tabular

Data

Are

more efficient

Multi

Tabular

Data

Are

relational

What to do first?

End result

depends on

  • How

  • Where

  • When

OSM

data structure


<node id="25316206" version="4" timestamp="2021-09-22T14:00:34Z" lat="52.0225868" lon="4.3754719">
  <tag k="barrier" v="lift_gate"/>
</node>

<way id="4239535" version="24" timestamp="2023-12-30T17:36:45Z">
  <nd ref="1432937786"/>
  <nd ref="1432937797"/>
  ...
  <tag k="highway" v="cycleway"/>
  <tag k="name" v="Bospad"/>
</way>

<relation id="..." version="...">
  <member type="way" ref="4239535" role=""/>
  <member type="way" ref="4239536" role=""/>
  ...
  <tag k="type" v="route"/>
  <tag k="route" v="bicycle"/>
</relation>
                    

OSM

data structure

is

relational

OSM

data structure

is

hierarchically

relational


                        library (osmdata)
                        dat <- opq ("Delft Netherlands") |>
                            add_osm_feature (key = "highway") |>
                            osmdata_sc (doc = "delft-hw.osm")
                    
osmdata_sc(): Silicate format

                        names (dat)
                        #> "nodes"  "relation_members"  "relation_properties"  "object"
                        #> "object_link_edge"  "edge"  "vertex"  "meta"

                        dat$vertex
                        #>      x_    y_ vertex_
                        #> 1  4.36  52.0 21702193
                        #> 2  4.36  52.0 21766435
                        #> 3  4.36  52.0 21766438

                        dat$edge
                        #> # A tibble: 48,368 × 3
                        #> .vx0       .vx1       edge_
                        #> <chr>      <chr>      <chr>
                        #> 1 1432937786 1432937797 PL7KhoEg2e
                        #> 2 1432937797 2961946231 OZaR5sC0SU
                        #> 3 2961946231 25315554   jk8s6kCjvL
                    

                        dat$object_link_edge
                        #> # A tibble: 48,368 × 3
                        #> edge_      object_ native_
                        #> <chr>      <chr>   <lgl>
                        #> 1 PL7KhoEg2e 4239535 TRUE
                        #> 2 OZaR5sC0SU 4239535 TRUE
                        #> 3 jk8s6kCjvL 4239535 TRUE

                        dat$object
                        #> # A tibble: 79,385 × 3
                        #> object_ key           value
                        #> <chr>   <chr>         <chr>
                        #> 1 4239535 foot          yes
                        #> 2 4239535 highway       cycleway
                        #> 3 4239535 lit           no
                    
  • Input data

  • Processing &

    Algorithms

  • Output data

  • Input data

  • Processing &

    Algorithms

  • Output data

  • Processing &

    Algorithms

  • Routing

    Algorithms

EPSG:4326

Compound Junctions

Compound street junction

require relational data

Routing is

not just routing

Routing is

political

Routing is

difficult

Routing is

difficult

Bicycle

Routing is

difficult

Public

transport

Routing is

difficult

Public

transport

Routing is

difficult

Bringing it

all together

  • Input data

  • Processing & Algorithms

  • Output data

  • Where?

  • When?

  • Which order?

Cities as stories

Mark Padgham
rOpenSci & UrbanAnalyst
mpadge.eu