Ctrl K
ComunidadGuías…

src/lib/map-grid.ts

Rama main · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
// The grid every tile belongs to: Web Mercator in GL JS's units - a 512 px
// tile, which is also the size the map renderer draws one at - its projection,
// and the middle of a square of it.
//
// A module of its own because the renderer imports it: its signature hashes
// every source that reaches its bundle, so what lives here is what decides a
// tile's pixels and nothing about how a card or a hero lays them out.

import type { LatLon } from "@/lib/basemap";

export const TILE_SIZE = 512;

// GL JS's own projection, in its own spelling, so the two agree to the last
// bit rather than to a rounding.
export const mercatorX = (longitude: number) => (180 + longitude) / 360;
export const mercatorY = (latitude: number) =>
  (180 -
    (180 / Math.PI) *
      Math.log(Math.tan(Math.PI / 4 + (latitude * Math.PI) / 360))) /
  360;
export const longitudeAt = (x: number) => x * 360 - 180;
export const latitudeAt = (y: number) =>
  (360 / Math.PI) * Math.atan(Math.exp(((180 - y * 360) * Math.PI) / 180)) - 90;

/** The middle of tile `z/x/y`, which the renderer draws the tile around. */
export function tileCenter(z: number, x: number, y: number): LatLon {
  const tiles = 2 ** z;
  return {
    latitude: latitudeAt((y + 0.5) / tiles),
    longitude: longitudeAt((x + 0.5) / tiles),
  };
}