-
---
--- Name: tile_for_point(integer, integer); Type: FUNCTION; Schema: public; Owner: -
---
-
-CREATE FUNCTION public.tile_for_point(scaled_lat integer, scaled_lon integer) RETURNS bigint
- LANGUAGE plpgsql IMMUTABLE
- AS $$
-DECLARE
- x int8; -- quantized x from lon,
- y int8; -- quantized y from lat,
-BEGIN
- x := round(((scaled_lon / 10000000.0) + 180.0) * 65535.0 / 360.0);
- y := round(((scaled_lat / 10000000.0) + 90.0) * 65535.0 / 180.0);
-
- -- these bit-masks are special numbers used in the bit interleaving algorithm.
- -- see https://graphics.stanford.edu/~seander/bithacks.html#InterleaveBMN
- -- for the original algorithm and more details.
- x := (x | (x << 8)) & 16711935; -- 0x00FF00FF
- x := (x | (x << 4)) & 252645135; -- 0x0F0F0F0F
- x := (x | (x << 2)) & 858993459; -- 0x33333333
- x := (x | (x << 1)) & 1431655765; -- 0x55555555
-
- y := (y | (y << 8)) & 16711935; -- 0x00FF00FF
- y := (y | (y << 4)) & 252645135; -- 0x0F0F0F0F
- y := (y | (y << 2)) & 858993459; -- 0x33333333
- y := (y | (y << 1)) & 1431655765; -- 0x55555555
-
- RETURN (x << 1) | y;
-END;
-$$;
-
-