If you have landed on this page, you are likely looking for a reliable, step-by-step protocol to and actually get it to work in your Geographic Information System (GIS), statistical software (like R or Python), or web mapping platform.

library(sf) library(dplyr) gadm <- st_read("gadm36_levels.gpkg", layer="ADM_ADM_1") pop_data <- read.csv("population_estimates.csv") # has GID_1 column merged <- left_join(gadm, pop_data, by="GID_1") GADM 3.6 boundaries are high-resolution (often >1 MB per province). Use simplification before serving tiles:

GADM (Database of Global Administrative Areas) is the gold standard for boundary data. Version 3.6, released in late 2020 (with minor updates into 2021), remains one of the most widely used versions due to its stability, licensing clarity, and compatibility with legacy systems. However, novice users often struggle with file formats, projection mismatches, and API changes.

SELECT NAME_0, NAME_1, HASC_1, ISO FROM gadm36 WHERE ISO LIKE 'US%'; Here is how to work with the data after a successful download. Workflow A: Extract a single country from global Geopackage (fastest) If you downloaded the global Geopackage, you don’t need to re-download per country:

import geopandas as gpd global_gdf = gpd.read_file("gadm36_levels.gpkg", layer="ADM_ADM_1") mexico = global_gdf[global_gdf["NAME_0"] == "Mexico"] mexico.to_file("mexico_adm1.gpkg") GADM 3.6 uses GID_0 , GID_1 , GID_2 as unique identifiers. Merge using these columns – more reliable than names (which may have spaces/case issues).

Example – add population data in R: