home

posts

notes

rss

Exploring breakfast spots with Overture Places

I recently learned about Overture places data through a blog post by Drew Breunig. This dataset “contains more than 53 million point representations of real-world entities: schools, businesses, (⋯), mountain peaks, and much more”1. You can explore this data through the Overture Maps Explorer.

I regularly have breakfast with a friend, and we like exploring new breakfast places. The Overture dataset could provide us with new breakfast places in Brussels. For this, we need the bounding box around the area of Brussels in which we’re interested in. We can find this using bboxfinder.com. For this example, we take the bounding box around the Vijfhoek of Brussels.

Screenshot of the bounding box around the Vijfhoek of Brussels

Checking out some of the regular places we visit through the Maps Explorer shows that they have the "breakfast_and_brunch_restaurant" category in common. Using duckdb, we can download all places within our defined bounding box of 50.832939, 4.337368, 50.858410, 4.369812. The code below is based on an example from the Overture Maps website:

-- Load necessary modules
LOAD spatial;
LOAD httpfs;
 
-- Set the AWS S3 region
SET s3_region = 'us-west-2';
 
-- Copy the filtered data from S3 to a local Parquet file
COPY (
SELECT
id,
names,
categories,
websites,
addresses,
ST_GeomFromWKB(geometry)
FROM
read_parquet('s3://overturemaps-us-west-2/release/2024-07-22.0/theme=places/*/*')
WHERE
-- Filter by bounding box (xmin and ymin)
bbox.xmin BETWEEN 4.337368 AND 4.369812 AND
bbox.ymin BETWEEN 50.832939 AND 50.858410
) TO 'vijfhoek.parquet';

Next, we can query all the places where the primary category is "breakfast_and_brunch_restaurant":

SELECT
names.primary AS name,
addresses[1].freeform AS address,
websites[1] AS website
FROM
'vijfhoek.parquet'
WHERE
categories.primary = 'breakfast_and_brunch_restaurant';
┌──────────────────────────────────────────────────────────────────────────────────────────────────────┐
│ name │ address │ website │
│ varchar │ varchar │ varchar │
├──────────────────────────────────────────────────────────────────────────────────────────────────────┤
│ Flower food │ Rue Blaes 264 │ │
│ Le Père Tranquille │ Rue des Renards 4 │ │
│ Brussels Waffle Workshop │ Rue des Foulons 30 │ http://www.waffleworkshop.com │
│ Woodpecker 20 │ Rue Jourdan 20 │ │
│ EatClub Brussels │ Rue de Stassart 18 │ │
│ Café Boudin │ Rue Ravenstein 20 │ https://cafeboudin.be │
│ bloom_and_brunch_by_sabri │ Rue de la Paix 7 │ │
│ Lastra │ Rue du Conseil 24 │ │
│ Le Coin Des Saveurs │ Boulevard de l'Abattoir 19 │ │
│ Kandinsky │ Chaussée de Gand 37 │ https://kandinsky-family.be/ │
│ Restaurant Baurade │ Boulevard Anspach 153 │ │
│ Kafei Dansaert │ Rue Antoine Dansaert 57 │ https://kafei.be │
│ Le Odin Royal │ Oude Graanmarkt 2 │ │
│ Movenpick │ │ │
│ Woodpecker St. Cath. │ Quai au Bois à Brûler 27 │ │
│ Restaurant Al Andalus │ Rue de Ribaucourt 4 │ │
│ Gaufres and Waffles │ Chemin du Croquet 1 │ http://www.gaufresandwaffles.com │
│ Oats Day Long │ Europakruispunt 3 │ https://www.oatsdaylong.com │
│ Belrose cake │ Boulevard Émile Jacqmain 3 │ https://www.belrosecake.com/ │
│ Spread the moon │ Rue du Gentilhomme 13 │ https://www.instagram.com/spreadthemoon/ │
│ Longitude Nord-Sud │ Quai aux Pierres de Taille 14 │ http://longitude.blog4ever.com/ │
├──────────────────────────────────────────────────────────────────────────────────────────────────────┤
│ 21 rows 3 columns │
└──────────────────────────────────────────────────────────────────────────────────────────────────────┘

This is a good start, but lots of places we already visited are still missing from this list. We can query for all places where 'breakfast_and_brunch_restaurant' is listed under alternate categories using OR 'breakfast_and_brunch_restaurant' = ANY (categories.alternate);.

I’m planning to pick this idea up later, and check if I can find a way to include more breakfast and brunch spots. In a next step, I could attempt to scrape the provided websites to check menus for our usual order.