Planetary-scale answers, unlocked.
A Hands-On Guide for Working with Large-Scale Spatial Data. Learn more.
Authors
Land cover classification is the process of labeling each part of the Earth's surface by the physical material that covers it. Examples are water, tree canopy, grass, crops, bare soil, or pavement. Remote sensing measures the surface from satellites and aircraft. In remote sensing, a classifier (a rule or model) assigns every pixel or segment of satellite or aerial imagery to one class. The classes come from a fixed list, the legend, and the result is a land cover map. Agencies, insurers, planners, and climate scientists use these maps to measure where forests, farms, and cities are and how they change. This article tests the claim that a map's accuracy score depends on its reference sample, and that two good maps of one place disagree.
Key takeaways
Overture Maps defines land cover as the physical thing covering the land, and land use as the human use to which the land is being put.
Imagery records land cover directly, because pixel values measure the surface. Land use needs context. A field of grass looks the same in imagery whether it is a park, a pasture, or a vacant lot. Many products combine the two and are labeled land use land cover (LULC).
A classification system fixes the classes and their levels so maps from different agencies and years stay comparable. Legends vary with purpose. NASA's Earth Observatory notes that land cover maps range from two categories for flood maps to seventeen for standard global maps.
Most systems share these types: water, forest or tree cover, shrubland, grassland, cropland, wetland, developed or built-up land, barren land, and snow and ice. The best-known five-class level is the top of CORINE Land Cover, Europe's inventory. Its five classes are artificial surfaces, agricultural areas, forests and semi-natural areas, wetlands, and water bodies. CORINE splits them into 15 classes at level two and 44 at level three.
The Anderson system, U.S. Geological Survey (USGS) Professional Paper 964 by Anderson, Hardy, Roach, and Witmer (1976), set a US federal standard for classifying land from remote sensor data. It fixed the first two levels of a national legend so maps from different agencies could be added together. It left levels three and four for agencies to extend.
The National Land Cover Database (NLCD) still uses a modified Anderson Level II, with two-digit codes:
The developed classes are split by impervious surface: Developed, Open Space has less than 20% impervious cover, and Developed, Low Intensity has 20% to 49%.
Global products use the United Nations Food and Agriculture Organization's Land Cover Classification System (LCCS), which Di Gregorio and Jansen published in 2000. Unlike Anderson's fixed levels, LCCS sorts land through a series of two-way choices. It builds each class from separate diagnostic criteria, such as life form and cover density, so any legend can be translated into any other. ESA WorldCover defines its 11 classes with LCCS, from Tree cover and Cropland to Built-up and Mangroves. Global maps from MODIS, the Moderate Resolution Imaging Spectroradiometer, use the 17-class legend of the International Geosphere-Biosphere Programme (IGBP). The Dynamic World taxonomy stays close to the land categories of the Intergovernmental Panel on Climate Change (IPCC): forest land, grassland, cropland, wetland, settlement, and other.
Ned Horning's guide to land cover classification methods for the American Museum of Natural History sorts classifiers into families:
Resolution sets which classes a map can show. At 30 m a pixel mixes a house, its yard, and the street, so NLCD measures developed intensity by percent impervious cover. At 1 m, the Chesapeake Conservancy maps structures, roads, and tree canopy over roads as separate classes. In the header image of Rockville, Maryland, the 1 m map separates single houses and roads, and the 10 m map merges them into built-up blocks.
Accuracy assessment compares the map with reference labels at sample locations. It tabulates the result in an error matrix, a table of mapped class against true class, as Congalton set out in his 1991 review. The matrix gives overall accuracy, user's accuracy (how often a mapped class is right on the ground), and producer's accuracy (how much of a true class the map found). Olofsson and colleagues' good practices (2014) add a probability sample, where every location has a known chance of selection. They also add class areas estimated from that sample with confidence intervals, because pixel counts include every misclassified pixel.
Well-known examples of satellite image land cover classification:
Land cover maps measure impervious surfaces, such as roofs and pavement, where rain runs off, for flood risk models and stormwater fees. Forest extent and loss go into carbon accounting. Catastrophe models use vegetation near structures for wildfire exposure. Planners start tree canopy targets and heat mapping from a land cover map.
Resolution, update frequency, and class detail trade off against each other.
Land cover change is the shift from one class to another between dates, such as forest to development or pasture to cropland. Annual NLCD publishes a land cover change product that joins the before and after codes into one number. 8123 means Pasture/Hay became Developed, Medium Intensity, and 7182 means Grassland/Herbaceous became Cultivated Crops.
Comparing two independent maps exaggerates change, because each map's errors look like change. ESA warns that differences between its 2020 and 2021 WorldCover maps mix real change with algorithm changes. USGS Land Change Monitoring, Assessment, and Projection (LCMAP) instead models each pixel's full record of observations with Zhu and Woodcock's Continuous Change Detection and Classification (CCDC) algorithm. CCDC fits a harmonic model, a smooth yearly curve, to every clear Landsat observation. It flags a break when new observations depart from the curve. The Chesapeake Conservancy reports its 2013 to 2022 change data captures 96% of land cover changes with a mapped accuracy of 77%. Change detection covers the methods in depth.
Overture land cover in the Havasu catalog holds ESA WorldCover classes as polygons, with Overture land use alongside. Overture stores polygons for several map resolutions, marked by cartography.min_zoom and cartography.max_zoom, so an area summary must filter to one first. The WorldCover rasters are public Cloud Optimized GeoTIFFs. WherobotsDB reads them in place in S3 as out-of-database rasters, fetching only the tiles a query touches.
cartography.min_zoom
cartography.max_zoom
The queries below read these inputs:
This query counts WorldCover 2021 pixels by class in a box around Rockville, Maryland, the place in the header image:
-- WorldCover 2021 class counts for a box around Rockville, Maryland WITH box AS ( SELECT ST_GeomFromText('POLYGON((-77.21 39.04, -77.09 39.04, -77.09 39.13, -77.21 39.13, -77.21 39.04))', 4326) AS g ), wc AS ( -- 1024-pixel tiles of the 3 by 3 degree file, read on demand SELECT RS_TileExplode(RS_FromPath('s3://esa-worldcover/v200/2021/map/ESA_WorldCover_10m_2021_v200_N39W078_Map.tif'), 1024, 1024) AS (x, y, rast) ), c AS ( -- RS_Clip(raster, band, geometry, allTouched, noDataValue, crop) SELECT /*+ BROADCAST(box) */ RS_Clip(wc.rast, 1, box.g, false, 0, true) AS c FROM wc CROSS JOIN box WHERE RS_Intersects(wc.rast, box.g) ) SELECT v AS worldcover_class, COUNT(*) AS pixels, ROUND(100 * COUNT(*) / SUM(COUNT(*)) OVER (), 1) AS pct FROM (SELECT explode(RS_BandAsArray(c, 1)) AS v FROM c) WHERE v > 0 GROUP BY v ORDER BY pixels DESC;
One WherobotsDB query returns the class counts of the box's 1,555,200 pixels in about 20 seconds. Tree cover is 64.3%, built-up 23.2%, grassland 11.2%, permanent water 0.6%, bare or sparse vegetation 0.4%, and cropland 0.2%. RS_TileExplode splits the 3 by 3 degree file into 1024-pixel tiles, and only tiles intersecting the box are clipped.
Swapping the box for parcel, tract, or watershed polygons gives a zonal summary, the class shares in each polygon. WherobotsDB runs raster and vector in one engine; most stacks pick one.
ESA produced WorldCover 2020 with algorithm v100 and WorldCover 2021 with v200. Both maps share one 10 m grid. This cross-tabulation counts the Rockville pixels for each pair of 2020 and 2021 classes:
-- Cross-tabulate WorldCover 2020 (v100) and 2021 (v200) pixels in one box WITH box AS ( SELECT ST_GeomFromText('POLYGON((-77.21 39.04, -77.09 39.04, -77.09 39.13, -77.21 39.13, -77.21 39.04))', 4326) AS g ), t20 AS ( SELECT RS_TileExplode(RS_FromPath('s3://esa-worldcover/v100/2020/map/ESA_WorldCover_10m_2020_v100_N39W078_Map.tif'), 1024, 1024) AS (x, y, rast) ), t21 AS ( SELECT RS_TileExplode(RS_FromPath('s3://esa-worldcover/v200/2021/map/ESA_WorldCover_10m_2021_v200_N39W078_Map.tif'), 1024, 1024) AS (x, y, rast) ), pairs AS ( -- the two files share one grid, so tile (x, y) covers the same ground in both SELECT /*+ BROADCAST(box) */ RS_BandAsArray(RS_Clip(a.rast, 1, box.g, false, 0, true), 1) AS v20, RS_BandAsArray(RS_Clip(b.rast, 1, box.g, false, 0, true), 1) AS v21 FROM t20 a JOIN t21 b ON a.x = b.x AND a.y = b.y CROSS JOIN box WHERE RS_Intersects(a.rast, box.g) ), cells AS ( SELECT z.v20 AS class_2020, z.v21 AS class_2021 FROM (SELECT explode(arrays_zip(v20, v21)) AS z FROM pairs) WHERE z.v20 > 0 AND z.v21 > 0 ) SELECT class_2020, class_2021, COUNT(*) AS pixels, ROUND(100 * COUNT(*) / SUM(COUNT(*)) OVER (), 2) AS pct FROM cells GROUP BY class_2020, class_2021 ORDER BY pixels DESC;
The query runs in about 20 seconds. Of the 1,555,200 pixels, 91.0% keep the same label and 9.0%, or 140,716 pixels, change. The largest moves are tree cover to built-up (2.6%), grassland to tree cover (1.6%), tree cover to grassland (1.0%), and bare or sparse vegetation to built-up (0.9%). Built-up land rises from 20.1% of the box in the 2020 map to 23.2% in 2021, and bare land falls from 1.8% to 0.4%. The 9.0% is label disagreement, which mixes real change with the algorithm change. A pixel can also change on the ground yet keep its label. Without reference labels, the 9.0% is neither an upper nor a lower bound on real change in Rockville.
The catalog also holds imagery for custom classification: Sentinel-2 seasonal mosaics at 10 m and USDA NAIP aerial imagery at 30 cm to 1 m. NAIP is the National Agriculture Imagery Program of the U.S. Department of Agriculture. RasterFlow (Public Preview) builds mosaics from imagery, runs computer vision inference on them, and writes the results as vectorized outputs on the same platform. For land cover, the input is cloud-free Sentinel-2 composites with all 12 L2A (surface reflectance) bands at 10 m. A segmentation model runs through the bring-your-own-model path, and the output is class polygons. This call builds a harvest-season mosaic for an area of interest and writes it to your bucket as Zarr, a cloud format for large arrays:
# Build a cloud-free Sentinel-2 composite as the input for a land cover model from datetime import datetime from rasterflow_remote import RasterflowClient, DatasetEnum client = RasterflowClient() result = client.build_mosaics( datasets=[DatasetEnum.S2_MED_HARVEST], aoi="s3://my-company-data/aois/project.parquet", # one or multiple geometries start=datetime(2024, 1, 1), end=datetime(2025, 1, 1), bucket="s3://my-company-data/rasterflow/results", ) print(result.first_row_mosaic)
The change detection workflow stacks two seasons or years of imagery for one model run. For change without training labels, RasterFlow scores the AlphaEarth embedding distance across years. An embedding is a list of numbers that summarizes each pixel. Classified polygons load into WherobotsDB, where a spatial join summarizes land cover by parcel, watershed, or county. WherobotsDB is built by the original creators of Apache Sedona and is 100% code compatible across all spatial functions.
Loveland and colleagues built IGBP DISCover (International Journal of Remote Sensing, 2000) with the IGBP legend. They used 1 km data from AVHRR, the Advanced Very High Resolution Radiometer. Friedl and colleagues' MODIS Collection 5 land cover (Remote Sensing of Environment, 2010) moved to 500 m. Gong and colleagues' FROM-GLC (2013) and Chen and colleagues' GlobeLand30 (2015) reached 30 m with Landsat. FROM-GLC stands for Finer Resolution Observation and Monitoring of Global Land Cover. Buchhorn and colleagues' Copernicus Global Land Cover Layers (2020) added cover fractions, the share of each class in each pixel, at 100 m. The 10 m generation came with Sentinel-2: ESA WorldCover (Zanaga and colleagues), Dynamic World (Brown and colleagues, 2022), and the Impact Observatory and Esri maps (Karra and colleagues, 2021).
The 1 m generation is regional. Robinson and colleagues' Large Scale High-Resolution Land Cover Mapping with Multi-Resolution Data (CVPR 2019) trained on the Chesapeake Conservancy's 1 m labels. The authors used 30 m NLCD as coarse labels to extend the model to the rest of the conterminous US.
Congalton's error matrix and Foody's Status of land cover classification accuracy assessment (2002) set the standard terms. Pontius and Millones' Death to Kappa (2011) argued that kappa, a statistic that adjusts accuracy for chance agreement, misleads. They split disagreement into quantity (wrong class proportions) and allocation (right proportions, wrong places). Stehman and Foody's Key issues in rigorous accuracy assessment of land cover products (2019), with the Olofsson good practices, made probability sampling and sample-based area estimates the standard.
The 10 m global maps show why. Venter and colleagues compared Dynamic World, WorldCover, and Esri Land Cover (Remote Sensing, 2022) against global reference data. They found overall accuracy of 75% for Esri, 72% for Dynamic World, and 65% for WorldCover. ESA's own validation sample gives WorldCover 74.4% and 76.7%, so the score depends on the reference sample as much as on the map.
Woodcock and Strahler's The factor of scale in remote sensing (1987) showed that the right pixel size depends on three things. They are the information wanted, the method, and the spatial structure of the scene. Fisher's The pixel: a snare and a delusion (1997) argued that treating a pixel as one uniform patch of ground is a mistake. At 10 m, a pixel on a suburban street holds part of a roof, a lawn, a tree crown, and asphalt, and the map can record only one label.
Finer pixels bring occlusion: one object hides another from the sensor. Robinson, Corley, and colleagues' Seeing the roads through the trees (2024) built the ChesapeakeRSC benchmark from 1 m NAIP imagery of Maryland, with a class for tree canopy over roads. A U-Net trained on the benchmark reached 84% recall on visible roads and 63.5% on roads under canopy. Recall is the share of true road pixels found. It drops under canopy because the pixels above a covered road look like trees. RasterFlow ships the ChesapeakeRSC model. Its Maryland output is in the Havasu catalog.
For land cover classification, the evidence shows that pixel size limits the classes, and the measuring method shapes accuracy and change figures.
Query land cover rasters and polygons with spatial SQL with a Wherobots free trial at cloud.wherobots.com.
Land cover classification in remote sensing is the process of assigning every pixel or area in satellite or aerial imagery to a land cover class. Examples are water, tree canopy, grassland, cropland, or developed land. A classifier is a rule or model, from a simple decision rule to a deep learning network. It is trained on labeled example pixels of each class, using their values in each spectral band and their spatial patterns, and then applied to the whole image.
There is no single official list, because each classification system sets its own legend. The best-known five-class level is the top level of CORINE Land Cover: artificial surfaces, agricultural areas, forests and semi-natural areas, wetlands, and water bodies. CORINE splits these into 15 classes at level two and 44 at level three. Other systems use more top-level classes: ESA WorldCover has 11, Annual NLCD 16, and the IGBP legend 17.
The main types of land cover are water, forest or tree cover, shrubland, grassland, cropland, wetland, developed or built-up land, barren or sparsely vegetated land, and snow and ice. Detailed systems split these further, for example NLCD’s four developed classes by percent impervious surface and three forest classes (deciduous, evergreen, and mixed).
Land classification is the grouping of land into categories by a shared property. Land cover classification groups land by its physical surface, such as forest or pavement. Land use classification groups it by human purpose, such as housing or farming. Land capability and soil classifications group it by suitability for agriculture. The USGS Anderson system of 1976 covers both land use and land cover.
Most land cover systems start from a short list of broad groups. The list has water, forest or tree cover, grassland and shrubland, cropland, and wetland. It also has developed or built-up land, bare ground, and snow and ice. The IPCC land categories (forest land, grassland, cropland, wetland, settlement, and other land) are a common reference. Detailed systems such as NLCD split these into subclasses.
Land cover is the physical material on the surface, such as trees, grass, water, or pavement. Land use is the human purpose of the land, such as housing, farming, recreation, or industry. A golf course has grass and tree land cover and a recreational land use. Imagery shows land cover directly, while land use usually needs other data such as parcels or zoning.
In supervised classification, an analyst labels sample pixels for each class and an algorithm such as a random forest is trained on them. In unsupervised classification, a clustering algorithm such as k-means or ISODATA groups similar pixels first, and the analyst names each cluster afterward. Supervised methods need training data; unsupervised methods need interpretation after the run.
Accuracy is measured by comparing the map with independent reference labels at sample locations and tabulating the result in an error matrix, a table of mapped class against true class. The matrix gives overall accuracy, user’s accuracy for each mapped class, and producer’s accuracy for each true class. Good practice uses a probability sample and reports class areas with confidence intervals, as Olofsson and colleagues set out in 2014.
Land cover change is a shift from one land cover class to another over time. Examples are forest cleared for housing, pasture converted to cropland, or wetland that becomes woody wetland. It is measured by comparing classified maps from two or more dates. Annual NLCD records each change with the before and after class codes.
Examples of land cover change include forest replaced by a new subdivision, cropland returning to grassland, a reservoir flooding a valley, and wildfire converting forest to shrubland. The Annual NLCD change legend gives examples such as Pasture/Hay to Developed, Medium Intensity and Grassland/Herbaceous to Cultivated Crops.
Free land cover data includes NLCD from the USGS and the Multi-Resolution Land Characteristics (MRLC) consortium for the United States, and ESA WorldCover for global 10 m maps. Other sources are Dynamic World for near real-time 10 m class probabilities, CORINE Land Cover for Europe, and Chesapeake Conservancy 1 m data for the Chesapeake Bay watershed. Overture Maps publishes land cover polygons derived from ESA WorldCover.
What is a Semantic Layer? Definition, Examples, Spatial Rules
A semantic layer defines business terms and metrics once, so every tool gives the same answer. For location data it must also set the boundary, the distance and what counts as inside.
What is a Geofence? How Geofencing Works, With Examples
A geofence is a virtual boundary that triggers an action when a device enters or leaves it. How geofencing works, its uses and limits, and a test on ship data.
What is Map Matching? GPS Traces, Methods and Examples
Map matching places each GPS record on the road a vehicle drove. How it works, nearest-road snapping vs hidden Markov models, and a test on Ann Arbor drives.
share this article
Awesome that you’d like to share our articles. Where would you like to share it to: