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 加载三维服务,使用鼠标绘制方法,将自定义绘制结果存入数据服务中

鼠标绘制自定义裁剪面:

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服务,实现地质体裁剪封边
});

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

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,构造请求参数

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服务是否执行完成

$.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时,任务执行完成,通过数据服务将封边模型添加到场景中

//当返回状态为 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

### 回答1: SuperMap iClient 3D for WebGL 是一款基于 WebGL 技术的三维地图开发工具,主要用于构建具有三维效果的地图应用程序。该工具提供了丰富的 API 接口和示例代码,可以帮助开发者快速上手,实现各种三维地图功能,如地形展示、建筑物模型、动态效果等。同时,SuperMap iClient 3D for WebGL 还支持多种数据格式,包括 SuperMap iServer 数据、OGC 标准数据、KML、GeoJSON 等,可以满足不同应用场景的需求。 ### 回答2: SuperMap iClient3D for WebGL是一个基于WebGL技术的三维地图开发框架。它提供了一系列的API和工具,使开发人员能够更加轻松地构建出高质量的三维地图应用。下面,我将从以下几个方面介绍SuperMap iClient3D for WebGL教程。 一、环境配置 SuperMap iClient3D for WebGL的开发需要先配置开发环境,包括安装Node.js、下载安装SuperMap iServer、下载安装SuperMap iClient3D资源包、创建Web应用程序。 二、基本概念 在学习SuperMap iClient3D for WebGL之前,需要了解一些基本概念。这些概念包括:场景(Scene)、层(Layer)、覆盖物(Overlay)等。在使用SuperMap iClient3D for WebGL时需要理解这些概念。 三、API使用 SuperMap iClient3D for WebGL提供了众多的API,使用这些API能够快速构建出一个三维地图应用。这些API包括:场景相关的API,如创建场景、设置场景属性等;层相关的API,如加载图层数据、隐藏、显示图层等;覆盖物相关的API,如创建、线、面等覆盖物。 四、进阶应用 在掌握SuperMap iClient3D for WebGL的基础之后,可以通过进阶应用来进一步加深对这个框架的理解。进阶应用包括地球的三维测量、地球的动态效果、地球的热区域等。 总之,SuperMap iClient3D for WebGL是一个非常实用的三维地图开发框架。通过学习其教程,开发人员可以更加方便、快速地构建出高质量的三维地图应用。 ### 回答3: SuperMap iClient 3D for WebGL是一款基于WebGL技术的开源GIS JavaScript库,用于构建高效、功能强大的3D GIS应用程序。这个库支持在Web浏览器里实现高质量的三维可视化效果,包括三维地形、建筑物、模型、标签等。现在,我来为你们讲解一下关于SuperMap iClient 3D for WebGL的教程。 一、前置知识 在接触SuperMap iClient 3D for WebGL之前,建议你先学习基本的WebGL知识和JavaScript语言,也应该具备计算机图形学基础和3D模型制作知识。 二、环境配置 在使用SuperMap iClient 3D for WebGL前,我们需要进行环境配置,在编写和运行项目时可以根据需要安装一系列依赖项,例如Node.js、npm包管理器、Gulp自动化工具、webpack工具和TypeScript编译器等。 三、基本使用 SuperMap iClient 3D for WebGL提供了丰富的API以实现3D可视化应用程序的开发,其中包括地图、图层、标注、工具、渲染等方面。同时,它还提供了多种数据格式的支持,如XYZ、OGC、JSON、KML、GML等。此外,SuperMap iClient 3D for WebGL还支持多种操作和交互方式,如平移、旋转、缩放、选取、编辑等,让用户可以更加自由地探索和编辑地图数据。 四、示例应用 SuperMap iClient 3D for WebGL提供了一系列的示例应用程序,可以帮助用户更好的理解其使用方法和特,其中包括一些经典的三维场景展示和实时数据可视化等。例如,用户可以验到城市三维建模、天气预报、热力图、空气质量监控等实用的功能。此外,SuperMap iClient 3D for WebGL也提供了一些模板和组件,供用户快速搭建自己的3D GIS应用程序。 总之,SuperMap iClient 3D for WebGL是一款非常优秀的基于WebGL技术的GIS JavaScript库,具有开源、高效、功能强大、易用等特,可以为用户提供丰富多彩的三维GIS应用程序。当然,在使用前,建议用户先了解基本的WebGL和JavaScript知识,同时还需配置好开发环境。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值