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.
| City | File | Trees | Size | Updated | Sources | Explore |
|---|---|---|---|---|---|---|
BogotáCOBOG | cobog_tree_info_v2.parquet | 1,484,873 | 38 MB | 2026-10-04 | Datos Abiertos Bogotá - Jardín Botánico de Bogotá, Arbolado UrbanoOSM | |
LondonGBLON | gblon_tree_info_v2.parquet | 1,266,241 | 35 MB | 2026-10-01 | London DatastoreOSM | |
New York CityUSNYC | usnyc_tree_info_v2.parquet | 792,791 | 24 MB | 2026-10-07 | NYC Parks Forestry Tree PointsOSM | |
TorontoCATOR | cator_tree_info_v2.parquet | 726,090 | 24 MB | 2026-10-03 | City of Toronto Open Data - Street Tree DataOSM | |
BerlinDEBER | deber_tree_info_v2.parquet | 573,347 | 18 MB | 2026-10-07 | Berlin GDI WFSOSM | |
CalgaryCACAL | cacal_tree_info_v2.parquet | 565,740 | 17 MB | 2026-10-04 | City of Calgary Open Data - Public TreesOSM | |
DenverUSDEN | usden_tree_info_v2.parquet | 556,888 | 15 MB | 2026-10-03 | Denver Open DataOSM | |
Los AngelesUSLAX | uslax_tree_info_v2.parquet | 514,342 | 9.2 MB | 2026-10-02 | Los Angeles Open DataOSM | |
EdmontonCAEDM | caedm_tree_info_v2.parquet | 490,168 | 17 MB | 2026-10-05 | City of Edmonton Open Data - TreesOSM | |
MontrealCAMTL | camtl_tree_info_v2.parquet | 374,716 | 13 MB | 2026-10-01 | Donnees Montreal - Arbres publics sur le territoire de la VilleOSM | |
OttawaCAOTT | caott_tree_info_v2.parquet | 368,063 | 30 MB | 2026-10-02 | City of Ottawa Open Data - Tree InventoryOSM | |
Buenos AiresARBUE | arbue_tree_info_v2.parquet | 367,571 | 8.9 MB | 2026-10-01 | Buenos Aires DataOSM | |
ParisFRPAR | frpar_tree_info_v2.parquet | 351,557 | 12 MB | 2026-10-07 | Paris Open DataOSM | |
AmsterdamNLAMS | nlams_tree_info_v2.parquet | 338,062 | 9.9 MB | 2026-10-07 | City of Amsterdam REST APIOSM | |
WinnipegCAWPG | cawpg_tree_info_v2.parquet | 306,974 | 9.2 MB | 2026-10-05 | City of Winnipeg Open Data - Tree InventoryOSM | |
MississaugaCAMIS | camis_tree_info_v2.parquet | 279,280 | 7.9 MB | 2026-10-01 | City of Mississauga Open Data - City Owned Tree InventoryOSM | |
TokyoJPTYO | jptyo_tree_info_v2.parquet | 264,375 | 10 MB | 2026-10-06 | Tokyo Open Data Catalog - Bureau of Construction, Street Trees on Metropolitan RoadsOSM | |
VancouverCAVAN | cavan_tree_info_v2.parquet | 248,764 | 7.2 MB | 2026-10-05 | Vancouver Open DataOSM | |
Washington, DCUSWAS | uswas_tree_info_v2.parquet | 235,509 | 21 MB | 2026-10-02 | Open Data DCOSM | |
MelbourneAUMEL | aumel_tree_info_v2.parquet | 229,096 | 6.1 MB | 2026-10-01 | OSMCity of Melbourne Open Data | |
Quebec CityCAQUE | caque_tree_info_v2.parquet | 217,643 | 6.1 MB | 2026-10-07 | Donnees Quebec - Ville de Quebec, Arbres repertoriesOSM | |
TaipeiTWTPE | twtpe_tree_info_v2.parquet | 164,911 | 4.4 MB | 2026-10-02 | Taipei City Open Data - Parks and Street Lights Office, Street and Park TreesOSM | |
San FranciscoUSSFO | ussfo_tree_info_v2.parquet | 145,205 | 4.7 MB | 2026-10-07 | SF Open Data PortalOSM | |
BostonUSBOS | usbos_tree_info_v2.parquet | 137,758 | 4.1 MB | 2026-10-08 | City of Boston Open DataCity of CambridgeOSMArnold ArboretumTown of BrooklineSATELLITE_USBOSCommunity | |
HelsinkiFIHEL | fihel_tree_info_v2.parquet | 112,349 | 3.2 MB | 2026-10-05 | Helsinki Region Infoshare - City of Helsinki Tree RegisterOSM | |
LongueuilCALON | calon_tree_info_v2.parquet | 103,125 | 4.6 MB | 2026-09-30 | Donnees Quebec - Ville de Longueuil, ArbresOSM | |
CopenhagenDKCPH | dkcph_tree_info_v2.parquet | 90,671 | 7.1 MB | 2026-10-01 | City of Copenhagen Open Data - Tree RegisterOSM | |
HalifaxCAHFX | cahfx_tree_info_v2.parquet | 81,466 | 2.4 MB | 2026-10-04 | Halifax Regional Municipality Open Data - Public TreesOSM | |
Burlington, ONCABUR | cabur_tree_info_v2.parquet | 77,470 | 2.3 MB | 2026-10-03 | City of Burlington Open Data - City Owned TreesOSM | |
KingstonCAKGN | cakgn_tree_info_v2.parquet | 47,153 | 1.4 MB | 2026-10-02 | City of Kingston Open Data - City Owned TreesOSM | |
AjaxCAAJX | caajx_tree_info_v2.parquet | 46,809 | 1.3 MB | 2026-10-04 | Town of Ajax Open Data - Town TreesOSM | |
LethbridgeCALET | calet_tree_info_v2.parquet | 45,559 | 1.3 MB | 2026-10-03 | City of Lethbridge Open Data - TreesOSM | |
VictoriaCAVIC | cavic_tree_info_v2.parquet | 37,409 | 1.0 MB | 2026-10-05 | City of Victoria Open Data - Tree SpeciesOSM | |
TempeUSTEM | ustem_tree_info_v2.parquet | 32,986 | 856 KB | 2026-10-02 | City of Tempe Tree InventoryOSM | |
KelownaCAKEL | cakel_tree_info_v2.parquet | 25,076 | 701 KB | 2026-10-06 | City of Kelowna Open Data - Tree InventoryOSM | |
New WestminsterCANWE | canwe_tree_info_v2.parquet | 21,578 | 1.6 MB | 2026-10-04 | City of New Westminster Open Data - Tree InventoryOSM | |
AthensGRATH | grath_tree_info_v2.parquet | 19,626 | 524 KB | 2026-10-05 | OSMCity of Athens Open Data | |
BurlingtonUSBTV | usbtv_tree_info_v2.parquet | 12,805 | 595 KB | 2026-10-06 | City of Burlington VT ArcGIS FeatureServerOSM | |
MonctonCAMON | camon_tree_info_v2.parquet | 12,401 | 1.1 MB | 2026-10-05 | City of Moncton Open Data - TreesOSM | |
MilosGRMLO | grmlo_tree_info_v2.parquet | 242 | 11 KB | 2026-10-05 | OSMCommunity | |
SantoriniGRSAN | grsan_tree_info_v2.parquet | 155 | 7 KB | 2026-10-05 | OSM |
Columns
Every city file has the same schema. The freshness column is named per city (ussfo_published_data_updated_through, and so on).
| Column | Type |
|---|---|
tree_id | VARCHAR |
city | VARCHAR |
data_source | VARCHAR |
species | VARCHAR |
tree_name | VARCHAR |
plant_date | DATE |
diameter_at_breast_height | DOUBLE |
latitude | DOUBLE |
longitude | DOUBLE |
submission_photo_url | VARCHAR |
cultivar | VARCHAR |
crown_width_m | DOUBLE |
cluster_id | VARCHAR |
merged_sources | VARCHAR |
merged_tree_ids | VARCHAR |
borough | only in COBOG, GBLON, JPTYO, TWTPE, DKCPH |
source_latitude | only in USBTV |
source_longitude | only in USBTV |
position_adjustment | only in USBTV |
position_shift_m | only 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.
…/trees/full_tree_info_v2.parquet13 columns
tree_idVARCHARcityVARCHARdata_sourceVARCHARspeciesVARCHARcultivarVARCHARcrown_width_mDOUBLEtree_nameVARCHARplant_dateDATEdiameter_at_breast_heightDOUBLElatitudeDOUBLElongitudeDOUBLEsubmission_photo_urlVARCHARlatest_update_throughTIMESTAMP 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.
…/trees/tree_enrichment_v2.parquet37 columns
speciesVARCHARgenusVARCHARspecies_epithetVARCHARfamilyVARCHARsynonymsVARCHAR[]common_namesVARCHAR[]descriptionVARCHARis_evergreenBOOLEANmature_height_min_ftFLOATmature_height_max_ftFLOATcanopy_spread_min_ftFLOATcanopy_spread_max_ftFLOATgrowth_rateVARCHARlifespan_min_yearsINTEGERlifespan_max_yearsINTEGERdrought_toleranceVARCHARwater_needsVARCHARsun_exposureVARCHAR[]soil_preferencesVARCHAR[]root_behaviorVARCHARcoastal_toleranceBOOLEANsalt_toleranceBOOLEANpollution_toleranceVARCHARbloom_monthsINTEGER[]wildlife_valueVARCHARfire_riskVARCHARtree_formVARCHARusda_zone_minINTEGERusda_zone_maxINTEGERnative_ecoregionsINTEGER[]photo_urlVARCHARphoto_licenseVARCHARphoto_attributionVARCHARtrunk_photo_urlVARCHARtrunk_photo_licenseVARCHARtrunk_photo_attributionVARCHARenriched_atTIMESTAMP 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.
…/trees/ecoregion_info_v2.parquet18 columns
ecoregion_idINTEGERecoregion_nameVARCHARrealmVARCHARbiomeVARCHARbiome_codeINTEGERrealm_codeVARCHARcountry_codesVARCHAR[]centroid_latDOUBLEcentroid_lonDOUBLEgeometry_geojsonVARCHARbbox_min_latDOUBLEbbox_min_lonDOUBLEbbox_max_latDOUBLEbbox_max_lonDOUBLEis_terrestrialBOOLEANsource_versionVARCHARenriched_atTIMESTAMP WITH TIME ZONEecoregion_data_updated_throughTIMESTAMP WITH TIME ZONE
All landmarks, one file
Named landmarks across every city, for geographic context on the map.
…/landmarks/full_landmark_info_v2.parquet6 columns
landmark_idVARCHARcityVARCHARnameVARCHARlatitudeDOUBLElongitudeDOUBLElatest_landmark_update_throughTIMESTAMP 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.
Derived from these, on this site
Built from the files above at each site build. Small, JSON, and fine to hotlink.
species.json— the top 2,000 species with per-city counts, trunk statistics and traits; what the species pages are built from.tree_stats.json— the homepage numbers: per-city tree counts, species count, top ten.datasets.json— this inventory.
Reading a file
DuckDB reads Parquet over HTTP without downloading the whole file first:
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:
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:
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_sourcebeginningOSM_): © 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_licensefor 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:
- 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.
- 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.
- 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.