public function decode($hash)
        {
            //decode hash into binary string
            $binary = "";
            $hl = strlen($hash);

            for($i = 0; $i < $hl; $i++) {
                $binary .= $this->codingMap[substr($hash, $i, 1)];
            }

            //split the binary into lat and log binary strings
            $bl = strlen($binary);
            $blat = "";
            $blong = "";

            for ($i = 0; $i < $bl; $i++) {
                if ($i % 2) $blat = $blat . substr($binary, $i, 1);
                else $blong = $blong . substr($binary, $i, 1);
            }

            //now concert to decimal
            $lat = $this->binDecode($blat, -90, 90);
            $long = $this->binDecode($blong, -180, 180);

            //figure out how precise the bit count makes this calculation
            $latErr = $this->calcError(strlen($blat), -90, 90);
            $longErr = $this->calcError(strlen($blong), -180, 180);

            //how many decimal places should we use? There's a little art to
            //this to ensure I get the same roundings as geohash.org
            $latPlaces = max(1, -round(log10($latErr))) - 1;
            $longPlaces = max(1, -round(log10($longErr))) - 1;

            //round it
            $lat = round($lat, $latPlaces);
            $long = round($long, $longPlaces);

            return array($lat, $long);
        }