Catalog PyPI
Back to packageRELEASE DETAILS

1.0.0

PyPI

aetherpy

Fast Python library for terrain visibility analysis

demgisremote-sensingviewshedvisibility
Published26 Apr 2025
Direct dependencies6
Transitive dependenciesNot calculated

README

Version 1.0.0 documentation

Banner

AetherPy

Python library for very fast and flexible terrain visibility analysis.

Supports real GeoTIFF DEMs, LOS, viewsheds (including constrained sectors, curvature correction), complex multiview observer calculation, and more. It also provides the tools for finding the optimal observer localization.


🚀 Features

  • Real GeoTIFF support: arbitrary CRS, resolution, out‑of‑core tiling
  • High‑performance LOS & viewshed: single and multi‑observer
  • Constrained analysis: range, azimuth sector, elevation angle
  • Earth‑curvature correction (k‑factor)
  • Coverage metrics: show which area can be seen from a target

📦 Installation

# From PyPI
pip install aetherpy

# Or from GitHub
pip install git+https://github.com/SchmidL/aetherpy.git


📝 Quickstart

from aetherpy.data.loader   import DEM
from aetherpy.core          import is_visible, viewshed_sweep
from aetherpy.io.plotting   import plot_viewshed

# load a GeoTIFF DEM (or pass a NumPy array)
dem = DEM("swisssurface3d-raster_2023_2600-1199_0.5_2056_5728.tif") 

# define your observer in map coords (x, y) or pixel coords
lon, lat = 2600410.30, 1199452.00            
obs_rc   = dem.index(lon, lat) 

# quick LOS check to a target
lon2, lat2 = 2600754.88, 1199416.56
tgt_rc = dem.index(lon2, lat2)
print("Visible?", is_visible(dem, obs_rc, tgt_rc, obs_h=1.75))

# compute a 5 km viewshed at 1.75 m observer height
vs = viewshed_sweep(dem, obs_rc, obs_h=1.75, max_dist=500.0,interpolation="bilinear")

# visualize
plot_viewshed(dem, vs, observer=obs_rc, hillshade=True) 

# Save Boolean mask as GeoTIFF
save_raster("viewshed.tif",vs,dem)

⚖️ License

AetherPy is offered under a dual‑license:

  1. MIT License – Free for:
    • Personal, academic, and non‑commercial use
    • Companies with annual revenue ≤1000000USD
  2. Commercial License – Required for:
    • Any organization or individual with annual revenue >1000000USDUSD
    • Contact us to obtain terms and pricing.

Please see LICENSE‑MIT for details of the MIT terms, or contact us for commercial licensing.

Threshold is a guideline; please get in touch if your use case is unclear.


☕ Support this project

I maintain aetherpy in my free time. If you find it valuable—especially in a commercial setting—please consider supporting my work:

Buy me a coffee ☕

Or contact me to discuss sponsorship, custom features, or commercial collaboration:

📧 lorenzdschmid@gmail.com


Downloads & popularity

Awaiting observations

No metric observations yet

Download counts and popularity will appear here as the collector receives them.

Declared dependencies 6

Native requirements
6 direct targetsNot calculated transitive count
Package / targetRequirementRelationship
numpy
Environment
{
  "extras": "",
  "marker": null,
  "requires_python": ">=3.8",
  "evaluation": "NOT_EVALUATED"
}
numpy>=1.20runtime
numba
Environment
{
  "extras": "",
  "marker": null,
  "requires_python": ">=3.8",
  "evaluation": "NOT_EVALUATED"
}
numba>=0.55runtime
rasterio
Environment
{
  "extras": "",
  "marker": null,
  "requires_python": ">=3.8",
  "evaluation": "NOT_EVALUATED"
}
rasterio>=1.2runtime
matplotlib
Environment
{
  "extras": "",
  "marker": null,
  "requires_python": ">=3.8",
  "evaluation": "NOT_EVALUATED"
}
matplotlib>=3.4runtime
fiona
Environment
{
  "extras": "",
  "marker": null,
  "requires_python": ">=3.8",
  "evaluation": "NOT_EVALUATED"
}
fiona>=1.8runtime
joblib
Environment
{
  "extras": "",
  "marker": null,
  "requires_python": ">=3.8",
  "evaluation": "NOT_EVALUATED"
}
joblib>=1.1runtime

Distribution files

2 collected
aetherpy-1.0.0-py3-none-any.whl

bdist_wheel · 17.9 KB · Python py3

Source file
aetherpy-1.0.0.tar.gz

sdist · 15.74 KB · Python source

Source file

Repository

PENDING
schmidl/aetherpy

Shared repository data · GitHub

License detected in repository
Not collected

Metadata history

Meaningful changes
Current collected state Current

Observed since 20 Oct, 20:55 UTC

No superseded metadata states collected. Unchanged observations do not create new revisions.

Record identity

package_version:590637a1599abb35b34895fb3369476d2156ecac3c3f7de79c701b104e36a3c2

Other collected versions

View all collected versions →