基于GeoToolkit/INT实现二维等值线图绘制示例

5 篇文章 0 订阅
3 篇文章 0 订阅

       继续在上一篇文章的基础上,利用相同的数据处理方法统一了地层数据和断层数据格式,本文主要基于GeoToolkit/INT组件,针对地质专业经常用到的地层数据解析和二维等值线(等高或等深线)可视化需求,本示例实现了不同地质年代地层的三种类型快速可视化,详细效果如下。

本篇主要阐述地质研究形成的地层数据解析与可视化交互显示,包括前端、后端设计等内容。

1.前端设计与相关实现代码:主要采用VUE+JS+Geotoolkit.JS,充分利用VUE的组件化思想,以及Geotoolkit.JS的ContourShape和ContourFaultList组件结合实现。具体前端代码如下,示例效果图详见第3部分。

vue组件

<script>
// 绘制二维等值线图
import {createScene} from './simpleContourShape';
let plot = null;
export default {
    name:"simpleContourShape",
    destroyed () {
        plot.dispose();
    },
    mounted () {
        plot = createScene(this.$refs.plot);
    }
};
</script>

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<lines.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<lines.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<lines.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};
2.后端设计与相关技术:主要采用java spring框架或者NodeJS的微服务接口实现。为了便于js或java解析地层或断层数据,统一采用json格式,有时候需要做base64转码处理。代码详见 上一篇文章,后端代码、服务方式和调用方式和数据文件格式类似。
3.地层与断层数据组合显示示例效果
等值线图(包括线,填充和深度文字标识)
等值线图(包括线和深度文字标识)
等值线图(包括线,填充,深度文字标识和线型个性化)
大地测量计算工具集 【软件功能】 该软件共包含近20项常用大地测量专业计算功能,部分项目功能含多个功能子项。 1)不同坐标形式转换 大地坐标与空间直角坐标的互换;空间直角坐标与正交椭球面坐标的互换;空间直角坐标与站心切平面坐标系的互换;大地坐标、空间直角坐标与球坐标的互换;高斯投影正反算与邻带换算;通用墨卡托投影正反算等。 2)不同坐标系转换 布尔莎模型七参数的求解(最小二乘法、抗差最小二乘法);不同坐标系转换;仿射变换参数求解;仿射变换计算。 3)参考椭球基本常数计算 由椭球基本几何常数计算其他几何常数,计算第一、第二辅助函数;计算卯酉圈、子午圈曲率半径;计算任意曲率半径和平均曲率半径;由椭球基本定义参数(4个)计算其他所有几何常数和物理常数。 4)参考框架变换 同一框架不同历元之间的变换;转换参数历元处不同框架间站速变换;转换参数历元处不同框架之间的坐标变换;历元速度坐标综合变换等。 5)大地问题解算 大地问题正反算,支持贝塞尔方法、高斯平均引数方法和韦森特方法。 6)距离归算 地面斜距归算至参考椭球面;椭球面边长投影至高斯平面;由两点位置计算各类大地方位角和各类边长。 工程控制网长度变形评估,支持标准3度带、任意投影、抵偿面投影、抵偿面任意投影等变形评估类型;支持测区四至信息加载;可以计算最大变形量,并进行限差审核。 7)控制网平差计算 水准网平差,支持最小二乘、粗差探测、自由网平差和拟稳平差; 三角高程网平差,支持最小二乘、粗差探测; GPS网平差,支持GAMIT和TGO基线解算结果转换;支持最小二乘、粗差探测、自由网平差和拟稳平差。 8)IGS观测数据与精密星历下载 支持精密星历、精密钟差、导航星历和原始观测文件的下载、解压和格式转换;支持多天多站下载模式;支持多线程下载;支持站点列表文件导入; 9)GNSS观测数据质量检查 支持GPS和GLONASS观测文件和星历;支持高度角设定;支持摘要生成;含有HOR图、IOD、ION、MP1、MP2、SN1、SN2图形的生成,支持按卫星编号绘图。 10)RTK定位结果精度分析 可应用于单点多历元各类XYZ坐标类型的点位精度分析,支持外部精度分析和内部精度评估;支持坐标转换;支持三维精度、平面精度的计算;支持数据剔除原则设定。 11)GNSS水准高程拟合 支持移动曲面法(含平面、二次曲面、加权平均法);支持整体拟合法(平面、二次曲面、三次曲面);支持EGM96和EGM2008;支持按不同地区不同点位分布情况进行算法优选与评估;支持似大地水准面模型文件的转换与生成;支持离散点批量水准拟合插值计算。 12)时间标示法变换 历书时、儒略日、GPS时、年积日等之间的转换;GNSS观测文件与星历文件名称计算。 13)图幅编号计算 由点位计算所在图幅号;由图幅号计算图幅范围;支持传统图幅编号和标准图幅编号;地形图图幅编码计算,由点位获得国标图幅编号和地形图幅编号,由图幅范围计算地形图幅集合。 14)…… 拟加入的功能: (1)水平网概算与平差。 (2)精密单点定位计算。 (3)GPS网型测前精度评估。 (4)GNSS星历预报。 (5)…… 【使用方法】 软件无广告、无注册码、无病毒、无任何功能限制,所有用户手中的软件和作者自己使用的软件是一样的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一望无际的大草原

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值