void GeohashGetCoordRange(ref GeoHashRange longRange, ref GeoHashRange latRange)
 {
     /* These are constraints from EPSG:900913 / EPSG:3785 / OSGEO:41001 */
     /* We can't geocode at the north/south pole. */
     longRange.Max = GeoLongMax;
     longRange.Min = GeoLongMin;
     latRange.Max  = GeoLatMax;
     latRange.Min  = GeoLatMin;
 }
        int GeohashEncode(GeoHashRange longRange, GeoHashRange latRange, double longitude, double latitude,
                          ushort step, ref GeoHashBits hash)
        {
            /* Check basic arguments sanity. */
            if (step > 32 || step == 0 ||
                Rangepiszero(latRange) || Rangepiszero(longRange))
            {
                return(0);
            }

            /* Return an error when trying to index outside the supported
             * constraints. */
            if (longitude > GeoLongMax)
            {
                return(0);
            }
            if (longitude < GeoLongMin)
            {
                return(0);
            }
            if (latitude > GeoLatMax)
            {
                return(0);
            }
            if (latitude < GeoLatMin)
            {
                return(0);
            }

            hash.Bits = 0;
            hash.Step = step;

            if (latitude < latRange.Min || latitude > latRange.Max ||
                longitude < longRange.Min || longitude > longRange.Max)
            {
                return(0);
            }

            double latOffset =
                (latitude - latRange.Min) / (latRange.Max - latRange.Min);
            double longOffset =
                (longitude - longRange.Min) / (longRange.Max - longRange.Min);

            /* convert to fixed point based on the step size */
            latOffset  *= (1UL << step);
            longOffset *= (1UL << step);
            hash.Bits   = Interleave64((uint)latOffset, (uint)longOffset);
            return(1);
        }
 private bool Rangeiszero(GeoHashRange r)
 {
     return(r.Max == 0.0 && r.Min == 0.0);
 }
 private bool Rangepiszero(GeoHashRange r)
 {
     return(Rangeiszero(r));
 }
 int GeohashDecodeType(GeoHashBits hash, GeoHashArea area)
 {
     GeoHashRange[] r = new GeoHashRange[2];
     GeohashGetCoordRange(ref r[0], ref r[1]);
     return(GeohashDecode(r[0], r[1], hash, area));
 }
 int GeohashEncodeType(double longitude, double latitude, ushort step, ref GeoHashBits hash)
 {
     GeoHashRange[] r = new GeoHashRange[2];
     GeohashGetCoordRange(ref r[0], ref r[1]);
     return(GeohashEncode(r[0], r[1], longitude, latitude, step, ref hash));
 }