geoviewer
A browser-based viewer for geospatial scientific data — netCDF, HDF5, and GRIB — inspired by NASA Panoply.
Browse a whitelisted server directory, pick a variable, and get an interactive lat/lon map with a time/level slider, colormap control, and a metadata panel. It runs as a single Panel app served over the web, with no uploads — files stay on the server.
Features
- Multi-format readers behind one interface: netCDF (classic and netCDF-4/HDF5-backed), HDF5, and GRIB (via cfgrib/eccodes).
- Variable list with automatic dimension-role detection (
x/y/z/time) via naming heuristics and unit hints. - Interactive map rendered with datashader rasterization (falls back to plain rendering when unavailable).
- Time and vertical-level sliders for N-D variables.
- Colormap picker and per-dimension role overrides.
- Metadata panel showing the selected variable's attributes.
- Directory whitelist with path-traversal protection — server-side browsing only.
Installation
Requires Python 3.11+.
pip install .
For an editable install that includes the test/lint tooling:
pip install -e ".[dev]"
With uv:
uv pip install .
GRIB support needs the eccodes C library; the eccodes wheel bundles it, or install it system-wide (conda install -c conda-forge eccodes).
Usage
Start the server, pointing NC_VIEWER_ROOTS at one or more directories to browse (colon-separated):
NC_VIEWER_ROOTS=/data/mydata:/data/more python -m panel serve app.py --port 5006
Then open http://localhost:5006/app.
To serve on a remote machine, use an SSH tunnel:
ssh -L 5006:127.0.0.1:5006 user@host
Natural Earth feature data (first render)
Coastlines, borders and the graticule come from Natural Earth data, which
cartopy downloads on first use and caches in ~/.local/share/cartopy. Behind
a blocking proxy the download fails; the map still renders, just without the
overlays (a warning names the unavailable features). To pre-seed the cache on
a proxied server, clear the proxy variables and render any map once:
env -u http_proxy -u https_proxy python -m panel serve app.py --port 5006
Environment variables
| Variable | Default | Description |
|---|---|---|
NC_VIEWER_ROOTS |
. |
Colon-separated whitelisted directories to browse |
NUMBA_CACHE_DIR |
<tmp>/numba_cache |
Numba JIT cache directory (used by datashader rasterization) |
Architecture
readers/ unified Reader abstraction (netCDF / HDF5 / GRIB) -> xarray
services/ catalog whitelist, dimension role model, slice LRU cache
ui/ Panel components (file browser, variable panel, map, controls, metadata)
app.py Panel entrypoint wiring callbacks
Testing
python -m pytest -q
License
Metadata
Release files for geoviewer 0.3.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| geoviewer-0.3.0.tar.gz | 24.4 kB | With provenance | Details for geoviewer-0.3.0.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| geoviewer-0.3.0-py3-none-any.whl | Python 3 | none | any | Details for geoviewer-0.3.0-py3-none-any.whl |
Total release size: 45.9 kB
Release files / geoviewer-0.3.0.tar.gz
| Download URL | geoviewer-0.3.0.tar.gz |
|---|---|
| Size | 24.4 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
8f14d4945c675d51ee48586e6a8cfc2a11282d6aab14dff98e735ef9a720fc4d
|
|
BLAKE2b-256 checksum How to use checksums |
1d05252b06f359c7aea155438047fcd23bb34c6c68f433a75c74f05ff8206bae
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 1, 2026.
Transparency logRelease files / geoviewer-0.3.0-py3-none-any.whl
| Download URL | geoviewer-0.3.0-py3-none-any.whl |
|---|---|
| Size | 21.5 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
56a70069b015423cddf1e79a078c313965b2d2616ca2c568fc298f0a752242de
|
|
BLAKE2b-256 checksum How to use checksums |
30d7887fbb20139caffa537a32d2a981e6065f236a393909924aa9fe0109762a
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 1, 2026.
Transparency logSecurity for geoviewer 0.3.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
Full provenance
Both files in this release have been uploaded with provenance metadata.
Attestation for geoviewer-0.3.0.tar.gz
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 1, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.