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#
|
Renvoie les 4 cellules HEALPix et leurs poids d'interpolation bilinéaire |
|
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.ndarrayofuint64,shape (N,4)) – Indices des 4 cellules HEALPix (schéma NESTED).weights (
np.ndarrayoffloat64,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#