LogoLogo
OS Docs HomeOS NGDOS APIs OS Download ProductsMore than MapsOS Data Hub
  • OS NGD Documentation
  • GETTING STARTED
    • OS NGD Key Benefits to Customers
    • OS NGD Core Principles
      • Terminology and access
      • File formats and naming
      • Data ordering and currency
      • COU supplies
      • Data schema versioning
      • Unique identifiers
      • Coordinate reference systems
      • Attribute information for feature types
    • OS NGD Sample Data Information
    • OS NGD Webinars, Tutorials and Case Studies
  • ACCESSING OS NGD
    • Downloading with OS Select+Build
      • Getting Started with GeoPackage
        • ArcGIS Pro
        • ArcMap
        • Cadcorp SIS
        • MapInfo Professional
        • QGIS
        • FME
        • GDAL
      • Getting Started with CSV
        • Loading CSV files
        • Processing COUs
      • Getting Started with Attribute Filtering
      • Getting Started with Temporal Filtering
    • Accessing OS NGD APIs
      • Getting started with an API project
      • OS NGD API – Features
        • What data is available?
        • Technical Specification
          • Landing page
          • Conformance
          • Collections
          • Collection
          • Schema
          • Queryables
          • Features
          • Feature
        • Getting Started
          • GIS Software
            • Cadcorp SIS
            • ESRI ArcGIS Online
            • ESRI ArcGIS Pro
            • QGIS
          • Libraries
            • Leaflet
            • MapLibre GL JS
            • OpenLayers
            • Python (Geopandas)
        • Code Examples
      • OS NGD API – Tiles
        • What data is available?
        • Technical Specification
          • Landing page
          • Conformance
          • Collections
          • Collection
          • Tile Matrix Sets
          • Tiles
          • Styles
        • Getting Started
          • GIS Software
            • Cadcorp SIS
            • QGIS
          • Libraries
            • Leaflet
            • MapLibre GL JS
            • OpenLayers
        • Code Examples
    • Additional Resources
      • Tutorials
      • Stylesheets
  • OS NGD NEWS
    • OS NGD News
    • What's New?
    • Change Log
    • OS NGD Improvements
    • Future OS NGD Data Enhancements
  • Data and Service Status
    • Data and Service Status Information
  • 🆕Live Service Disruption and Planned Maintenance
  • Current Known Data Issues
  • 🆕Resolved Data Issues
  • USING OS NGD DATA
    • OS NGD Buildings
      • Building Feature Type
      • How Building data is created
      • Building attribution
      • Known limitations
      • Summary
    • OS NGD Structures
      • Field Boundary
        • Field Boundary Feature Type
        • How Field Boundary data is created
        • Field Boundary attribution
        • Known limitations
        • Summary
    • OS NGD Transport
      • Pavements
        • Pavement polygons
        • Pavement attribution
        • Pavement Link feature type
      • Trams
        • Tram attribution on Road Link
        • Tram On Road Feature Type
        • Trams in the Rail Network
      • Street Light
        • Known limitations
    • OS NGD Land Cover Enhancements
      • Introduction
      • Habitat mapping
      • Percentage coverage
      • Cross reference table
      • Known limitations
      • Summary
    • Data Catalogue
    • FAQs
    • OS NGD Product Viewer Tool
  • DATA STRUCTURE
    • OS NGD Address
      • GB Address
        • Built Address
        • Historic Address
        • Non-Addressable Object
        • Pre-Build Address
        • Street Address
      • Islands Address
        • Built Address
        • Historic Address
        • Non-Addressable Object
        • Pre-Build Address
        • Street Address
      • Related Components
        • Alternate Address
        • Postal Address
        • Other Classification
        • Related Entity
      • Versioning information
      • GB Address Local Custodian Codes
      • Islands Address Local Custodian Codes
    • OS NGD Administrative and Statistical Units
      • Boundaries
        • Boundary High Water Mark
        • Ceremonial County
        • Country
        • Devolved Parliament Constituency
        • Devolved Parliament Electoral Region
        • Electoral Division
        • GLA Assembly Constituency
        • Historic County
        • Historic European Region
        • Lower Tier Local Authority
        • Parish Or Community
        • Polling District
        • Region
        • Regional Authority
        • Upper Tier Local Authority
        • Ward
        • Westminster Constituency
    • OS NGD Buildings
      • Building Features
        • Building
        • 🆕Building Access Location
        • Building Line
        • Building Part
    • OS NGD Geographical Names
      • Named Features
        • 🆕Crowd Sourced Name Point
        • Named Area
        • Named Point
        • Named Road Junction
    • OS NGD Land
      • Land Features
        • Land
        • Land Point
        • Landform
        • Landform Line
        • Landform Point
    • OS NGD Land Use
      • Land Use Features
        • Site
        • Site Access Location
        • ❌Site Routing Point
    • OS NGD Structures
      • Structure Features
        • Compound Structure
        • Field Boundary
        • Structure
        • Structure Line
        • Structure Point
    • OS NGD Transport
      • Routing and Asset Management Information (RAMI)
        • Average And Indicative Speed
        • Highway Dedication
        • Maintenance Area
        • Maintenance Line
        • Maintenance Point
        • Reinstatement Area
        • Reinstatement Line
        • Reinstatement Point
        • Restriction
        • Routing Hazard
        • Routing Structure
        • Special Designation Area
        • Special Designation Line
        • Special Designation Point
      • Transport Features
        • Cartographic Rail Detail
        • Rail
        • Road Line
        • Road Track Or Path
        • 🆕Street Light
      • Transport Network
        • Connecting Link
        • Connecting Node
        • Ferry Link
        • Ferry Node
        • Ferry Terminal
        • Path
        • Path Link
        • Path Node
        • Pavement Link
        • Railway Link
        • Railway Link Set
        • Railway Node
        • Road
        • Road Junction
        • Road Link
        • Road Node
        • Street
        • Tram On Road
    • OS NGD Water
      • Water Features
        • Inter Tidal Line
        • River Basin District Catchment
        • Tidal Boundary
        • Water
        • Water Point
        • Waterbody Catchment
      • Water Network
        • Water Link
        • Water Link Set
        • Water Node
  • Code Lists
    • Code Lists Overview
      • accesstypevalue
      • 🆕accesslevelvalue
      • 🆕accessmodevalue
      • 🆕accessobstructionvalue
      • 🆕accesspurposevalue
      • addressbasepostalvalue
      • addressclassificationsourcevalue
      • addressdescriptionvalue
      • addressstatusvalue
      • addressstreettypevalue
      • associatedstreetdatadescriptionvalue
      • averageandindicativespeeddescriptionvalue
      • basementpresencesourcevalue
      • boundaryhighwatermarkdescriptionvalue
      • boundarytypevalue
      • 🆕buildingaccesslocationdescriptionvalue
      • buildingageperiodvalue
      • buildingagesourcevalue
      • buildingconnectivitytypevalue
      • buildingdescriptionvalue
      • buildinglinedescriptionvalue
      • buildingpartdescriptionvalue
      • buildingpartoslandcovertieravalue
      • buildingpartoslandcovertierbvalue
      • buildingusevalue
      • buildstatusvalue
      • builtstructureheightconfidencevalue
      • capturemethodvalue
      • capturespecificationvalue
      • ceremonialcountydescriptionvalue
      • changetypevalue
      • classificationcorrelationvalue
      • compoundstructuredescriptionvalue
      • connectinglinkdescriptionvalue
      • connectingnodedescriptionvalue
      • constructionmaterialsourcevalue
      • constructionmaterialvalue
      • countryvalue
      • countrydescriptionvalue
      • 🆕crowdsourcednamedescriptionvalue
      • 🆕crowdsourcednamematchtypevalue
      • cyclefacilityvalue
      • dataentitycatalogue
      • dedicationvalue
      • devolvedparliamentconstituencydescriptionvalue
      • devolvedparliamentelectoralregiondescriptionvalue
      • electoraldivisiondescriptionvalue
      • extentoflinkvalue
      • ferrylinkdescriptionvalue
      • ferrynodedescriptionvalue
      • ferryterminaldescriptionvalue
      • fieldboundarydescriptionvalue
      • formofroadnodevalue
      • formofwaytypevalue
      • gaugevalue
      • glaassemblyconstituencydescriptionvalue
      • gssrolevalue
      • hazardtypevalue
      • heightingmethodvalue
      • highwaydedicationnetworkfeaturetypevalue
      • historiccountydescriptionvalue
      • historiceuropeanregiondescriptionvalue
      • intertidallinedescriptionvalue
      • 🆕illuminationvalue
      • junctiontypedescriptionvalue
      • landdescriptionvalue
      • landformdescriptionvalue
      • landformlinedescriptionvalue
      • landformpointdescriptionvalue
      • landoslandcovertieravalue
      • landoslandcovertierbvalue
      • landformvalue
      • landpointdescriptionvalue
      • languagevalue
      • linkdirectionvalue
      • 🆕linkreferenceconfidencevalue
      • lowertierlocalauthoritydescriptionvalue
      • maintenancevalue
      • 🆕matchedfeaturetypengdvalue
      • 🆕matchedthemengdvalue
      • matchstatusvalue
      • classificationcorrelationvalue
      • namedareaextentdefinitionvalue
      • nameddatevalue
      • nameddayvalue
      • namedescriptiongroupvalue
      • namedescriptionvalue
      • namedperiodvalue
      • namedroadjunctiondescriptionvalue
      • namedtimevalue
      • networkfeaturetypevalue
      • 🆕networknodefeaturetypevalue
      • networkoverunderbridgevalue
      • operationalstatevalue
      • operationalstatusvalue
      • oslandusetieravalue
      • oslandusetierbvalue
      • parentboundarydescriptionvalue
      • parentfeaturetypevalue
      • parishorcommunitydescriptionvalue
      • pathdescriptionvalue
      • pathnodedescriptionvalue
      • physicallevelvalue
      • 🆕physicalstatevalue
      • physicallevelvalue
      • pollingdistrictdescriptionvalue
      • positionalaccuracyvalue
      • postcodetypevalue
      • presencevalue
      • raildescriptionvalue
      • raildetaildescriptionvalue
      • railoslandcovertieravalue
      • railoslandcovertierbvalue
      • railwaylinkdescriptionvalue
      • railwaylinksetdescriptionvalue
      • railwaynodedescriptionvalue
      • railwayusevalue
      • regionalauthoritydescriptionvalue
      • regiondescriptionvalue
      • reinstatementtypevalue
      • relationshiptypevalue
      • restrictiontypedescriptionvalue
      • restrictionvalue
      • riverbasindistrictcatchmentdescriptionvalue
      • roadclassificationvalue
      • roaddescriptionvalue
      • roadfunctionvalue
      • roadlinedescriptionvalue
      • roadnodedescriptionvalue
      • roadstructurevalue
      • roadtrackorpathdescriptionvalue
      • roadtrackorpathoslandcovertieravalue
      • roadtrackorpathoslandcovertierbvalue
      • roadwidthconfidencelevelvalue
      • 🆕roofconfidenceindicatorvalue
      • 🆕roofmaterialvalue
      • 🆕roofshapevalue
      • pavementdescriptionvalue
      • sideofroadvalue
      • siteaccesslocationdescriptionvalue
      • sitedescriptionvalue
      • siteextentdefinitionvalue
      • siteroutingpointdescriptionvalue
      • sourceofmeasurevalue
      • specialdesignationtypevalue
      • stakeholdervalue
      • statusvalue
      • streetclassificationvalue
      • streetdescriptionvalue
      • streetgeometrysourcevalue
      • 🆕streetlightdescriptionvalue
      • streetstatevalue
      • streetsurfacevalue
      • streettypevalue
      • structuredescriptionvalue
      • structureoslandcovertieravalue
      • structureoslandcovertierbvalue
      • structurelinedescriptionvalue
      • structurepointdescriptionvalue
      • structuretypevalue
      • structurevalue
      • surfacetypevalue
      • themevalue
      • tidalboundarydescriptionvalue
      • trackrepresentationvalue
      • tramdescriptionvalue
      • 🆕transportfeaturetypevalue
      • uppertierlocalauthoritydescriptionvalue
      • usrnmatchindicatorvalue
      • vehiclequalifiervalue
      • warddescriptionvalue
      • waterbodycatchmentdescriptionvalue
      • waterbodycategoryvalue
      • waterdescriptionvalue
      • wateroslandcovertieravalue
      • wateroslandcovertierbvalue
      • waterlinkdescriptionvalue
      • waterlinkflowdirectionvalue
      • waterlinkgeometrysourcevalue
      • waterlinklevelofdetailvalue
      • waterlinkpermanencevalue
      • waterlinkphysicalcontainmentvalue
      • waterlinkprimacyvalue
      • waterlinksetdescriptionvalue
      • waterlinkwatertypevalue
      • watermarkvalue
      • waternodedescriptionvalue
      • waterpointdescriptionvalue
      • watertypevalue
      • westminsterconstituencydescriptionvalue
      • yesnovalue
  • EXTRA LINKS
    • Accessibility
    • Contact Us
    • Copyright
    • PSGA Product Summary
Powered by GitBook
On this page
  • What you'll need
  • What's next?

Was this helpful?

Export as PDF
  1. ACCESSING OS NGD
  2. Accessing OS NGD APIs
  3. OS NGD API – Features
  4. Getting Started
  5. Libraries

Leaflet

Accessing OS NGD API – Features via Leaflet

PreviousLibrariesNextMapLibre GL JS

Last updated 4 months ago

Was this helpful?

is an open-source JavaScript library for displaying interactive maps on the web or mobile. A simple and lightweight library that will enable you to display and visualise location data and build dynamic applications.

What you'll need

  • OS Maps API and OS NGD API – Features added to an API project in the OS Data Hub with an API Key. See for more information.

  • A text editor like Visual Studio Code or Notepad to edit and save your HTML and JavaScript files.

1

Set up your HTML file

  • Create a new HTML file with a text editor (for example, Notepad, Visual Studio Code).

  • Add the basic HTML structure to your file with a placeholder <div> for the map.

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>OS NGD API – Features | Template (EPSG:3857) | Leaflet</title>
    
    <!--Add the Ordnance Survey Styling-->
    <link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/OrdnanceSurvey/os-api-branding@0.3.1/os-api-branding.css" />
    <script src="https://cdn.jsdelivr.net/gh/OrdnanceSurvey/os-api-branding@0.3.1/os-api-branding.js"></script>
    
    <!--Add the Leaflet libraries-->
    <link rel="stylesheet" href="https://unpkg.com/leaflet@1.9.4/dist/leaflet.css" />
    <script src="https://unpkg.com/leaflet@1.9.4/dist/leaflet.js"></script>
    
   
    <style>
        /* Set the map container size and style */
        body { margin: 0; padding: 0; }
        #map { position: absolute; top: 0; bottom: 0; width: 100%; }
    </style>
</head>
<body>
    
    <!--Create a div element to hold the map-->
    <div id="map"></div>
    
    <!--Add your Javascript code below--> 
    <script>
        // Your Javascript code will go here

    </script>

</body>
</html>

2

Insert your API Key and OS NGD collection

  • To enable access to OS APIs an API Key is required. Inside the <script> tag, add a variable called apiKey, replacing 'INSERT_API_KEY_HERE' with the API Key from your project.

  • Add a variable called collectionID, replacing 'INSERT_COLLECTIONID_HERE' with the collection ID for the desired OS NGD feature type and version (for example, bld-fts-buildingpart-1).

// Set API Key 
 const apiKey = 'INSERT_API_KEY_HERE';
 
 const collectionId= 'INSERT_COLLECTIONID_HERE';
3

Add a basemap

  • Define the configuration options for the map, defining minZoom, maxZoom, center, zoom, maxBounds, attributionControl.

    • minZoom and maxZoom: Sets the minimum and maximum zoom level for the map. Users will not be able to go beyond these levels.

    • center: Sets the initial centre point of the map.

    • zoom: Sets the initial zoom level of the map.

    • maxBounds: Defines the maximum bounds and restricts panning the map.

    • style: Defines the style of the map, configured via a URL pointing at the style specified.

    • attributionControl: When set to 'false', it hides the attribution control which displays map credits.

  • Initialize the map with the id of the <div> element and the configuration option defined in mapOptions.

  • Using the 'L.tileLayer' method, specify the basemap layer for OS Maps API, which includes your API Key to load the tiles to your map.

// Initialize the map.
    const mapOptions = {
        minZoom: 7,
        maxZoom: 20,
        center: [ 50.727589, -3.541809 ],
        zoom: 18,
        maxBounds: [
            [ 49.528423, -10.76418 ],
            [ 61.331151, 1.9134116 ]
        ],
        attributionControl: false
    };

    const map = L.map('map', mapOptions);

    // Load and display ZXY tile layer on the map.
    const basemap = L.tileLayer(`https://api.os.uk/maps/raster/v1/zxy/Light_3857/{z}/{x}/{y}.png?key=${apiKey}`, {
        maxZoom: 20
    }).addTo(map);
4

Add an OS NGD API – Features layer

  • Create a function called fetchFeatures that fetches the API based on the current map extent (bounding box) by generating a bbox string.

  • Construct the API request URL to fetch OS NGD data from OS NGD API – Features. The URL includes the collectionId, bbox and apiKey.

  • Once the features have been returned in JSON, update the source data of the map's layers to display the features.

// Add layer group to make it easier to add or remove layers from the map.
    const lyrGroup = new L.layerGroup().addTo(map);

// Define an asynchronous function to fetch and display the NGD Features API features.
    async function fetchFeatures(bounds) {
        // Generate a BBOX string for the map extent.
        const bbox = bounds.toBBoxString();

        // Construct the NGD Features API request URL.
        const url = `https://api.os.uk/features/ngd/ofa/v1/collections/${collectionId}/items?key=${apiKey}&bbox=${bbox}`;

        // Fetch features from the API endpoint.
        const features = await fetch(url).then(response => response.json());

        // Parse the GeoJSON data and display it on the map.
        lyrGroup.clearLayers().addLayer(L.geoJSON(features));
    }

// Get the visible map bounds (BBOX).
    let bounds = map.getBounds();

// Initial fetch and display of features.
    fetchFeatures(bounds);
5

Load and update features on the map dynamically

The map.on('moveend',...) event handler fetches and updates the features based on the map's current extent.

// Add event which will be triggered when the map has finshed moving (pan + zoom).
// Implements a simple strategy to only request data when the map viewport invalidates
// certain bounds.
    map.on('moveend', function() {
        let bounds1 = new L.latLngBounds(bounds.getSouthWest(), bounds.getNorthEast()),
            bounds2 = map.getBounds();

        if( JSON.stringify(bounds) !== JSON.stringify(bounds1.extend(bounds2)) ) {
            bounds = bounds2;
            fetchFeatures(bounds);
        }
    });

Features within the viewport extent will load initially (first 100 features) and will continue to load as you pan and zoom across the map.

What's next?

Congratulations! You've successfully created a map using Leaflet and added an OS NGD layer using OS NGD API – Features in a few steps.

Now you can continue to explore Ordnance Survey's to learn more about advanced features and functionality, such as adding markers, pop-ups, and additional layers.

Leaflet
code examples
Getting started with an API project