In his book King Arthur's Wars, Jim Storr notes the large number of places in Britain that have names containing the word ‘ford’ (a primitive river crossing), such as Bradford or Oxford. He points out that these would have been important points on the British route network in early Anglo-Saxon times before the building of proper bridges in later centuries.
I decided to plot these places and possibly reconstruct the ancient network.
First I got a full list of British settlements:
I decided to plot these places and possibly reconstruct the ancient network.
First I got a full list of British settlements:
In[]:=
cities=CityData[{All,"UnitedKingdom"}];
I then selected those that have ‘ford’ anywhere in their names given that it is not always at the end (e.g. Fordwich).
In[]:=
fords=Select[cities,StringContainsQ[#["Name"],"ford",IgnoreCase->True]&];
Since I found that one of the fords (Gilford) is in Northern Ireland not in mainland Britain, I dropped it from the list with a bit of a hack:
In[]:=
fords=Select[fords,Not[StringMatchQ[#["Name"],"Gilford"]]&];
To create the route network, I used the principle of Proximal Point Analysis adopted by Cyprian Broodbank to reconstruct networks in the ancient Mediterranean. According to this, each location is considered to be connected to its N nearest neighbours. I followed Broodbank in using N=3.
Thus, for each member of the list of fords, I found the 4 nearest neighbours given that the first nearest neighbour would be the ford itself.
Thus, for each member of the list of fords, I found the 4 nearest neighbours given that the first nearest neighbour would be the ford itself.
In[]:=
neighbours=GeoNearest[fords,#,4]&/@fords;
This gave a list of 4-tuples, where the first element of each 4-tuple was the ford in question and the other elements were its three nearest neighbours.
Next I constructed the edges of the network. Each 4-tuple would give three undirected edges, where the first vertex of each edge would be the first element of the 4-tuple, corresponding to the ford in question, and the second vertex would be one of the three neighbours (elements 2 to 4). Hence
In[]:=
edges=Table[UndirectedEdge[#[[1]],#[[i]]],{i,2,Length[#]}]&/@neighbours;
Using Length[#] in the Table iteration, instead of hard-coding it as 4, means that this piece of code doesn’t need to change if I later change N in the finding of nearest neighbours.
Next I flattened the list:
Next I flattened the list:
In[]:=
edges=Flatten[edges];
I then got rid of redundant edges, i.e. where two fords were mutually connected giving two edges between them instead of one. Since UndirectedEdges are considered distinct if their vertices are listed in opposite orders, I used a technique I obtained from a Stack Exchange post, which is to sort each edge first and then delete duplicates:
In[]:=
edges=DeleteDuplicates[Sort/@edges];
All that remained was to plot the network:
In[]:=
GeoGraphPlot[edges]
Out[]=
Three points:
1
.Northern England turns out to be devoid of fords, leaving Scotland and England disconnected. The most northerly ford in England is Barrowford and the most southerly ford in Scotland is Crossford.
2
.The fords of northern Cornwall / Devon and South Wales turn out to be connected even though the Bristol Channel is in the way. It would be better to disallow connections that cross open bodies of water. I did this for Gilford in Northern Ireland by the hack of simply deleting it from the list. With the connections across the Bristol Channel, something more sophisticated is needed. I’m not sure if Mathematica has a built-in function that could be used.
3
.It might be interesting to compare this with the river network, for example to see which rivers have the most fords. Since Mathematica does not seem to provide any easy way of obtaining a list of a country’s rivers or of finding the river nearest to a given location, the data would need to be imported from somewhere else.