# Processing/LLToBNG: bnglookup.py

File bnglookup.py, 2.4 KB (added by benj, 13 years ago) |
---|

Line | |
---|---|

1 | # Script for converting BNG transverse mercator co-ordinates (eastings northings in km) to OS grid square co-ordinates |

2 | # |

3 | # Author: Ben Taylor |

4 | # Created: 05/06/2008 |

5 | # Last edit: 05/06/2008 |

6 | |

7 | import math |

8 | import sys |

9 | import alphaconv |

10 | |

11 | if (len(sys.argv) != 3): |

12 | print "Usage: python bnglookup.py eastings northings" |

13 | sys.exit(1) |

14 | # end if |

15 | |

16 | eastings_in = float(sys.argv[1]) |

17 | northings_in = float(sys.argv[2]) |

18 | eastings_out = "S0000" |

19 | northings_out = "V0000" |

20 | firstletter = "S" |

21 | secondletter = "V" |

22 | subeasting = eastings_in |

23 | subnorthing = northings_in |

24 | |

25 | if ((eastings_in < 0) or (eastings_in > 700000) or (northings_in < 0) or (northings_in > 1300000)): |

26 | print "One or both co-ordinates are out of range.\nEastings may be 0-700000, northings may be 0-1300000." |

27 | sys.exit(1) |

28 | # end if |

29 | |

30 | # Check first letter - 500km grid squares |

31 | if (northings_in < 500000): |

32 | if (eastings_in < 500000): |

33 | firstletter = "S" |

34 | else: |

35 | subeasting = eastings_in - 500000 |

36 | firstletter = "T" |

37 | # end if |

38 | else: |

39 | if (northings_in < 1000000): |

40 | subnorthing = northings_in - 500000 |

41 | if (eastings_in < 500000): |

42 | firstletter = "N" |

43 | else: |

44 | subeasting = eastings_in - 500000 |

45 | firstletter = "O" |

46 | # end if |

47 | else: |

48 | subnorthing = northings_in - 1000000 |

49 | if (eastings_in < 500000): |

50 | firstletter = "H" |

51 | else: |

52 | subeasting = eastings_in - 500000 |

53 | firstletter = "J" |

54 | # end if |

55 | # end if |

56 | # end if |

57 | |

58 | # Work out grid square we're in |

59 | letterconv = (math.ceil(subeasting/100000)) + (5 * (5 - math.ceil(subnorthing/100000))) |

60 | |

61 | # Letter I is skipped in national grid, so add one if we're at or past I |

62 | if (letterconv >= 9): |

63 | letterconv = letterconv + 1 |

64 | # end if |

65 | |

66 | secondletter = alphaconv.num2letter(letterconv) |

67 | |

68 | # Subtract the number of hundred thousand metres from each coordinate - that's covered by the grid letter |

69 | subgrid_e = int(math.floor(subeasting - (100000 * math.floor(subeasting/100000)))) |

70 | subgrid_n = int(math.floor(subnorthing - (100000 * math.floor(subnorthing/100000)))) |

71 | |

72 | # Get the number of ten thousand metres for each coordinate for the 10km tile |

73 | e_10km = (int(10000 * math.floor(subgrid_e/10000)))/10000 |

74 | n_10km = (int(10000 * math.floor(subgrid_n/10000)))/10000 |

75 | |

76 | easting_out = firstletter + str(subgrid_e) |

77 | northing_out = secondletter + str(subgrid_n) |

78 | |

79 | print("Grid reference: " + easting_out + " " + northing_out) |

80 | print("10km Tile: " + firstletter + secondletter + str(e_10km) + str(n_10km)) |