/******************************************************************************* * Copyright (c) 2015 Voyager Search and MITRE * All rights reserved. This program and the accompanying materials * are made available under the terms of the Apache License, Version 2.0 which * accompanies this distribution and is available at * http://www.apache.org/licenses/LICENSE-2.0.txt ******************************************************************************/ package org.locationtech.spatial4j.io; import org.locationtech.spatial4j.context.SpatialContext; import org.locationtech.spatial4j.shape.Point; import org.junit.Test; import static org.junit.Assert.assertEquals; /** * Tests for {@link GeohashUtils} */ public class TestGeohashUtils { SpatialContext ctx = SpatialContext.GEO; /** * Pass condition: lat=42.6, lng=-5.6 should be encoded as "ezs42e44yx96", * lat=57.64911 lng=10.40744 should be encoded as "u4pruydqqvj8" */ @Test public void testEncode() { String hash = GeohashUtils.encodeLatLon(42.6, -5.6); assertEquals("ezs42e44yx96", hash); hash = GeohashUtils.encodeLatLon(57.64911, 10.40744); assertEquals("u4pruydqqvj8", hash); } /** * Pass condition: lat=52.3738007, lng=4.8909347 should be encoded and then * decoded within 0.00001 of the original value */ @Test public void testDecodePreciseLongitudeLatitude() { String hash = GeohashUtils.encodeLatLon(52.3738007, 4.8909347); Point point = GeohashUtils.decode(hash,ctx); assertEquals(52.3738007, point.getY(), 0.00001D); assertEquals(4.8909347, point.getX(), 0.00001D); } /** * Pass condition: lat=84.6, lng=10.5 should be encoded and then decoded * within 0.00001 of the original value */ @Test public void testDecodeImpreciseLongitudeLatitude() { String hash = GeohashUtils.encodeLatLon(84.6, 10.5); Point point = GeohashUtils.decode(hash, ctx); assertEquals(84.6, point.getY(), 0.00001D); assertEquals(10.5, point.getX(), 0.00001D); } /* * see https://issues.apache.org/jira/browse/LUCENE-1815 for details */ @Test public void testDecodeEncode() { String geoHash = "u173zq37x014"; assertEquals(geoHash, GeohashUtils.encodeLatLon(52.3738007, 4.8909347)); Point point = GeohashUtils.decode(geoHash,ctx); assertEquals(52.37380061d, point.getY(), 0.000001d); assertEquals(4.8909343d, point.getX(), 0.000001d); assertEquals(geoHash, GeohashUtils.encodeLatLon(point.getY(), point.getX())); geoHash = "u173"; point = GeohashUtils.decode("u173",ctx); geoHash = GeohashUtils.encodeLatLon(point.getY(), point.getX()); final Point point2 = GeohashUtils.decode(geoHash, ctx); assertEquals(point.getY(), point2.getY(), 0.000001d); assertEquals(point.getX(), point2.getX(), 0.000001d); } /** see the table at http://en.wikipedia.org/wiki/Geohash */ @Test public void testHashLenToWidth() { //test odd & even len double[] boxOdd = GeohashUtils.lookupDegreesSizeForHashLen(3); assertEquals(1.40625,boxOdd[0],0.0001); assertEquals(1.40625,boxOdd[1],0.0001); double[] boxEven = GeohashUtils.lookupDegreesSizeForHashLen(4); assertEquals(0.1757,boxEven[0],0.0001); assertEquals(0.3515,boxEven[1],0.0001); } /** see the table at http://en.wikipedia.org/wiki/Geohash */ @Test public void testLookupHashLenForWidthHeight() { assertEquals(1, GeohashUtils.lookupHashLenForWidthHeight(999,999)); assertEquals(1, GeohashUtils.lookupHashLenForWidthHeight(999,46)); assertEquals(1, GeohashUtils.lookupHashLenForWidthHeight(46,999)); assertEquals(2, GeohashUtils.lookupHashLenForWidthHeight(44,999)); assertEquals(2, GeohashUtils.lookupHashLenForWidthHeight(999,44)); assertEquals(2, GeohashUtils.lookupHashLenForWidthHeight(999,5.7)); assertEquals(2, GeohashUtils.lookupHashLenForWidthHeight(11.3,999)); assertEquals(3, GeohashUtils.lookupHashLenForWidthHeight(999,5.5)); assertEquals(3, GeohashUtils.lookupHashLenForWidthHeight(11.1,999)); assertEquals(GeohashUtils.MAX_PRECISION, GeohashUtils.lookupHashLenForWidthHeight(10e-20,10e-20)); } }