=== Step 0: find the COG tiles from part 1 === 25 COG tiles in cloud-optimised-geotiff-python\output\tiles, 12.72 MB === Step 1: build a Catalog -> Collection -> Items tree with pystac and rio-stac === pystac 1.15.2, STAC version 1.1.0; built 25 items in 0.64 s, saved in 0.02 s 27 JSON files (165.6 kB) and 50 asset files (13.18 MB) stac/catalog.json 596 bytes stac/eryri-dem-25m/collection.json 5,371 bytes stac/eryri-dem-25m/eryri-dem-25m-SH53/eryri-dem-25m-SH53.json 6,273 bytes stac/eryri-dem-25m/eryri-dem-25m-SH97/eryri-dem-25m-SH97.json 6,277 bytes SH65 item, abridged: {"stac_extensions": ["https://stac-extensions.github.io/projection/v2.0.0/schema.json", "https://stac-extensions.github.io/raster/v1.1.0/schema.json"], "bbox": [-4.093381, 53.028914, -3.940011, 53.121278], "properties": {"os:grid_square": "SH65", "processing:software": {"rasterio": "1.5.2"}, "proj:bbox": [260000.0, 350000.0, 270000.0, 360000.0], "proj:shape": [400, 400], "proj:transform": [25.0, 0.0, 260000.0, 0.0, -25.0, 360000.0, 0.0, 0.0, 1.0], "start_datetime": "2011-01-01T00:00:00Z", "end_datetime": "2015-12-31T23:59:59Z", "created": "2026-11-03T00:00:00Z", "title": "Eryri DEM 25 m, OS square SH65", "proj:code": "EPSG:27700", "datetime": null}, "assets.dem": {"href": "./SH65.tif", "type": "image/tiff; application=geotiff; profile=cloud-optimized", "roles": ["data"]}, "dem band statistics": {"mean": 439.93389892578125, "minimum": 53.640750885009766, "maximum": 1071.8411865234375, "stddev": 202.7344970703125, "valid_percent": 100.0}, "links (rel)": ["derived_from", "derived_from", "root", "collection", "parent"]} === Step 2: validate every object against the STAC JSON schemas === validate_all: 25 items valid (plus the catalogue and collection); first pass 0.40 s (fetches the schemas), second pass 0.23 s (schemas cached) start_datetime removed: STACValidationError schema: https://schemas.stacspec.org/v1.1.0/item-spec/json-schema/item.json reason: 'start_datetime' is a required property (at properties) proj:shape as a string: STACValidationError schema: https://stac-extensions.github.io/projection/v2.0.0/schema.json reason: '400 x 400' is not of type 'array' (at properties/proj:shape) === Step 3: read the catalogue back and query it with GeoPandas === read 25 items from disk in 0.014 s; projection extension on eryri-dem-25m-SH53: code EPSG:27700, shape [400, 400], bbox [250000.0, 330000.0, 260000.0, 340000.0] point query (Yr Wyddfa (-4.0763, 53.0685)): ['SH65'] bbox query (-3.95, 53.10, -3.75, 53.25): 9 items ['SH65', 'SH66', 'SH67', 'SH75', 'SH76', 'SH77', 'SH85', 'SH86', 'SH87'] property query (maximum elevation > 800 m): 5 items square min_m mean_m max_m SH65 53.6 439.9 1071.8 SH66 33.0 492.9 1059.2 SH76 1.0 312.6 875.1 SH75 8.2 272.0 865.0 SH83 158.5 363.4 846.5 === Step 4: serve the catalogue as static files and crawl it over HTTP === crawl all items: 25 items, 27 GET requests, 165.6 kB of JSON, 0.08 s first requests: ['/catalog.json', '/eryri-dem-25m/collection.json', '/eryri-dem-25m/eryri-dem-25m-SH53/eryri-dem-25m-SH53.json'] fetch one item you already know: 1 request, 6.5 kB, 2 ms pystac-client search on the static catalogue: DoesNotConformTo: Server does not conform to ITEM_SEARCH, There is no fallback option available for search. read a 2 x 2 km window of SH65 through its asset href: 3 range requests, 285.9 kB of a 537.8 kB file, max 1071.8 m, 9 ms === Step 5: search public STAC APIs with pystac-client === Earth Search: opened landing page in 0.39 s; 9 collections cop-dem-glo-30 in bbox [-4.2521, 52.8466, -3.4867, 53.3075]: 4 items, 2 POST request(s), 0.85 s Copernicus_DSM_COG_10_N53_00_W005_00_DEM datetime 2021-04-22 s3://copernicus-dem-30m/Copernicus_DSM_COG_10_N53_00_W005_00_DEM/Copernicus_DSM_COG_10_N53_00_W005_00_DEM.tif Copernicus_DSM_COG_10_N53_00_W004_00_DEM datetime 2021-04-22 s3://copernicus-dem-30m/Copernicus_DSM_COG_10_N53_00_W004_00_DEM/Copernicus_DSM_COG_10_N53_00_W004_00_DEM.tif Copernicus_DSM_COG_10_N52_00_W005_00_DEM datetime 2021-04-22 s3://copernicus-dem-30m/Copernicus_DSM_COG_10_N52_00_W005_00_DEM/Copernicus_DSM_COG_10_N52_00_W005_00_DEM.tif Copernicus_DSM_COG_10_N52_00_W004_00_DEM datetime 2021-04-22 s3://copernicus-dem-30m/Copernicus_DSM_COG_10_N52_00_W004_00_DEM/Copernicus_DSM_COG_10_N52_00_W004_00_DEM.tif our derived_from links point at the same 4 items: True sentinel-2-l2a, May-Sep 2026, cloud < 10%: 14 items, 3 request(s), 1.36 s id date mgrs cloud_% S2A_30UVE_20260510_0_L2A 2026-05-10 30UVE 9.355050 S2B_30UVD_20260526_0_L2A 2026-05-26 30UVD 6.851021 S2B_30UVE_20260526_0_L2A 2026-05-26 30UVE 0.121609 S2A_30UVD_20260709_0_L2A 2026-07-09 30UVD 4.464607 S2C_30UVD_20260710_0_L2A 2026-07-10 30UVD 7.375222 S2B_30UVD_20260712_0_L2A 2026-07-12 30UVD 0.000561 S2A_30UVD_20260712_1_L2A 2026-07-12 30UVD 0.000645 S2B_30UVE_20260712_0_L2A 2026-07-12 30UVE 0.007792 S2A_30UVE_20260712_1_L2A 2026-07-12 30UVE 0.008869 S2B_30UVD_20260715_0_L2A 2026-07-15 30UVD 0.367485 S2B_30UVE_20260715_0_L2A 2026-07-15 30UVE 2.161486 S2C_30UVD_20260720_0_L2A 2026-07-20 30UVD 5.617763 S2B_30UVE_20260824_0_L2A 2026-08-24 30UVE 6.859924 S2B_30UVE_20260930_0_L2A 2026-09-30 30UVE 9.563044 Planetary Computer cop-dem-glo-30: 4 items, 2 requests (including the landing page), 0.48 s same item IDs as Earth Search: True example href: https://elevationeuwest.blob.core.windows.net/copernicus-dem/COP30_hh/Copernicus_DSM_COG_10_N53_00_W005_00_DEM.tif === Step 6: read pixels through asset hrefs from both catalogues === merged the 5 items with maximum > 800 m from local hrefs: 1200 x 1600 px in 0.03 s; max 1071.8 m; 58% of the box has no item clearest date covering both MGRS tiles: 2026-07-12; 4 items, using S2B_30UVD_20260712_0_L2A, S2B_30UVE_20260712_0_L2A S2B_30UVD_20260712_0_L2A: visual asset 10980 x 10980 px at 10 m, overviews [2, 4, 8, 16], 295 MB S2B_30UVE_20260712_0_L2A: visual asset 10980 x 10980 px at 10 m, overviews [2, 4, 8, 16], 229 MB Sentinel-2 true colour over the 50 x 50 km area at 100 m: 5 range requests, 2.55 MB, 4.4 s === figures === wrote 01-catalogue-tree.png, 02-item-footprints-thumbnails.png, 03-local-queries.png, 04-static-vs-api-requests.png, 05-earth-search-results.png, 06-read-through-hrefs.png