I've been an avid GPS user and enthusiast ever since purchasing my first accessible unit in 2006. Even so, I was somewhat disappointed in the state of the technology and made a variety of suggestions for improvements, some of which were met with scorn and hostility. The technology was sub-par, the community stifled innovation and something that should have been a source of fun and adventure was boring as hell. I felt that I could do better and, while it's taken years to do so, I think that I have. Hermes is my attempt at an open source, accessible, cross-platform GPS solution.
So why the name? Hermes is the deity for lots of cool travel-related concepts, as well as of borders and of crossing them. What could be more fitting for a project intended to free people from various confinements and limitations? I also wanted something to capture the notion that accessible GPS need not be boring, helping to realize everything from the mundane to the adventurous.
At the moment, Hermes has two components. The core library and engine is a Scala wrapper around LibOSM and, eventually, OSMNavigation. This means that it supports a number of geospatial data structures and queries, as well as data storage layers, in a GUI-agnostic manner. In layman's terms, the core functionality for plotting routes, describing maps in natural language, etc. can and hopefully will be used in a variety of front-ends ranging from self-contained devices similar to those currently marketed, to web-based geolocation services.
The second component is just such a thing. Hermes Mobile is a web-based interface to the core library, letting you explore maps from most modern web browsers. The interface is highly dynamic, uses AJAX and Comet heavily, and provides rich accessibility support by using Accessible Rich Internet Applications (ARIA). The results, pardon the pun, speak for themselves–at least, they do on my Linux box running Orca and Firefox 3.5.
If you're interested in playing with this tech, check out the demo instance. There are a few caveats, however:
- It's running on my desktop, since I don't have access to a server with the required RAM and disk space. I may pull the plug on it should people's testing interfere with my ability to watch movies or otherwise get work done. If this happens then I'll update this post.
- The server is only hosting maps for Texas at the moment. Loading maps for the entire world would require in excess of 200 gigs of disk space, not to mention an intense import process that would kill my desktop for days. Even so, you can still play with it if you don't live in TX.
- It may occasionally be down while I load newer versions with more features or upgrade the server.
- I've already had one request to load more maps and did so in that instance, but I probably won't do so again. I understand that people may want to explore specific areas, but this is just my desktop, and if I start loading maps left and right or arbitrarily deciding which to load then this stops being fun and starts becoming a drain on resources. It's a proof of concept for now.
To experiment with this, visit the above URL. If your browser doesn't support geolocation, you'll be prompted to either upgrade or to install Google Gears, though most features should work fine if you don't have a browser with geolocation support. You'll then be prompted to share your location. I don't do anything evil with this (or even persist it beyond your session.) When you click “OK,” “Yes” or whatever, you are then located on the map more or less accurately (I have no control over this part of the process) and can begin browsing. If you don't live in TX or don't wish to share your location, type a “city, TX” query (I.e. “Houston, TX”) or a Texas address into the search box and you'll be offered a list of search results which match your input. Simply select one then tab away and you'll be located at that point.
The browsing interface should be fairly simple. Basically, there's a list of nearby points of interest and intersections on the left, found within a range of 400 feet or so. Selecting one of these moves you to that location and updates the list again to feature nearby points relative to that. If you're on a street or at an intersection, a list of buttons for intersections reachable from your current position becomes available. In other words, you can browse by either selecting points from the list on the left, or by navigating the street network. Doing the former lets you move about an area more quickly and non-linearly, while the latter automatically sets your direction of travel and, as such, can list points and describe the area relative to the direction you're facing.
By default, distances are returned in metric units. If you can't handle this, it's fairly easy to change. Immediately below the search field are stats on your direction, altitude and speed, along with a popup reading “KPH.” Switching this to “MPH” globally changes the units used for the duration of your session.
You can also place beacons, which are a bit like points of interest, but appear regardless of where you are on the map. I'm planning a move, don't know this city very well and needed a way to basically mark a bunch of points and see where they all are in reference to potential housing. So with Hermes I can create several named beacons, browse to potential addresses and see where my beacons are relative to wherever I am. Right now these persist only for the length of the session. When I add user accounts, these plus user POIs and other details will be saved between sessions.
So what's next? This is obviously an early version, but it's not intended as a throw-away prototype. The code is well-written, open source and being steadily improved. As its name implies, my ultimate intent is for this to be usable on data-capable mobile devices, but it's already a useful tool for exploring locations from the desktop. For mobile users, I plan on adding augmented reality features to, in essence, let you write notes on reality. Forget which buttons on the machines in the laundrymat do what, or which is the door into your favorite store or restaurant? No problem, just write a note on that location and have it and others displayed whenever you enter a configurable range.
I'm also planning social network integration. I've been in many situations where I've needed help finding an obscure or unmarked bus stop, or some other business, but there's just not a pedestrian around to ask. With Hermes Mobile, you'll be able to take a picture or video of your location and post it, along with Google and OpenStreetMap views of your location, to your Twitter and Facebook feeds. Instead of waiting for pedestrians, simply croudsource your question and receive answers directly in the app.
Also, since the Hermes core is GUI agnostic, there's no reason that someone else can't do cool things for disconnected devices as well. My ultimate goal is for Hermes to work just as well on forest trails as it does on city streets, so you can take a disconnected PDA of some sort, map out a path and use it for routing just as will eventually be possible over road networks. For the moment, though, my efforts are concentrated on the mobile interface.
I also need to get the open source infrastructure set up. I'm not sure when I'll get around to doing that, as that's a bit dull compared to the rest of this, though if there's developer interest then I might be convinced to do it sooner rather than later.
My ultimate plans are to monetize this as a small business. The requirements are a bit odd in that it will likely use a large and growing pool of disk space (I'm thinking half a TB to be safe) but likely not a whole lot of bandwidth, which makes it a bad fit for most VPS providers. It also needs Java-based hosting and uses MongoDB for its back-end storage, which rules out just about every other hosting provider out there. The only way forward will likely be buying or leasing a server or two to host this, meaning I can't just do it as a voluntary thing. I'm thinking of a monthly subscription-based model with a brief trial period. Admittedly, OSM data isn't the best available, but it will only improve over time. With a trial period and subscription-based model, you'll be able to see if it meets your needs, cancel if it ever doesn't, and OSM's map coverage may be sufficient enough for most use cases. In quite a few instances, a $15 or so per month subscription is probably far better than the $1500 investment I made when I purchased my Trekker in '06, and I'm already doing tasks in Hermes that the Trekker community told me weren't supported.
Anyhow, I look forward to feedback, as well as to developer contributions. This project has gone through various incarnations over the past few years, as well as many rewrites, so I'm thrilled to finally have something to show for my efforts.
Last but not least, I'd like to take a moment to express a bit of geek squee over what a joy working with Lift has been. It isn't the easiest framework to wrap your head around I'll admit, but once you do…wow. Had I done this in Rails, I'd have been bogged down with plumbing–setting up controllers, defining routes and a whole bunch more tedium that Rails was supposed to avoid. Over the last few weeks I've really been getting it, though, and have added a whole bunch of interactivity in just the last week or so. It's amazing. I get an idea in my head and within a few minutes there's new front-end javascript sending data back into my Lift app which is processing it and updating HTML like magic, often without my even having to write a single character of JS. I often forget that I'm even using HTML, or even that I'm designing a website, instead feeling as if I'm developing an application.