SuperMap iClient3D for WebGL——pickEvent事件

作者:赵爽

相信有大部分初学者在学习webgl的时候,都遇到pickEvent事件进不去的问题,我最近也查了查相关的问题,也是不少的。下面我就来总结一下pickEvent事件究竟应该怎么写。因为每个人的数据都不太一样,下面分单个数据集和多个数据集两个方向来写


使用产品:SuperMap iDesktop & SuperMap iServer
产品下载地址http://support.supermap.com.cn/DownloadCenter/ProductPlatform.aspx
使用数据:SampleData中的CBD数据(安装目录\3D\CBDDataset\CBD)
数据下载地址http://support.supermap.com.cn/DownloadCenter/DownloadPage.aspx?id=1099

产品配置环境
启动iServer(最后一行显示Server startup in *** ms为启动成功)
将webgl包放在iServer根目录下的webapps文件夹内

单个模型数据集

将模型数据集加载到场景后,保存场景然后右键该场景进行切缓存,文件类型改为S3M
在这里插入图片描述
生成场景缓存后,会在缓存目录下多出来一个新的工作空间,打开该工作空间然后把single数据源放进去,保存关闭。在iserver上发布该工作空间,选择数据服务三维服务

scene.open方式打开

主要函数代码

    function onload(Cesium) {
        var viewer = new Cesium.Viewer('cesiumContainer');
        var scene = viewer.scene,
            url = "http://localhost:8091/iserver/services/3D-single/rest/realspace",    //三维服务地址
            url2 = "http://localhost:8091/iserver/services/data-single/rest/data";      //数据服务地址
        var promise = scene.open(url);
        Cesium.when(promise, function(layers) {
            var layer = scene.layers.find('Building@single');       //绑定图层,图层名称可在三维服务地址下的datas中看
            layer.setQueryParameter({
                url: url2,
                dataSourceName: "single",                           //对应数据源名称,数据服务
                dataSetName:"Building",                             //对应数据集名称,数据服务
                isMerge: true,
                keyWord: 'SmID'
            });
        })
        viewer.pickEvent.addEventListener(function(feature) {
            alert("pickEvent事件已生效");
        });

因为是以scene.open的方式打开场景的,scene.open是打开该场景下所有图层,所以里面会包含多个图层,因此是layers而不是layer。这个时候如果不写var layer = scene.layers.find(‘Building@single’); 的话,它就不知道我们点击的是哪个图层了,下面的setQueryParameter就无效了。如果数据源名字或者数据集名字写错的话,也是无效的。

scene.addS3MTilesLayerByScp方式打开

主要函数代码

    function onload(Cesium) {
        var viewer = new Cesium.Viewer('cesiumContainer');
        var scene = viewer.scene,
            url = "http://localhost:8091/iserver/services/3D-single/rest/realspace/datas/Building@single/config",    //三维服务地址
            url2 = "http://localhost:8091/iserver/services/data-single/rest/data";      //数据服务地址
        var promise = scene.addS3MTilesLayerByScp(url);
        Cesium.when(promise, function(layer) {
            scene.camera.setView({
                destination: Cesium.Cartesian3.fromDegrees(116.458110477296490 ,39.912298501230481, 2300),//经纬度转笛卡尔
            })
            layer.setQueryParameter({
                url: url2,
                dataSourceName: "single",                           //对应数据源名称,数据服务
                dataSetName:"Building",                             //对应数据集名称,数据服务
                isMerge: true,
                keyWord: 'SmID'
            });
        })
        viewer.pickEvent.addEventListener(function(feature) {
            alert("pickEvent事件已生效");
        });

多个模型数据集

把上面所用的building数据分为3个模型数据集(分别命名为Building_1-3),为了方便区分,我把它们分别给了颜色。

单独生成缓存

保存场景并对其生成场景缓存,这种方式是每个图层单独切缓存,加载的时候是通过3个scp配置文件加载的。
在这里插入图片描述
生成场景缓存后,会在缓存目录下多出来一个新的工作空间,打开该工作空间然后把multiple数据源放进去,保存关闭。在iserver上发布该工作空间,选择数据服务三维服务

scene.open方式打开

主要函数代码

    function onload(Cesium) {
        var viewer = new Cesium.Viewer('cesiumContainer');
        var scene = viewer.scene,
            url = "http://localhost:8091/iserver/services/3D-Multiple/rest/realspace",    //三维服务地址
            url2 = "http://localhost:8091/iserver/services/data-Multiple/rest/data";      //数据服务地址
        var promise = scene.open(url);
        Cesium.when(promise, function(layers) {
            var layer1 = scene.layers.find('Building_1@Multiple');
            layer1.setQueryParameter({
                url: url2,
                dataSourceName: "Multiple",                           //对应数据源名称,数据服务
                dataSetName:"Building_1",                             //对应数据集名称,数据服务
                isMerge: true,
                keyWord: 'SmID'
            });
            var layer2 = scene.layers.find('Building_2@Multiple');
            layer2.setQueryParameter({
                url: url2,
                dataSourceName: "Multiple",                           //对应数据源名称,数据服务
                dataSetName:"Building_2",                             //对应数据集名称,数据服务
                isMerge: true,
                keyWord: 'SmID'
            });
            var layer3 = scene.layers.find('Building_3@Multiple');
            layer3.setQueryParameter({
                url: url2,
                dataSourceName: "Multiple",                           //对应数据源名称,数据服务
                dataSetName:"Building_3",                             //对应数据集名称,数据服务
                isMerge: true,
                keyWord: 'SmID'
            });
        })
        viewer.pickEvent.addEventListener(function(feature) {
            alert("pickEvent事件已生效");
        });

因为场景中一共有三个图层,每个图层对应的数据也不一样,所以一共要写三遍setQueryParameter,这样是不是有一些麻烦?没关系,后面会写一个简单的方法——批量生成场景缓存

scene.addS3MTilesLayerByScp方式打开

主要函数代码

    function onload(Cesium) {
        var viewer = new Cesium.Viewer('cesiumContainer');
        var scene = viewer.scene,
            url1 = "http://localhost:8091/iserver/services/3D-Multiple/rest/realspace/datas/Building_1@Multiple/config",    //三维服务地址
            url2 = "http://localhost:8091/iserver/services/3D-Multiple/rest/realspace/datas/Building_2@Multiple/config",
            url3 = "http://localhost:8091/iserver/services/3D-Multiple/rest/realspace/datas/Building_3@Multiple/config",
            url4 = "http://localhost:8091/iserver/services/data-Multiple/rest/data";      //数据服务地址
        var promise1 = scene.addS3MTilesLayerByScp(url1,{name:'Building_1@Multiple'});
        var promise2 = scene.addS3MTilesLayerByScp(url2,{name:'Building_2@Multiple'});
        var promise3 = scene.addS3MTilesLayerByScp(url3,{name:'Building_3@Multiple'});
        var promise = [promise1,promise2,promise3];
        Cesium.when.all(promise, function(layers) {				    //注意是when.all
            scene.camera.setView({
                destination: Cesium.Cartesian3.fromDegrees(116.458110477296490 ,39.912298501230481, 2300),//经纬度转笛卡尔
            })
            var layer1 = scene.layers.find('Building_1@Multiple');
            layer1.setQueryParameter({
                url: url4,
                dataSourceName: "Multiple",                           //对应数据源名称,数据服务
                dataSetName:"Building_1",                             //对应数据集名称,数据服务
                isMerge: true,
                keyWord: 'SmID'
            });
            var layer2 = scene.layers.find('Building_2@Multiple');
            layer2.setQueryParameter({
                url: url4,
                dataSourceName: "Multiple",                           //对应数据源名称,数据服务
                dataSetName:"Building_2",                             //对应数据集名称,数据服务
                isMerge: true,
                keyWord: 'SmID'
            });
            var layer3 = scene.layers.find('Building_3@Multiple');
            layer3.setQueryParameter({
                url: url4,
                dataSourceName: "Multiple",                           //对应数据源名称,数据服务
                dataSetName:"Building_3",                             //对应数据集名称,数据服务
                isMerge: true,
                keyWord: 'SmID'
            });
        })
        viewer.pickEvent.addEventListener(function(feature) {
            alert("pickEvent事件已生效");
        });

批量生成场景缓存

在iDesktop的【三维数据-模型-批量生成缓存】中,可以对这三个数据集批量生成缓存,格式选择S3M,与上面不同的是,这个缓存生成的是一个SCP文件,也就是一个图层。
全是白模,但实际上还是三个数据集。
主要函数代码

    function onload(Cesium) {
        var viewer = new Cesium.Viewer('cesiumContainer');
        var scene = viewer.scene,
            url = "http://localhost:8091/iserver/services/3D-PLMultiple/rest/realspace",    //三维服务地址
            url2 = "http://localhost:8091/iserver/services/data-PLMultiple/rest/data";      //数据服务地址
        var promise = scene.open(url);
        Cesium.when(promise, function(layers) {
            var layer1 = scene.layers.find('PLMultiple');
            layer1.setQueryParameter({
                url: url2,
                dataSourceName: "Multiple",                           //对应数据源名称,数据服务
                isMerge: true,
                keyWord: 'SmID'
            });
        })
        viewer.pickEvent.addEventListener(function(feature) {
            alert("pickEvent事件已生效");
        });
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答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、付费专栏及课程。

余额充值