继续在上一篇文章的基础上,利用相同的数据处理方法统一了地层数据和断层数据格式,本文主要基于GeoToolkit/INT组件,针对地质专业经常用到的地层数据解析和二维等值线(等高或等深线)可视化需求,本示例实现了不同地质年代地层的三种类型快速可视化,详细效果如下。
本篇主要阐述地质研究形成的地层数据解析与可视化交互显示,包括前端、后端设计等内容。
1.前端设计与相关实现代码:主要采用VUE+JS+Geotoolkit.JS,充分利用VUE的组件化思想,以及Geotoolkit.JS的ContourShape和ContourFaultList组件结合实现。具体前端代码如下,示例效果图详见第3部分。
vue组件
js组件
import {createModelLimits, makeContourPlot, MODE} from './contourShapeCommon';
//绘制整体场景,先设置模型范围,再绘制具体的对象。
function createScene (canvas) {
const left = 38;
const bottom = 41;
const right = 54;
const top = 46;
// 设置模型范围
const modelLimits = createModelLimits(left,bottom,right,top);
//绘制对象
return makeContourPlot(canvas, modelLimits, right, top, MODE.Shape);
// return makeContourPlot(canvas, modelLimits, right, top, MODE.ColoredIsolines);
// return makeContourPlot(canvas, modelLimits, right, top, MODE.ShapeWithSingleIsoline);
}
export {createScene};
解析和绘制contour的js公共组件
//设置模型左上--》右下边界范围
const createModelLimits = function (left, bottom,right,top) {
return new Rect(left, bottom,right, top);
};
//对外部组件提供的绘制contour的接口,用于绘制contourShape,并将其加入的group中,将group作为plot的根对象返回。
function makeContourPlot (canvas, modelLimits, xSize, ySize, mode) {
// Create contour shape
const contourShape = buildContourShape(modelLimits, xSize, ySize, mode)
.setBoundingBox(modelLimits);
// Create a group to hold the contourShape
const group = new Group()
.setModelLimits(modelLimits)
.addChild(contourShape)
.setVerticalFlip(true)
.setFillStyle(ColorUtil.parseColor('white'));
// Create a Plot object from the canvas and group
return new Plot({
'canvasElement': canvas,
'root': group
});
}
surface.contour = null;
//contour明码数据解析,详见surfaces2.json
function getContour() {
if (surface.contour == null) {
surface.contour = [];
for (let k = 0; k < SurfaceData.length; k++) {
surface.contour.push(SurfaceData[k]);
}
}
return surface.contour;
};
//主要方法,用于构建fault和grid,grid里面有contour
const buildContourShape = function (modelLimits, xSize, ySize, mode) {
// Create faults
const faults = createFaults(modelLimits);
// Create grid
const grid = createGrid(xSize, ySize);
// Create contour shape
const contour = new ContourShape()
.setGrid(grid)
.setScale(scale)
.setFaultsList(faults)
.setSmoothingIsolines(true)
.setSuppressIntersectingLabels(true)
.setSmoothingLabels(true)
.setFillStyle(ColorUtil.parseColor('blue'));
return contour;
};
//构建Grid,Grid中包含了Contour,Grid必须从0开始绘制
const createGrid = function (xSize, ySize) {
const grid = new ContourRectangularGrid();
grid.setRange(new GridRange(0,0,xSize,ySize));
//为了将坐标转换到grid设置的模型范围,用到的倍数关系
const num=10000;
//获取Contour数据,line是一个三维数组,第一层为每一段的contour、第二层为每一段的x点数组,y点数组,z数组,第三层为具体的x,y和z的array
const lines = getContour();
let xmin,xmax,ymin,ymax;
xmin=xmax=ymin=ymax=0;
//1.方法一:实现将x-array,y-array,z-value赋值给grid
for (let i = 0; i < lines.length; i++) {
// grid.setData(lines.at(0).x, lines.at(0).y, lines.at(0).z);
// grid.setData(lines.at(i).x, lines.at(i).y, lines.at(i).z);
for(let j=0;jlines.at(i).x[j]){
xmin=lines.at(i).x[j];
}
if(xmaxlines.at(i).y[j]){
ymin=lines.at(i).y[j];
}
if(ymax