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)
};
}
}