Skip to main content

A wrapper for hmm

Project description

pydelatin

A Python wrapper of hmm (of which Delatin is a port) for fast terrain mesh generation.

Install

pip install pydelatin

Binary wheels are provided for macOS and Linux. On Windows, glm is a prerequisite for building from source.

Using

Example

from pydelatin import Delatin

tin = Delatin(terrain, width, height)
# Mesh vertices
tin.vertices
# Mesh triangles
tin.triangles

API

The API is similar to that of hmm.

Additionally I include a helper function: decode_ele, to decode a Mapbox Terrain RGB or Terrarium PNG array to elevations.

Delatin

Arguments
  • arr (numpy ndarray): data array. If a 2D array, dimensions are expected to be (height, width). If a 1D array, height and width parameters must be passed, and the array is assumed to be in C order.
  • height (int, default: None): height of array; required when arr is not 2D
  • width (int, default: None): width of array; required when arr is not 2D
  • z_scale (float, default: 1): z scale relative to x & y
  • z_exag (float, default: 1): z exaggeration
  • max_error (float, default: 0.001): maximum triangulation error
  • max_triangles (int, default: None): maximum number of triangles
  • max_points (int, default: None): maximum number of vertices
  • base_height (float, default: 0): solid base height
  • level (bool, default: False): auto level input to full grayscale range
  • invert (bool, default: False): invert heightmap
  • blur (int, default: 0): gaussian blur sigma
  • gamma (float, default: 0): gamma curve exponent
  • border_size (int, default: 0): border size in pixels
  • border_height (float, default: 1): border z height
Attributes
  • vertices (ndarray of shape (-1, 3)): the interleaved 3D coordinates of each vertex, e.g. [[x0, y0, z0], [x1, y1, z1], ...].
  • triangles (ndarray of shape (-1, 3)): represents indices within the vertices array. So [0, 1, 3, ...] would use the first, second, and fourth vertices within the vertices array as a single triangle.
  • error (float): the maximum error of the mesh.

util.rescale_positions

A helper function to rescale the vertices output to a new bounding box. Returns an ndarray of shape (-1, 3) with positions rescaled. Each row represents a single 3D point.

Arguments
  • vertices: (np.ndarray) vertices output from Delatin
  • bounds: (Tuple[float]) linearly rescale position values to this extent. Expected to be [minx, miny, maxx, maxy].
  • flip_y: (bool, default False) Flip y coordinates. Can be useful since images' coordinate origin is in the top left.

Saving to mesh formats

Quantized Mesh

A common mesh format for the web is the Quantized Mesh format, which is supported in Cesium and deck.gl (via loaders.gl). You can use quantized-mesh-encoder to save in this format:

import quantized_mesh_encoder
from pydelatin import Delatin
from pydelatin.util import rescale_positions

tin = Delatin(terrain, max_error=30)
vertices, triangles = tin.vertices, tin.triangles

# Rescale vertices linearly from pixel units to world coordinates
rescaled_vertices = rescale_positions(vertices, bounds)

with open('output.terrain', 'wb') as f:
    quantized_mesh_encoder.encode(f, rescaled_vertices, triangles)

Meshio

Alternatively, you can save to a variety of mesh formats using meshio:

from pydelatin import Delatin
import meshio

tin = Delatin(terrain, max_error=30)
vertices, triangles = tin.vertices, tin.triangles

cells = [("triangle", triangles)]
mesh = meshio.Mesh(vertices, cells)
# Example output format
# Refer to meshio documentation
mesh.write('foo.vtk')

Martini or Delatin?

Two popular algorithms for terrain mesh generation are the "Martini" algorithm, found in the JavaScript martini library and the Python pymartini library, and the "Delatin" algorithm, found in the C++ hmm library, this Python pydelatin library, and the JavaScript delatin library.

Which to use?

For most purposes, use pydelatin over pymartini. A good breakdown from a Martini issue:

Martini:

  • Only works on square 2^n+1 x 2^n+1 grids.
  • Generates a hierarchy of meshes (pick arbitrary detail after a single run)
  • Optimized for meshing speed rather than quality.

Delatin:

  • Works on arbitrary raster grids.
  • Generates a single mesh for a particular detail.
  • Optimized for quality (as few triangles as possible for a given error).

Benchmark

The following uses the same dataset as the pymartini benchmarks, a 512x512 pixel heightmap of Mt. Fuji.

For the 30-meter mesh, pydelatin is 25% slower than pymartini, but the mesh is much more efficient: it has 40% fewer vertices and triangles.

pydelatin is 4-5x faster than the JavaScript delatin package.

Python

git clone https://github.com/kylebarron/pydelatin
cd pydelatin
pip install '.[test]'
python bench.py
mesh (max_error=30m): 27.322ms
vertices: 5668, triangles: 11140

mesh (max_error=1m): 282.946ms
mesh (max_error=2m): 215.839ms
mesh (max_error=3m): 163.424ms
mesh (max_error=4m): 127.203ms
mesh (max_error=5m): 106.596ms
mesh (max_error=6m): 91.868ms
mesh (max_error=7m): 82.572ms
mesh (max_error=8m): 74.335ms
mesh (max_error=9m): 65.893ms
mesh (max_error=10m): 60.999ms
mesh (max_error=11m): 55.213ms
mesh (max_error=12m): 54.475ms
mesh (max_error=13m): 48.662ms
mesh (max_error=14m): 47.029ms
mesh (max_error=15m): 44.517ms
mesh (max_error=16m): 42.059ms
mesh (max_error=17m): 39.699ms
mesh (max_error=18m): 37.657ms
mesh (max_error=19m): 36.333ms
mesh (max_error=20m): 34.131ms

JS (Node)

This benchmarks against the delatin JavaScript module.

git clone https://github.com/kylebarron/pydelatin
cd test/bench_js/
yarn
wget https://raw.githubusercontent.com/mapbox/delatin/master/index.js
node -r esm bench.js
mesh (max_error=30m): 143.038ms
vertices: 5668
triangles: 11140

mesh (max_error=0m): 1169.226ms
mesh (max_error=1m): 917.290ms
mesh (max_error=2m): 629.776ms
mesh (max_error=3m): 476.958ms
mesh (max_error=4m): 352.907ms
mesh (max_error=5m): 290.946ms
mesh (max_error=6m): 240.556ms
mesh (max_error=7m): 234.181ms
mesh (max_error=8m): 188.273ms
mesh (max_error=9m): 162.743ms
mesh (max_error=10m): 145.734ms
mesh (max_error=11m): 130.119ms
mesh (max_error=12m): 119.865ms
mesh (max_error=13m): 114.645ms
mesh (max_error=14m): 101.390ms
mesh (max_error=15m): 100.065ms
mesh (max_error=16m): 96.247ms
mesh (max_error=17m): 89.508ms
mesh (max_error=18m): 85.754ms
mesh (max_error=19m): 79.838ms
mesh (max_error=20m): 75.607ms

License

This package wraps @fogleman's hmm, a C++ library that is also MIT-licensed.

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

pydelatin-0.2.0.tar.gz (420.1 kB view details)

Uploaded Source

Built Distributions

pydelatin-0.2.0-cp38-cp38-manylinux2010_x86_64.whl (1.6 MB view details)

Uploaded CPython 3.8 manylinux: glibc 2.12+ x86-64

pydelatin-0.2.0-cp38-cp38-manylinux2010_i686.whl (1.6 MB view details)

Uploaded CPython 3.8 manylinux: glibc 2.12+ i686

pydelatin-0.2.0-cp38-cp38-macosx_10_9_x86_64.whl (192.4 kB view details)

Uploaded CPython 3.8 macOS 10.9+ x86-64

pydelatin-0.2.0-cp37-cp37m-manylinux2010_x86_64.whl (1.7 MB view details)

Uploaded CPython 3.7m manylinux: glibc 2.12+ x86-64

pydelatin-0.2.0-cp37-cp37m-manylinux2010_i686.whl (1.6 MB view details)

Uploaded CPython 3.7m manylinux: glibc 2.12+ i686

pydelatin-0.2.0-cp37-cp37m-macosx_10_9_x86_64.whl (191.2 kB view details)

Uploaded CPython 3.7m macOS 10.9+ x86-64

pydelatin-0.2.0-cp36-cp36m-manylinux2010_x86_64.whl (1.7 MB view details)

Uploaded CPython 3.6m manylinux: glibc 2.12+ x86-64

pydelatin-0.2.0-cp36-cp36m-manylinux2010_i686.whl (1.6 MB view details)

Uploaded CPython 3.6m manylinux: glibc 2.12+ i686

pydelatin-0.2.0-cp36-cp36m-macosx_10_9_x86_64.whl (191.2 kB view details)

Uploaded CPython 3.6m macOS 10.9+ x86-64

File details

Details for the file pydelatin-0.2.0.tar.gz.

File metadata

  • Download URL: pydelatin-0.2.0.tar.gz
  • Upload date:
  • Size: 420.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.2.0 pkginfo/1.5.0.1 requests/2.24.0 setuptools/50.3.0 requests-toolbelt/0.9.1 tqdm/4.50.2 CPython/3.8.6

File hashes

Hashes for pydelatin-0.2.0.tar.gz
Algorithm Hash digest
SHA256 de049064e1d7f6bde33609b2a8e9ad0e7ead76ffc36478e47fe4a4ef41de9b11
MD5 10a39c39c502f8e04721fd031313752e
BLAKE2b-256 97f971a506255b95f2c8b39c48ba243198562e1490cc5d8aeae6434dc867a064

See more details on using hashes here.

File details

Details for the file pydelatin-0.2.0-cp38-cp38-manylinux2010_x86_64.whl.

File metadata

  • Download URL: pydelatin-0.2.0-cp38-cp38-manylinux2010_x86_64.whl
  • Upload date:
  • Size: 1.6 MB
  • Tags: CPython 3.8, manylinux: glibc 2.12+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.2.0 pkginfo/1.5.0.1 requests/2.24.0 setuptools/50.3.0 requests-toolbelt/0.9.1 tqdm/4.50.2 CPython/3.8.6

File hashes

Hashes for pydelatin-0.2.0-cp38-cp38-manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 831a1a17d9eec779638cd2528c24007f06a0c9f361183d28605d9df267ae9b2c
MD5 f68ffb0cb0b0c65668aaf2a86bf40908
BLAKE2b-256 2ed653b0ed97c1c04957dd5ed73bb32fd10f660a9b52a16213b587935b91f320

See more details on using hashes here.

File details

Details for the file pydelatin-0.2.0-cp38-cp38-manylinux2010_i686.whl.

File metadata

  • Download URL: pydelatin-0.2.0-cp38-cp38-manylinux2010_i686.whl
  • Upload date:
  • Size: 1.6 MB
  • Tags: CPython 3.8, manylinux: glibc 2.12+ i686
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.2.0 pkginfo/1.5.0.1 requests/2.24.0 setuptools/50.3.0 requests-toolbelt/0.9.1 tqdm/4.50.2 CPython/3.8.6

File hashes

Hashes for pydelatin-0.2.0-cp38-cp38-manylinux2010_i686.whl
Algorithm Hash digest
SHA256 17d4dcacb2ce1b26bd7170435e35a40d4a3f3413fd696023900eca1227f3ebdb
MD5 f72f47e6f90fd62110913243224057b9
BLAKE2b-256 a2476c6ed74fc06ef89ecd58a2031b59b6290018db0a5de93cc02acdc5bb711e

See more details on using hashes here.

File details

Details for the file pydelatin-0.2.0-cp38-cp38-macosx_10_9_x86_64.whl.

File metadata

  • Download URL: pydelatin-0.2.0-cp38-cp38-macosx_10_9_x86_64.whl
  • Upload date:
  • Size: 192.4 kB
  • Tags: CPython 3.8, macOS 10.9+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.2.0 pkginfo/1.5.0.1 requests/2.24.0 setuptools/50.3.0 requests-toolbelt/0.9.1 tqdm/4.50.2 CPython/3.8.6

File hashes

Hashes for pydelatin-0.2.0-cp38-cp38-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 2d030631d7023414f0f1241d036b7a955a5e4882f84a99a7cbb493eab8748f67
MD5 d59f8e0327e5293c228f835c9a127037
BLAKE2b-256 6549a3b322a56c107630cf9fa50c810ed1cd73cdc5aaf538a1da2c8cc8a0796b

See more details on using hashes here.

File details

Details for the file pydelatin-0.2.0-cp37-cp37m-manylinux2010_x86_64.whl.

File metadata

  • Download URL: pydelatin-0.2.0-cp37-cp37m-manylinux2010_x86_64.whl
  • Upload date:
  • Size: 1.7 MB
  • Tags: CPython 3.7m, manylinux: glibc 2.12+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.2.0 pkginfo/1.5.0.1 requests/2.24.0 setuptools/50.3.0 requests-toolbelt/0.9.1 tqdm/4.50.2 CPython/3.8.6

File hashes

Hashes for pydelatin-0.2.0-cp37-cp37m-manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 8a9532c7c53fc7d9b14801ee503f1b293875bee3493c1b0d237d37f9a9679fcf
MD5 77974f68f4d195bf33784d2184a43e8a
BLAKE2b-256 bf30eeae816da326a952610a6b1bc0b0fbc288ca4fa8253cb58a8d8f135c22c3

See more details on using hashes here.

File details

Details for the file pydelatin-0.2.0-cp37-cp37m-manylinux2010_i686.whl.

File metadata

  • Download URL: pydelatin-0.2.0-cp37-cp37m-manylinux2010_i686.whl
  • Upload date:
  • Size: 1.6 MB
  • Tags: CPython 3.7m, manylinux: glibc 2.12+ i686
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.2.0 pkginfo/1.5.0.1 requests/2.24.0 setuptools/50.3.0 requests-toolbelt/0.9.1 tqdm/4.50.2 CPython/3.8.6

File hashes

Hashes for pydelatin-0.2.0-cp37-cp37m-manylinux2010_i686.whl
Algorithm Hash digest
SHA256 31d4cb09fa35fab811dcbd7f4b9b50b082a38bd8fa16629008ddf08760fc0d5a
MD5 da9bb2dfee1fcd404c4fbe9c4b969799
BLAKE2b-256 49e37a84e9b4705cdab4fcf16f7f9bf5800d17debaeea217f4130485fce7278a

See more details on using hashes here.

File details

Details for the file pydelatin-0.2.0-cp37-cp37m-macosx_10_9_x86_64.whl.

File metadata

  • Download URL: pydelatin-0.2.0-cp37-cp37m-macosx_10_9_x86_64.whl
  • Upload date:
  • Size: 191.2 kB
  • Tags: CPython 3.7m, macOS 10.9+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.2.0 pkginfo/1.5.0.1 requests/2.24.0 setuptools/50.3.0 requests-toolbelt/0.9.1 tqdm/4.50.2 CPython/3.8.6

File hashes

Hashes for pydelatin-0.2.0-cp37-cp37m-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 7bae2f9fec95b87f96dc460f13f911c889df4a1aaa171fca5dc48ab3a167852d
MD5 1af04da923b9b9a95d4bf348b4969238
BLAKE2b-256 8d5bb1bc60e087cca81d10a555b933fd51c96a6100709dbd59404ae9376388ad

See more details on using hashes here.

File details

Details for the file pydelatin-0.2.0-cp36-cp36m-manylinux2010_x86_64.whl.

File metadata

  • Download URL: pydelatin-0.2.0-cp36-cp36m-manylinux2010_x86_64.whl
  • Upload date:
  • Size: 1.7 MB
  • Tags: CPython 3.6m, manylinux: glibc 2.12+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.2.0 pkginfo/1.5.0.1 requests/2.24.0 setuptools/50.3.0 requests-toolbelt/0.9.1 tqdm/4.50.2 CPython/3.8.6

File hashes

Hashes for pydelatin-0.2.0-cp36-cp36m-manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 195dd3226d581e4a270c34602b4d18b75a6c9e66480b1d01b61e12850e8a2858
MD5 57feb019db6ff1925dfdbb542e4c182f
BLAKE2b-256 8f14e4ef421f246f0b65d641a705276dc5e40ff76c922a11046978174f1b1c90

See more details on using hashes here.

File details

Details for the file pydelatin-0.2.0-cp36-cp36m-manylinux2010_i686.whl.

File metadata

  • Download URL: pydelatin-0.2.0-cp36-cp36m-manylinux2010_i686.whl
  • Upload date:
  • Size: 1.6 MB
  • Tags: CPython 3.6m, manylinux: glibc 2.12+ i686
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.2.0 pkginfo/1.5.0.1 requests/2.24.0 setuptools/50.3.0 requests-toolbelt/0.9.1 tqdm/4.50.2 CPython/3.8.6

File hashes

Hashes for pydelatin-0.2.0-cp36-cp36m-manylinux2010_i686.whl
Algorithm Hash digest
SHA256 5d9be329830f9a08a2ef2c749656336384d4a85bf3be6835789f8f486b5982ff
MD5 339304174e133855743e08357f927f09
BLAKE2b-256 8cd248d0edd323fdf48d9bd02342a2fa808544b706d21b4690523fcafc878974

See more details on using hashes here.

File details

Details for the file pydelatin-0.2.0-cp36-cp36m-macosx_10_9_x86_64.whl.

File metadata

  • Download URL: pydelatin-0.2.0-cp36-cp36m-macosx_10_9_x86_64.whl
  • Upload date:
  • Size: 191.2 kB
  • Tags: CPython 3.6m, macOS 10.9+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.2.0 pkginfo/1.5.0.1 requests/2.24.0 setuptools/50.3.0 requests-toolbelt/0.9.1 tqdm/4.50.2 CPython/3.8.6

File hashes

Hashes for pydelatin-0.2.0-cp36-cp36m-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 f8373735a48cb6726c7505a73bf81aed901a0cb97a67fb8095365029be7f299a
MD5 7c2bc871b514513b6e0bb7a55a69583d
BLAKE2b-256 cb031f5c949158d53d416b47110d9b3ede9e2e06b5ee89fae593b4088323068a

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