The Overture Maps Foundation publishes a global dataset every month containing the world's buildings, roads, addresses and places of interest. Below is a screenshot of some analysis I did on their March update for Southern Spain.

The data is shared via ~450 GB of Parquet files hosted on AWS S3 and Microsoft's Azure.
Parquet files allow you to only read what you need from them. I was able to pull satellite image footprints for Bahrain reading only 460 KB of data out of a 275 MB Parquet file on S3 in my recent Satellogic post. The software making these optimised downloads possible is DuckDB.
Last December, Chris Holmes, a Fellow at Planet Labs, published a plugin for QGIS that allowed users to pick any location on Earth and only download Parquet data for that location via DuckDB, including from Overture's datasets. Below is a screenshot of Chris' plugin.

Ryan Lopez, a Senior IT Analyst at the Fresno County Department of Public Works & Planning, took inspiration from Chris' work and has recently released an add-in for Esri's ArcGIS Pro that allows users to download Overture data into their projects.
This add-in is partly possible due to Parquet support being added in to ArcGIS Pro 3.5 last month.
The add-in is built to read Overture's Releases Manifest and make sure the latest version of their datasets are being downloaded.
Ryan's add-in is made up of 3,609 lines of C# and the source code is available on GitHub.
In this post, I'll walk through installing and running Ryan's add-in.
My Workstation
I'm using a 5.7 GHz AMD Ryzen 9 9950X CPU. It has 16 cores and 32 threads and 1.2 MB of L1, 16 MB of L2 and 64 MB of L3 cache. It has a liquid cooler attached and is housed in a spacious, full-sized Cooler Master HAF 700 computer case.
The system has 96 GB of DDR5 RAM clocked at 4,800 MT/s and a 5th-generation, Crucial T700 4 TB NVMe M.2 SSD which can read at speeds up to 12,400 MB/s. There is a heatsink on the SSD to help keep its temperature down. This is my system's C drive.
The system is powered by a 1,200-watt, fully modular Corsair Power Supply and is sat on an ASRock X870E Nova 90 Motherboard.
I'm running Ubuntu 24 LTS via Microsoft's Ubuntu for Windows on Windows 11 Pro. In case you're wondering why I don't run a Linux-based desktop as my primary work environment, I'm still using an Nvidia GTX 1080 GPU which has better driver support on Windows and ArcGIS Pro only supports Windows natively.
Installing Prerequisites
I'll use jq to help analyse the data in this post.
$ sudo apt update
$ sudo apt install \
jq
I'll use DuckDB, along with its H3, JSON, Lindel, Parquet and Spatial extensions, in this post.
$ cd ~
$ wget -c https://github.com/duckdb/duckdb/releases/download/v1.1.3/duckdb_cli-linux-amd64.zip
$ unzip -j duckdb_cli-linux-amd64.zip
$ chmod +x duckdb
$ ~/duckdb
INSTALL h3 FROM community;
INSTALL lindel FROM community;
INSTALL json;
INSTALL parquet;
INSTALL spatial;
I'll set up DuckDB to load every installed extension each time it launches.
$ vi ~/.duckdbrc
.timer on
.width 180
LOAD h3;
LOAD lindel;
LOAD json;
LOAD parquet;
LOAD spatial;
Installing the Add-In
If you already have ArcGIS Pro 3.5 installed, you can download the 83 MB Add-In, launch it and install it.

ArcGIS Pro 3.5 is the first version of ArcGIS Pro to ship with DuckDB and Parquet support built-in so this add-in is unlikely to work with previous versions of ArcGIS Pro.
Downloading Overture Maps
Create a new map in ArcGIS Pro and zoom into an area of interest. An area the size a few neighbourhoods will mean only a small amount of data will need to be downloaded. If your window extent covers an area the size of Canada, you could be waiting a while for your download to complete.

Click the "Overture Maps" tab at the top of the UI and click the "Launch Overture" button.

A panel should appear that allows you to select the datasets you want to download from Overture. Once you've made your selection(s), click the "Load Data" button in the bottom right of the panel.

You'll then see a status tab appear with the progress of the download(s).

At this point, the datasets will appear as feature layers within your map.

Multi-file Feature Connections
If you've selected more than one dataset, you'll be asked if you want to create an Multi-file Feature Connection (MFC). This allows ArcGIS Pro to work more efficiently with multiple Parquet files.

Below you can pick your settings and location to store the MFC file.

You should see something like the following once that's complete.

Overture's Parquet Data
When Ryan's add-in downloaded the data, it saved them in Parquet files. Below are the building and building parts (used for 3D) files I downloaded for Downtown Calgary.
$ ls -lht ~/Downloads/Overture/*/*.parquet
53K '/home/mark/Downloads/Overture/building_part/Buildings - Building Part.parquet'
132K '/home/mark/Downloads/Overture/building/Buildings - Building.parquet'
Below is an example record for the buildings dataset.
$ echo "FROM 'Buildings - Building.parquet'
LIMIT 1" \
| ~/duckdb -json \
| jq -S .
[
{
"bbox": "{'xmin': -114.08377, 'xmax': -114.08318, 'ymin': 51.0421, 'ymax': 51.042442}",
"class": "apartments",
"facade_color": null,
"facade_material": null,
"filename": "s3://overturemaps-us-west-2/release/2025-05-21.0/theme=buildings/type=building/part-00027-0df994ca-3323-4d7c-a374-68c653f78289-c000.zstd.parquet",
"geometry": "POLYGON ((-114.0836356 51.0424412, -114.0837513 51.0424422, -114.0837533 51.0424016, -114.0837335 51.0424011, -114.083735 51.0423659, -114.0837579 51.0423661, -114.0837616 51.0423239, -114.083738 51.0423209, -114.0837423 51.0422798, -114.0837653 51.0422809, -114.0837694 51.0422338, -114.0837432 51.0422304, -114.0837472 51.0421182, -114.0832012 51.0421052, -114.0831834 51.0424375, -114.0836356 51.0424412))",
"has_parts": false,
"height": 13.924596,
"id": "08b12ccd76148fff02006acb70056191",
"is_underground": false,
"level": null,
"min_floor": null,
"min_height": null,
"names": "{'primary': Aura, 'common': NULL, 'rules': NULL}",
"num_floors": null,
"num_floors_underground": null,
"roof_color": null,
"roof_direction": null,
"roof_height": null,
"roof_material": null,
"roof_orientation": null,
"roof_shape": null,
"sources": "[{'property': '', 'dataset': OpenStreetMap, 'record_id': w476428510@4, 'update_time': '2022-07-05T07:29:04.000Z', 'confidence': NULL}, {'property': properties/height, 'dataset': Microsoft ML Buildings, 'record_id': NULL, 'update_time': NULL, 'confidence': NULL}]",
"subtype": "residential",
"theme": "buildings",
"type": "building",
"version": 0
}
]
The fields are strongly typed.
$ echo "DESCRIBE FROM 'Buildings - Building.parquet'
LIMIT 1" \
| ~/duckdb
┌──────────────────────┬──────────────────────────────────────────────────────────────────────────────┬─────────┬─────────┬─────────┬─────────┐
│ column_name │ column_type │ null │ key │ default │ extra │
│ varchar │ varchar │ varchar │ varchar │ varchar │ varchar │
├──────────────────────┼──────────────────────────────────────────────────────────────────────────────┼─────────┼─────────┼─────────┼─────────┤
│ id │ VARCHAR │ YES │ NULL │ NULL │ NULL │
│ bbox │ STRUCT(xmin FLOAT, xmax FLOAT, ymin FLOAT, ymax FLOAT) │ YES │ NULL │ NULL │ NULL │
│ version │ INTEGER │ YES │ NULL │ NULL │ NULL │
│ sources │ STRUCT(property VARCHAR, dataset VARCHAR, record_id VARCHAR, update_time V… │ YES │ NULL │ NULL │ NULL │
│ level │ INTEGER │ YES │ NULL │ NULL │ NULL │
│ subtype │ VARCHAR │ YES │ NULL │ NULL │ NULL │
│ class │ VARCHAR │ YES │ NULL │ NULL │ NULL │
│ height │ DOUBLE │ YES │ NULL │ NULL │ NULL │
│ names │ STRUCT("primary" VARCHAR, common MAP(VARCHAR, VARCHAR), rules STRUCT(varia… │ YES │ NULL │ NULL │ NULL │
│ has_parts │ BOOLEAN │ YES │ NULL │ NULL │ NULL │
│ is_underground │ BOOLEAN │ YES │ NULL │ NULL │ NULL │
│ num_floors │ INTEGER │ YES │ NULL │ NULL │ NULL │
│ num_floors_undergr… │ INTEGER │ YES │ NULL │ NULL │ NULL │
│ min_height │ DOUBLE │ YES │ NULL │ NULL │ NULL │
│ min_floor │ INTEGER │ YES │ NULL │ NULL │ NULL │
│ facade_color │ VARCHAR │ YES │ NULL │ NULL │ NULL │
│ facade_material │ VARCHAR │ YES │ NULL │ NULL │ NULL │
│ roof_material │ VARCHAR │ YES │ NULL │ NULL │ NULL │
│ roof_shape │ VARCHAR │ YES │ NULL │ NULL │ NULL │
│ roof_direction │ DOUBLE │ YES │ NULL │ NULL │ NULL │
│ roof_orientation │ VARCHAR │ YES │ NULL │ NULL │ NULL │
│ roof_color │ VARCHAR │ YES │ NULL │ NULL │ NULL │
│ roof_height │ DOUBLE │ YES │ NULL │ NULL │ NULL │
│ filename │ VARCHAR │ YES │ NULL │ NULL │ NULL │
│ theme │ VARCHAR │ YES │ NULL │ NULL │ NULL │
│ type │ VARCHAR │ YES │ NULL │ NULL │ NULL │
│ geometry │ GEOMETRY │ YES │ NULL │ NULL │ NULL │
├──────────────────────┴──────────────────────────────────────────────────────────────────────────────┴─────────┴─────────┴─────────┴─────────┤
│ 27 rows 6 columns │
└─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
ArcGIS Pro 3.5 will automatically denormalise any lists of dictionaries. Below the sources field has been broken out. This should make it much easier to work with these values without needing to juggle nested data structures and denormalisation.
