{ "cells": [ { "cell_type": "markdown", "id": "a2ed3d3b-1e72-4751-b318-d131b1b55c00", "metadata": {}, "source": [ "# Resampling to lon-lat grid\n", "\n", "This notebook shows a quick way to resample HEALPix data to a lon/lat grid using nearest neighbors.\n", "\n", "## Remapping via source indices\n", "Likely, the easiest method for resampling HEALPix data is to compute which index of the HEALPix grid corresponds to each pixel of the target grid. We'll take this approach and build a function which computes the HEALPix pixel indices for each lon/lat pair in a [rectilinear grid](https://en.wikipedia.org/wiki/Regular_grid#Rectilinear_grid) of longitudes and latitudes:" ] }, { "cell_type": "code", "execution_count": 1, "id": "ed9df4e6-d8b6-4ce8-930a-fa6b17dbbacf", "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "import xarray as xr\n", "import healpy\n", "\n", "\n", "def get_nn_lon_lat_index(nside, lons, lats):\n", " lons2, lats2 = np.meshgrid(lons, lats)\n", " return xr.DataArray(\n", " healpy.ang2pix(nside, lons2, lats2, nest=True, lonlat=True),\n", " coords=[(\"lat\", lats), (\"lon\", lons)],\n", " )" ] }, { "cell_type": "markdown", "id": "002d7607-c480-4e49-8d25-40fcf422f226", "metadata": {}, "source": [ "Let's try this function on a coarse HEALPix grid (`nside=2`) and for a coarse global lon/lat grid. We'll obtain an array of cell indices:" ] }, { "cell_type": "code", "execution_count": 2, "id": "295c30d4-9f04-4583-b619-8445c209ece9", "metadata": { "tags": [] }, "outputs": [ { "data": { "text/html": [ "
<xarray.DataArray (lat: 5, lon: 10)>\n", "array([[40, 40, 40, 44, 44, 32, 32, 36, 36, 40],\n", " [42, 42, 41, 46, 45, 34, 33, 38, 37, 42],\n", " [25, 25, 30, 29, 18, 17, 22, 21, 26, 25],\n", " [10, 10, 9, 14, 13, 2, 1, 6, 5, 10],\n", " [11, 11, 11, 15, 15, 3, 3, 7, 7, 11]])\n", "Coordinates:\n", " * lat (lat) float64 -90.0 -45.0 0.0 45.0 90.0\n", " * lon (lon) float64 -180.0 -140.0 -100.0 -60.0 ... 60.0 100.0 140.0 180.0