Skip to content

Public datasets ​

For hobbyists, students, journalists and researchers. Everything below is free to download, needs no account, and is served as plain Parquet over HTTPS from a public Google Cloud Storage bucket.

86 files, 695 MB in total, inventoried on 2026-10-08. All under storage.googleapis.com/trilogy_public_models/duckdb/trees/ unless noted.

Trees, per city

One file per city, named by its five-letter code. Trees is how many trees the file holds. Updated is the latest timestamp from any source contributing to that city dataset. Click a row for its provenance.

11,766,844 trees10,317,436 from municipal inventories (88%)1,449,378 from OpenStreetMap (12%)9 community submissions
CityFileTreesSizeUpdatedSourcesExplore
Bogotá
COBOG
cobog_tree_info_v2.parquet1,484,87338 MB2026-10-04Datos Abiertos Bogotá - Jardín Botánico de Bogotá, Arbolado UrbanoOSM
London
GBLON
gblon_tree_info_v2.parquet1,266,24135 MB2026-10-01London DatastoreOSM
New York City
USNYC
usnyc_tree_info_v2.parquet792,79124 MB2026-10-07NYC Parks Forestry Tree PointsOSM
Toronto
CATOR
cator_tree_info_v2.parquet726,09024 MB2026-10-03City of Toronto Open Data - Street Tree DataOSM
Berlin
DEBER
deber_tree_info_v2.parquet573,34718 MB2026-10-07Berlin GDI WFSOSM
Calgary
CACAL
cacal_tree_info_v2.parquet565,74017 MB2026-10-04City of Calgary Open Data - Public TreesOSM
Denver
USDEN
usden_tree_info_v2.parquet556,88815 MB2026-10-03Denver Open DataOSM
Los Angeles
USLAX
uslax_tree_info_v2.parquet514,3429.2 MB2026-10-02Los Angeles Open DataOSM
Edmonton
CAEDM
caedm_tree_info_v2.parquet490,16817 MB2026-10-05City of Edmonton Open Data - TreesOSM
Montreal
CAMTL
camtl_tree_info_v2.parquet374,71613 MB2026-10-01Donnees Montreal - Arbres publics sur le territoire de la VilleOSM
Ottawa
CAOTT
caott_tree_info_v2.parquet368,06330 MB2026-10-02City of Ottawa Open Data - Tree InventoryOSM
Buenos Aires
ARBUE
arbue_tree_info_v2.parquet367,5718.9 MB2026-10-01Buenos Aires DataOSM
Paris
FRPAR
frpar_tree_info_v2.parquet351,55712 MB2026-10-07Paris Open DataOSM
Amsterdam
NLAMS
nlams_tree_info_v2.parquet338,0629.9 MB2026-10-07City of Amsterdam REST APIOSM
Winnipeg
CAWPG
cawpg_tree_info_v2.parquet306,9749.2 MB2026-10-05City of Winnipeg Open Data - Tree InventoryOSM
Mississauga
CAMIS
camis_tree_info_v2.parquet279,2807.9 MB2026-10-01City of Mississauga Open Data - City Owned Tree InventoryOSM
Tokyo
JPTYO
jptyo_tree_info_v2.parquet264,37510 MB2026-10-06Tokyo Open Data Catalog - Bureau of Construction, Street Trees on Metropolitan RoadsOSM
Vancouver
CAVAN
cavan_tree_info_v2.parquet248,7647.2 MB2026-10-05Vancouver Open DataOSM
Washington, DC
USWAS
uswas_tree_info_v2.parquet235,50921 MB2026-10-02Open Data DCOSM
Melbourne
AUMEL
aumel_tree_info_v2.parquet229,0966.1 MB2026-10-01OSMCity of Melbourne Open Data
Quebec City
CAQUE
caque_tree_info_v2.parquet217,6436.1 MB2026-10-07Donnees Quebec - Ville de Quebec, Arbres repertoriesOSM
Taipei
TWTPE
twtpe_tree_info_v2.parquet164,9114.4 MB2026-10-02Taipei City Open Data - Parks and Street Lights Office, Street and Park TreesOSM
San Francisco
USSFO
ussfo_tree_info_v2.parquet145,2054.7 MB2026-10-07SF Open Data PortalOSM
Boston
USBOS
usbos_tree_info_v2.parquet137,7584.1 MB2026-10-08City of Boston Open DataCity of CambridgeOSMArnold ArboretumTown of BrooklineSATELLITE_USBOSCommunity
Helsinki
FIHEL
fihel_tree_info_v2.parquet112,3493.2 MB2026-10-05Helsinki Region Infoshare - City of Helsinki Tree RegisterOSM
Longueuil
CALON
calon_tree_info_v2.parquet103,1254.6 MB2026-09-30Donnees Quebec - Ville de Longueuil, ArbresOSM
Copenhagen
DKCPH
dkcph_tree_info_v2.parquet90,6717.1 MB2026-10-01City of Copenhagen Open Data - Tree RegisterOSM
Halifax
CAHFX
cahfx_tree_info_v2.parquet81,4662.4 MB2026-10-04Halifax Regional Municipality Open Data - Public TreesOSM
Burlington, ON
CABUR
cabur_tree_info_v2.parquet77,4702.3 MB2026-10-03City of Burlington Open Data - City Owned TreesOSM
Kingston
CAKGN
cakgn_tree_info_v2.parquet47,1531.4 MB2026-10-02City of Kingston Open Data - City Owned TreesOSM
Ajax
CAAJX
caajx_tree_info_v2.parquet46,8091.3 MB2026-10-04Town of Ajax Open Data - Town TreesOSM
Lethbridge
CALET
calet_tree_info_v2.parquet45,5591.3 MB2026-10-03City of Lethbridge Open Data - TreesOSM
Victoria
CAVIC
cavic_tree_info_v2.parquet37,4091.0 MB2026-10-05City of Victoria Open Data - Tree SpeciesOSM
Tempe
USTEM
ustem_tree_info_v2.parquet32,986856 KB2026-10-02City of Tempe Tree InventoryOSM
Kelowna
CAKEL
cakel_tree_info_v2.parquet25,076701 KB2026-10-06City of Kelowna Open Data - Tree InventoryOSM
New Westminster
CANWE
canwe_tree_info_v2.parquet21,5781.6 MB2026-10-04City of New Westminster Open Data - Tree InventoryOSM
Athens
GRATH
grath_tree_info_v2.parquet19,626524 KB2026-10-05OSMCity of Athens Open Data
Burlington
USBTV
usbtv_tree_info_v2.parquet12,805595 KB2026-10-06City of Burlington VT ArcGIS FeatureServerOSM
Moncton
CAMON
camon_tree_info_v2.parquet12,4011.1 MB2026-10-05City of Moncton Open Data - TreesOSM
Milos
GRMLO
grmlo_tree_info_v2.parquet24211 KB2026-10-05OSMCommunity
Santorini
GRSAN
grsan_tree_info_v2.parquet1557 KB2026-10-05OSM

Columns

Every city file has the same schema. The freshness column is named per city (ussfo_published_data_updated_through, and so on).

ColumnType
tree_idVARCHAR
cityVARCHAR
data_sourceVARCHAR
speciesVARCHAR
tree_nameVARCHAR
plant_dateDATE
diameter_at_breast_heightDOUBLE
latitudeDOUBLE
longitudeDOUBLE
submission_photo_urlVARCHAR
cultivarVARCHAR
crown_width_mDOUBLE
cluster_idVARCHAR
merged_sourcesVARCHAR
merged_tree_idsVARCHAR
boroughonly in COBOG, GBLON, JPTYO, TWTPE, DKCPH
source_latitudeonly in USBTV
source_longitudeonly in USBTV
position_adjustmentonly in USBTV
position_shift_monly in USBTV

Everything else

All cities, one file

Every city's trees in a single parquet. Republished on its own schedule, so it can lag a city file by a day, and it carries neither the per-city freshness stamp nor the merge columns. Prefer the per-city files for counting.

12,128,775 rows298 MBpublished 2026-10-08
…/trees/full_tree_info_v2.parquet
13 columns
  • tree_id VARCHAR
  • city VARCHAR
  • data_source VARCHAR
  • species VARCHAR
  • cultivar VARCHAR
  • crown_width_m DOUBLE
  • tree_name VARCHAR
  • plant_date DATE
  • diameter_at_breast_height DOUBLE
  • latitude DOUBLE
  • longitude DOUBLE
  • submission_photo_url VARCHAR
  • latest_update_through TIMESTAMP WITH TIME ZONE

Species enrichment

One row per species: common names, a description, growth form, mature size, lifespan, tolerances, bloom months, USDA zones, native ecoregions and an iNaturalist photo with its licence. Join to the tree files on species.

4,559 rows1.0 MBpublished 2026-10-08
…/trees/tree_enrichment_v2.parquet
37 columns
  • species VARCHAR
  • genus VARCHAR
  • species_epithet VARCHAR
  • family VARCHAR
  • synonyms VARCHAR[]
  • common_names VARCHAR[]
  • description VARCHAR
  • is_evergreen BOOLEAN
  • mature_height_min_ft FLOAT
  • mature_height_max_ft FLOAT
  • canopy_spread_min_ft FLOAT
  • canopy_spread_max_ft FLOAT
  • growth_rate VARCHAR
  • lifespan_min_years INTEGER
  • lifespan_max_years INTEGER
  • drought_tolerance VARCHAR
  • water_needs VARCHAR
  • sun_exposure VARCHAR[]
  • soil_preferences VARCHAR[]
  • root_behavior VARCHAR
  • coastal_tolerance BOOLEAN
  • salt_tolerance BOOLEAN
  • pollution_tolerance VARCHAR
  • bloom_months INTEGER[]
  • wildlife_value VARCHAR
  • fire_risk VARCHAR
  • tree_form VARCHAR
  • usda_zone_min INTEGER
  • usda_zone_max INTEGER
  • native_ecoregions INTEGER[]
  • photo_url VARCHAR
  • photo_license VARCHAR
  • photo_attribution VARCHAR
  • trunk_photo_url VARCHAR
  • trunk_photo_license VARCHAR
  • trunk_photo_attribution VARCHAR
  • enriched_at TIMESTAMP WITH TIME ZONE

Terrestrial ecoregions

The RESOLVE / WWF terrestrial ecoregions with geometry, biome and realm. native_ecoregions in the species file refers to ecoregion_id here, which is how the map decides whether a tree is native where it stands.

846 rows5.8 MBpublished 2026-03-29
…/trees/ecoregion_info_v2.parquet
18 columns
  • ecoregion_id INTEGER
  • ecoregion_name VARCHAR
  • realm VARCHAR
  • biome VARCHAR
  • biome_code INTEGER
  • realm_code VARCHAR
  • country_codes VARCHAR[]
  • centroid_lat DOUBLE
  • centroid_lon DOUBLE
  • geometry_geojson VARCHAR
  • bbox_min_lat DOUBLE
  • bbox_min_lon DOUBLE
  • bbox_max_lat DOUBLE
  • bbox_max_lon DOUBLE
  • is_terrestrial BOOLEAN
  • source_version VARCHAR
  • enriched_at TIMESTAMP WITH TIME ZONE
  • ecoregion_data_updated_through TIMESTAMP WITH TIME ZONE

All landmarks, one file

Named landmarks across every city, for geographic context on the map.

44,122 rows1.9 MBpublished 2026-10-04
…/landmarks/full_landmark_info_v2.parquet
6 columns
  • landmark_id VARCHAR
  • city VARCHAR
  • name VARCHAR
  • latitude DOUBLE
  • longitude DOUBLE
  • latest_landmark_update_through TIMESTAMP WITH TIME ZONE

Landmarks, per city

Under storage.googleapis.com/trilogy_public_models/duckdb/landmarks/. A city with one row is a placeholder waiting for a source; the columns vary by city beyond the shared core.

CityFileRowsSizePublishedExplore
Berlindeber_landmark_info_v2.parquet10,013506 KB2026-08-21
Amsterdamnlams_landmark_info_v2.parquet9,805740 KB2026-04-10
Helsinkifihel_landmark_info_v2.parquet5,3471.5 MB2026-09-11
Vancouvercavan_landmark_info_v2.parquet2,495108 KB2026-04-02
Parisfrpar_landmark_info_v2.parquet1,889133 KB2026-10-04
New York Cityusnyc_landmark_info_v2.parquet1,532410 KB2026-07-02
Bogotácobog_landmark_info_v2.parquet1,453627 KB2026-09-11
Los Angelesuslax_landmark_info_v2.parquet1,3401.5 MB2026-10-04
Kingstoncakgn_landmark_info_v2.parquet1,198264 KB2026-09-12
Edmontoncaedm_landmark_info_v2.parquet1,10588 KB2026-10-04
Calgarycacal_landmark_info_v2.parquet87059 KB2026-09-06
Winnipegcawpg_landmark_info_v2.parquet71157 KB2026-10-04
Mississaugacamis_landmark_info_v2.parquet65744 KB2026-09-27
Taipeitwtpe_landmark_info_v2.parquet55744 KB2026-09-11
Halifaxcahfx_landmark_info_v2.parquet530354 KB2026-10-04
Londongblon_landmark_info_v2.parquet43526 KB2026-08-21
Copenhagendkcph_landmark_info_v2.parquet40222 KB2026-09-11
San Franciscoussfo_landmark_info_v2.parquet372114 KB2026-10-04
Denverusden_landmark_info_v2.parquet37217 KB2026-09-06
Monctoncamon_landmark_info_v2.parquet33635 KB2026-09-12
Burlington, ONcabur_landmark_info_v2.parquet29422 KB2026-10-04
Melbourneaumel_landmark_info_v2.parquet24214 KB2026-04-02
Tokyojptyo_landmark_info_v2.parquet23018 KB2026-09-07
New Westminstercanwe_landmark_info_v2.parquet22422 KB2026-09-12
Longueuilcalon_landmark_info_v2.parquet223341 KB2026-09-06
Ottawacaott_landmark_info_v2.parquet20522 KB2026-09-12
Kelownacakel_landmark_info_v2.parquet19836 KB2026-09-20
Ajaxcaajx_landmark_info_v2.parquet18114 KB2026-09-12
Torontocator_landmark_info_v2.parquet17814 KB2026-09-06
Bostonusbos_landmark_info_v2.parquet17418 KB2026-10-04
Montrealcamtl_landmark_info_v2.parquet16015 KB2026-09-06
Burlingtonusbtv_landmark_info_v2.parquet1368 KB2026-08-21
Quebec Citycaque_landmark_info_v2.parquet10010 KB2026-09-06
Lethbridgecalet_landmark_info_v2.parquet467 KB2026-09-12
Athensgrath_landmark_info_v2.parquet303 KB2026-09-04
Santorinigrsan_landmark_info_v2.parquet303 KB2026-09-04
Victoriacavic_landmark_info_v2.parquet2321 KB2026-09-12
Milosgrmlo_landmark_info_v2.parquet193 KB2026-09-04
Buenos Airesarbue_landmark_info_v2.parquet102 KB2026-07-29
Washington, DCuswas_landmark_info_v2.parquet11 KB2026-08-21
Tempeustem_landmark_info_v2.parquet11 KB2026-08-21

Derived from these, on this site

Built from the files above at each site build. Small, JSON, and fine to hotlink.

Reading a file ​

DuckDB reads Parquet over HTTP without downloading the whole file first:

sql
INSTALL httpfs; LOAD httpfs;

SELECT species, count(*) AS trees
FROM read_parquet(
  'https://storage.googleapis.com/trilogy_public_models/duckdb/trees/frpar_tree_info_v2.parquet'
)
GROUP BY 1
ORDER BY trees DESC
LIMIT 20;

Or in Python:

python
import duckdb

con = duckdb.connect()
con.execute("INSTALL httpfs; LOAD httpfs;")
df = con.execute("""
    SELECT t.*, e.common_names[1] AS common_name
    FROM read_parquet(
      'https://storage.googleapis.com/trilogy_public_models/duckdb/trees/ussfo_tree_info_v2.parquet'
    ) t
    LEFT JOIN read_parquet(
      'https://storage.googleapis.com/trilogy_public_models/duckdb/trees/tree_enrichment_v2.parquet'
    ) e USING (species)
""").df()

Every city's file can be read together in one call; DuckDB unions them by column name, which handles the per-city freshness column:

sql
SELECT city, count(*) FROM read_parquet([
  'https://storage.googleapis.com/trilogy_public_models/duckdb/trees/ussfo_tree_info_v2.parquet',
  'https://storage.googleapis.com/trilogy_public_models/duckdb/trees/usnyc_tree_info_v2.parquet'
], union_by_name = true)
GROUP BY 1;

Two gotchas worth knowing up front ​

Merged records. OpenStreetMap overlaps municipal inventories by construction — the same tree mapped twice, a few metres apart. Where we are confident that has happened the records are merged upstream into one row, so a per-city file is already one row per tree and needs no duplicate filter. merged_sources lists every source that contributed to a row and merged_tree_ids the ids folded into it (null where nothing was); cluster_id is the surviving record's own id. In San Francisco, 1,580 of 203,622 rows are a municipal record merged with an OSM node. The all-cities rollup does not carry those three columns, which is why the per-city files are the better starting point for anything you intend to count.

Species sentinels. A source that records Vacant, Onbekend or Empty pit/planting site is not naming a taxon. Those collapse to Unknown, except where the source did record a growth form, which is kept as Palm, Shrub or Cactus. Exclude all four before computing species diversity. A few placeholders still leak through in the current data (Planting site, Scheduled planting, Non specifie); this site drops those too, and they are on the list to fix upstream.

Licence and attribution ​

The underlying inventories stay under their publishers' licences. Attribution is per row: the data_source column says where each tree came from, and the table above links every value to its publisher.

  • Municipal inventories: © the city's open-data publisher, under that portal's terms. Most are open-government or Creative Commons attribution licences; where the inventory above shows no licence, we have not confirmed the terms by hand and you should check the portal.
  • OpenStreetMap rows (data_source beginning OSM_): © OpenStreetMap contributors, ODbL.
  • Community submissions (COMMUNITY_): contributed to arborary.world through the map, reviewed before publication.
  • Species photos: iNaturalist contributors, under the Creative Commons licence recorded in photo_license for each row. Many are non-commercial (cc-by-nc).

If ODbL's share-alike terms are a problem for what you are building, see Licensing.

Requesting a new city ​

Everything on this page is rebuilt by greenmtnboy/tree_reporting, which is open source. Adding a city is mostly mechanical once the inventory has been found, so the fastest way to get one in is to open an issue there with the details the pipeline needs:

Request a city on GitHub

  1. The city, and where its tree inventory is published. A link to the open-data portal page or the download is enough; ArcGIS Hub, Socrata, CKAN and plain CSV or GeoJSON all work. If you are not sure the city publishes one, say so and we will look.
  2. The licence the portal publishes it under. Most are open-government or Creative Commons attribution terms. A link to the licence page saves a round trip.
  3. Anything that helps: a rough tree count, whether the records carry species names, and a landmarks or parks dataset if you know of one.

Open issues are listed at github.com/greenmtnboy/tree_reporting/issues; check there first in case your city is already queued. If you would rather add it yourself, the runbook is EXTENDING.md in that repo, and pull requests are welcome. Mistakes in species names, enrichment or photos have their own "Report an issue" link at the bottom of every species page.

Interested in talking trees? arborary.world@gmail.comTree data © the respective municipal publishers and © OpenStreetMap contributors (ODbL).