Package: bng
BNGConvert between BNG grid refs (e.g. NT123456) and OSGB36 (EPSG:27700) coordsCoordinates in theOrdnance Survey National Gridor British National Grid are often defined by alphanumeric grid references that refer to grid squares.
These are based on theosgb36(EPSG:27700) coordinate reference system but are not understood by most GIS software.
This module contains Python functions to convert 4, 6, 8, or 10 figure alphanumeric grid references to/from pureosgb36coordinates.This code was originally published on a blog post:Easily change coordinate projection systems in Python with pyproj.
The blog post contains more information and instructions for converting between coordinate systems using Python.InstallationBNG can be installed for Python 2.7 or Python 3 using pip:pip install bngInstructionsTheto_osbg36andfrom_osbg36functions are used to convert between tuples of OSGB36 (x, y) coordinates and alphanumeric grid references.to_osbg36BNG grid references can be converted toosbg36coordinates as follows.Single values:importbngbng.to_osgb36('NT2755072950')# (327550, 672950)The coordinates correspond to the southwest corner of the grid square described by the grid reference.For multiple values, use Python's zip function and list comprehension:importbnggridrefs=['HU431392','SJ637560','TV374354']x,y=zip(*[bng.to_osgb36(g)forgingridrefs])x# (443100, 363700, 537400)y# (1139200, 356000, 35400)from_osbg36BNG grid references can be created fromosbg36coordinates as follows.Single values:importbngbng.from_osgb36((327550,672950),figs=6)# 'NT275729'The number of figures in the grid reference can be specified.
The coordinates correspond to the southwest corner of the grid square containing the (x, y) coordinates.For multiple values, use Python's zip function and list comprehension:importbngx=[443143,363723,537395]y=[1139158,356004,35394][bng.from_osgb36(coords,figs=4)forcoordsinzip(x,y)]# ['HU4339', 'SJ6356', 'TV3735']Converting grid references to GPS coordinatesBNGcan be combined withpyproj(seeblog post) to convert grid references to many different coordinate systems.BNG grid references can be converted to lat/lon as used by GPS systems (EPSG:4326) as follows:importbngimportpyproj# Define coordinate systemswgs84=pyproj.CRS("EPSG:4326")# LatLon with WGS84 datum used by GPS units and Google Earthosgb36=pyproj.CRS("EPSG:27700")# UK Ordnance Survey, 1936 datum# Transformx,y=bng.to_osgb36('NT2755072950')pyproj.transform(osgb36,wgs84,x,y)# (55.94410954187127, -3.1615548049941133i)Note: older versions of pyproj usepyproj.Proj("+init=EPSG:4326")syntax
andreturn coordinates in lon, lat
order.GPS coordinates can be converted to BNG grid references as follows:importbngimportpyproj# Define coordinate systemswgs84=pyproj.CRS("EPSG:4326")# LatLon with WGS84 datum used by GPS units and Google Earthosgb36=pyproj.CRS("EPSG:27700")# UK Ordnance Survey, 1936 datum# Transformlon=-3.1615548588213667lat=55.944109545140932x,y=pyproj.transform(wgs84,osgb36,lat,lon)bng.from_osgb36((x,y))# 'NT275729Note that for surveying work (i.e. < 1 m accuracy) it is necessary to make a geoid correction.
Projusesgrid correction files in NTv2 format to make this correction.
The Ordnance Survey provide these files (OSTN2 transformation model)on their website.For DevelopersInstall developer dependencies:pipinstall-rrequirements.txtRun tests:pytest-vstest_bng.py