28 static const real northoffset =
29 ( OSGBTM().Forward(
real(0), OriginLatitude(),
real(0),
x,
y),
30 FalseNorthing() -
y );
36 if (!(prec >= 0 && prec <= maxprec_))
44 char grid[2 + 2 * maxprec_];
54 grid[
z++] = letters_[(tilegrid_ - (yh / tilegrid_) - 1)
55 * tilegrid_ + (xh / tilegrid_)];
56 grid[
z++] = letters_[(tilegrid_ - (yh % tilegrid_) - 1)
57 * tilegrid_ + (xh % tilegrid_)];
63 for (
int c =
min(prec,
int(tilelevel_));
c--;) {
64 grid[
z +
c] = digits_[ ix % base_ ];
66 grid[
z +
c + prec] = digits_[ iy % base_ ];
69 if (prec > tilelevel_) {
70 xf -=
floor(xf / mult);
71 yf -=
floor(yf / mult);
75 for (
int c = prec - tilelevel_;
c--;) {
76 grid[
z +
c + tilelevel_] = digits_[ ix % base_ ];
78 grid[
z +
c + tilelevel_ + prec] = digits_[ iy % base_ ];
82 int mlen =
z + 2 * prec;
84 copy(grid, grid + mlen, gridref.begin());
94 toupper(gridref[0]) ==
'I' &&
95 toupper(gridref[1]) ==
'N') {
100 char grid[2 + 2 * maxprec_];
101 for (
int i = 0;
i <
len; ++
i) {
102 if (!isspace(gridref[
i])) {
103 if (
p >= 2 + 2 * maxprec_)
105 grid[
p++] = gridref[
i];
111 throw GeographicErr(
"OSGB string " + gridref +
" too short");
114 " has odd number of characters");
122 yh = yh * tilegrid_ + tilegrid_ - (
i / tilegrid_) - 1;
123 xh = xh * tilegrid_ + (
i % tilegrid_);
128 int prec1 = (
len -
p)/2;
133 for (
int i = 0;
i < prec1; ++
i) {
138 if (ix < 0 || iy < 0)
139 throw GeographicErr(
"Encountered a non-digit in " + gridref);
156 if (x < minx_ || x >= maxx_)
158 +
"km not in OSGB range ["
161 if (y < miny_ || y >= maxy_)
163 +
"km not in OSGB range ["