healpix_analyse.healpix_interp#

get_interp_val — interpolation bilinéaire sur une grille HEALPix (NESTED) via healpix-geo pour les conversions de coordonnées.

Équivalent à healpy.get_interp_val / get_interp_weights.

Deux régimes, selon ellipsoid :

  • ellipsoid=”sphere” (défaut) : reproduit EXACTEMENT l’algorithme RING de référence de healpy (T_Healpix_Base::get_interpol, healpix_base.cc), transcrit ici en pur NumPy (aucune dépendance à healpy au runtime). Les 4 pixels renvoyés sont rigoureusement identiques à healpy.get_interp_weights(nside, lon, lat, lonlat=True, nest=True) (schéma NESTED, obtenu par conversion RING->NESTED via healpix_geo.ring.to_nested) ; les poids concordent à ~1e-12 près (bruit de calcul flottant inévitable tant qu’on ne relie pas le même binaire C++ — largement sous la précision utile de n’importe quelle application scientifique).

  • ellipsoid != “sphere” (ex. “WGS84”) : healpy n’a aucune notion d’ellipsoïde, donc “identique à healpy” n’a pas de sens dans ce cas. On délègue alors directement à healpix_geo.nested.bilinear_interpolation, qui implémente une interpolation bilinéaire géométriquement correcte (vérifiée indépendamment, voir la discussion qui a mené à ce fichier) et supporte nativement les ellipsoïdes de référence.

Dépendances :

pip install healpix-geo # inclut cdshealpix comme dépendance pip install numpy

Auteurs : Claude (Anthropic)

Attributes#

Functions#

get_interp_weights(→ tuple[numpy.ndarray, numpy.ndarray])

Renvoie les 4 cellules HEALPix et leurs poids d'interpolation bilinéaire

get_interp_val(→ numpy.ndarray)

Interpolation bilinéaire d'une carte HEALPix aux coordonnées géographiques.

Module Contents#

healpix_analyse.healpix_interp.get_interp_weights(lon: numpy.ndarray, lat: numpy.ndarray, depth: int, ellipsoid: str = 'sphere') → tuple[numpy.ndarray, numpy.ndarray][source]#

Renvoie les 4 cellules HEALPix et leurs poids d’interpolation bilinéaire pour chaque position (lon, lat).

Pour ellipsoid=”sphere” (défaut), les résultats (pixels ET poids) sont rigoureusement identiques à healpy.get_interp_weights(nside, lon, lat, lonlat=True, nest=True) (aux erreurs d’arrondi flottant près, ~1e-12) : c’est un portage direct de l’algorithme RING de référence de healpy, pas une réinvention géométrique approximative.

Pour un ellipsoïde non-sphérique, il n’existe pas de “référence healpy” (healpy ne connaît que la sphère) : on utilise alors healpix_geo.nested.bilinear_interpolation, qui implémente une interpolation bilinéaire correcte sur la grille NESTED en tenant compte de l’ellipsoïde choisi.

Parameters:
  • lon (np.ndarray, shape (N,)) – Longitudes en degrés.

  • lat (np.ndarray, shape (N,)) – Latitudes en degrés.

  • depth (int) – Profondeur HEALPix (nside = 2**depth).

  • ellipsoid (str, optional) – Ellipsoïde de référence : “sphere” (défaut, identique à healpy) ou “WGS84”, “GRS80”, etc. Voir la doc de healpix-geo pour la liste.

Returns:

  • pixels (np.ndarray of uint64, shape (N, 4)) – Indices des 4 cellules HEALPix (schéma NESTED).

  • weights (np.ndarray of float64, shape (N, 4)) – Poids bilinéaires correspondants. Chaque ligne somme à 1.

Raises:

ValueError – Si lon et lat n’ont pas la même forme.

healpix_analyse.healpix_interp.get_interp_val(hpx_map: numpy.ndarray, lon, lat, depth: int, ellipsoid: str = 'sphere') → numpy.ndarray[source]#

Interpolation bilinéaire d’une carte HEALPix aux coordonnées géographiques.

Équivalent à healpy.get_interp_val(m, theta, phi, nest=True, lonlat=True) mais utilise healpix-geo pour les projections, ce qui permet de travailler sur des ellipsoïdes de référence (ex. WGS84).

Parameters:
  • hpx_map (np.ndarray, shape (12 * 4**depth,)) – Carte HEALPix en ordre NESTED.

  • lon (float ou np.ndarray) – Longitude(s) en degrés.

  • lat (float ou np.ndarray) – Latitude(s) en degrés.

  • depth (int) – Profondeur HEALPix (nside = 2**depth).

  • ellipsoid (str, optional) – Ellipsoïde de référence : “sphere” (défaut) ou “WGS84”, etc.

Returns:

np.ndarray ou float – Valeurs interpolées. Scalaire si lon/lat sont scalaires, sinon array de même forme que lon/lat.

Examples

>>> import numpy as np
>>> from healpix_interp import get_interp_val
>>>
>>> depth = 3
>>> nside  = 2**depth
>>> npix   = 12 * nside**2
>>> hpx_map = np.arange(npix, dtype=float)
>>>
>>> # Point unique
>>> val = get_interp_val(hpx_map, lon=45.0, lat=30.0, depth=depth)
>>> print(val)
>>>
>>> # Grille de points
>>> lons = np.linspace(0, 360, 50)
>>> lats = np.linspace(-80, 80, 40)
>>> lon_grid, lat_grid = np.meshgrid(lons, lats)
>>> vals = get_interp_val(hpx_map, lon_grid, lat_grid, depth=depth)
>>> print(vals.shape)  # (40, 50)
>>>
>>> # Avec ellipsoïde WGS84
>>> vals_wgs84 = get_interp_val(
...     hpx_map, lon=2.3522, lat=48.8566, depth=depth, ellipsoid="WGS84"
... )

Notes

La carte hpx_map doit contenir exactement 12 * 4**depth éléments et être en ordre NESTED (le schéma utilisé par healpix-geo).

Si votre carte est en ordre RING (healpy), convertissez-la d’abord :

import healpy as hp hpx_map_nested = hp.reorder(hpx_map_ring, r2n=True)

healpix_analyse.healpix_interp.depth = 5#