LogoLogo
OS Docs HomeOS NGDOS APIs OS Download ProductsMore than MapsOS Data Hub
  • OS NGD Documentation
  • INTRODUCTION TO OS NGD
    • Introduction to OS NGD
    • OS NGD Key Benefits to Customers
    • OS NGD Sample Data
    • OS NGD Product Viewer Tool
  • GETTING STARTED
    • Getting Started Information
    • OS NGD Fundamentals
      • 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
    • 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?
        • Zoom Levels
        • 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
    • Styling OS NGD Data
    • OS NGD Webinars, Tutorials and Case Studies
    • FAQs
  • 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 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
    • Data Catalogue
    • 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. GETTING STARTED
  2. Accessing OS NGD APIs
  3. OS NGD API – Features
  4. Getting Started
  5. Libraries

OpenLayers

Accessing OS NGD API – Features via OpenLayers

PreviousMapLibre GL JSNextPython (Geopandas)

Last updated 4 months ago

Was this helpful?

is a free and open-source JavaScript library for displaying interactive maps on the web. It is a powerful tool that can be used to create a wide variety of map-based applications, from simple web maps to complex GIS applications.

OpenLayers is easy to use and can be integrated with a variety of other web development frameworks.

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) | OpenLayers</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 OpenLayers libraries-->
    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/ol@v8.1.0/ol.css" />
    <script src="https://cdn.jsdelivr.net/npm/ol@v8.1.0/dist/ol.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

  • Create a source for the basemap layer using OS Maps API and initialise the ol.map class with the applicable map properties – target, layers and view. Add the following code inside the JavaScript block:

// Initialize the map object.
    const map = new ol.Map({
        target: 'map',
        layers: [
            new ol.layer.Tile({
                source: new ol.source.XYZ({
                    url: `https://api.os.uk/maps/raster/v1/zxy/Light_3857/{z}/{x}/{y}.png?key=${apiKey}`
                })
            })
        ],
        view: new ol.View({
            projection: 'EPSG:3857',
            extent: ol.proj.transformExtent([ -10.76418, 49.528423, 1.9134116, 61.331151 ], 'EPSG:4326', 'EPSG:3857'),
            minZoom: 7,
            maxZoom: 20,
            center: ol.proj.fromLonLat([ -3.541809, 50.727589 ]),
            zoom: 18
        })
    });

The above code creates the main map instance using the OpenLayers library where you can specify various properties:

  • target: Defines where the map should be displayed. In this instance, it is set to the id of the <div> element.

  • layers: An array containing the layers to be added to the map.

  • view: Defines the initial view of the main, containing various settings such as projection, extent (the geographic bounds of the map), minimum and maximum zoom levels, centre of the map and the initial zoom level.

4

Add an OS NGD API – Features layer

  • Define and initialise the source using the ol.source.Vector class to make a request to OS NGD API – Features. By utilising the ol.loadingstrategy.bbox this means that data from OS NGD API – Features will be loaded based on the visible map extent.

  • To create a separate layer to overlay OS NGD data onto the map, you will need to add the ngdFeatures layers to the ol.map object to render both layers on the map.

// Create the NGD Features API layer (with BBOX strategy).
    const ngdFeatures = new ol.layer.Vector({
        source: new ol.source.Vector({
            format: new ol.format.GeoJSON(),
            url: function(extent) {
                return (
                    `https://api.os.uk/features/ngd/ofa/v1/collections/${collectionId}/items?key=${apiKey}&bbox=${extent.join(',')}&bbox-crs=http://www.opengis.net/def/crs/EPSG/0/3857`
                );
            },
            strategy: ol.loadingstrategy.bbox
        })
    });

    // Add the NGD Features API layer to the map.
    map.addLayer(ngdFeatures);

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

What's next?

Congratulations! You've successfully created a map using OpenLayers 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.

OpenLayers
code examples
Getting started with an API project