Okay, so it’s hardly an announcement, but I’ve been working on a flex app for determining your daily official xkcd meetup location via the geohashing method described in comic 426.
Much love to:
- Randall Munroe for beloved xkcd
- Google, for their lovely Maps API and documentation.
- Peeron for the help with the Dow Jones snapshots.
- Geoffrey Williams for his MD5 AS conversion
I’m still learning Flex and this is my first adventure with Google Map, so it’s rough. And there’s still a lot of work to do, like, validation, error checking, or testing for example. But hey, first pass!
Here’s the code for the actual GeoHash class. I have “view source” disabled because it currently contains my API key, but you can download the key-less zip.
public class GeoHasher { private var date:Date; private var dow:Number; private var latitude:Number; private var longitude:Number; private var dateHash:String; private var dowHash:String; private var ready:Boolean; public function GeoHasher() { this.ready = false; } public function reset( date:Date, dow:Number, latitude:Number, longitude:Number ):void { this.date = date; this.dow = dow; this.latitude = latitude; this.longitude = longitude; this.ready = true; setHashValues(); } public function getDestination():Object { if(ready) { var hash:Object = getHashAsDecimal(); return { latitude: toOrdinal(latitude, hash.date), longitude: toOrdinal(longitude, hash.dow) }; } return { latitude: "", longitude: "" }; } // privates private function setHashValues():void { var formattedDate:String = Utilities.dateFormat(date,"-"); var string:String = formattedDate + "-" + dow.toString(); var hash:String = MD5.encrypt(string); dateHash = hash.slice(0,hash.length / 2); dowHash = hash.slice(hash.length / 2,hash.length); } private function toOrdinal(pre:Number, post:Number):String { return (Math.floor(pre) + post).toString(); } private function getHash():Object { return { date: dateHash, dow: dowHash }; } private function getHashAsDecimal():Object { var hash:Object = getHash(); return { date: Utilities.fractionalHexToDecimal(hash.date), dow: Utilities.fractionalHexToDecimal(hash.dow) }; } }