SuperMap iClient3D for WebGL 使用说明

前言:

最近由于公司需要用的superMap相关的技术,本人之前也从未接触过这方面的东西,也是从零开始,边做边学。下面简单对本次项目进行一个技术总结,希望对没有经验的人有所帮助。
SuperMap iClient3D for WebGL 官方文档
http://support.supermap.com.cn:8090/webgl/web/index.html

一、Viewer视图

Viewer是Cesium中用于显示3D场景的组件。它提供了创建和控制3D场景所需的所有基本功能,包括加载3D模型、添加图像覆盖物、设置相机位置和方向、处理用户输入等。

在创建Viewer时,可以指定要使用的HTML元素(例如canvas),该元素将用于呈现3D场景。一旦创建了Viewer对象,就可以通过调用其方法来添加实体、图像覆盖物和其他元素,并对相机进行操作。

new Cesium.Viewer(container, options):是用来创建一个新的 Cesium 视图器(Viewer)实例的构造函数。
container:必需,表示视图器容器元素的ID字符串或HTML元素。
options:{
	geocoder: false, // 是否创建右上角的查询按钮(右上第一个)
    homeButton: false, // 是否创建 home 按钮(右上第二个)
    sceneModePicker: false, // 是否创建右上角的切换地图的按钮(右上第三个)
    baseLayerPicker: false, // 是否创建右上角 BaseLayerPicker 小部件(右上第四个)
    navigationHelpButton: false, // 是否创建右上角的导航帮助按钮(右上第五个
    // vrButton: true, // 是否创建右下角的 VR 按钮,默认值为 true
    animation: false, // 是否创建左下角的动画小部件
    fullscreenButton: false, // 是否创建右下角全屏按钮
    timeline: false, // 是否创建最下方的时间线
    infoBox: false, // 点击实体是否展示详情
    selectionIndicator: false, // 点击实体是否显示选中样式
    // 左下方的 Cesium logo 使用 css 删除
    terrainProvider: Cesium.createWorldTerrain(), // 加载地球椭球体
}

二、scene场景

三维场景类,所有3D图形对象的容器(HTML canvas)。它是所有三维图形对象和状态的容器,通常不直接创建场景,而是由Widget隐式创建。

 scene = viewer.scene

常用方法:

// 打开指定图层资源
scene.open(url, sceneName, options)
scene.open(
  url, 必须,服务url 例如 http://{s}/iserver/services/3D-QX20230317-2/rest/realspace
  sceneName, //工作空间中有多个场景,需要指定场景名称;设置为undefined,默认打开第一个
  options: {
   // 用于子域, 例如 ['192.168.2.1:8090', '192.168.2.1:8091']
    subdomains: ['t1','t2'],
    // 是否自动定位到场景, 默认为true
    autoSetView: false
  }
)

三、camera相机

相机类,它由位置、方向和视锥体定义。 视锥体(viewing frustum)由6个(上、下、左、右、近、远)平面限定,每个平面可 由Cartesian4对象表示,其中x,y和z分量定义垂直于平面的单位向量,w分量是平面距原点/相机位置的距离。

camera = viewer.scene.camera;

常用方法:

// 设置相机位置、方向和变换。
1、camera.setView(options) 
camera.setView({
    // 相机在WGS84世界坐标系中的最终位置,或是自顶向下视图中可见的矩形区域。
    destination : new Cesium.Cartesian3(-1590650.7796661195, 5331299.69368041, 3109890.2682378646),
    orientation : {
      // 方位角
      heading : 1.4092244106070817,
      // 俯仰角
      pitch : -0.6060137107123218,
      // 滚动角
      roll : 3.055333763768431e-13
    },
    // 是否将相机最终位置从世界坐标转换为场景坐标,默认值True。
    convert: true
  });
// camera.flyTo(target, options): 使相机飞行到指定的目标位置,并设置相应的动画效果和参数。
2、camera.flyTo({
  // 相机在WGS84世界坐标系中的最终位置,或是自顶向下视图中可见的矩形区域。
  destination: SuperMap3D.Cartesian3.fromDegrees(Number(data.camera.longitude), Number(data.camera.latitude), Number(data.camera.hight)),
  orientation: {
     // 方位角
      heading : 1.4092244106070817,
      // 俯仰角
      pitch : -0.6060137107123218,
      // 滚动角
      roll : 3.055333763768431e-13
  },
  // 动画持续时间
  duration: 5,
  // 飞行结束后的回调
  complete: function () {
   
  }
});
// 监听相机位置
3、 camera.moveEnd.addEventListener 
camera.moveEnd.addEventListener(() => {
   // 世界坐标系
   const result = Cesium.Cartographic.fromCartesian(position)
   // 纬度
   const latitude = Cesium.Math.toDegrees(result.latitude)
   // 经度
   const longitude = Cesium.Math.toDegrees(result.longitude)
 	console.log(camera.position)
 })

用的到一些方法说明

1、在地图上创建点线面
// 点实体
var boxEntity = viewer.entities.add({
    position: position, // 格式为世界坐标的点位置
	point: {
        show: ture, // 点是否可见
        pixelSize: Number, // 点的大小
        color: color, // 点的颜色
        outlineClor: color, // 边框颜色
        outlineWidth: Number, // 轮廓宽度
    },
});
// 线实体
var boxEntity = viewer.entities.add({
    polyline: {
        show: Boolean, // 线是否可见
        positions: positions, // 格式为世界坐标的线位置数组
        width: Number, // 线的宽度
        material: color, // 线的颜色
        clampToGround: Boolean, // 线是否固定在地面
    },
});
// 面实体
var boxEntity = viewer.entities.add({
    polygon: {
        show: Boolean, // 面是否可见
        hierarchy: positions, // 格式为世界坐标的面位置数组
        height: Number, // 面相对于椭球表面的高度
        fill: Boolean, // 面是否有填充
        material: color, // 面的填充颜色
        outline: Boolean, // 面是否有边框
        outlinColor: color, // 边框的颜色
        outlineWidth: Number, // 边框的宽度,无论设置为多少宽度始终只会显示为 1
        perPositionHeight: Boolean, // 面是否使用每个位置的高度
    },
});
2、移除某个绘制实体
  var redBox = viewer.entities.add(boxEntity);
  viewer.entities.remove(redBox )
3、移除全部绘制实体
  viewer.entities.removeAll()
4、更换地图影像
  viewer.imageryLayers.addImageryProvider(new Cesium.SuperMapImageryProvider({
    url: ‘xxxx’
  }));
5、查询所有矢量面数据
function doSqlQuery () {
  let _this = this
  var sqlParameter= {
    // 具体的数据源+数据源列表
   "datasetNames"  : ["G65结构物数据库:结构物库"],
    getFeatureMode  : "SQL",
    queryParameter  : {
      // 查询条件,smId 大于 0 的数据
      attributeFilter : 'SmID > 0'
    }
  };
  var queryData = JSON.stringify(sqlParameter);
  // 要查询的数据服务地址
  axios.post('http://183.64.62.11:9490/iserver/services/data-QX20230317/rest/data/featureResults.rjson?returnContent=true', queryData).then(res => {
    const data = res.data.features
    console.log(data, '所有矢量面详细数据')
  })
}
// 具体可参考官方文档中的 查询/属性查询/SQL查询
6、根据具体的坐标查询矢量面
// 根据倾斜摄影ID查询建筑物
function queryByPoint (queryPoint) {
  var queryObj = {
    "getFeatureMode": "SPATIAL",
    "spatialQueryMode": "INTERSECT",
    // 要查询的数据源
    "datasetNames": ["G65结构物数据库:结构物库"],
    "geometry": {
      id: 0,
      parts: [1],
      points: [queryPoint],
      type: "POINT"
    }
  };
  var queryObjJSON = JSON.stringify(queryObj); // 转化为JSON字符串作为查询参数
  axios.post('http://183.64.62.11:9490/iserver/services/data-QX20230317/rest/data/featureResults.rjson?returnContent=true', queryObjJSON).then(res => {
    if (res.data.features.length) {
      const data = res.data.features[0]
      console.log(data, ''单条矢量数据)
    }
  })
}
// 具体可参考官方文档中的 查询/属性查询/动态单体化
7、监听鼠标左键单击
var handler = new SuperMap3D.ScreenSpaceEventHandler(scene.canvas);
handler.setInputAction(function (e) {
  // 首先移除之前添加标识实体
  viewer.entities.removeById('identify-area');
  // 获取点击位置笛卡尔坐标
  var position = scene.pickPosition(e.position);
  scenePosition = position;
  // 从笛卡尔坐标获取经纬度
  var cartographic = SuperMap3D.Cartographic.fromCartesian(position);
  var longitude = SuperMap3D.Math.toDegrees(cartographic.longitude);
  var latitude = SuperMap3D.Math.toDegrees(cartographic.latitude);

  var queryPoint = { // 查询点对象
      x: longitude,
      y: latitude
  };
 console.log(queryPoint , '当前点击的具体方位坐标')
}, SuperMap3D.ScreenSpaceEventType.LEFT_CLICK);

开发的时候在网上用到的一下技术文献
1、不使用fpf文件实现漫游功能。可参考

https://blog.csdn.net/wo_buzhidao/article/details/102681925

如果使用fpf文件实现漫游,vue项目 注意fpf文件需放在public目录下

var fpfUrl = './SampleData/fpf/niaocao.fpf';  // 注意这里的./指的是public目录下
routes.fromFile(fpfUrl);

2、关于在地图上绘制点线面、经纬度坐标转换、具体的有哪些事件可参考

https://blog.csdn.net/m0_49788155/article/details/126966718
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
### 回答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知识,同时还需配置好开发环境。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值