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


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

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

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

    vue组件

    js组件

    1. import {createModelLimits, makeContourPlot, MODE} from './contourShapeCommon';
    2. //绘制整体场景,先设置模型范围,再绘制具体的对象。
    3. function createScene (canvas) {
    4. const left = 38;
    5. const bottom = 41;
    6. const right = 54;
    7. const top = 46;
    8. // 设置模型范围
    9. const modelLimits = createModelLimits(left,bottom,right,top);
    10. //绘制对象
    11. return makeContourPlot(canvas, modelLimits, right, top, MODE.Shape);
    12. // return makeContourPlot(canvas, modelLimits, right, top, MODE.ColoredIsolines);
    13. // return makeContourPlot(canvas, modelLimits, right, top, MODE.ShapeWithSingleIsoline);
    14. }
    15. export {createScene};

    解析和绘制contour的js公共组件

    1. //设置模型左上--》右下边界范围
    2. const createModelLimits = function (left, bottom,right,top) {
    3. return new Rect(left, bottom,right, top);
    4. };
    5. //对外部组件提供的绘制contour的接口,用于绘制contourShape,并将其加入的group中,将group作为plot的根对象返回。
    6. function makeContourPlot (canvas, modelLimits, xSize, ySize, mode) {
    7. // Create contour shape
    8. const contourShape = buildContourShape(modelLimits, xSize, ySize, mode)
    9. .setBoundingBox(modelLimits);
    10. // Create a group to hold the contourShape
    11. const group = new Group()
    12. .setModelLimits(modelLimits)
    13. .addChild(contourShape)
    14. .setVerticalFlip(true)
    15. .setFillStyle(ColorUtil.parseColor('white'));
    16. // Create a Plot object from the canvas and group
    17. return new Plot({
    18. 'canvasElement': canvas,
    19. 'root': group
    20. });
    21. }
    22. surface.contour = null;
    23. //contour明码数据解析,详见surfaces2.json
    24. function getContour() {
    25. if (surface.contour == null) {
    26. surface.contour = [];
    27. for (let k = 0; k < SurfaceData.length; k++) {
    28. surface.contour.push(SurfaceData[k]);
    29. }
    30. }
    31. return surface.contour;
    32. };
    33. //主要方法,用于构建fault和grid,grid里面有contour
    34. const buildContourShape = function (modelLimits, xSize, ySize, mode) {
    35. // Create faults
    36. const faults = createFaults(modelLimits);
    37. // Create grid
    38. const grid = createGrid(xSize, ySize);
    39. // Create contour shape
    40. const contour = new ContourShape()
    41. .setGrid(grid)
    42. .setScale(scale)
    43. .setFaultsList(faults)
    44. .setSmoothingIsolines(true)
    45. .setSuppressIntersectingLabels(true)
    46. .setSmoothingLabels(true)
    47. .setFillStyle(ColorUtil.parseColor('blue'));
    48. return contour;
    49. };
    50. //构建Grid,Grid中包含了Contour,Grid必须从0开始绘制
    51. const createGrid = function (xSize, ySize) {
    52. const grid = new ContourRectangularGrid();
    53. grid.setRange(new GridRange(0,0,xSize,ySize));
    54. //为了将坐标转换到grid设置的模型范围,用到的倍数关系
    55. const num=10000;
    56. //获取Contour数据,line是一个三维数组,第一层为每一段的contour、第二层为每一段的x点数组,y点数组,z数组,第三层为具体的x,y和z的array
    57. const lines = getContour();
    58. let xmin,xmax,ymin,ymax;
    59. xmin=xmax=ymin=ymax=0;
    60. //1.方法一:实现将x-array,y-array,z-value赋值给grid
    61. for (let i = 0; i < lines.length; i++) {
    62. // grid.setData(lines.at(0).x, lines.at(0).y, lines.at(0).z);
    63. // grid.setData(lines.at(i).x, lines.at(i).y, lines.at(i).z);
    64. for(let j=0;jat(i).x.length;j++){
    65. //获取x和y的最小值和最大值
    66. if((i==0) && (j==0)){
    67. xmin=lines.at(i).x[j];
    68. ymin=lines.at(i).y[j];
    69. xmax=xmin;
    70. ymax=ymin;
    71. }
    72. if(xmin>lines.at(i).x[j]){
    73. xmin=lines.at(i).x[j];
    74. }
    75. if(xmaxat(i).x[j]){
    76. xmax=lines.at(i).x[j];
    77. }
    78. if(ymin>lines.at(i).y[j]){
    79. ymin=lines.at(i).y[j];
    80. }
    81. if(ymaxat(i).y[j]){
    82. ymax=lines.at(i).y[j];
    83. }
    84. //将每个散点值赋值给grid。
    85. 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));
    86. }
    87. }
    88. return grid;
    89. };
    90. export {createModelLimits, makeContourPlot, MODE};
    2.后端设计与相关技术:主要采用java spring框架或者NodeJS的微服务接口实现。为了便于js或java解析地层或断层数据,统一采用json格式,有时候需要做base64转码处理。代码详见 上一篇文章,后端代码、服务方式和调用方式和数据文件格式类似。
    3.地层与断层数据组合显示示例效果
    等值线图(包括线,填充和深度文字标识)
    等值线图(包括线和深度文字标识)
    等值线图(包括线,填充,深度文字标识和线型个性化)
  • 相关阅读:
    SpringBoot定时任务 - 集成quartz实现定时任务(单实例和分布式两种方式)
    持续造风,快手为品牌、商家提供“保姆式”服务
    vue3+elementPlus:el-table-column表格列动态设置单元格颜色
    面试必问-Android系统运行流程与AMS源码实战
    嵌入式算法19---国家商用密码SM算法
    Java中synchronized:特性、使用、锁机制与策略简析
    品牌低价的形式有哪些
    iMazing 3 for Windows iOS设备管理软件2024最新功能解析
    ICV:2025年中国汽车磁传感器芯片市场规模将超过30亿元
    Redis 事务
  • 原文地址:https://blog.csdn.net/hhue2007/article/details/130899662