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