java.lang.Object
org.elasticsearch.search.aggregations.bucket.geogrid.GeoTileUtils

public final class GeoTileUtils extends Object
Implements geotile key hashing, same as used by many map tile implementations. The string key is formatted as "zoom/x/y" The hash value (long) contains all three of those values compacted into a single 64bit value: bits 58..63 -- zoom (0..29) bits 29..57 -- X tile index (0..2^zoom) bits 0..28 -- Y tile index (0..2^zoom)
  • Field Summary

    Fields
    Modifier and Type
    Field
    Description
    static final double
    The geo-tile map is clipped at 85.05112878 to 90 and -85.05112878 to -90
    static final int
    Largest number of tiles (precision) to use.
    static final double
    Since shapes are encoded, their boundaries are to be compared to against the encoded/decoded values of LATITUDE_MASK
    static final double
     
  • Method Summary

    Modifier and Type
    Method
    Description
    static int
    checkPrecisionRange(int precision)
    Assert the precision value is within the allowed range, and return it if ok, or throw.
    static int
    getXTile(double longitude, long tiles)
    Calculates the x-coordinate in the tile grid for the specified longitude given the number of tile columns for a pre-determined zoom-level.
    static int
    getYTile(double latitude, long tiles)
    Calculates the y-coordinate in the tile grid for the specified longitude given the number of tile rows for pre-determined zoom-level.
    static long
    longEncode(double longitude, double latitude, int precision)
    Encode lon/lat to the geotile based long format.
    static long
    longEncode(String hashAsString)
    Encode a geotile hash style string to a long.
    static long
    longEncodeTiles(int precision, long xTile, long yTile)
     
    static String
    stringEncode(long hash)
    Encode to a geotile string from the geotile based long format
    static Rectangle
    toBoundingBox(int xTile, int yTile, int precision)
     
    static Rectangle
    toBoundingBox(long hash)
     
    static Rectangle
    Decode a string bucket key in "zoom/x/y" format to a bounding box of the tile corners

    Methods inherited from class java.lang.Object

    clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
  • Field Details

    • MAX_ZOOM

      public static final int MAX_ZOOM
      Largest number of tiles (precision) to use. This value cannot be more than (64-5)/2 = 29, because 5 bits are used for zoom level itself (0-31) If zoom is not stored inside hash, it would be possible to use up to 32. Note that changing this value will make serialization binary-incompatible between versions. Another consideration is that index optimizes lat/lng storage, loosing some precision. E.g. hash lng=140.74779717298918D lat=45.61884022447444D == "18/233561/93659", but shown as "18/233561/93658"
      See Also:
    • LATITUDE_MASK

      public static final double LATITUDE_MASK
      The geo-tile map is clipped at 85.05112878 to 90 and -85.05112878 to -90
      See Also:
    • NORMALIZED_LATITUDE_MASK

      public static final double NORMALIZED_LATITUDE_MASK
      Since shapes are encoded, their boundaries are to be compared to against the encoded/decoded values of LATITUDE_MASK
    • NORMALIZED_NEGATIVE_LATITUDE_MASK

      public static final double NORMALIZED_NEGATIVE_LATITUDE_MASK
  • Method Details

    • checkPrecisionRange

      public static int checkPrecisionRange(int precision)
      Assert the precision value is within the allowed range, and return it if ok, or throw.
    • getXTile

      public static int getXTile(double longitude, long tiles)
      Calculates the x-coordinate in the tile grid for the specified longitude given the number of tile columns for a pre-determined zoom-level.
      Parameters:
      longitude - the longitude to use when determining the tile x-coordinate
      tiles - the number of tiles per row for a pre-determined zoom-level
    • getYTile

      public static int getYTile(double latitude, long tiles)
      Calculates the y-coordinate in the tile grid for the specified longitude given the number of tile rows for pre-determined zoom-level.
      Parameters:
      latitude - the latitude to use when determining the tile y-coordinate
      tiles - the number of tiles per column for a pre-determined zoom-level
    • longEncode

      public static long longEncode(double longitude, double latitude, int precision)
      Encode lon/lat to the geotile based long format. The resulting hash contains interleaved tile X and Y coordinates. The precision itself is also encoded as a few high bits.
    • longEncode

      public static long longEncode(String hashAsString)
      Encode a geotile hash style string to a long.
      Parameters:
      hashAsString - String in format "zoom/x/y"
      Returns:
      long encoded value of the given string hash
    • longEncodeTiles

      public static long longEncodeTiles(int precision, long xTile, long yTile)
    • stringEncode

      public static String stringEncode(long hash)
      Encode to a geotile string from the geotile based long format
    • toBoundingBox

      public static Rectangle toBoundingBox(long hash)
    • toBoundingBox

      public static Rectangle toBoundingBox(String hash)
      Decode a string bucket key in "zoom/x/y" format to a bounding box of the tile corners
    • toBoundingBox

      public static Rectangle toBoundingBox(int xTile, int yTile, int precision)