Skip to main content

Creates OpenStreetMap suitable contour lines from NASA SRTM data

Project description

Python: 3.8, 3.9, 3.10, 3.11, 3.12 GitHub GitHub Workflow Status Hatch project linting - Ruff types - Mypy DeepSource Codacy Badge Maintainability

pyhgtmap is a fork of the original phyghtmap tool, which doesn't seem to be maintained anymore.

This is a little program which lets you easily generate OSM contour lines from NASA SRTM data. It was initially created as replacement for srtm2osm which stopped working when the NASA changed the server and started distributing the raw SRTM data via http instead of ftp. In the meanwhile, srtm2osm is working again due to the efforts of bomm.

However, pyhgtmap has some advantages compared to srtm2osm. One is that you won't need a C# runtime environment installed on your machine. Another important thing is that pyhgtmap generates already tiled data. Furthermore, pyhgtmap seems to slightly outperform srtm2osm. If you are using a multi-core machine and are running a POSIX compliant operating system you can use a very simple form of parallelization and the advance will be dramatical.

Note that the intended use is not to upload generated contour OSM data to the OSM servers but to use it for fancy maps.

Sources

pyhgtmap supports several HGT data sources. Those are identified by a 4-character "nickname" + one digit resolution suffix, which can be specified with the --source parameter of pyhgtmap.

SRTM

NASA Shuttle Radar Topography Mission v3.0

Available for 1" and 3" resolutions.

This source requires creating an earthexplorer account on https://ers.cr.usgs.gov/register/.

VIEW

VIEWFINDER PANORAMAS DIGITAL ELEVATION DATA

Available for 1" and 3" resolutions.

SONN

Sonny's LiDAR Digital Terrain Models (DTM) of European countries

Available for 1" and 3" resolutions.

This source require usage of Google Drive API. To use it, you have to generate API client OAuth secret as described in Google drive's documentation and save the client secrets JSON file in pyhgtmap config directory (~/.pyhgtmap/client-secret.json).

Installation

For ubuntu-like system:

Ligther deployment (without GeoTiff support)

GDAL dependency is required only to add GeoTiff support, and is quite painful to install. If you don't need GeoTiff support, simply install the default version of pyhgtmap:

sudo apt update
sudo apt install python3 python3-pip python3-venv
python3 -m venv my_venv
# Switch to venv
. ./my_venv/bin/activate
# Install pyhgtmap with dependencies from PyPi
pip install pyhgtmap

With GeoTiff optional support

sudo apt update
sudo apt install python3 python3-pip python3-venv
# Install GDAL via system package, as it's painful to install through PIP
sudo apt install python3-gdal 
# Create virtual env (allow --system-site-packages to use system's GDAL)
python3 -m venv --system-site-packages my_venv
# Switch to venv
. ./my_venv/bin/activate
# Install pyhgtmap with dependencies from PyPi
pip install pyhgtmap[geotiff]

Install directly from GitHub (useful to test non-released fixes)

sudo apt update
sudo apt install python3 python3-pip python3-venv git
python3 -m venv my_venv
# Switch to venv
. ./my_venv/bin/activate
# Install latest pyhgtmap development version from github
pip install -U git+https://github.com/agrenott/pyhgtmap.git

Usage

For a detailed help, run pyhgtmap --help on the console.

Example output

Generating contours for France PACA region with a 10m step and 0.00001 RDP Epsilon (taking less than a minute on Intel 13600K via Windows WSL 1):

> pyhgtmap --polygon=provence-alpes-cote-d-azur/provence-alpes-cote-d-azur.poly --step=10 --pbf --hgtdir=work/hgt --source=view1,view3 --simplifyContoursEpsilon=0.00001 -j16
...
> du -shc lon*.pbf |tail -3
196K    lon7.00_7.75lat44.69_44.75_view1.osm.pbf
168K    lon7.00_7.75lat44.75_44.88_view1.osm.pbf
81M     total
> ls -l lon*.pbf |wc -l
104

Contour lines displayed over OSM map using QGis:

PACA 10m contours

PACA 10m contours - zoom in mountains area

A word on contour simplification

pyhgtmap now uses very efficient pybind11-rdp Ramer-Douglas-Peucker Algorithm library for contour simplification. This makes RDP activation the best solution in most cases, as the slight overhead in computing performance is compensated by the reduced number of points to write (which is now the most time consuming part). It also reduces the final file size.

Epsilon value must be chosen with care to get the proper tradeoff between efficiency and quality.

Here is an example originating from a "view1" source with 10m step (lon6.00_7.00lat43.00_43.25_view1.osm.pbf):

RDP Epsilon values Disabled 0 0.00001 0.0001
Visual details Comparison between RDP 0 and 0.00001 results Comparison between RDP 0, 0.0001 and 0.00001 results
Blue lines (Epsilon=0.00001) are almost indistinguishable from red ones (Epsilon=0) Clear difference appears for green lines (Epsilon = 0.0001)
File size (1 tile, PBF format, KiB) 1840 1717 1424 716
Number of nodes (1 tile) 869685 761085 559678 210744

Development

This project uses hatch.

(Mini)Conda can be used to easily setup given version of Python and GDAL:

conda create -n python39 -c conda-forge python=3.9
conda activate python39
conda install -c conda-forge gdal hatch
hatch -e geotiff shell
# To start VSCode using the proper python env
code .

The one-liner for formatting and local validation:

hatch run fmt && hatch run all

Profiling

pip install yappi
python -m yappi -f callgrind -o yappi_ex1.out ../../pyhgtmap/main.py --pbf --log=DEBUG N43E006.hgt

Then open yappi_ex1.out with some callgrind viewer (eg. QCacheGrind).

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

pyhgtmap-3.7.tar.gz (54.9 kB view details)

Uploaded Source

Built Distribution

pyhgtmap-3.7-py3-none-any.whl (65.4 kB view details)

Uploaded Python 3

File details

Details for the file pyhgtmap-3.7.tar.gz.

File metadata

  • Download URL: pyhgtmap-3.7.tar.gz
  • Upload date:
  • Size: 54.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: python-httpx/0.26.0

File hashes

Hashes for pyhgtmap-3.7.tar.gz
Algorithm Hash digest
SHA256 59447c07b3a1b4fcd5c6247644abfcef0bdb0d58ccbfa7292133b8d65a4c8294
MD5 2616c785789d9279ce4a631a48608cab
BLAKE2b-256 c996b804ea0c183ff4863e24bc8815781ea3e51b2c12b8ff466e1fdccd783364

See more details on using hashes here.

File details

Details for the file pyhgtmap-3.7-py3-none-any.whl.

File metadata

  • Download URL: pyhgtmap-3.7-py3-none-any.whl
  • Upload date:
  • Size: 65.4 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: python-httpx/0.26.0

File hashes

Hashes for pyhgtmap-3.7-py3-none-any.whl
Algorithm Hash digest
SHA256 e3db46bf5880782933ec28d8af6e7486e54f43c4757138644a59a72d03e7bfaa
MD5 a006d7a2be38e4e92c603d11d57edd6a
BLAKE2b-256 da7157e193838cbb42c9347090bbd6990596f39d5bfaf3594e0da0c2dd4e157b

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page