#MonthOfJulia Day 35: Mapping
A lot of my data reflects events happening at different geographic locations (and, incidentally, at different times, but that’s another story). So it’s not surprising that I’m interested in mapping those data. Julia has an OpenStreetMap package which presents an interface to the OpenStreetMap service. The package is well documented and has an extensive range of functionality. As with a number of previous posts in this series, I’m just going to skim the surface of what’s available.
We’ll need to load up the Requests package to retrieve the map data and the OpenStreetMap package to manipulate and process those data.
As far as I can see the OpenStreetMap package doesn’t implement functionality for downloading the map data. So we do this directly through an HTTP request. We’ll specify a map area by giving the latitude and longitude of the bottom-left and top-right corners.
We then build the query URL using Julia’s convenient string interpolation and execute a GET request against the OpenStreetMap API.
Save the resulting data (it’s just a large blob of XML) to a file. Feel free to open this file in an editor and browse around. Although there is currently no official schema for the OpenStreetMap XML, the documentation gives a solid overview of the format.
We process the contents of the XML file using
The call to
getOSMData() returns all of the data required to build a map. Amongst these you’ll find a dictionary of features broken down by
:name. It’s always handy to know where the nearest Woolworths is, and this area has two of them.
There are other dictionarys which list the highways and buildings in the area.
Although we specified the latitudinal and longitudinal extremes of the map originally, we can retrieve these wrapped up in a data structure. Note that these values are given in Latitude-Longitude-Altitude (LLA) coordinates. There’s functionality for transforming to other coordinate systems like East-North-Up (ENU).
We’re ready to take a look at the map using
And here’s what it looks like. There are ways to further customise the look and feel of the map.
Plotting maps is just the beginning. You can use
findIntersections() to fing highway intersections; generate a transportation network using
createGraph(); and find the shortest and fastest routes between locations using
fastestRoute(). The package is literally a trove of cool and useful things.
There might be interesting synergies between this package and the GeoInterface, GeoIP, GeoJSON and Geodesy packages. Those will have to wait for another day. But feel free to experiment in the meantime!