# Places of interest in Europe

*Shops, schools, hospitals, stations and cafés, with a category and a point.*

Points of interest across Europe from Overture Maps' places theme: one row per place with its name, Overture's category (and the category path from general to specific), a confidence score, the address fields, a longitude and a latitude, and a website and brand when known. Kept where the address country is European and Overture's confidence is at least 0.9, about 7.7 million places.

## At a glance

| | |
|---|---|
| Table | `pubdata.places.places` |
| Category | Places · Places, Spatial, Europe |
| Rows | 7,257,624 |
| Size | 5 data file(s) |
| Iceberg format | v3 |
| Last refreshed | 2026-10-10T11:25:24Z |
| Source version | overture 2026-09-23.1 |
| Refresh cadence | monthly (replace) |
| Coverage | Europe (EU-27, EFTA, the UK, the Western Balkans, the microstates, Ukraine, Moldova, Belarus), by address country; the latest Overture release |

## Origin

- **Source:** [Overture Maps Foundation, places theme](https://docs.overturemaps.org/guides/places/)
- **Licence:** CDLA-Permissive-2.0 (a few sources CC0-1.0 or Apache-2.0; the per-record licence is in Overture's sources)
- **Attribution:** © Overture Maps Foundation (CDLA-Permissive-2.0).
- **Note:** Overture releases monthly; the release name is the source version. Measured on 2026-09-23.1, about 0.55 GB.
- **Recipe:** `pubdata/recipes/places.py` in the LakehouseBox repository; registry entry `pubdata/registry/places.yaml`.

## Schema

| column | type | description |
|---|---|---|
| `place_id` | string | Overture GERS id of the place |
| `name` | string | primary name |
| `basic_category` | string | Overture's coarse category (e.g. restaurant, hospital, pharmacy_and_drug_store, elementary_school) |
| `category` | string | Overture's taxonomy category (the most specific) |
| `category_path` | string | the taxonomy path from general to specific, joined with ' > ' |
| `confidence` | double | Overture's confidence that the place exists, 0.9 to 1 |
| `operating_status` | string | open, permanently_closed or temporarily_closed when known |
| `country_code` | string | ISO 3166-1 alpha-2 of the address (joins reference.countries) |
| `region` | string | the address region as given (not always an ISO 3166-2 code) |
| `locality` | string | city or town |
| `postcode` | string | postal code |
| `address` | string | the street address as one line |
| `longitude` | double | WGS84 longitude |
| `latitude` | double | WGS84 latitude |
| `geometry` | geometry | the point (WGS84, longitude/latitude), for spatial joins and maps |
| `website` | string | the first website listed |
| `brand` | string | brand name for chain locations |
| `overture_release` | string | the release this row came from |

**Join keys:** `country_code`.

## For agents

Filter on `basic_category` for broad questions (restaurant, hospital, pharmacy_and_drug_store, elementary_school,
high_school; list them with `SELECT DISTINCT basic_category`) and on `category` or `category_path` for specific ones
(`category = 'pharmacy'`). Rows are stored in Hilbert order, so a box around an area reads little: a bounding box on
longitude and latitude, or `geometry && ST_MakeEnvelope(xmin, ymin, xmax, ymax)`, before any distance arithmetic.
`geometry` is an Iceberg v3 geometry column (DuckDB 1.5.6 or newer; PyIceberg 0.12 cannot load v3 geometry tables
yet). Coverage and freshness vary by country (Overture merges several providers); `confidence` 0.9 already drops most duplicates and stale entries, but a closed business can remain.

## Example SQL (DuckDB)

```sql
-- pharmacies by country
SELECT p.country_code, count(*) AS pharmacies
FROM pubdata.places.places AS p
WHERE p.category = 'pharmacy'
GROUP BY 1 ORDER BY 2 DESC;
-- the ten nearest hospitals to a point (Madrid, Puerta del Sol)
SELECT name, locality, round(6371 * 2 * asin(sqrt(pow(sin(radians(latitude - 40.4169) / 2), 2)
       + cos(radians(40.4169)) * cos(radians(latitude)) * pow(sin(radians(longitude + 3.7035) / 2), 2))), 2) AS km
FROM pubdata.places.places
WHERE basic_category = 'hospital' AND latitude BETWEEN 40.2 AND 40.7 AND longitude BETWEEN -4.0 AND -3.4
ORDER BY km LIMIT 10;
```

## How to read it

Without an account, over HTTPS (the bucket is public):

```sql
INSTALL iceberg; LOAD iceberg; INSTALL httpfs; LOAD httpfs;
-- anonymous: the bucket is public, requests go unsigned, through the public-data cache
CREATE OR REPLACE SECRET pubdata (TYPE S3, ENDPOINT 'lakehousebox-public-data.b-cdn.net', URL_STYLE 'path', REGION 'us-east-1');
CREATE OR REPLACE VIEW places AS SELECT * FROM iceberg_scan('s3://commons--pubdata/places/places');
SELECT * FROM places LIMIT 10;
```

With a LakehouseBox account:

```bash
# with a LakehouseBox account (any organisation): the public catalog by name, read-only
lhbox duckdb --catalog commons/pubdata     # opens DuckDB attached as `commons_pubdata`
SELECT * FROM commons_pubdata.places.places LIMIT 10;
```

Public URL of the table's storage: `https://s3.lakehousebox.com/commons--pubdata/places/places/`. This card: `https://lakehousebox.com/pubdata/cards/places.md`; the page: https://lakehousebox.com/public-data/places. Every dataset as a table: `commons_pubdata.meta.datasets`; as Markdown: https://lakehousebox.com/public-data.md.
