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:
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)
};
}
}
Tags: actionscript, flex, geohashflash, geohashing, xkcd
I'm working on a little Flex Geohashing application which required me to convert a fractional Hex value to decimal and the net was no help. It's a trivial algorithm, but it's not the kind of thing I want to spend my time writing. So, Here you go, future!
public function fractionalHexToDecimal(hex:String):Number {
var total:Number = 0;
for(var i:int = 0; i < hex.length; i++) {
total += (parseInt("0x" + hex.charAt(i)) / Math.pow(16,i+1));
}
return total;
}
Only pass in the fractional. No "0x". No decimal point. Here's how it do.
fractionalHexToDecimal("1");
// 0.0625
fractionalHexToDecimal("0a");
// 0.0390625
fractionalHexToDecimal("db9318c2259923d0");
// 0.8577132677070023
Geohashing App forthcoming.
Tags: actionscript, geohashing