ICIMOD | Bhutan geospatial data
The International Centre for Integrated Mountain Development (ICIMOD) provides regional data for the Hindu Kush Himalaya. Its Bhutan ArcGIS services include administrative boundaries, roads, protected areas, glaciers, land cover, and hydrology. This notebook shows how to inspect the services and retrieve their features for analysis.
These are historical source layers. Check each layer's edition, scale, attribution, and administrative identifiers before joining it to current statistics. The Bhutan geospatial source register compares other boundary sources; the spatial baseline guide explains their use in social assessment.
Institutional context from the original notebook
Bhutan is a founding member of ICIMOD. The original notebook described cooperation on poverty alleviation, environmental conservation, institutional strengthening, research, and training. It identified the Ministry of Agriculture and Forests as the country nodal agency and Tashi Dorji, Programme Coordinator for KLCDI, as the focal point. These names record the original context; consult ICIMOD's Bhutan information for current arrangements.
Inspect the directory
The Bhutan service directory describes the server version and available services. The server supports HTTPS and cross-origin requests, so the notebook connects directly to ICIMOD. Each map below loads only when requested.
const directory_controller = new AbortController();
invalidation.then(() => directory_controller.abort());
const bhutan_directory = await requestArcGIS(bhutan_directory_url, {}, {signal: directory_controller.signal})
.then(data => ({ok: true, data}), error => ({ok: false, message: error.message}));
Basemap
The Basemap service contains the national outline, dzongkhag and gewog boundaries, district headquarters, roads, and protected areas. A map service can export a styled image and expose individual layers for feature queries.
The server limits each feature response. To retrieve a complete layer, the helper first requests its object IDs, then queries those IDs in bounded batches. It checks every batch against the requested IDs and requests GeoJSON in EPSG:4326. This replaces the former SDK, ArcGIS-to-GeoJSON conversion, and offset-pagination steps.
const basemap_controller = new AbortController();
invalidation.then(() => basemap_controller.abort());
const basemap = basemap_request ? await loadArcGISService(bhutan_service_url("Basemap"), [
{id: 0, label: "National outline"}, {id: 1, label: "Dzongkhag"},
{id: 2, label: "Gewog"}, {id: 3, label: "District headquarters"},
{id: 4, label: "Roads"}, {id: 5, label: "Protected areas"}
], {signal: basemap_controller.signal}) : null;
Polygon rings are copied and oriented for D3 and Plot before rendering. The source GeoJSON remains unchanged. Feature counts describe the retrieved source, rather than a truncated first response.
The original implementation used ArcGIS REST JS, Terraformer's ArcGIS conversion, and Philippe Rivière's winding helper. Those references remain useful when working with ArcGIS JSON or older notebooks; this implementation requests GeoJSON directly.
Glacier
The Glacier service contains inventories labelled 1980, 1990, 2000, and 2010, together with a combined layer. These dates identify the source series. Comparing glacier extent requires attention to image dates, classification methods, and positional accuracy.
const glacier_controller = new AbortController();
invalidation.then(() => glacier_controller.abort());
const glaciers = glacier_request ? await loadArcGISService(bhutan_service_url("Glacier"), [
{id: 0, label: "2010"}, {id: 1, label: "2000"}, {id: 2, label: "1990"},
{id: 3, label: "1980"}, {id: 4, label: "Combined inventory"}
], {signal: glacier_controller.signal}) : null;
Land cover
The Landcover service publishes raster layers for 1990, 2000, and 2010, alongside Landsat imagery. A bounded image export provides a preview. For quantitative land-cover analysis, use the underlying georeferenced data and its classification documentation.
const landcover_controller = new AbortController();
invalidation.then(() => landcover_controller.abort());
const image_data = landcover_request ? await requestArcGIS(bhutan_service_url("Landcover"), {}, {signal: landcover_controller.signal})
.then(data => ({ok: true, data}), error => ({ok: false, message: error.message})) : null;
The export request uses URLSearchParams to keep the bounding box, coordinate reference, layer ID, and image dimensions separate. The server may adjust the extent to match the image's aspect ratio; the returned extent is used for georeferencing.
const raster_controller = new AbortController();
invalidation.then(() => raster_controller.abort());
const url_export = image_data?.ok && select_layers ? landcoverExportUrl(bhutan_service_url("Landcover"), image_data.data, {layer: select_layers.id, format: select_format, width: 960, height: 600, response: "json"}) : null;
const raster_result = url_export ? await requestArcGIS(url_export, {}, {signal: raster_controller.signal})
.then(data => ({ok: true, data}), error => ({ok: false, message: error.message})) : null;
World files store pixel size and the centre of the upper-left pixel in six lines: x scale, two rotation terms, y scale, x origin, and y origin. They describe image placement; the coordinate reference should accompany the image separately. See Esri's world-file specification.
Physiography
The Physiography service provides sub-basins, basins, drainage, and glacial lakes. Retrieve complete layer features with the same ID-based approach used for the basemap. Basin and drainage boundaries describe hydrological relationships; settlement exposure needs additional evidence on people, infrastructure, and the hazard pathway.
const physiography_controller = new AbortController();
invalidation.then(() => physiography_controller.abort());
const physiography = physiography_request ? await loadArcGISService(bhutan_service_url("Physiography"), [
{id: 0, label: "Sub-basins"}, {id: 1, label: "Basins"},
{id: 2, label: "Drainage"}, {id: 3, label: "Glacial lakes"}
], {signal: physiography_controller.signal}) : null;
Using the layers
Retain the service URL, retrieval date, layer metadata, coordinate reference, and feature counts with each analysis. Reviewed derivatives can be shared using the site's map and data workflow. Archived source access follows the citation manager's reader permissions.