上传文件至 /
This commit is contained in:
parent
c6ad6f6cc2
commit
1166fc8052
157
import vtk.py
Normal file
157
import vtk.py
Normal file
@ -0,0 +1,157 @@
|
|||||||
|
import json
|
||||||
|
import vtk
|
||||||
|
import numpy as np
|
||||||
|
import geojson
|
||||||
|
from pygltflib import GLTF2, Buffer, Accessor, Mesh, Primitive, BufferView
|
||||||
|
# # Create a grid
|
||||||
|
# grid_size = 50
|
||||||
|
# x = np.linspace(0, 10, grid_size)
|
||||||
|
# y = np.linspace(0, 10, grid_size)
|
||||||
|
# z = np.linspace(0, 10, grid_size)
|
||||||
|
# x, y, z = np.meshgrid(x, y, z)
|
||||||
|
|
||||||
|
# # Create scalar values based on a Gaussian distribution
|
||||||
|
# values = np.exp(-((x - 5)**2 + (y - 5)**2 + (z - 5)**2) / 10)
|
||||||
|
|
||||||
|
# # Convert grid points and values to VTK format
|
||||||
|
# points = vtk.vtkPoints()
|
||||||
|
# scalars = vtk.vtkDoubleArray()
|
||||||
|
# scalars.SetName("HeatValues")
|
||||||
|
|
||||||
|
# for i in range(grid_size):
|
||||||
|
# for j in range(grid_size):
|
||||||
|
# for k in range(grid_size):
|
||||||
|
# points.InsertNextPoint(x[i, j, k], y[i, j, k], z[i, j, k])
|
||||||
|
# scalars.InsertNextValue(values[i, j, k])
|
||||||
|
|
||||||
|
# # Create a structured grid
|
||||||
|
# structured_grid = vtk.vtkStructuredGrid()
|
||||||
|
# structured_grid.SetDimensions(grid_size, grid_size, grid_size)
|
||||||
|
# structured_grid.SetPoints(points)
|
||||||
|
# structured_grid.GetPointData().SetScalars(scalars)
|
||||||
|
|
||||||
|
# # Write the grid to a VTK file
|
||||||
|
# vtk_writer = vtk.vtkStructuredGridWriter()
|
||||||
|
# vtk_writer.SetFileName("heatmap.vtk")
|
||||||
|
# vtk_writer.SetInputData(structured_grid)
|
||||||
|
# vtk_writer.Write()
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def load_vtk(vtk_file):
|
||||||
|
# 使用 vtkStructuredGridReader 来读取 structured_grid 数据类型
|
||||||
|
reader = vtk.vtkStructuredGridReader()
|
||||||
|
reader.SetFileName(vtk_file)
|
||||||
|
reader.Update()
|
||||||
|
|
||||||
|
# 获取数据集
|
||||||
|
dataset = reader.GetOutput()
|
||||||
|
|
||||||
|
# 提取点数据
|
||||||
|
points = dataset.GetPoints()
|
||||||
|
point_data = points.GetData()
|
||||||
|
|
||||||
|
# 由于结构化网格的数据是按规则网格组织的,我们直接获取网格尺寸
|
||||||
|
dimensions = dataset.GetDimensions()
|
||||||
|
|
||||||
|
return point_data, dimensions # 返回维度而不是 cells
|
||||||
|
|
||||||
|
|
||||||
|
def vtk_to_geojson(point_data, dimensions):
|
||||||
|
# 转换 VTK 点数据
|
||||||
|
points = []
|
||||||
|
for i in range(point_data.GetNumberOfTuples()):
|
||||||
|
points.append(list(point_data.GetTuple3(i)))
|
||||||
|
|
||||||
|
# 这里我们不直接使用 cells,而是基于维度构建网格的多边形
|
||||||
|
features = []
|
||||||
|
x_dim, y_dim, z_dim = dimensions
|
||||||
|
for x in range(x_dim - 1):
|
||||||
|
for y in range(y_dim - 1):
|
||||||
|
for z in range(z_dim - 1):
|
||||||
|
# 获取每个方格的四个角
|
||||||
|
pts = [
|
||||||
|
points[x + y * x_dim + z * x_dim * y_dim],
|
||||||
|
points[(x + 1) + y * x_dim + z * x_dim * y_dim],
|
||||||
|
points[(x + 1) + (y + 1) * x_dim + z * x_dim * y_dim],
|
||||||
|
points[x + (y + 1) * x_dim + z * x_dim * y_dim]
|
||||||
|
]
|
||||||
|
# 创建多边形面
|
||||||
|
features.append({
|
||||||
|
"type": "Feature",
|
||||||
|
"geometry": {
|
||||||
|
"type": "Polygon",
|
||||||
|
"coordinates": [pts]
|
||||||
|
},
|
||||||
|
"properties": {}
|
||||||
|
})
|
||||||
|
|
||||||
|
# 构建 GeoJSON 数据
|
||||||
|
geojson_data = geojson.FeatureCollection(features)
|
||||||
|
return geojson_data
|
||||||
|
|
||||||
|
|
||||||
|
def vtk_to_gltf(point_data, dimensions):
|
||||||
|
# 提取点数据
|
||||||
|
vertices = []
|
||||||
|
for i in range(point_data.GetNumberOfTuples()):
|
||||||
|
vertices.append(list(point_data.GetTuple3(i)))
|
||||||
|
|
||||||
|
# 创建 GLTF 数据结构
|
||||||
|
gltf = GLTF2()
|
||||||
|
|
||||||
|
# 将点数据转换为 numpy 数组
|
||||||
|
vertices = np.array(vertices, dtype=np.float32).flatten()
|
||||||
|
|
||||||
|
# 创建缓冲区
|
||||||
|
buffer = Buffer(uri="data.bin", byteLength=len(vertices) * 4)
|
||||||
|
gltf.buffers.append(buffer)
|
||||||
|
|
||||||
|
# 创建缓冲区视图
|
||||||
|
bufferViewVertices = BufferView(
|
||||||
|
buffer=0,
|
||||||
|
byteOffset=0,
|
||||||
|
byteLength=len(vertices) * 4,
|
||||||
|
target=34962
|
||||||
|
)
|
||||||
|
gltf.bufferViews.append(bufferViewVertices)
|
||||||
|
|
||||||
|
# 创建访问器
|
||||||
|
accessorVertices = Accessor(
|
||||||
|
bufferView=0,
|
||||||
|
byteOffset=0,
|
||||||
|
componentType=5126,
|
||||||
|
count=len(vertices) // 3,
|
||||||
|
type="VEC3"
|
||||||
|
)
|
||||||
|
gltf.accessors.append(accessorVertices)
|
||||||
|
|
||||||
|
# 返回 GLTF 数据
|
||||||
|
return gltf
|
||||||
|
|
||||||
|
|
||||||
|
def save_geojson(geojson_data, filename):
|
||||||
|
with open(filename, 'w') as f:
|
||||||
|
json.dump(geojson_data, f)
|
||||||
|
|
||||||
|
|
||||||
|
def save_gltf(gltf, filename):
|
||||||
|
gltf.save(filename)
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
# 读取 VTK 文件
|
||||||
|
vtk_file = 'heatmap.vtk'
|
||||||
|
point_data, dimensions = load_vtk(vtk_file)
|
||||||
|
|
||||||
|
# 转换为 GeoJSON
|
||||||
|
geojson_data = vtk_to_geojson(point_data, dimensions)
|
||||||
|
save_geojson(geojson_data, 'output.geojson')
|
||||||
|
|
||||||
|
# 转换为 GLTF
|
||||||
|
gltf = vtk_to_gltf(point_data, dimensions)
|
||||||
|
save_gltf(gltf, 'output.gltf')
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
main()
|
Loading…
Reference in New Issue
Block a user