Some geo love

Mashing up single sign on and the CWD wasn’t enough. I’ve added to our Nucleus ‘location’ service some new geo APIs that will allow us to make location aware websites and applications.

There is both a server side version which can be called via cURL/file_get_contents/etc:

http://nucleus.online.lincoln.ac.uk/locations/geo/format/xml (your IP address)
http://nucleus.online.lincoln.ac.uk/locations/geo/format/xml?ip=86.6.170.144 (my current IP address)

(if you want JSON/JSONP/CSV then replace the format/xml with format/your choice)

and a JavaScript client side version:

http://nucleus.online.lincoln.ac.uk/locations/geojs (your IP address)
http://nucleus.online.lincoln.ac.uk/locations/geojs?ip=86.6.170.144 (my current IP address)

Both services return the following information:

  • which campus network the IP address is associated with (or ‘non’ if they aren’t using a campus network)
  • which campus they’re on (e.g. Brayford or Hull or ‘non’ if they aren’t on a campus)
  • the building (we can only do this currently for wired networks and some wireless networks)
  • the postcode of the building (where possible)
  • latitude and longitude (if the IP address isn’t on a University network then it uses the Maxmind GeoCity database)
  • the closest library to the library (GCW, Holbeach, Hull, or if they’re on a campus network, the Theology Reading Room)

So how does it work?

I’ve collected a huge list of IP ranges for the wired and wireless networks at the University and then I use the this function to loop over these ranges until it returns TRUE that an IP is in a range, or that it isn’t (i.e. they aren’t on a University network).

The ranges look like this:

$zones = array(
    'HBW'    => array(
        'network'=>'Holbeach wireless',
        'campus'=>'Holbeach',
        'postcode'=>'PE12 7PT',
        'building'=>'Minerva House',
        'latitude'=>'52.810004',
        'longitude'=>'0.01696'
    ),

If it results that an IP address is from a network then I’ve a simple multidimensional array for each network that contains the meta:

$zones = array(
'HBW'	=> array(
	'network'=>'Holbeach wireless',
	'campus'=>'Holbeach',
	'postcode'=>'PE12 7PT',
	'building'=>'Minerva House',
	'latitude'=>'52.810004',
	'longitude'=>'0.01696'
),
...

Finally it outputs in the required format (i.e. json/xml (server) or JavaScript (client)).

When mashed up with another Nucleus location API we could easily make a FourSquare like app that finds buildings around a location:

http://nucleus.online.lincoln.ac.uk/locations/buildings_near/format/xml?lat=53.228482&long=-0.547847&distance=0.5&limit=10

I’ll make sure that all of these location APIs are properly documented soon so people can go have fun with them. Also, none of these location APIs require any sort of authentication (though we are rate limiting so don’t try and kill our servers please!).

Busy bees

The last fortnight has been incredibly busy:

Nick and I finished off the client side design for “Posters at Lincoln” which was well received by MARCOMMS and will be soft launching in the next few weeks.

Preview of Posters at Lincoln site
Preview of Posters at Lincoln site

Posters at Lincoln will be the first Lincoln site to use the new “common web design” that I designed. The CWD is going to be rolled out to other sites over the coming months including Enterprise@Lincoln, Blogs, Network Access (LUNA), Wireless Access, Pay for Print, Print From My PC and the Library Portal. We’ve set up a blog at thecwd.dev.lincoln.ac.uk to show off some of the new sites we’re making.

A preview of the "common web design"
A preview of the "common web design"

I’ve started laying down some of the ground work for the new APIs that we’re developing for use in new applications. So far we’ve got the starts of an authentication API (which can be interacted with via OAuth, SAML or Shibboleth), a basic library API which interacts with Horizon, and Nick has been working on an API that integrates with the Virtual Project Office system.

In my spare time I’ve developed an OAuth server for the CodeIgniter framework which I’m currently integrating with Phil Sturgeon‘s CodeIngiter REST server which we’re using as the basis for the APIs mentioned above.

Apparently our open API is giving our customers unprecenteded control over their own lives allowing them to seize control of their destinies. So please shut it down.
Apparently our open API is giving our customers unprecenteded control over their own lives allowing them to seize control of their destinies. So please shut it down.

Some how I’ve also managed to attend a couple of lectures and submit an Artificial Intelligence assignment in there as well!

All in all I’m thoroughly enjoying my new job in the Online Services Team, however I will admit to struggling to not work outside of work hours – some of the stuff we’re working on / have planned is just so much fun!