GeoHash { public static Coverage coverBoundingBoxMaxHashes(double topLeftLat, final double topLeftLon, final double bottomRightLat, final double bottomRightLon, int maxHashes) { CoverageLongs coverage = null; int startLength = hashLengthToCoverBoundingBox(topLeftLat, topLeftLon, bottomRightLat, bottomRightLon); if (startLength == 0) startLength = 1; for (int length = startLength; length <= MAX_HASH_LENGTH; length++) { CoverageLongs c = coverBoundingBoxLongs(topLeftLat, topLeftLon, bottomRightLat, bottomRightLon, length); if (c.getCount() > maxHashes) return coverage == null ? null : new Coverage(coverage); else coverage = c; } return new Coverage(coverage); } private  GeoHash(); static String adjacentHash(String hash, Direction direction); static String right(String hash); static String left(String hash); static String top(String hash); static String bottom(String hash); static String adjacentHash(String hash, Direction direction, int steps); static List<String> neighbours(String hash); static String encodeHash(double latitude, double longitude); static String encodeHash(LatLong p, int length); static String encodeHash(LatLong p); static String encodeHash(double latitude, double longitude, int length); static LatLong decodeHash(String geohash); static int hashLengthToCoverBoundingBox(double topLeftLat, double topLeftLon,
            double bottomRightLat, double bottomRightLon); static boolean hashContains(String hash, double lat, double lon); static Coverage coverBoundingBox(double topLeftLat, final double topLeftLon,
            final double bottomRightLat, final double bottomRightLon); static Coverage coverBoundingBoxMaxHashes(double topLeftLat, final double topLeftLon,
            final double bottomRightLat, final double bottomRightLon, int maxHashes); static Coverage coverBoundingBox(double topLeftLat, final double topLeftLon,
            final double bottomRightLat, final double bottomRightLon, final int length); static double heightDegrees(int n); static double widthDegrees(int n); static String gridAsString(String hash, int size, Set<String> highlightThese); static String gridAsString(String hash, int fromRight, int fromBottom, int toRight,
            int toBottom); static String gridAsString(String hash, int fromRight, int fromBottom, int toRight,
            int toBottom, Set<String> highlightThese); static final int MAX_HASH_LENGTH; static final int DEFAULT_MAX_HASHES; }
@Test public void testCoverBoundingBoxWithMaxHashesThrowsException() { Coverage coverage = coverBoundingBoxMaxHashes(SCHENECTADY_LAT, SCHENECTADY_LON, HARTFORD_LAT, HARTFORD_LON, 0); assertNull(coverage); }
@Test public void testCoverBoundingBoxWithMaxHashesIsOne() { Coverage coverage = coverBoundingBoxMaxHashes(SCHENECTADY_LAT, SCHENECTADY_LON, HARTFORD_LAT, HARTFORD_LON, 1); assertEquals(1, coverage.getHashes().size()); assertEquals(2, coverage.getHashLength()); }
@Test public void testCoverBoundingBoxWithMaxHashesReturnsMoreThanMax() { Coverage coverage = coverBoundingBoxMaxHashes(SCHENECTADY_LAT, SCHENECTADY_LON, SCHENECTADY_LAT - 0.000000001, SCHENECTADY_LON + 0.000000001, Integer.MAX_VALUE); assertEquals(GeoHash.MAX_HASH_LENGTH, coverage.getHashLength()); }