View on GitHub

Portable Antiquities County Blogs - revived

An archive of the old PAS blogs that went missing.

Download this project as a .zip file Download this project as a tar.gz file
Total posts: 187

Dr James Gerrard joins the team

03/25/2013

Frances opens a box of pottery we haven't seen before!

Frances opens a box of pottery we haven’t seen before!

On Friday, despite the freezing weather,  Frances McIntosh, Dr James Gerrard and myself went out to Rolfe’s house to look at the Piercebridge pottery assemblage.  The task for the day was to persuade James (a lecturer in Roman archaeology at Newcastle University and a pottery expert) to be our pottery specialist and to devise a strategy for the study of all 50 kilos of pot from the site. Fortified by a continuous stream of sausage rolls and cups of tea (thanks, Rolfe!) we managed to achieve both.

Here’s what James has to say about the assemblage:

“I had an email from Philippa a few weeks back asking whether I and the Centre for Interdisciplinary Artefact Studies at Newcastle University might be interested in working on the Piercebridge pottery. So today we went to meet Bob and Rolfe and I had a good look at the boxes of pottery.

It was a pretty interesting collection. The first impression is that it’s all pretty fresh with sharp edges and breaks. This is important because it should indicate that the pottery hasn’t travelled far in the river. 

Some of the decorated Samian from Piercebridge

Some of the decorated Samian from Piercebridge

There’s a small but important collection of samian from Gaul, which includes some decorated vessels and sherds with makers’ stamps. There was even a piece with a rivet hole – this shows that it was repaired in antiquity and is an indicator of the esteem that samian was held in by the Romans.

 There are a few sherds from large olive oil amphorae from Spain and quite a few beakers and drinking vessels. Some of these are from the Nene Valley and include vessels decorated with hunting scenes.

Most of the pottery are black and grey kitchen and tablewares. Jars, bowls and dishes are present and the vessels range in date from the second until the fourth century. Some of the latest sherds are from BB1 jars and bowls. It was nice to see these because they come from Dorset and I wrote my PhD on this type of pottery!

James explains the dating of Black Burnished ware to Bob

James explains the dating of Black Burnished ware to Bob

It’s early days and the next step is to get the pottery up to Newcastle so I can study it properly. That said, one striking aspect of this pottery is the lack of any flagons (jugs). I’m not sure how to explain this but it’s a hint that these boxes of pottery have secrets to reveal.”

James, Philippa, Bob and Rolfe on pottery sorting duty

James, Philippa, Bob and Rolfe on pottery sorting duty

James, Philippa, Bob and Rolfe on pottery sorting duty

Roman figurine from Stogumber

03/11/2013

Small figurines in the shape of boars were popular in the Late Iron Age and Early Roman period, although the findspot of this example is unusually far West. They are thought to have a votive role, possibly relating to local hunting cults, unfortunately stratified finds are rare. The late Iron Age examples are usually complete, although stylised, figures. Examples with just the head and foreparts become more common in the Early Roman period.

This example (SOM-B820E3) has a well moulded head with a long snout and deeply drilled eyes, which gives it a rather fierce appearance seen face on. The crest of bristles along the back is emphasised by incised lines. It swells out initially to make the upper part of the body before narrowing to a plain rectangular base. At the tail end it tapers to a rounded point, this is broken but is too narrow to have formed an attachment to a larger implement such as a knife although it may have had some indication of a tail. It may have been freestanding on the base or fitted into a larger base piece.

Roman boar figurine

Roman boar figurine

The closest parallel in terms of form is from a smaller knife handle from Chester Roman fort and dated to the Hadrianic period or later, supporting the suggestion this is Early Roman rather than Iron Age in date.

Getting elevation from the Google geocoding api

03/08/2013

The code below can be used to access Google’s elevation API and retrieve single point data easily using Zend HTTP Client. I previously used the geonames API, but found that too flaky for production. There are restrictions on using this api:

Use of the Google Elevation API is subject to a limit of 2,500 requests per day (Maps API for Business users may send up to 100,000 requests per day). In each given request you may query the elevation of up to 512 locations, but you may not exceed 25,000 total locations per day (1,000,000 for Maps API for Business users). This limit is enforced to prevent abuse and/or repurposing of the Elevation API, and this limit may be changed in the future without notice. Additionally, we enforce a request rate limit to prevent abuse of the service. If you exceed the 24-hour limit or otherwise abuse the service, the Elevation API may stop working for you temporarily. If you continue to exceed this limit, your access to the Elevation API may be blocked.

And there is a specific requirement for where this data will be used:

Note: the Elevation API may only be used in conjunction with displaying results on a Google map; using elevation data without displaying a map for which elevation data was requested is prohibited.

Access the google elevation

<?php /** A class for getting elevation of a latlon point against the google api * @version 1 * @author Daniel Pett * @license GNU * @package Pas_Service * @subpackage Geo * @category Pas * @see https://developers.google.com/maps/documentation/elevation/ * @uses Zend_Http_Client * @uses Zend_Json */ class Pas_Service_Geo_Elevation{ const ELEVATIONURI = 'http://maps.googleapis.com/maps/api/elevation/json'; /** Get the coordinates from an address string * @param float $lat * @param float $lon * @access public */ public function _getElevationApiCall($lat, $lon) { $client = new Zend_Http_Client(); $client->setUri(self::ELEVATIONURI); $client->setParameterGet('locations', $lon . ',' . $lat) ->setParameterGet('sensor', 'false'); $result = $client->request('GET'); $response = Zend_Json_Decoder::decode($result->getBody(), Zend_Json::TYPE_OBJECT); return $response; } /** Get the coordinates of an address * @param float $lat * @param float $lon * @access public */ public function getElevation($lat, $lon) { $response = $this->_getElevationApiCall($lat, $lon); if(isset($response->results[0]->elevation)){ return $response->results[0]->elevation; } else { return null; } } }



<?php

/** A class for getting elevation of a latlon point against the google api
* @version 1
* @author Daniel Pett
* @license GNU
* @package Pas_Service

* @subpackage Geo

* @category Pas

* @see https://developers.google.com/maps/documentation/elevation/

* @uses Zend_Http_Client

* @uses Zend_Json

*/

class  Pas_Service_Geo_Elevation{

const  ELEVATIONURI  = 'http://maps.googleapis.com/maps/api/elevation/json';

/** Get the coordinates from an address string

     * @param float $lat

     * @param float $lon

     * @access public

     */

public  function  _getElevationApiCall($lat,  $lon)  {

$client  = new  Zend_Http_Client();

$client->setUri(self::ELEVATIONURI);

$client->setParameterGet('locations',  $lon  .  ','  .  $lat)
       ->setParameterGet('sensor',  'false');

$result  = $client->request('GET');

$response  = Zend_Json_Decoder::decode($result->getBody(),

Zend_Json::TYPE_OBJECT);

return  $response;

}

/** Get the coordinates of an address

     * @param float $lat

     * @param float $lon

     * @access public

     */

public  function  getElevation($lat,  $lon){

$response  = $this->_getElevationApiCall($lat,  $lon);

if(isset($response->results[0]->elevation)){

return  $response->results[0]->elevation;

}  else  {

return  null;

}

}

}

To use this in your code do the below:

Use the service class

$api = new Pas_Service_Geo_Elevation(); $elevation = $api->getElevation($data['declong'], $data['declat']);

$api  = new  Pas_Service_Geo_Elevation();

$elevation  = $api->getElevation($data['declong'],  $data['declat']);

Pretty simple.

Pot quern from Combwich

01/14/2013

While most finds I deal with are found in fields or gardens I do get the occasional find from building work. This upper stone from a late Medieval or Post Medieval pot quern was found while the owner was taking down a wall of an old barn, probably previously a house, in Combwich. It recorded on the database as SOM-D9C047.

Upper stone from a pot quern Upper stone from a pot quern

Pot querns have two parts, the upper stone and the larger lower stone which is ‘pot shaped’ with raised sides around a central recess within which the upper stone sits. A spout is cut into the side of the lower stone through which the meal exits. Evidence from Winchester suggests they were in use from the mid 12th century. A similar example to this but with only one handle lug and a splay flanking the slot on the base was found in a late 13th century context in the priory kitchen in Exeter with part of a base. The stone is lava; querns of imported German lava were popular in the later Medieval period.

Documentary evidence suggests the continued use of hand querns into the Post Medieval period. They were replaced by examples with cranked handles and gears in the 17th century. Pot querns have been found in 17th century contexts, usually in rubble and hardcore, but it is not clear if they are residual or were recycled as hardcore when the new style of quern replaced them. The find spot of this example, in rubble fill, reinforces this pattern.

Possible ‘Trench art’ ring, SOM-AE96C7

12/17/2012

In general I don’t record finds that are less than 300 years old. Not because they are not interesting but firstly because the quantity is too great, secondly because we have usually have more and better sources to use to identify and categorise sites of this period and thirdly because, to be frank, with the huge increase in manufactured goods and machines there are a lot more odd bent bits of metal that are hard to identify.

However sometimes something comes in with a nice local link or that is just fun and I know it will be useful in talks or schools sessions. This finger ring from Hinton St George is an example, find number SOM-AE96C7.

Finger ring made of 1940 penny

Finger ring made of 1940 penny

It is made from a copper penny dated 1940. The penny was carefully cut, folded and shaped to retain the reverse legend, head of Britannia and date on the inner side of the ring while the outer side was either smoothed or has worn smooth through wear. Given the date it is possible this was made by someone during the war, either a soldier, prisoner of war or someone else with time on their hands waiting for orders and access to cheap items and tools that could be easily carried in a pocket. Such pieces are known as ‘trench art’ after the items produced during the First World War and continue to be made today during modern conflicts. Finger rings made from coins were a popular form of trench art.

Adding Open Domesday data to object records

12/12/2012

The Scheme website has had low level integration with the Open Domesday project site since September 2011, and it has taken me this long to get round to writing about how it works. Each record we create, ideally should have a National Grid Reference (NGR) attached to it. These NGRs are converted at the point of data entry, via a backend script, to Latitude and Longitude which gives us more flexibility for integrating with 3rd party services (mapping apis, flickr, etc.) These LatLon pairs can also be used to retrieve data easily from Open Domesday, via Anna Powell-Smith’s excellent API.  In this instance, I’m interested in just places near to the point of discovery of an object, and this can be seen in the segment of a record displayed below.

Open Domesday data added to a record

Open Domesday data added to a record

The API call that you need to do this is ‘PlacesNear: returns places within a radius (in km) of a given point, or places within a bounding box. Uses WGS84 coordinates.’ This is very simple to call as her examples show you and I just use the following format:

http://domesdaymap.co.uk/api/1.0/placesnear?lat={LAT}&lng={LON}&radius={RADIUS}


http://domesdaymap.co.uk/api/1.0/placesnear?lat={LAT}&lng={LON}&radius={RADIUS}

To automate this in my Zend Framework based application, I’ve built some simple PHP library code and some view helpers as detailed below.

The service library classes

These can be seen here: https://github.com/portableant/Beowulf—PAS/tree/master/library/Pas/Service/Domesday

Service class for interacting with Domesday site

<?php

class  App-Service-Domesday-Place  extends  Zend-Rest-Client  {

protected  $_params  =  array();

protected  $_uri  =  'http://domesdaymap.co.uk';

protected  $_responseTypes  =  array('xml',  'json',  'django');

protected  $_responseType  =  'json';

protected  $_methods  =  array('place',  'placesnear',  'manor',

'image',  'hundred',  'area',

'county'  );

protected  $_placeNearParams  =  array(

'lat',  'lng',  'radius',

's',  'e',  'n',

'w','format');

protected  $_apiPath  =  '/api/1.0/';

public function  __construct(){

$this->setUri($this->_uri);

$client  =  self::getHttpClient();

$client->setHeaders('Accept-Charset',  'ISO-8859-1,utf-8');

}

public  function  setParams($params)

{

foreach  ($params as  $key  =>  $value)  {

switch  (strtolower($key))  {

case  'format':

$this->_params['format']  =  $this->setResponseType($value);

break;

default:

$this->_params[$key]  =  $value;

break;

}

}

return  $this;

}

public  function  getParams()

{

return  $this->_params;

}

public  function  setResponseType($responseType)

{

if  (!in-array(strtolower($responseType),  $this->_responseTypes))  {

throw  new  Pas-Service-Domesday-Exception('Invalid Response Type');

}

$this->_responseType  =  strtolower($responseType);

return  $this->_responseType;

}

public  function  getResponseType()

{

return  $this->_responseType;

}

public  function  sendRequest($requestType,  $path)

{

$requestType  =  ucfirst(strtolower($requestType));

if  ($requestType  !==  'Post'  &&  $requestType  !==  'Get')  {

throw  new  Pas-Service-Domesday-Exception('Invalid request type: '  .  $requestType);

}

try  {

$requestMethod  =  'rest'  .  $requestType;

$response  =  $this->{$requestMethod}($path,  $this->getParams());

return  $this->formatResponse($response);

}  catch  (Zend-Http-Client-Exception  $e)  {

throw  new  Pas-Service-Domesday-Exception($e->getMessage());

}

}

/** Set up the response rendering

     *

     * @param string $response

     */

public  function  formatResponse(Zend-Http-Response  $response)

{

if  ('json'  ===  $this->getResponseType())  {

return  json-decode($response->getBody());

}else  {

return  new  Zend-Rest-Client-Result($response->getBody());

}

}

/** Retrieve data from the api

     *

     * @param string $method

     * @param array $params

     */

public  function  getData($method,  array  $params  =  array())

{

if(!in-array($method,$this->_methods)){

throw  new  Pas-Service-Domesday-Exception('That is not a valid method');

}

foreach($params as  $k  =>  $v)  {

if(!in-array($k,  $this->_placeNearParams)){

unset($params['k']);

}

}

$this->setParams($params);

$path  =  $this->_apiPath  .  $method;

return  $this->sendRequest('GET',  $path);

}

}

Exception class

<?php

/** The exception for geo based classes

* @category   Pas

* @package    Pas-Service-Domesday

* @subpackage Exception

* @copyright  Copyright (c) 2011 Daniel Pett

* @license    GNU

* @author        Daniel pett

* @version       1

* @since        26 September 2011

*/

class  Pas-Service-Domesday-Exception  extends  Zend-Exception  {

}

 The view helper

This needs rewriting for OO PHP and chained methods and perhaps moving HTML to a view partial instead. As always there are lots of different ways to write the code to get to the end point.

<?php

/**

*

* @author dpett

* @version

*/

/**

* DomesdayNear helper

*

* @uses viewHelper Pas-View-Helper

*/

class  Pas-View-Helper-DomesdayNear

extends  Zend-View-Helper-Abstract  {

protected  $_url  =  'http://domesdaymap.co.uk/';

protected  $_baseurl  =  'http://domesdaymap.co.uk/place/';

protected  $_domesday;

protected  $_cache;

public  function  --construct(){

$this->_domesday  =  new  Pas-Service-Domesday-Place();

$this->_cache  =  Zend-Registry::get('cache');

}

/**

     *

     */

public  function  domesdayNear($lat,  $lng,  $radius)  {

if(!is-int($radius)){

throw  new  Exception('Defined radius needs to be an integer');

}

$params  =  array('lat'  =>  $lat,  'lng'  =>  $lng,  'radius'  =>  $radius);

$key  =  md5($lat  .  $lng  .  $radius);

$response  =  $this->getPlacesNear($params,$key);

return  $this->buildHtml($response,  $radius);

}

public  function  getPlacesNear(array  $params,  $key  ){

if  (!($this->_cache->test($key)))  {

$data  =  $this->_domesday->getData('placesnear',  $params);

$this->_cache->save($data);

}  else  {

$data  =  $this->_cache->load($key);

}

return  $data;

}

public  function  buildHtml($response,  $radius){

if($response){

$html  =  '<h3>Adjacent Domesday Book places</h3>';

$html  .=  '<a  href="'  .  $this->_url  .  '"><img class="dec flow" src="http://domesdaymap.co.uk/media/images/lion1.gif" width="67" height="93"/></a>';

$html  .=  '<ul>';

foreach($response as  $domesday){

$html  .=  '<li><a href="'  .  $this->_baseurl  .  $domesday->grid  .  '/'  .  $domesday->vill-slug

.  '">'.  $domesday->vill  .  '</a></li>';

}

$html  .=  '</ul>';

$html  .=  '<p>Domesday data  within '  .  $radius  .  ' km of discovery point is surfaced via the excellent <a href="http://domesdaymap.co.uk">

    Open Domesday</a> website.</p>';

return  $html;

}

}

}

To use this:

<?php
//In the view script in which you want this to appear
echo  $this->domesdayNear($lat,  $lng,  $radius);
?>

central unit (23) danish research (8) denmark (1) essex (8) finds advisers (1) frome hoard (20) hampshire (1) isle of wight (1) labs (3) lancashire (1) lincolnshire (13) news (3) north east (9) north west (20) north yorkshire (1) northants (9) oxfordshire (2) piercebridge (3) roman coins (1) roman numismatics phd (7) somerset (14) sussex (3) technology (1) the marches (11) treasure (21) west midlands (6) wiltshire (1)