1 引言
大部分采矿规划软件都内置块体模型(Block Model)功能,但这些软件有一定的局限性:一方面是价格不菲的商业性软件,另一方面功能太多,短时间内不容易掌握。而MiningPy是一个用Python语言编写的功能相对单一的块体模型API,能够满足要求不太高的块体模型操作,包括块体索引(ijk)、基于几何和属性的块体重构、块体旋转、计算模型框架(原点、尺寸、旋转、外延等)、验证块体模型的内部块缺失、检查模型是否规则等。
MiningPy能够在Python中直接预览块体模型和dxf文件,也能导出与ParaView兼容的块体模型,关于ParaView参看【软土地层开挖和支护模拟(Excavation and Support of Soft Soil)---Part 3】此外,MiningPy提供了与商业采矿计划软件包的交互功能,例如Maptek Vulcan,GEOVIA Whittle,COMET,Minemax Scheduler/Tempo和Datamine。
2 核心API
MiningPy的核心函数共有15个,以miningpy.core.YYY的形式调用,YYY代表如下函数:
(1) ijk---根据块体的xyz坐标计算其ijk的索引值
(2) xyz---与(1)正好相反,根据块体的ijk索引计算其xyz坐标
(3) rotate_grid---采用右手规则和旋转矩阵方法,旋转块体
(4) group_weighted_average---块状模型属性的加权平均数
(5) nblocks_xyz---在模型不旋转情况下x,y,z轴上的块体数目
(6) model_origin---块体模型网格的原点,即最小xyz坐标值的点
(7) block_dims---估算不旋转情况下块体x、y、z的尺寸
(8) check_regular---检查块体模型中的块是否置于一个规则的网格上
(9) check_internal_blocks_missing---检查在一个规则的块体模型中是否存在有缺失的内部块(10) vulcan_csv---将pandas.Dataframe块体模型转换成Vulcan导入兼容的CSV格式
(11) vulcan_bdf---从Vulcan块模型创建一个Vulcan块定义文件
(12) geometric_reblock---将一个普通的块体模型聚合或分割为更大或更小的块
(13) index_3Dto1D---将块体中心点的三维数组xyz转换为一维索引
(14) index_1Dto3D---将IJK索引转换回块体中心点的坐标xyz
(15) grade_tonnage_plot---创建并返回品位-吨位(grade-tonnage)表,品位-吨位表示截止品位对矿产储量的影响。
3 可视化函数
MiningPy提供的可视化函数共有8个,以miningpy.visualisation.YYY的形式调用,YYY代表如下函数:
(1) plot3D---创建完全互动的3D vtk块体模型图
(2) export_html---输出块体模型的块体和属性,并将数据嵌入到paraview glance html应用程序中,以实现可视化
(3) plot3D_dxf---创建完全交互的3D vtk图,dxf必须是字符串或三角化图
(4) export_dxf_html---导出dxf文件并将数据嵌入paraview glance html应用程序,以实现可视化
(5) dxf2vtk---将dxf保存为.vtp(vtk polydata)文件格式,以便在paraview中打开用于外部查看。
(6) blocks2vtk---将块体模型的块体和属性导出到vtk文件中,以便在paraview中进行可视化
(7) blocks2dxf---将块体模型的块体和属性导出到vtk文件中,以便在paraview中进行可视化
(8) face_position_dxf
4 与Maptek Vulcan集成
MiningPy提供了与Maptek Vulcan集成的功能。目前可以使用的函数有12个,以miningpy.vulcan.YYY的形式调用,YYY代表如下函数:
(1) vulcan_dir_to_path
(2) bdf_from_bmf
(3) create_bdf
(4) bmf_to_csv
(5) csv_to_bmf
(6) pandas_to_bmf
(7) bmf_to_pandas
(8) mine_block_model
(9) set_variable
(10) create_variable
(11) strings_to_dxf
(12) dxf_to_strings
5 应用实例
[例子1] 下面的代码用来手工建立一个块体模型,也可以按照这种方法读取一个大的数据集,代码执行结果如下图所示。
import pandas as pd
import miningpy
blockModelData={
'x': [5,5,15],
'y': [5,15,25],
'z': [5,5,5],
'tonnage': [50,100,50],
}
blockModel=pd.DataFrame(blockModelData)
blockModel.plot3D(
xyz_cols=('x','y','z'),
dims=(5,5,5),
col='tonnage',
}
[例子2] 下面的代码读取一个csv文件,然后生成块体模型,如下图所示。
import pandas as pd
import miningpy
blockModel = pd.read_csv('block_model.csv')
blockModel.export_html(
path='blockmodel.html',
xyz_cols=('x', 'y', 'z'),
dims=(1, 1, 1),
)
[例子3] 下面的代码读取一个dxf文件,然后进行三角化处理,生成表面模型。
import hashlib
import os
import miningpy
import ezdxf
with open('block_model.dxf') as bm:
dxf_raw = bm.read()
dxf_raw = dxf_raw.replace("\r\n", "\n")
temp_file=hashlib.md5(dxf_raw.encode(encoding='UTF-8')).hexdigest()
with open(temp_file, 'w') as file:
file.write(dxf_raw)
miningpy.export_dxf_html(temp_file, output='dxf_triangulation.html')
os.remove(temp_file)