SuperMap iClient3D for WebGL 调用GPA服务实现地质体模型裁剪封边

kele

前言

当展示大数据量地质体数据并进行裁剪封边业务时,常遇性能及显示效果问题。如何高效加载海量地质体数据并实现各类分析业务?一起来看看吧!

一、实现思路

1.1、加载地质体数据的两种方式:

① 数据服务方式(仅小数据量情况下建议使用,支持数据裁剪封边)

② 三维瓦片服务方式(大数据量情况下建议使用,支持裁剪,不支持封边)

1.2、加载大数据量地质体模型并要实现裁剪封边,需结合SuperMap iServer GPA工具实现

① 三维瓦片服务方式加载数据

② 调用iServer GPA模型裁剪地质体,实现封边

二、操作步骤

2.1、新建三维面数据集,将地质体数据集、三维面数据集存入数据库型数据源中

操作目的 :封边模型需要通过数据服务进行展示,需占用数据源,GPA模型也需要占用数据源,使用数据库型数据源避免数据源被独占

2.2、 将地质体模型生成三维瓦片,并保存到工作空间中。将工作空间发布为数据服务、三维服务。数据服务开启可编辑状态

2.3、使用 iClient3D for WebGL 加载三维服务,使用鼠标绘制方法,将自定义绘制结果存入数据服务中

鼠标绘制自定义裁剪面:

javascript 复制代码
var tooltip = createTooltip(document.body);
var handlerPolygon = new SuperMap3D.DrawHandler(viewer, SuperMap3D.DrawMode.Polygon, 0);
handlerPolygon.activeEvt.addEventListener(function(isActive){
    if(isActive == true){
        viewer.enableCursorStyle = false;
        viewer._element.style.cursor = '';
        $('body').removeClass('drawCur').addClass('drawCur');
    }else{
        viewer.enableCursorStyle = true;
        $('body').removeClass('drawCur');
    }
});
handlerPolygon.movingEvt.addEventListener(function(windowPosition){
    if(handlerPolygon.isDrawing){
        tooltip.showAt(windowPosition,'<p>点击确定多边形顶点</p><p>右键单击结束绘制</p>');
    } else{
        tooltip.showAt(windowPosition,'<p>点击绘制第一个点</p>');
    }
});
handlerPolygon.drawEvt.addEventListener(function(result){
    tooltip.setVisible(false);
    handlerPolygon.polygon.show = false;
    handlerPolygon.polyline.show = false;
    positions = [];
    for(var pt of result.object.positions){
        var cartographic = SuperMap3D.Cartographic.fromCartesian(pt);
        var longitude = SuperMap3D.Math.toDegrees(cartographic.longitude);
        var latitude = SuperMap3D.Math.toDegrees(cartographic.latitude);
        var height = cartographic.height;
        positions.push(longitude, latitude, height);
    }
    regions = [];
    regions.push(positions);
    for(var layer of layers){
        layer.setModifyRegions(regions, clipMode);
    }
    //鼠标绘制事件结束后执行
    addRegion(regions[0]);  //将绘制面添加到数据服务中
    //fengbian()              //调用iServer GPA服务,实现地质体裁剪封边
});

将自定义裁剪面添加到三维面数据服务中:

javascript 复制代码
function addRegion(regions) {
    var delUrl = "http://localhost:8091/iserver/services/data-dztcj/rest/data/datasources/DataSource_Clip/datasets/NewRegion3D/features.rjson?_method=DELETE&deleteMode=IDS";
    var ids = [];
    for(let i=0;i<100;i++){
    	ids.push(i)
    };
    var delids = JSON.stringify(ids);
    //执行post请求,删除三维面数据集中的所有要素
    $.ajax({
        type: "post",
        url: delUrl,
        data: delids,
        success: function (result) {
            console.log(result);
        },
        error: function (msg) {
            console.log(msg);
        },
    });
    //执行post请求,向三维面数据集中添加绘制范围结果
    var length = regions.length/3;
    var points = [];
    for(let i=0;i<regions.length/3;i++){
        let str = {
            "x": regions[i*3],
            "y": regions[i*3+1],
            "z": regions[i*3+2]
        };
        points.push(str)
    }
    var regionParme = [
        {
            "fieldNames": ["SMID"],
            "fieldValues": ["1"],
            "geometry": {
                "id": 1,
                "parts": [length],
                "points": points,
                "style": null,
                "type": "REGION3D"
            }
        }
    ];
    var url = "http://localhost:8091/iserver/services/data-dztcj/rest/data/datasources/DataSource_Clip/datasets/NewRegion3D/features.rjson?isUseBatch=true"
    var queryData = JSON.stringify(regionParme);
    $.ajax({
        type: "post",
        url: url,
        data: queryData,
        success: function (result) {
            console.log(result);
        },
        error: function (msg) {
            console.log(msg);
        }
    })
}

2.4、点击进入 SuperMap iServer 处理自动化服务,找到 工具列表-模型工具-模型裁剪-地质体裁剪工具

复制工具id:

申请token令牌:

2.5、调用GPA工具,实现地质体裁剪封边

使用上一步记录的模型id、token,构造请求参数

javascript 复制代码
let clipMonelName;
//调用iServer GPA服务,实现地质体裁剪封边
function fengbian() {
    //给裁剪结果数据集创建一个不会重复的数据集名称
    var now = new Date();
    clipMonelName = "clipModel" + now.getHours().toString().padStart(2, '0') + now.getMinutes().toString().padStart(2, '0') + now.getSeconds().toString().padStart(2, '0');
    //GPA服务模型ID
    let modelID = "sps.WorkflowProcessFactory.models.模型裁剪:地质体裁剪";
    //iServer token,GPA服务必须要使用token
    let token = "8Yb_n11d1rVPVntqd7evtZNEFQe-uckmkOicpSoLejeL-qaZZ3aia2gcklrJ4oRHa5qUe2d07dPLA9l2bwoLK4Lxsdf_Fi0A";
    //请求参数,可在iserver对应工具中查看
    let Paramt = {
        "parameter":{
            "modelclip-sourceDataset":"--server=172.16.14.191 --password=123456 --database=DataSource_Clip --dbType=POSTGRESQL --alias=DataSource_Clip --maxConnPoolNum=50 --dataset=ZMQ_DZ --user=postgres --providerType=sdx",
            "modelclip-clipDataset":"--server=172.16.14.191 --password=123456 --database=DataSource_Clip --dbType=POSTGRESQL --alias=DataSource_Clip --maxConnPoolNum=50 --dataset=NewRegion3D --user=postgres --providerType=sdx",
            "modelclip-resultDatasource":"--server=172.16.14.191 --password=123456 --database=DataSource_Clip --dbType=POSTGRESQL --alias=DataSource_Clip --maxConnPoolNum=50 --user=postgres --providerType=sdx",
            "modelclip-resultDatasetName": clipMonelName
        }
    };
    var url = "http://localhost:8091/iserver/services/geoprocessing/restjsr/gp/v2/" + modelID + "/jobs?token=" + token;
    var queryData = JSON.stringify(Paramt);
    //执行请求
    $.ajax({
        type: "post",
        url: url,
        data: queryData,
        success: function (result) {
            var resultObj = JSON.parse(result);
            //发送get请求,从返回结果中判断GPA服务是否执行完成
        }
    })
}

发送请求后,再次发送get请求,从返回结果中判断GPA服务是否执行完成

javascript 复制代码
$.ajax({
    type: "get",
    url: "http://localhost:8091/iserver/services/geoprocessing/restjsr/gp/v2/jobs/" + resultObj.jobID + ".json?token=" + token,
    success: function (result) {
        //当返回状态为 true 时表示裁剪完成
    }
})

当GPA工具任务执行状态返回为true时,任务执行完成,通过数据服务将封边模型添加到场景中

javascript 复制代码
//当返回状态为 true 时表示裁剪完成
if(result.state.success = "true"){
    clearInterval(interV);
    setTimeout(()=>{   //发送get请求,获取裁剪结果中封边模型的数量
        $.ajax({
            type: "get",
            url: "http://localhost:8091/iserver/services/data-dztcj/rest/data/datasources/DataSource_Clip/datasets/" + clipMonelName +"/features.rjson",
            success: function (result) {
                var resultObj = JSON.parse(result);
                //使用数据服务方式添加封边模型
                var solidModelsProfile = new SuperMap3D.SolidModelsProfile(scene);
                var models = [];
                for(let i=1;i<=resultObj.featureCount;i++){
                    // 也可以不设置纹理,设置颜色
                    models.push({
                        id: i,
                        model: "http://localhost:8091/iserver/services/data-dztcj/rest/data/datasources/DataSource_Clip/datasets/"+ clipMonelName +"/features/" + i +".stream",
                        color: new SuperMap3D.Color(179 / 255, 179 / 255, 179 / 255, 1)
                    });
                }
                solidModelsProfile.addModels(models);
                solidModelsProfile.addedEvent.addEventListener((param) => {
                    console.log(param);
                });
            }
        })
    },1000)
}

完整代码:

链接: https://pan.baidu.com/s/1JRempJaJkmTRTOYW3L56lA?pwd=6655 提取码: 6655

相关推荐
想看雪的瓜8 小时前
Origin绘制3D坐标下边际直方图
3d
接着奏乐接着舞。11 小时前
3D地球可视化教程 - 第3篇:地球动画与相机控制
前端·vue.js·3d·threejs
研梦非凡11 小时前
ShapeLLM: 用于具身交互的全面3D物体理解
人工智能·深度学习·计算机视觉·3d·架构·数据分析
二川bro2 天前
第28节:网络同步与多人在线3D场景
网络·3d
nnnnichijou2 天前
Qt Quick 3D-机械臂模型显示与交互
qt·3d·交互
m0_743106463 天前
LOBE-GS:分块&致密化效率提升
人工智能·算法·计算机视觉·3d·几何学
视觉人机器视觉3 天前
机器视觉Halcon3D中,六大类3D处理算子
人工智能·计算机视觉·3d·视觉检测
Damon小智3 天前
从零开始XR开发:Three.js实现交互式3D积木搭建器
javascript·3d·xr
-dzk-3 天前
【3DGS复现】Autodl服务器复现3DGS《简单快速》《一次成功》《新手练习复现必备》
运维·服务器·python·计算机视觉·3d·三维重建·三维