metalfrom.eu/apps/api/migrations/010_band_locations_geom.sql
Nicolas Fryder 39e6b2a66f feat(map): carte multi-localisations — un point par step géocodé
La carte clusterisait depuis bands.geom (un seul point par groupe). Désormais
/api/clusters source band_locations : un groupe multi-périodes (ex. Thessaloniki
puis Boston) apparaît comme plusieurs points distincts.

- migration 010: colonne geom générée (Point,4326) + index GIST sur
  band_locations (évite le seq-scan sur les requêtes bbox)
- /api/clusters: FROM band_locations bl JOIN bands b, bbox via geom && envelope,
  filtres (pays/statut/genre/année) sur b.*, points issus de bl.lat/lon ;
  la JSON des clusters porte location_raw + step_label
- web parseBandData: expose location_raw + step_label (base pour différencier
  plus tard un groupe qui a déménagé d'un groupe resté sur place)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-02 19:52:40 +02:00

16 lines
634 B
SQL

-- 010_band_locations_geom.sql
-- La carte doit clusteriser par LOCALISATION (band_locations), pas par groupe
-- (bands). band_locations n'avait que lat/lon sans index spatial → seq-scan à
-- chaque déplacement de carte. On ajoute une colonne geom générée + index GIST,
-- alignée sur le pattern de la table bands.
ALTER TABLE band_locations
ADD COLUMN IF NOT EXISTS geom geometry(Point, 4326)
GENERATED ALWAYS AS (
CASE
WHEN lat IS NOT NULL AND lon IS NOT NULL
THEN ST_SetSRID(ST_MakePoint(lon, lat), 4326)
END
) STORED;
CREATE INDEX IF NOT EXISTS idx_bl_geom ON band_locations USING GIST (geom);