nz-arcgis
Discover and query allowlisted New Zealand public-sector and utility ArcGIS services and layers, including Auckland, Christchurch, Dunedin and Hamilton assets, hazards and transport data. Use for serv
SKILL.mdskills/nz-arcgis/SKILL.md
GitHubNZ ArcGIS
Use scripts/cli.py to discover public ArcGIS REST services from verified New Zealand publishers, inspect layers and extract bounded spatial records. Python 3.10+, stdlib only; keyless and read-only.
Workflow
Run
orgsto select a publisher and inspect its verified roots.Use
services ORGthenlayers ORG SERVICEto discover layer URLs. A service name includes its server type, such asPJ_Roadworks_MS/FeatureServer. Enterprise services on another root use their full allowlisted HTTPS URL.For Auckland hackathon data, use
layers --curated akl --problem F1or read references/layers-auckland.md. Names, A/B grades, problem tags, licences and caveats are machine-readable in references/layers-auckland.json. Uselayers --curated nz --publisher dccfor the wider selection; references/layers-nz.md and references/layers-nz.json document the additional council layers, Flooded NZ and PC120 services.--publisherfilters either curated selection by organisation code.Run
describe LAYER_URLbefore choosing fields or an attribute filter; it includes fields, geometry type, record count and the upstream editing timestamp when published. Problem tags: F1 flooding/flow paths; T1 congestion; T2 near-miss safety; T3 incidents/roadworks; W1 construction and demolition materials; W2 reuse/repair/recycling; W3 illegal dumping.Use
countto size a selection, thenquerywith a WGS84 bbox and small limit. Preserve the layer caveats when interpreting an extract.
Commands
python3 skills/nz-arcgis/scripts/cli.py orgs --json
python3 skills/nz-arcgis/scripts/cli.py services at --json
python3 skills/nz-arcgis/scripts/cli.py layers at PJ_Roadworks_MS/FeatureServer --json
python3 skills/nz-arcgis/scripts/cli.py layers --curated akl --problem F1 --json
python3 skills/nz-arcgis/scripts/cli.py layers --curated nz --publisher ccc --json
python3 skills/nz-arcgis/scripts/cli.py services hcc --root 0 --max-requests 1 --json
python3 skills/nz-arcgis/scripts/cli.py count https://apps.dunedin.govt.nz/arcgis/rest/services/Public/Search/FeatureServer/0 --json
python3 skills/nz-arcgis/scripts/cli.py describe https://tiles.arcgis.com/tiles/n4yPwebTjJCmXB6W/arcgis/rest/services/PC120Revised_PROD_Precincts/MapServer --json
python3 skills/nz-arcgis/scripts/cli.py query https://gis.ccc.govt.nz/server/rest/services/OpenData/Structure/FeatureServer/2 --bbox 172.635,-43.535,172.64,-43.53 --fields FenceID,Height --limit 5 --format geojson
python3 skills/nz-arcgis/scripts/cli.py query https://services-ap1.arcgis.com/eqbFSejuTufXDr0E/arcgis/rest/services/flooded_nz_gdb_v2_202603181308/FeatureServer/0 --fields objectid,obs_date,impact,obs_depth,obs_depth_v2,historic --limit 5 --json
python3 skills/nz-arcgis/scripts/cli.py search stormwater --org akl --root 0 --max-services 20 --json
python3 skills/nz-arcgis/scripts/cli.py describe https://services2.arcgis.com/JkPEgZJGxhSjYOo0/arcgis/rest/services/PJ_Roadworks_MS/FeatureServer/0 --json
python3 skills/nz-arcgis/scripts/cli.py count https://services2.arcgis.com/JkPEgZJGxhSjYOo0/arcgis/rest/services/PJ_Roadworks_MS/FeatureServer/0 --json
python3 skills/nz-arcgis/scripts/cli.py query https://services2.arcgis.com/JkPEgZJGxhSjYOo0/arcgis/rest/services/PJ_Roadworks_MS/FeatureServer/0 --bbox 174.738,-36.895,174.741,-36.888 --limit 5 --format geojson --json
python3 skills/nz-arcgis/scripts/cli.py query https://services1.arcgis.com/n4yPwebTjJCmXB6W/arcgis/rest/services/Stormwater_Pipe/FeatureServer/0 --bbox 174.919,-37.024,174.922,-37.021 --fields OBJECTID --limit 5 --format csv
- Every command accepts
--json:{"meta": {...}, "results": [...]}. GeoJSON has ametaforeign member. Provenance includes source URL, publisher, UTC retrieval time, licence when known andlatest_datawhen editingInfo.lastEditDate exists. Cached catalogue timestamps are retained. Unknown licence notes are separate from reuse terms. Errors use stdout with empty results and standard error code/type/message; human errors use stderr. queryaccepts--where(default1=1),--fields(default*for unrestricted organisations), WGS84--bbox,--limit(default 100, maximum 10,000) and--format json|geojson|csv. Flooded NZ defaults toobjectid,obs_date,impact,impact_items,obs_depth,obs_depth_v2,historic,status;*and fields outside that allowlist exit 2 before connecting. Its--where(forqueryandcount) may reference only those fields, with literals, comparison operators, parentheses andAND/OR/NOT/IN/IS/NULL/LIKE/BETWEEN/DATE/TIMESTAMP; other identifiers, functions, subqueries, quoted identifiers, comments or unparseable filters exit 2 before connecting. Itsdescribeoutput includes only allowlisted fields. Geometry uses WGS84; bbox filtering uses upstream intersects. Tables reject--bbox; use--wherefor attribute filtering. CSV requests no geometry, includes provenance columns and prefixes formula-like strings with an apostrophe.--json --format csvreturns one CSV record inresultswith counts and truncation status.layers --curated nzcombines both catalogues and lists their URLs inmeta.source_urls, retaining the primary Auckland file inmeta.source_url.- Queries first select object IDs with the same filter, sort them and fetch at most 200 IDs per batch. ID selection is bounded by a 32 MiB response and the command’s aggregate byte/deadline limits, independently of the feature limit.
matched_countreports the size of the returned ID selection; server-truncated ID selections also setincomplete. Missing returned IDs markincompleteandtruncated, withmissing_object_ids_count. Without an OID, offset paging cross-checks the count and warns that ordering is unavailable. describe,countandqueryaccept--timeout SECONDS(1–60, default 10). Enterprise MapServer layers need small bboxes; narrow the example bbox further or raise the timeout when needed. Commands have a 55-second deadline (within the common runner’s 60-second cap) and 64 MiB aggregate response bound; partial query/discovery results report truncation reasons.servicesandsearchtraverse at most two folder levels, with--max-requests(default 40, maximum 50) and optional--root INDEX. Unvisited directories and failed folders/services are returned explicitly; failed discovery entries mark coverage truncated. Discovery includes FeatureServer, MapServer and ImageServer.describealso accepts service URLs for metadata, including tiles-only PC120 maps;countandqueryrequire numeric FeatureServer/MapServer layers. Service extents retain their declared source CRS and are metadata, not GeoJSON.search TEXT --org ORGsearches all discovered service names plus layer names from at most--max-servicesservices (default 20, maximum 50), prioritising service-name matches. It reports scanned services andtruncatedwhen coverage is incomplete. Raise the bound or choose another root to widen discovery.- The client accepts only exact registry hosts and REST prefixes, including exact ArcGIS Online tenant IDs. Redirects, credentials, ports, arbitrary operations, query-string URLs and unsafe paths are refused before following them. Strip a copied
?f=jsonfrom layer URLs. - No tokens, login, edits, exports of imagery, spatial analysis or real-time flood predictions. AT roadwork status and dates can disagree: filter dates explicitly using the published field names.
- Dunedin/Hamilton road assets and Hamilton renewals are not closure feeds: catalogue roadworks/closure rows are HTML notices outside this skill. Flooded NZ is self-reported and has no stated reuse licence; the CLI restricts output fields,
--wherefilters and field descriptions to its observation allowlist. Only that Council service is allowlisted within its contractor's ArcGIS tenant. DEM/DSM identify support is deferred because the tiled image host's robots.txt disallows automated paths; service-leveldescribeon that host exits 7 before connecting. Do not crawl its metadata, tiles or identify routes.
References and checks
Read references/source-notes.md for verification results, excluded routes and bounds. references/orgs.json is the runtime allowlist; references/verification.json records live root checks, including failures. references/curation-exclusions.json records omitted catalogue feature layers.
Run scripts/test_contract.py for deterministic contracts and response assertions, and scripts/smoke_test.py for bounded live probes. Maintainers can rebuild the Auckland files using python3 skills/nz-arcgis/scripts/curate_layers.py skills/nz-data-catalogue/data/catalogue.json.gz; add --reuse-verification to retain bundled probe timestamps. Rebuild the additional selection with python3 skills/nz-arcgis/scripts/curate_more_layers.py skills/nz-data-catalogue/data/catalogue.json.gz; it verifies metadata/counts and records failures in references/more-layer-exclusions.json.