一、使用proj4将地理经纬度转换为网格坐标,您可以使用以下代码:
import pyproj
def convert_coordinates(lat, lon):
source_crs = pyproj.CRS("EPSG:4326")
target_crs = pyproj.CRS("EPSG:32650")
transformer = pyproj.Transformer.from_crs(source_crs, target_crs, always_xy=True)
x, y = transformer.transform(lon, lat)
return x, y
# 示例使用:
latitude = 40.7128
longitude = -74.0060
x, y = convert_coordinates(latitude, longitude)
print(f"网格坐标: x={x}, y={y}")
二、tvtk学习笔记参考
python 科学计算三维可视化笔记(第一周 基础运用)_python三维数据-CSDN博客
三、用vtk将包含xyz坐标和浓度的体数据进行三维可视化
- 导入所需的vtk模块和数据集。
- 创建vtkStructuredPoints或vtkImageData对象,并设置其网格尺寸和数据类型。
- 创建vtkPointData对象,并将xyz坐标和浓度数据添加到其中。
- 创建vtkColorTransferFunction对象,并定义颜色映射关系。
- 创建vtkVolumeProperty对象,并设置体数据的透明度、光照和渲染模式等属性。
- 创建vtkVolume对象,并将vtkStructuredPoints或vtkImageData、vtkVolumeProperty和vtkColorTransferFunction对象添加到其中。
- 创建vtkRenderer和vtkRenderWindow对象,并将vtkVolume对象添加到vtkRenderer中。
- 设置vtkRenderWindow为窗口的渲染窗口,并执行渲染操作。
示例代码:
import vtk
# 创建vtkStructuredPoints数据集
structured_points = vtk.vtkStructuredPoints()
structured_points.SetDimensions(nx, ny, nz) # 设置网格尺寸
structured_points.SetOrigin(origin_x, origin_y, origin_z) # 设置原点坐标
structured_points.SetSpacing(delta_x, delta_y, delta_z) # 设置间距
# 创建vtkPointData对象,并添加xyz坐标和浓度数据
point_data = vtk.vtkPointData()
structured_points.SetPointData(point_data)
coords_array = vtk.vtkDoubleArray()
coords_array.SetNumberOfComponents(3)
coords_array.SetName("Coordinates")
coords_array.SetVoidArray(coords, 3 * num_points, 1)
point_data.SetCoordinates(coords_array)
concentration_array = vtk.vtkDoubleArray()
concentration_array.SetNumberOfComponents(1)
concentration_array.SetName("Concentration")
concentration_array.SetVoidArray(concentration, num_points, 1)
point_data.SetScalars(concentration_array)
# 创建颜色映射
color_transfer = vtk.vtkColorTransferFunction()
color_transfer.AddRGBPoint(min_concentration, r, g, b)
color_transfer.AddRGBPoint(max_concentration, r, g, b)
# 创建体数据属性
volume_property = vtk.vtkVolumeProperty()
volume_property.SetColor(color_transfer)
volume_property.SetScalarOpacity(opacity_transfer)
volume_property.ShadeOn()
# 创建vtkVolume
volume_mapper = vtk.vtkGPUVolumeRayCastMapper() # 或者使用vtkSmartVolumeMapper
volume_mapper.SetInputDataObject(structured_points)
volume = vtk.vtkVolume()
volume.SetMapper(volume_mapper)
volume.SetProperty(volume_property)
# 创建渲染器和窗口
renderer = vtk.vtkRenderer()
renderer.AddVolume(volume)
render_window = vtk.vtkRenderWindow()
render_window.AddRenderer(renderer)
# 设置渲染窗口并执行渲染操作
render_window_interactor = vtk.vtkRenderWindowInteractor()
render_window_interactor.SetRenderWindow(render_window)
render_window.Render()
render_window_interactor.Start()
四、使用vtkNetCDFReader类来读取并可视化netcdf文件
import vtk
# 创建一个vtkNetCDFReader对象
reader = vtk.vtkNetCDFReader()
reader.SetFileName("your_file_path.nc")
# 设置读取的变量
reader.GetOutput().GetPointData().SetActiveAttribute("your_variable_name", vtk.vtkDataSetAttributes.SCALARS)
# 创建一个vtkContourFilter对象来提取等值面
contour = vtk.vtkContourFilter()
contour.SetInputConnection(reader.GetOutputPort())
contour.SetValue(0, 0.5) # 设置等值面的值
# 创建一个vtkPolyDataMapper对象来将数据映射到图形对象
mapper = vtk.vtkPolyDataMapper()
mapper.SetInputConnection(contour.GetOutputPort())
# 创建一个vtkActor对象来表示图形对象
actor = vtk.vtkActor()
actor.SetMapper(mapper)
# 创建一个vtkRenderer对象来渲染图形对象
renderer = vtk.vtkRenderer()
renderer.AddActor(actor)
# 创建一个vtkRenderWindow对象来显示渲染结果
render_window = vtk.vtkRenderWindow()
render_window.AddRenderer(renderer)
# 创建一个vtkRenderWindowInteractor对象来与用户交互
interactor = vtk.vtkRenderWindowInteractor()
interactor.SetRenderWindow(render_window)
# 开始渲染和交互
interactor.Initialize()
render_window.Render()
interactor.Start()
五、
六、『python笔记』numpy中mgrid的用法_np.mgrid-CSDN博客
七、提取等值面之vtkContourFilter算法和vtkMarchingCubes算法
vtkContourFilter算法和vtkMarchingCubes算法是常用于三维可视化和体积渲染的算法。它们都用于从体数据中提取等值面。
vtkContourFilter算法使用线性插值的方法,通过将体数据中的标量值与指定的等值进行比较,生成等值面。该算法使用了一个线性插值表,将等值面与单元间的交点进行插值计算,从而生成平滑的等值面。
vtkMarchingCubes算法是一种更高级的等值面提取算法。它使用了空间分割树(Octree)来提高算法的效率,并且可以在提取等值面时保持边界的较高分辨率。该算法通过将体数据划分为小的单元格,并根据这些单元格内部的标量值来确定等值面的位置和形状。需注意,该算法的输入数据必须是ImageData数据类型
# MarchingCube算法提取等值面
iso = vtk.vtkMarchingCubes()
iso.SetInputData(grid)
iso.ComputeNormalsOn()
# ContourFilter算法提取等值面
contour = vtk.vtkContourFilter()
contour.SetInputData(grid)
contour.GenerateValues(10,100,1000)