package com.esri; import ch.hsr.geohash.BoundingBox; /** */ public final class Quad { private Quad() { } private final static long MSB = 1L << 63; public static BoundingBox decode(final long bits) { return decode(bits, 32); } public static BoundingBox decode( long bits, int levels) { double xmin = -180, xmax = 180, ymin = -90, ymax = 90; levels = Math.min(32, levels); for (int l = 0; l < levels; l++) { final double xmid = (xmin + xmax) * 0.5; if ((bits & MSB) == 0) { xmax = xmid; } else { xmin = xmid; } bits <<= 1; final double ymid = (ymin + ymax) * 0.5; if ((bits & MSB) == 0) { ymax = ymid; } else { ymin = ymid; } bits <<= 1; } return new BoundingBox(ymin, ymax, xmin, xmax); } public static long encode( final double x, final double y ) { return encode(x, y, 32); } public static long encode( final double x, final double y, int levels) { long bits = 0; double xmin = -180, xmax = 180, ymin = -90, ymax = 90; levels = Math.min(32, levels); for (int l = 0; l < levels; l++) { bits <<= 1; final double xmid = (xmin + xmax) * 0.5; if (x < xmid) { xmax = xmid; } else { xmin = xmid; bits |= 1L; } bits <<= 1; final double ymid = (ymin + ymax) * 0.5; if (y < ymid) { ymax = ymid; } else { ymin = ymid; bits |= 1L; } } bits <<= (64 - levels - levels); return bits; } }