跳转到主要内容

快速的Python量化网格编码器

项目描述

量化网格编码器

Build Status

一个快速的Python 量化网格 编码器。在20毫秒内将包含100k坐标和180k三角形的网格进行编码。示例查看器

大峡谷和瓦尔多拉高原。该网格使用pydelatinpymartini创建,使用quantized-mesh-encoder进行编码,使用dem-tiler按需提供,并使用deck.gl进行渲染。

概述

量化网格 是一种用于高效客户端地形渲染的地形网格编码格式。此类文件在Cesiumdeck.gl中得到支持。

该库旨在支持高性能服务器端按需地形网格生成。

安装

使用pip

pip install quantized-mesh-encoder

或使用Conda

conda install -c conda-forge quantized-mesh-encoder

使用

API

quantized_mesh_encoder.encode

参数

  • f:一个可写文件对象,用于写入编码的字节
  • positions:(array[float]):一个1维Numpy数组或一个形状为(-1, 3)的2维Numpy数组,包含3D位置。
  • indices (array[int]): 可以是 1D Numpy 数组或形状为 (-1, 3) 的 2D Numpy 数组,指示从 positions 到制作三角形的坐标的三元组。例如,如果 indices 的前三个值是 012,那么这定义了一个由 positions 中前 9 个值形成的三角形,每个顶点对应三个值(索引 0 为第一个顶点,索引 1 为第二个顶点,索引 2 为第三个顶点)。

关键字参数

  • bounds (List[float],可选):边界列表,格式为 [minx, miny, maxx, maxy]。默认情况下,根据 positions 的最小和最大值推断。
  • sphere_method (str,可选):在编码量化网格时作为头信息的一部分,需要计算包含网格中所有位置的 边界球sphere_method 指定了创建边界球的算法。必须是 'bounding_box''naive''ritter'None 之一。默认为 None
    • 'bounding_box':找到所有位置的边界框,然后将边界框的中心定义为球体的中心,并将半径定义为回到角落的距离。这种方法产生的边界球最大,但速度最快:在我的计算机上大约为 70 µs。
    • 'naive':找到所有位置的边界框,然后将边界框的中心定义为球体的中心。然后它检查到每个其他点的距离,并将半径定义为这些距离中的最大值。当点不在 3D 角落时,这种方法产生的边界球略小于 bounding_box 方法。这是第二种最快的方法,在我的计算机上大约为 160 µs。
    • 'ritter':实现了边界球的 Ritter 方法。它首先找到最长跨度的中心,然后检查每个点是否包含在内,并在必要时扩大球体。这种方法可能比朴素方法产生更小的边界球,但不总是这样,因此通常同时运行这两种方法,请看下一个选项。这是最慢的方法,在我的计算机上大约为 300 µs。
    • None:同时运行朴素和 Ritter 方法,然后返回两者中较小的一个。由于同时运行了这两个算法,因此在我的计算机上大约需要 500 µs。
  • ellipsoid (quantized_mesh_encoder.Ellipsoid,可选):由其半长轴 a 和半短轴 b 定义的椭球体。默认:WGS84 椭球体。
  • 扩展:要编码的量化网格对象的扩展列表。这些必须是 Extension 实例。请参阅 量化网格扩展

quantized_mesh_encoder.Ellipsoid

用于网格计算的椭球体。

参数

  • a (float):半长轴
  • b (float):半短轴

quantized_mesh_encoder.WGS84

默认的 WGS84 椭球体。半长轴 a 为 6378137.0 米,半短轴 b 为 6356752.3142451793 米。

量化网格扩展

量化网格规范有许多 扩展

quantized_mesh_encoder.VertexNormalsExtension

实现了 地形照明 扩展。从您的网格数据生成每个顶点的法线。

关键字参数

  • indices:网格索引
  • positions:网格位置
  • ellipsoid:Ellipsoid 类的实例,默认:WGS84 椭球体
quantized_mesh_encoder.WaterMaskExtension

实现了 水掩码 扩展。

关键字参数

  • data (Union[np.ndarray, np.uint8, int]):水掩码的数据
quantized_mesh_encoder.MetadataExtension

实现了 元数据 扩展。

  • data (Union[Dict, bytes]): 要编码的元数据数据。如果是字典,将调用 json.dumps 以 UTF-8 编码创建字节。

示例

写入文件

from quantized_mesh_encoder import encode
with open('output.terrain', 'wb') as f:
    encode(f, positions, indices)

量化的网格文件通常以 gzip 压缩形式保存。创建 gzip 文件的一个简单方法是使用 gzip.open

import gzip
from quantized_mesh_encoder import encode
with gzip.open('output.terrain', 'wb') as f:
    encode(f, positions, indices)

写入缓冲区

将数据写入内存缓冲区而不是文件也很简单

from io import BytesIO
from quantized_mesh_encoder import encode
with BytesIO() as bio:
    encode(bio, positions, indices)

或者压缩内存缓冲区

import gzip
from io import BytesIO
with BytesIO() as bio:
    with gzip.open(bio, 'wb') as gzipf:
        encode(gzipf, positions, indices)

备选椭球

默认情况下,所有计算都使用 WGS84 椭球。对于非地球行星体,可能需要使用备选椭球。

from quantized_mesh_encoder import encode, Ellipsoid

# From https://ui.adsabs.harvard.edu/abs/2010EM%26P..106....1A/abstract
mars_ellipsoid = Ellipsoid(3_395_428, 3_377_678)

with open('output.terrain', 'wb') as f:
    encode(f, positions, indices, ellipsoid=mars_ellipsoid)

量化网格扩展

from quantized_mesh_encoder import encode, VertexNormalsExtension, MetadataExtension

vertex_normals = VertexNormalsExtension(positions=positions, indices=indices)
metadata = MetadataExtension(data={'hello': 'world'})

with open('output.terrain', 'wb') as f:
    encode(f, positions, indices, extensions=(vertex_normals, metadata))

生成网格

要将网格编码为量化的网格文件,首先需要一个网格!本项目旨在与 pydelatinpymartini 一起使用,它们是快速高程高度图到地形网格生成器。

import quantized_mesh_encoder
from imageio import imread
from pymartini import decode_ele, Martini, rescale_positions
import mercantile

png = imread(png_path)
terrain = decode_ele(png, 'terrarium')
terrain = terrain.T
martini = Martini(png.shape[0] + 1)
tile = martini.create_tile(terrain)
vertices, triangles = tile.get_mesh(10)

# Use mercantile to find the bounds in WGS84 of this tile
bounds = mercantile.bounds(mercantile.Tile(x, y, z))

# Rescale positions to WGS84
rescaled = rescale_positions(
    vertices,
    terrain,
    bounds=bounds,
    flip_y=True
)

with BytesIO() as f:
    quantized_mesh_encoder.encode(f, rescaled, triangles)
    f.seek(0)
    return ("OK", "application/vnd.quantized-mesh", f.read())

您还可以查看 _mesh() 的源代码,以获取工作参考,该代码位于 dem-tiler

许可证

此代码的大部分内容是以某种方式从 quantized-mesh-tile 移植或派生而来的。quantized-mesh-tile 也以 MIT 许可证发布。

项目详情


下载文件

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

源代码发行版

quantized-mesh-encoder-0.4.3.tar.gz (138.0 kB 查看哈希值)

上传时间 源代码

构建发行版

quantized_mesh_encoder-0.4.3-cp311-cp311-win_amd64.whl (199.4 kB 查看哈希值)

上传时间 CPython 3.11 Windows x86-64

quantized_mesh_encoder-0.4.3-cp311-cp311-musllinux_1_1_x86_64.whl (540.3 kB 查看哈希值)

上传时间 CPython 3.11 musllinux: musl 1.1+ x86-64

quantized_mesh_encoder-0.4.3-cp311-cp311-musllinux_1_1_i686.whl (513.9 kB 查看哈希值)

上传时间 CPython 3.11 musllinux: musl 1.1+ i686

quantized_mesh_encoder-0.4.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (548.6 kB 查看哈希值)

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

quantized_mesh_encoder-0.4.3-cp311-cp311-macosx_11_0_arm64.whl (200.5 kB 查看哈希值)

上传于 CPython 3.11 macOS 11.0+ ARM64

quantized_mesh_encoder-0.4.3-cp311-cp311-macosx_10_9_x86_64.whl (208.3 kB 查看哈希值)

上传于 CPython 3.11 macOS 10.9+ x86-64

quantized_mesh_encoder-0.4.3-cp310-cp310-win_amd64.whl (200.3 kB 查看哈希值)

上传于 CPython 3.10 Windows x86-64

quantized_mesh_encoder-0.4.3-cp310-cp310-musllinux_1_1_x86_64.whl (530.7 kB 查看哈希值)

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

quantized_mesh_encoder-0.4.3-cp310-cp310-musllinux_1_1_i686.whl (509.3 kB 查看哈希值)

上传于 CPython 3.10 musllinux: musl 1.1+ i686

quantized_mesh_encoder-0.4.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (532.3 kB 查看哈希值)

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

quantized_mesh_encoder-0.4.3-cp310-cp310-macosx_11_0_arm64.whl (201.5 kB 查看哈希值)

上传于 CPython 3.10 macOS 11.0+ ARM64

quantized_mesh_encoder-0.4.3-cp310-cp310-macosx_10_9_x86_64.whl (209.5 kB 查看哈希值)

上传于 CPython 3.10 macOS 10.9+ x86-64

quantized_mesh_encoder-0.4.3-cp39-cp39-win_amd64.whl (200.3 kB 查看哈希值)

上传于 CPython 3.9 Windows x86-64

quantized_mesh_encoder-0.4.3-cp39-cp39-musllinux_1_1_x86_64.whl (539.4 kB 查看哈希值)

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

quantized_mesh_encoder-0.4.3-cp39-cp39-musllinux_1_1_i686.whl (517.5 kB 查看哈希值)

上传于 CPython 3.9 musllinux: musl 1.1+ i686

quantized_mesh_encoder-0.4.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (536.3 kB 查看哈希值)

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

quantized_mesh_encoder-0.4.3-cp39-cp39-macosx_11_0_arm64.whl (200.6 kB 查看哈希值)

上传于 CPython 3.9 macOS 11.0+ ARM64

quantized_mesh_encoder-0.4.3-cp39-cp39-macosx_10_9_x86_64.whl (208.5 kB 查看哈希值)

上传于 CPython 3.9 macOS 10.9+ x86-64

quantized_mesh_encoder-0.4.3-cp38-cp38-win_amd64.whl (209.8 kB 查看哈希值)

上传于 CPython 3.8 Windows x86-64

quantized_mesh_encoder-0.4.3-cp38-cp38-musllinux_1_1_x86_64.whl (559.0 kB 查看哈希值)

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

quantized_mesh_encoder-0.4.3-cp38-cp38-musllinux_1_1_i686.whl (540.4 kB 查看哈希值)

上传于 CPython 3.8 musllinux: musl 1.1+ i686

quantized_mesh_encoder-0.4.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (547.0 kB 查看哈希值)

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

quantized_mesh_encoder-0.4.3-cp38-cp38-macosx_11_0_arm64.whl (208.9 kB 查看哈希值)

上传于 CPython 3.8 macOS 11.0+ ARM64

quantized_mesh_encoder-0.4.3-cp38-cp38-macosx_10_9_x86_64.whl (216.7 kB 查看哈希值)

上传于 CPython 3.8 macOS 10.9+ x86-64

quantized_mesh_encoder-0.4.3-cp37-cp37m-win_amd64.whl (209.3 kB 查看哈希)

上传于 CPython 3.7m Windows x86-64

quantized_mesh_encoder-0.4.3-cp37-cp37m-musllinux_1_1_x86_64.whl (524.5 kB 查看哈希)

上传于 CPython 3.7m musllinux: musl 1.1+ x86-64

quantized_mesh_encoder-0.4.3-cp37-cp37m-musllinux_1_1_i686.whl (507.6 kB 查看哈希)

上传于 CPython 3.7m musllinux: musl 1.1+ i686

quantized_mesh_encoder-0.4.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (521.6 kB 查看哈希)

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

quantized_mesh_encoder-0.4.3-cp37-cp37m-macosx_10_9_x86_64.whl (217.1 kB 查看哈希)

上传于 CPython 3.7m macOS 10.9+ x86-64

quantized_mesh_encoder-0.4.3-cp37-cp37m-win_amd64.whl (218.7 kB 查看哈希)

上传于 CPython 3.6m Windows x86-64

quantized_mesh_encoder-0.4.3-cp36-cp36m-musllinux_1_1_x86_64.whl (524.5 kB 查看哈希)

上传于 CPython 3.6m musllinux: musl 1.1+ x86-64

quantized_mesh_encoder-0.4.3-cp36-cp36m-musllinux_1_1_i686.whl (505.8 kB 查看哈希)

上传于 CPython 3.6m musllinux: musl 1.1+ i686

quantized_mesh_encoder-0.4.3-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (521.9 kB 查看哈希)

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

quantized_mesh_encoder-0.4.3-cp36-cp36m-macosx_10_9_x86_64.whl (217.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 状态页面