Old Hampshire Mapped
OLDMAPS.exeSuperimposing the National Grid
OLDMAPS.exe has developed through 7 versions, and has never
been seen as anything but a behind-the-scenes tool.
At various times the map measurements have been made:-
from the map usually in cm from a bottom left corner; or
from one or other of the map images, working in 100s
of pixels, and most recently in pixels, from the top
left corner of the image. Sorry: this is not as
tidy as it should be; but the results are OK!|
HANTSMAP file: OLDMAPS.rul MN: 7.6.1996 last edit 9.10.2001 OLDMAPS.exe NOTES version 7.1 cm or pixelsThese notes explain the background to OLDMAPS.exe software which carries out a number of calculations to do with coordinate systems on old maps. The source code is OLDMAPS.pas written in Turbo Pascal 7. This software is home-built, pretty untested, and available from the author for your use at your own risk.
NOTE: comma delimited data output from this procedure, described below, is available in files [Map]PTS.cdf and [Map]GEN.cdf which are in the map makers directory within the map project directory.
An old map will not usually have any grid on it to facilitate
listing placenames in an index. It is not helpful just to say
'Odgath is shown on the Norden map of Hampshire', it would be
more useful to indicate where to find this name amongst
all the others. You need an index, ie you need a grid.
You could just impose a grid, an arbitrary grid of
squares labelled along bottom and left edges of the map
sheet, by which to refer to areas on the map. A
more interesting approach, fraught with problems
but potentially more rewarding, is to impose the national
grid onto the map sheet. The problems? the old
map's projection will not conform to the ngr, the
old projection may be full of errors anyway, and the
plotted position of features may not be very
accurately positioned. So what; if you need a grid you may
as well use a familiar one, and admit and warn of
the limitations of its use in the circumstances.
In the first version of OLDMAPS.exe measurements on the
old map were made in centimetres; and 6 figure grid
references complete with prefix letters were expected for
As all measurements and calculations are relative, not absolute, it makes little difference what units are used. The latest uses of this software have had measurements made on a scanned image of the map, in pixels. To prevent size overuns in the software the meaurements were expressed in 100s of pixels, AND the 'y' measurement made in pixels being from the top of the image, it is subtracted from the map height (pixels) to give a northing value. For example:-
if map height 3065 pixels thenIf this appears to be a 'cobble' it is because I cannot be fussed to rewrite and debug the software which works nicely, thank you.
OLDMAPS runs without user interference, reading data from a file which must be declared as command line parameter. For example:-
OLDMAPS NRD1reads from NRD1PTS.txt, and outputs to NRD1NGR.txt, NRD1PTS.cdf, NRD1GEN.cdf and NRD1.mcr.
The format of the data file is a simple ascii text of tagged data. There are four sorts of line:-
@t map identifierFor example see NRD1PTS.txt. Multiple placename lines are expected, up to 50(?); the program will fail with too few points! Several scalelines may be entered, up to 5.
A scaling factor may be given as parameter 2 on the
command line, eg:-
OLDMAPS HAR1 0.855The scale factor will only be used to repeat the grid lines output, see below.
There is usually no reference position on an old map; the
map is located by the measuring its positions of
individual features, the towns and other settlements,
for example. The plotting of these is not too certain.
The declared scale, if there is one, will not be very reliable, if for no other reason because standards
of measurement were not so very fine. The following
strategy was tried as a way of locating an old map in
Using the bottom left corner of the old map sheet as origin,
measure (x,y) coordinates for a couple of dozen towns or
settlements that are recognizable today. It is better to use
towns that are not too large, small market towns are ideal.
These are more easily located on old and new maps.|
From a modern map using the national grid, read the ngr of each of the places, using the position of the parish church as the reference point for the town, rather than a centre ngr; this is more likely to be the focus of the old map's plotted position. Convert to a purely numerical (E,N) coordinate pair.
Find the centroid of the (x,y) pairs, and the centroid of the (E,N) pairs, and declare these to be at the same place, but on different scales; ie:-
xbar = sum of x(n)/no of towns ybar = sum of y(n)/no of towns Ebar = sum of E(n)/no of towns Nbar = sum of N(n)/no of townsThe map is now centred with its centroid over the equivalent centroid of the reference towns in ngr space.
For each town calculate its distance from the centroid in map
space, the (x,y) coordinates, and in ngr space, the (E,N)
coordinates, and compare these to get the scale to convert one
to the other:-|
scale(n) = sqrt(sqr(E(n)-Ebar)+sqr(N(n)-Nbar))/ sqrt(sqr(x(n)-xbar)+sqr(y(n)-ybar))and average the scales:-
scale = sum of scale(n)/no of townsNB during this procedure you may wish to discount a town where the distance from the centroid is so small that errors become too significant, and gives unreliable or divide-by-zero results. (In Hampshire it means you do not use Winchester.)
Calculate a heading for each town from the centroid, in
both map space and ngr space:-|
xyheading(n) := arctan((y(n)-ybar)/(x(n)-xbar)); protect against division by zero and correct the answer by +pi if x(n)Compare the average of both the sets of headings, weighted by the distance of the place from the centroid.
mapheading := sum(distance(n) * (ngrheading(n) - xyheading(n)) / sum(distance(n))A positive value means the map north is W of NGR north; and vice versa.
The map is now facing the right way.
|xy to EN, EN to xy Conversions||
Conversions between the two coordinate systems are
if (x-xbar)=0.0 then angle := pi/2 else angle := arctan((y-ybar)/(x-xbar)); angle := angle+heading; if (xENtoxy
if (E-Ebar)=0.0 then angle := pi/2 else angle := arctan((N-Nbar)/(E-Ebar)); if (EIts all a bit sixth form trigonometry, confusing!
The bottom left sheet corner is at (0,0) in (x,y) space. Its
position, and the positions of the other sheet corners, can be
calculated in ngr space.|
The position in (x,y) space of ngr grid lines for particular
eastings and northings can be calculated. This is a
little more involved. If you want to know more consult
the program source code, the arithmetic is fun.
The intersection of NGR grid lines on the old map sheet
edges are reported by the program so that you can mark
the grid on the old map. Do this on a copy please! if you
use a copy to do the measuring it is safer for the old
map, and the grid can be drawn on the copy without
worrying about it being the right size ...|
If a scaling factor is given on the command line as parameter 2 this is used to repeat the grid lines exercise scaled for a copy of the map at a different scale. This might be more convenient - working on a copy fitted to A3 sheet for photocopying for instance.
The crudest estimate of the scale of the old map is to believe
what its cartographer said, use the scale line printed on the
map. The scale line, there might be more than one, is usually
marked in miles; measure a number of miles in
scale = [no of miles]*63360*2.54/[length cm]This may be calculated for several scale lines.
BUT: this calculation is faulty; it assumes that the map maker used the modern statute mile which may not have been formalised at the time. The old english mile was not the same as todays; for example various researchers have shown that Saxton's mile was about 1 1/4 statute miles.
The program reports to screen as it goes.|
Output of data is made to an ascii text file:-
[Map]NGR.txtOutput of some of the data is made to a pair of .cdf files suitable to load into tables for a relational database.
[Map]PTS.cdf [Map]GEN.cdfThe Points table has columns:-
MapCode / Map / Town / trueNGR / mapNGR
|MapCode||4 character map code used in the HantsMap project, eg:- NRD1|
|Map||the map's name; in HantsMap this is the maker name and date pair, eg:- Norden 1607|
|trueNGR||town coordinates in OS ngr system|
|mapNGR||town position in ngr space applied to the map|
The General table has columns:-
MapCode / Scale 1 to / Rotation / scale line(s) 1 / / / /
|MapCode||as above; this is the link data for the two tables|
|Scale||map's scale derived from the sample of towns|
|Rotation||how much the map ws rotated to fit the applied ngr grid|
|scale(s)||map scale as declared by its scale line, or up to 5 scale lines|
Output is also made to an .mcr file which is a DOS AutoSketch
macro file. Loading and running this in AutoSketch
will produce a sketch map which can be used as a visual
check on the calculations, just to look at and be
convinced nothing stupid has happened. The sketch map
has little other use.
file: NRD1PTS.txt reference points for map NORDEN1 to work in OLDHANTS.exe @t Norden 1607 @pl Alton @ngr SU717396 @xy (24.15,21.11) @pl Basingstoke @ngr SU634527 @xy (21.38,24.20) @pl Winchester @ngr SU478293 @xy (16.06,15.49) @pl Andover @ngr SU365458 @xy (12.55,20.40) @pl Lymington @ngr SZ322954 @xy (12.28,4.00) @pl Romsey @ngr SU351212 @xy (13.30,12.60) @pl Fareham @ngr SU575061 @xy (20.88,8.89) @pl Stockbridge @ngr SU355351 @xy (12.57,16.84) @pl Petersfield @ngr SU744235 @xy (24.90,13.58) @pl Havant @ngr SU717062 @xy (24.90,8.97) @pl Odiham @ngr SU740509 @xy (23.66,24.41) @pl Christchurch @ngr SZ159925 @xy (7.11,1.37) @pl Kingsclere @ngr SU525586 @xy (17.56,25.60) @pl Overton @ngr SU514500 @xy (16.96,22.95) @pl Fordingbridge @ngr SU150145 @xy (7.19,8.87) @pl Titchfield @ngr SU541058 @xy (19.30,8.13) @pl Hambledon @ngr SU646151 @xy (21.94,12.36) @pl Grately @ngr SU275420 @xy (8.62,18.29) @pl Nether Wallop @ngr SU304364 @xy (9.59,16.86) @pl Buriton @ngr SU740200 @xy (24.80,14.21) @pl Hawkley @ngr SU746291 @xy (25.19,17.74) @pl Burghclere @ngr SU469610 @xy (15.30,25.46) @w 32.10 @h 29.28 @sc 6.61 @m 10 NRD1NGR.txt Map norden1 Data file: NRD1PTS.txt Output file: NRD1NGR.txt OLDMAPS Plotting a NGR grid on an old map version 7.2 MN: 30.8.1999 Given points no place ngr (x,y) 1 Alton SU717396 ( 24.15, 21.11) 2 Basingstoke SU634527 ( 21.38, 24.20) 3 Winchester SU478293 ( 16.06, 15.49) 4 Andover SU365458 ( 12.55, 20.40) 5 Lymington SZ322954 ( 12.28, 4.00) 6 Romsey SU351212 ( 13.30, 12.60) 7 Fareham SU575061 ( 20.88, 8.89) 8 Stockbridge SU355351 ( 12.57, 16.84) 9 Petersfield SU744235 ( 24.90, 13.58) 10 Havant SU717062 ( 24.90, 8.97) 11 Odiham SU740509 ( 23.66, 24.41) 12 Christchurch SZ159925 ( 7.11, 1.37) 13 Kingsclere SU525586 ( 17.56, 25.60) 14 Overton SU514500 ( 16.96, 22.95) 15 Fordingbridge SU150145 ( 7.19, 8.87) 16 Titchfield SU541058 ( 19.30, 8.13) 17 Hambledon SU646151 ( 21.94, 12.36) 18 Grately SU275420 ( 8.62, 18.29) 19 Nether Wallop SU304364 ( 9.59, 16.86) 20 Buriton SU740200 ( 24.80, 14.21) 21 Hawkley SU746291 ( 25.19, 17.74) 22 Burghclere SU469610 ( 15.30, 25.46) number of points = 22 Centroids of points (x,y) centroid is ( 17.28, 15.56) NGR centroid is SU503286 numerical ngr 450.30 128.67 Map scale scale = 2.72 scale = 2.86 scale = 3.25 scale = 3.01 scale = 3.41 scale = 3.13 scale = 3.31 scale = 3.13 scale = 3.08 scale = 2.98 scale = 2.86 scale = 3.14 scale = 3.01 scale = 3.49 scale = 2.91 scale = 2.74 scale = 3.30 scale = 2.96 scale = 3.22 map scale 1 to 307928 or 1 to 307000 Map heading Map heading NGR north on map is -8.2 degrees W of map north Check points no place ngr map 1 Alton SU717396 SU736425 2 Basingstoke SU634527 SU666531 3 Winchester SU478293 SU465289 4 Andover SU365458 SU380455 5 Lymington SZ322954 SZ299956 6 Romsey SU351212 SU368214 7 Fareham SU575061 SU583067 8 Stockbridge SU355351 SU365346 9 Petersfield SU744235 SU726192 10 Havant SU717062 SU706052 11 Odiham SU740509 SU736528 12 Christchurch SZ159925 SZ130899 13 Kingsclere SU525586 SU555591 14 Overton SU514500 SU525513 15 Fordingbridge SU150145 SU166127 16 Titchfield SU541058 SU531051 17 Hambledon SU646151 SU630168 18 Grately SU275420 SU251408 19 Nether Wallop SU304364 SU274360 20 Buriton SU740200 SU726212 21 Hawkley SU746291 SU753318 22 Burghclere SU469610 SU486597 Map sheet corners bottom left SY907888 top left SU036781 top right TQ015639 bottom right SZ886747 Grid lines x positions on bottom and top edges, y positions on left and right edges, by which to draw lines on map easting grid lines Eing bottom edge top edge 400 3.03 -1.21 410 6.31 2.07 420 9.59 5.35 430 12.87 8.63 440 16.15 11.92 450 19.43 15.20 460 22.71 18.48 470 26.00 21.76 480 29.28 25.04 490 32.56 28.32 500 35.84 31.60 510 39.12 34.88 northing grid lines Ning left edge right edge 80 -2.91 1.73 90 0.37 5.01 100 3.65 8.30 110 6.93 11.58 120 10.21 14.86 130 13.50 18.14 140 16.78 21.42 150 20.06 24.70 160 23.34 27.98 170 26.62 31.27 180 29.90 34.55 Scale line scale line length 6.61 cm representing 10 miles scale 1 to 243471
||Old Hampshire Mapped|