继续在上一篇文章的基础上,利用相同的数据处理方法统一了地层数据和断层数据格式,本文主要基于GeoToolkit/INT组件,针对地质专业经常用到的地层数据解析和二维等值线(等高或等深线)可视化需求,本示例实现了不同地质年代地层的三种类型快速可视化,详细效果如下。
本篇主要阐述地质研究形成的地层数据解析与可视化交互显示,包括前端、后端设计等内容。
1.前端设计与相关实现代码:主要采用VUE+JS+Geotoolkit.JS,充分利用VUE的组件化思想,以及Geotoolkit.JS的ContourShape和ContourFaultList组件结合实现。具体前端代码如下,示例效果图详见第3部分。
vue组件
- // 绘制二维等值线图
- import {createScene} from './simpleContourShape';
- let plot = null;
- export default {
- name:"simpleContourShape",
- destroyed () {
- plot.dispose();
- },
- mounted () {
- plot = createScene(this.$refs.plot);
- }
- };
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;j
at(i).x.length;j++){ - //获取x和y的最小值和最大值
- if((i==0) && (j==0)){
- xmin=lines.at(i).x[j];
- ymin=lines.at(i).y[j];
- xmax=xmin;
- ymax=ymin;
- }
- if(xmin>lines.at(i).x[j]){
- xmin=lines.at(i).x[j];
- }
- if(xmax
at(i).x[j]){ - xmax=lines.at(i).x[j];
- }
- if(ymin>lines.at(i).y[j]){
- ymin=lines.at(i).y[j];
- }
- if(ymax
at(i).y[j]){ - ymax=lines.at(i).y[j];
- }
- //将每个散点值赋值给grid。
- grid.setValue( Math.floor(lines.at(i).x[j]/num), Math.floor(lines.at(i).y[j]/(num*10)), Math.floor(lines.at(i).z));
- }
- }
- return grid;
- };
- export {createModelLimits, makeContourPlot, MODE};