跳转到主要内容

hmm的包装器

项目描述

pydelatin

为快速地形网格生成提供hmm(其中Delatin是一个端口)的Python包装器。

演示中捕获的冰川国家公园截图。网格使用pydelatin创建,使用quantized-mesh-encoder编码,使用dem-tiler按需提供,并使用deck.gl渲染。

安装

使用pip

pip install pydelatin

或使用Conda

conda install -c conda-forge pydelatin

在Windows上,强烈建议使用Conda进行安装。

如果在Windows上使用pip进行安装,glm是从源构建的前提条件。如果您想帮助为Windows打包二进制轮,请提出一个issue。

使用

示例

from pydelatin import Delatin

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

API

API类似于hmm

此外,我还包含一个辅助函数:decode_ele,用于将Mapbox Terrain RGB或Terrarium PNG数组解码为海拔高度。

Delatin

参数
  • arr(numpy ndarray):数据数组。如果是二维数组,则期望维度为(高度,宽度)。如果是二维数组,则必须传递高度和宽度参数,并且假设数组按C顺序排列。
  • heightint,默认:None):数组高度;当arr不是二维时必需
  • widthint,默认:None):数组宽度;当arr不是二维时必需
  • z_scalefloat,默认:1):相对于x和y的z比例
  • z_exagfloat,默认:1):z夸张
  • max_errorfloat,默认:0.001):最大三角剖分误差
  • max_trianglesint,默认:None):最大三角形数量
  • max_pointsint,默认:None):最大顶点数量
  • base_height (float, 默认: 0): 固体基础高度
  • level (bool, 默认: False): 将自动级别输入到全灰度范围
  • invert (bool, 默认: False): 反转高度图
  • blur (int, 默认: 0): 高斯模糊sigma
  • gamma (float, 默认: 0): gamma曲线指数
  • border_size (int, 默认: 0): 像素边框大小
  • border_height (float, 默认: 1): 边框z高度
属性
  • vertices (ndarray 形状 (-1, 3)): 每个顶点的交错3D坐标,例如 [[x0, y0, z0], [x1, y1, z1], ...]
  • triangles (ndarray 形状 (-1, 3)): 表示 索引vertices 数组中。因此 [0, 1, 3, ...] 将使用 vertices 数组中的第一个、第二个和第四个顶点作为一个三角形。
  • error (float): 网格的最大误差。

util.rescale_positions

一个辅助函数,用于将 vertices 输出缩放到新的边界框。返回一个形状为 (-1, 3)ndarray,包含缩放后的位置。每一行代表一个单独的3D点。

参数
  • vertices: (np.ndarray) Delatin输出的顶点
  • bounds: (Tuple[float]) 线性缩放位置值到这个范围。预期为 [minx, miny, maxx, maxy]
  • flip_y: (bool, 默认 False) 翻转y坐标。由于图像的坐标原点在左上角,因此可能很有用。

保存到网格格式

量化网格

网络上的一个常用网格格式是 量化网格 格式,该格式在 Cesium 和 deck.gl(通过 loaders.gl)中得到支持。您可以使用 quantized-mesh-encoder 以此格式保存

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

或者,您可以使用 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')

MartiniDelatin

两种流行的地形网格生成算法是 JavaScript martini 库和 Python pymartini 库中的 "Martini" 算法,以及 C++ hmm 库、Python pydelatin 库和 JavaScript delatin 库中的 "Delatin" 算法。

使用哪个?

对于大多数目的,使用 pydelatin 而不是 pymartini。来自 一个 Martini 问题 的良好分析

Martini

  • 仅在 2^n+1 x 2^n+1 的正方形网格上工作。
  • 生成网格的层次结构(单次运行后选择任意细节)
  • 优化网格速度而不是质量。

Delatin

  • 在任意栅格网格上工作。
  • 为特定细节生成单个网格。
  • 优化质量(给定误差的最少三角形数量)。

基准测试

以下使用与 pymartini 基准测试 相同的数据集,一个富士山的 512x512 像素高度图。

对于 30 米网格,pydelatin 比比 pymartini 慢 25%,但网格效率更高:它有 40% 更少的顶点和三角形。

pydelatin 比 JavaScript 的 delatin 包快 4-5 倍。

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)

这些基准测试与 delatin JavaScript 模块进行。

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

许可证

此软件包包装了 @fogleman 的 hmm,这是一个也具有 MIT 许可证的 C++ 库。

项目详情


下载文件

下载适合您平台的文件。如果您不确定选择哪个,请了解更多关于安装包的信息

源分发

pydelatin-0.2.8.tar.gz (99.5 kB 查看哈希值)

上传时间

构建分发

pydelatin-0.2.8-cp313-cp313-musllinux_1_2_x86_64.whl (1.2 MB 查看哈希值)

上传时间 CPython 3.13 musllinux: musl 1.2+ x86-64

pydelatin-0.2.8-cp313-cp313-musllinux_1_2_i686.whl (1.3 MB 查看哈希值)

上传时间 CPython 3.13 musllinux: musl 1.2+ i686

pydelatin-0.2.8-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (225.2 kB 查看哈希值)

上传时间 CPython 3.13 manylinux: glibc 2.17+ x86-64

pydelatin-0.2.8-cp313-cp313-macosx_11_0_arm64.whl (171.0 kB 查看哈希值)

上传时间 CPython 3.13 macOS 11.0+ ARM64

pydelatin-0.2.8-cp313-cp313-macosx_10_13_x86_64.whl (185.5 kB 查看哈希值)

上传时间 CPython 3.13 macOS 10.13+ x86-64

pydelatin-0.2.8-cp312-cp312-musllinux_1_2_x86_64.whl (1.2 MB 查看哈希值)

上传时间 CPython 3.12 musllinux: musl 1.2+ x86-64

pydelatin-0.2.8-cp312-cp312-musllinux_1_2_i686.whl (1.3 MB 查看哈希值)

上传时间 CPython 3.12 musllinux: musl 1.2+ i686

pydelatin-0.2.8-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (225.3 kB 查看哈希值)

上传时间 CPython 3.12 manylinux: glibc 2.17+ x86-64

pydelatin-0.2.8-cp312-cp312-macosx_11_0_arm64.whl (171.0 kB 查看哈希值)

上传于 CPython 3.12 macOS 11.0+ ARM64

pydelatin-0.2.8-cp312-cp312-macosx_10_9_x86_64.whl (183.8 kB 查看哈希)

上传于 CPython 3.12 macOS 10.9+ x86-64

pydelatin-0.2.8-cp311-cp311-musllinux_1_2_x86_64.whl (1.2 MB 查看哈希)

上传于 CPython 3.11 musllinux: musl 1.2+ x86-64

pydelatin-0.2.8-cp311-cp311-musllinux_1_2_i686.whl (1.3 MB 查看哈希)

上传于 CPython 3.11 musllinux: musl 1.2+ i686

pydelatin-0.2.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (224.9 kB 查看哈希)

上传于 CPython 3.11 manylinux: glibc 2.17+ x86-64

pydelatin-0.2.8-cp311-cp311-macosx_11_0_arm64.whl (172.2 kB 查看哈希)

上传于 CPython 3.11 macOS 11.0+ ARM64

pydelatin-0.2.8-cp311-cp311-macosx_10_9_x86_64.whl (184.8 kB 查看哈希)

上传于 CPython 3.11 macOS 10.9+ x86-64

pydelatin-0.2.8-cp310-cp310-musllinux_1_2_x86_64.whl (1.2 MB 查看哈希)

上传于 CPython 3.10 musllinux: musl 1.2+ x86-64

pydelatin-0.2.8-cp310-cp310-musllinux_1_2_i686.whl (1.3 MB 查看哈希)

上传于 CPython 3.10 musllinux: musl 1.2+ i686

pydelatin-0.2.8-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (223.9 kB 查看哈希)

上传于 CPython 3.10 manylinux: glibc 2.17+ x86-64

pydelatin-0.2.8-cp310-cp310-macosx_11_0_arm64.whl (171.2 kB 查看哈希)

上传于 CPython 3.10 macOS 11.0+ ARM64

pydelatin-0.2.8-cp310-cp310-macosx_10_9_x86_64.whl (183.4 kB 查看哈希)

上传于 CPython 3.10 macOS 10.9+ x86-64

pydelatin-0.2.8-cp39-cp39-musllinux_1_2_x86_64.whl (1.2 MB 查看哈希值)

上传于 CPython 3.9 musllinux: musl 1.2+ x86-64

pydelatin-0.2.8-cp39-cp39-musllinux_1_2_i686.whl (1.3 MB 查看哈希值)

上传于 CPython 3.9 musllinux: musl 1.2+ i686

pydelatin-0.2.8-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (224.0 kB 查看哈希值)

上传于 CPython 3.9 manylinux: glibc 2.17+ x86-64

pydelatin-0.2.8-cp39-cp39-macosx_11_0_arm64.whl (171.3 kB 查看哈希值)

上传于 CPython 3.9 macOS 11.0+ ARM64

pydelatin-0.2.8-cp39-cp39-macosx_10_9_x86_64.whl (183.5 kB 查看哈希值)

上传于 CPython 3.9 macOS 10.9+ x86-64

pydelatin-0.2.8-cp38-cp38-musllinux_1_2_x86_64.whl (1.2 MB 查看哈希值)

上传于 CPython 3.8 musllinux: musl 1.2+ x86-64

pydelatin-0.2.8-cp38-cp38-musllinux_1_2_i686.whl (1.3 MB 查看哈希值)

上传于 CPython 3.8 musllinux: musl 1.2+ i686

pydelatin-0.2.8-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (223.7 kB 查看哈希值)

上传于 CPython 3.8 manylinux: glibc 2.17+ x86-64

pydelatin-0.2.8-cp38-cp38-macosx_11_0_arm64.whl (171.0 kB 查看哈希值)

上传于 CPython 3.8 macOS 11.0+ ARM64

pydelatin-0.2.8-cp38-cp38-macosx_10_9_x86_64.whl (183.3 kB 查看哈希值)

上传于 CPython 3.8 macOS 10.9+ x86-64

pydelatin-0.2.8-cp37-cp37m-musllinux_1_2_x86_64.whl (1.2 MB 查看哈希值)

上传时间: CPython 3.7m musllinux: musl 1.2+ x86-64

pydelatin-0.2.8-cp37-cp37m-musllinux_1_2_i686.whl (1.3 MB 查看哈希值)

上传时间: CPython 3.7m musllinux: musl 1.2+ i686

pydelatin-0.2.8-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (226.1 kB 查看哈希值)

上传时间: CPython 3.7m manylinux: glibc 2.17+ x86-64

pydelatin-0.2.8-cp37-cp37m-macosx_10_9_x86_64.whl (182.6 kB 查看哈希值)

上传时间: CPython 3.7m macOS 10.9+ x86-64

pydelatin-0.2.8-cp36-cp36m-musllinux_1_2_x86_64.whl (1.2 MB 查看哈希值)

上传时间: CPython 3.6m musllinux: musl 1.2+ x86-64

pydelatin-0.2.8-cp36-cp36m-musllinux_1_2_i686.whl (1.3 MB 查看哈希值)

上传时间: CPython 3.6m musllinux: musl 1.2+ i686

pydelatin-0.2.8-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (225.7 kB 查看哈希值)

上传时间: CPython 3.6m manylinux: glibc 2.17+ x86-64

pydelatin-0.2.8-cp36-cp36m-macosx_10_9_x86_64.whl (182.0 kB 查看哈希值)

上传时间: CPython 3.6m macOS 10.9+ x86-64

支持者

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误记录 StatusPage StatusPage 状态页面