做了一个用vtk生成三维模型并在上面贴插值图的功能
import rasterio
import vtk
from pyproj import Transformer
# 1. 使用 rasterio 读取 TIFF 文件
with rasterio.open(r'D:\data\projects\202533\demtaiyuan1.tif') as src:
elevation_data = src.read(1) # 读取第一个波段的数据
transform = src.transform # 获取地理变换信息
# 2. 创建坐标转换器,从源坐标系(例如 EPSG:4326)转换为 EPSG:3857
transformer = Transformer.from_crs("EPSG:4326", "EPSG:3857", always_xy=True)
# 3. 将高程数据转换为 VTK 可以处理的格式
rows, cols = elevation_data.shape
points = vtk.vtkPoints()
texture_coords = vtk.vtkFloatArray()
texture_coords.SetNumberOfComponents(2) # 每个顶点有两个纹理坐标 (u, v)
for i in range(rows):
for j in range(cols):
z = elevation_data[i, j]
if z > 0:
# 将像素坐标 (j, i) 转换为地理坐标 (x, y)
x, y = transform * (j, i)
# 将地理坐标 (x, y) 转换为 EPSG:3857 坐标
x_3857, y_3857 = transformer.transform(x, y)
points.InsertNextPoint(x_3857, y_3857, z*4) # 将点添加到 VTK 点集
# 计算纹理坐标 (u, v)
u = j / (cols - 1) # 水平方向,从 0 到 1
v = 1 - (i / (rows - 1)) # 垂直方向,从 1 到 0(翻转)
texture_coords.InsertNextTuple((u, v))
# 4. 创建多边形数据
polydata = vtk.vtkPolyData()
polydata.SetPoints(points)
# 5. 使用 vtkDelaunay2D 生成三角网格
delaunay = vtk.vtkDelaunay2D()
delaunay.SetInputData(polydata)
delaunay.SetAlpha(4000)
delaunay.Update()
# 6. 将纹理坐标添加到多边形数据
output_polydata = delaunay.GetOutput()
output_polydata.GetPointData().SetTCoords(texture_coords)
# 7. 创建映射器
mapper = vtk.vtkPolyDataMapper()
mapper.SetInputData(output_polydata)
# 8. 创建演员
actor = vtk.vtkActor()
actor.SetMapper(mapper)
# 9. 读取纹理图片
texture_reader = vtk.vtkPNGReader()
texture_reader.SetFileName(r'D:\data\projects\202533\Ca_kriging11.png')
texture_reader.Update()
# 10. 创建纹理
texture = vtk.vtkTexture()
texture.SetInputConnection(texture_reader.GetOutputPort())
# 11. 将纹理应用到演员
actor.SetTexture(texture)
# 12. 创建渲染器和窗口
renderer = vtk.vtkRenderer()
render_window = vtk.vtkRenderWindow()
render_window.AddRenderer(renderer)
render_window_interactor = vtk.vtkRenderWindowInteractor()
render_window_interactor.SetInteractorStyle(vtk.vtkInteractorStyleTrackballCamera())
render_window_interactor.SetRenderWindow(render_window)
# 13. 添加演员到渲染器
renderer.AddActor(actor)
# 14. 设置背景颜色
renderer.SetBackground(0.1, 0.2, 0.4)
# 15. 启动交互
render_window.Render()
glb_exporter = vtk.vtkOBJExporter()
glb_exporter.SetRenderWindow(render_window)
glb_exporter.SetFilePrefix(r'D:\data\projects\202533\model\name.obj')
glb_exporter.Write()
glb_exporter.Update()
render_window_interactor.Start()