WebGIS面试题
注意webgis面试不一定只问一些GIS相关的,还会提问众多技术相关问题;本人的答案也不一定正确,仅供参考!!!
Cesium的核心组件包括Viewer、Scene、Model、Geometry、Material和Camera等。其中,Viewer是Cesium的主要接口,用于加载和显示3D地球和地图;Scene是场景管理器,负责管理所有的实体,如地形、建筑物、标记等;Camera则定义了视角和视距。
具体:
1. **Viewer(查看器)**:Cesium的主要入口点之一。提供了一个用于渲染三维地球的Canvas或WebGL容器,并管理了场景、相机、光照等方面的状态。
2. **Scene(场景)**:表示三维场景的对象,包括地球、模型、图像等。负责管理渲染的对象、光照、相机等方面。
3. **Primitive(原始对象)**:Cesium中的基本渲染单元,可用于表示地形、实体、模型等。它们可以是点、线、多边形等形式,用于构建复杂的地球表面和场景。
4. **Imagery(影像)**:用于加载和显示地球表面图像的组件。支持各种地图服务提供商(如谷歌地图、Bing Maps等)以及自定义图像。
5. **Terrain(地形)**:用于加载和显示地球表面高程数据的组件。允许将真实世界的地形数据集成到Cesium应用程序中,以实现更真实的地球模拟。
6. **Entity(实体)**:表示三维场景中的可渲染对象,如飞机、汽车、点标记等。可以具有位置、方向、大小、外观等属性,并可以在场景中动态更新。
7. **Camera(相机)**:控制场景视角的组件。允许用户控制相机位置、方向、缩放等参数,以浏览和导航场景。
8. **Geometry(几何体)**:用于创建和处理几何形状的组件,如球体、盒子、圆柱体等。可以用于创建自定义的地球表面对象或模型。
9. **Interpolation(插值)**:提供了在场景中执行插值和动画的功能。可以用于平滑地过渡相机位置、实体属性等。
这些是Cesium中一些核心的组件,用于构建各种类型的三维地球和地球上的应用程序。
3D Tiles是Cesium中用于高效地加载和显示大规模的3D地球数据的技术。它可以将复杂的3D数据分层并进行高度优化,支持大规模的3D地球数据,包括城市、建筑、地形等,从而提高数据的加载速度和显示效率。
具体:
1. **数据组织**:3D Tiles技术允许地理数据按照层次结构进行组织,将地球表面划分为一系列的瓦片(tiles)。这些瓦片可以根据需要进行分辨率和细节层次的变化,使得数据可以在不同的缩放级别下进行加载和显示。
2. **数据压缩**:3D Tiles使用各种压缩技术对地理数据进行压缩,以减少数据的存储和传输开销。这包括空间压缩、纹理压缩等技术,可以大大减少数据文件的大小,提高数据传输效率。
3. **动态加载**:3D Tiles允许根据视图的位置和缩放级别动态加载和卸载数据瓦片,使得在浏览大范围地理区域时可以实现流畅的体验。这种动态加载的机制可以最大程度地减少内存和网络资源的占用。
4. **多样化数据支持**:3D Tiles技术不仅可以用于地形数据,还可以用于表示建筑物、植被、城市模型等多种类型的地理数据。这使得Cesium可以呈现出丰富多样的地球表面细节,从而提供更具交互性和真实感的地理应用体验。
5. **开放标准**:3D Tiles是一个开放的规范,其设计思想是为了支持各种类型的地理数据和应用场景。这意味着开发者可以自由地使用和扩展3D Tiles规范,以满足不同应用的需求。
CZML(Cesium Language)是一种描述和显示动态的地球场景的数据格式。它可以用于描述航班轨迹、气象数据、卫星运行轨迹等。CZML中可以包含实体的位置、速度、方向等信息,以及可视化效果的设置。
具体:
CZML可以描述的场景包括但不限于:
1. **地球上的实体和标记**:如建筑物、飞机、汽车、船舶等。这些实体可以具有位置、方向、大小、形状、颜色等属性,并且可以在时间上动态变化。
2. **传感器和效果**:如雷达、热成像仪等传感器的位置和扫描范围,以及火焰、烟雾等效果的位置和状态。
3. **时间动画**:CZML可以描述场景中各个元素随时间变化的行为。例如,可以定义飞机的航迹、车辆的移动路径、建筑物的建造过程等。
4. **地球上的图形和形状**:如多边形、圆形、线条等。这些图形可以用于绘制地图上的区域、路径、边界等。
5. **图像和文本标签**:CZML还支持在地球表面上添加图像、文本标签等元素,用于展示地理信息或其他内容。
Cesium使用ECEF(Earth-Centered, Earth-Fixed)坐标系来处理地理位置信息。ECEF坐标系是一种以地球中心为原点,以赤道面为基准面的三维坐标系。开发者可以使用Cesium的Cartographic类来转换地理位置信息到ECEF坐标系,或者使用Cesium的Ellipsoid类来计算地理位置信息的距离和面积。
具体:
Cesium 使用 ECEF(Earth-Centered, Earth-Fixed)坐标系作为其核心坐标系统来处理地理空间数据。ECEF 坐标系以地球的中心为原点,其 X 轴指向本初子午线与赤道的交点,Y 轴指向赤道与东经 90 度的交点,Z 轴指向北极。这种坐标系对于描述地球表面和空间中点的位置非常有用。
在 Cesium 中,经常需要处理不同坐标系之间的转换。`Cartographic` 类是 Cesium 中用于表示地理坐标(经度、纬度和高度)的类,而 `Cartesian3` 类则用于表示 ECEF 坐标系中的三维坐标。Cesium 提供了一系列方法,允许在 `Cartographic` 和 `Cartesian3` 之间进行转换。
1、可以使用 `Cartographic.toCartesian` 方法将地理坐标转换为 ECEF 坐标:
```javascript
var cartographic = Cesium.Cartographic.fromDegrees(longitude, latitude, height);
var cartesian3 = Cesium.Cartographic.toCartesian(cartographic);
```
2、也可以使用 `Cartesian3.toCartographic` 方法将 ECEF 坐标转换回地理坐标:
```javascript
var cartesian3 = ...; // 已有的 ECEF 坐标
var cartographic = Cesium.Cartesian3.toCartographic(cartesian3, ellipsoid);
```
这里的 `ellipsoid` 是 `Ellipsoid` 类的实例,代表了地球的椭球模型。Cesium 默认使用 WGS84 椭球模型,但也可以根据需要创建其他椭球模型。
`Ellipsoid` 类还提供了许多有用的方法来计算基于椭球模型的地理属性,比如两点之间的距离、区域的面积等。如使用 `Ellipsoid.cartesianDistanceTo` 方法可以计算两个 ECEF 坐标之间的距离:
```javascript
var cartesian1 = ...; // 第一个 ECEF 坐标
var cartesian2 = ...; // 第二个 ECEF 坐标
var distance = Cesium.Ellipsoid.WGS84.cartesianDistanceTo(cartesian1, cartesian2);
```
Cesium支持多种地图源,包括OpenStreetMap、Bing Maps、Google Maps等。它提供了一个统一的接口来加载和显示这些地图源。
具体:
1. **Cesium Ion**:Cesium Ion是Cesium提供的基于云的服务,提供了高分辨率的地球表面图像和地形数据。开发者可以通过Cesium Ion订阅地图服务,以便在Cesium应用程序中显示实时更新的地图数据。
2. **Bing Maps**:Cesium可以直接集成Bing Maps提供的地图服务,包括卫星影像、地图和街景等图层。
3. **Google Maps**:虽然Cesium不能直接集成Google Maps,但是开发者可以使用Cesium的ImageryProvider接口来创建自定义的图像图层,并通过Google Maps API获取地图图像,并将其显示在Cesium应用程序中。
4. **OpenStreetMap**:Cesium可以直接集成OpenStreetMap提供的地图服务,包括地图、卫星影像和地形等图层。
5. **Mapbox**:Cesium可以直接集成Mapbox提供的地图服务,包括地图、卫星影像和地形等图层。开发者可以使用Mapbox的样式和图层来自定义地图的外观。
6. **USGS高程数据**:Cesium可以直接集成USGS提供的地形数据,以显示真实的地球表面高程。
7. **自定义地图服务**:除了以上提到的地图服务之外,开发者还可以使用Cesium的ImageryProvider和TerrainProvider接口来集成自定义的地图服务,包括WMS、TMS等标准地图服务。
Cesium使用WebGL进行渲染,WebGL是一种基于GPU的渲染技术,可以有效地处理大数据量的场景。此外,Cesium还使用了Occlusion Culling(遮挡剔除)和Billboard Rendering(广告牌渲染)等优化技术,进一步减少了渲染负载。
具体:
1. 使用Level of Detail (LOD) 技术
LOD技术是处理大规模地形和模型数据的有效方法。通过为模型定义不同的细节级别,Cesium可以根据相机与模型的距离动态地切换模型的细节。这样,当模型远离相机时,使用较低精度的模型,从而减少渲染的复杂性和提高性能。
2. 利用Octree结构
对于大规模的模型,可以使用Octree(八叉树)结构来组织和管理模型的节点。八叉树可以将空间分割成多个区域,并在每个区域内存储模型数据。这样,当相机移动时,只需要渲染相机视野内的模型部分,从而提高渲染效率。
3. 遮挡剔除 (Occlusion Culling)
遮挡剔除是一种优化技术,可以识别并剔除那些在当前视角下被其他对象完全遮挡的模型部分。这样可以减少不必要的渲染计算,提高性能。
4. 地形和建筑物的分块加载
将地形和建筑物数据分成小块,只加载相机视野内的块。这种方法可以减少一次性加载的数据量,并且可以根据需要异步加载其他块。
5. 使用批处理 (Batch Table) 技术
批处理技术可以将多个模型合并为一个绘制调用,减少GPU的调用次数,提高渲染效率。Cesium的批处理功能可以自动合并相邻的相同材质的模型。
6. 利用Cesium的动态几何加载
对于非常大的模型,如建筑物或者地形,可以使用Cesium的动态几何加载功能。这种功能允许模型在不同的距离级别下使用不同精度的几何体,从而在保持视觉效果的同时减少渲染负担。
7. 优化材质和纹理
减少材质和纹理的复杂性和数量,使用压缩纹理和MIPmapping技术,可以减少GPU的负担。同时,合理地使用材质和纹理的LOD,可以进一步提高性能。
8. 使用Web Workers
Web Workers可以在后台线程中执行任务,从而不会阻塞主线程。通过将一些计算密集型的任务,如模型的解析和处理,放在Web Workers中执行,可以提高应用程序的响应性。
9. 利用Cesium的TileLoadProgress事件
通过监听TileLoadProgress事件,可以监控模型的加载进度,并根据需要动态调整加载策略,如暂停或取消某些不必要的加载任务。
10. 预先加载和缓存
对于经常需要显示的模型,可以预先加载并缓存到本地,减少每次加载的时间。同时,合理地管理缓存策略,确保缓存的数据是最新的,避免过时数据的加载。
11. 模型简化:我本人的研究也就是进行模型简化,这也是当前研究的热点,主要基于简化算法进行模型简化,降低模型的冗余。简单来说就是减少不重要的细节。
以上一些仅供参考。
Vue的优势包括轻量级、简单易学、双向数据绑定、组件化开发、视图与数据结构的分离、虚拟DOM等。这些优势使得Vue在构建用户界面时更加高效和灵活。
具体:
Vue框架的优点主要包括:
- **轻量级**:Vue只关注视图层,大小只有几十KB,使得加载和执行速度非常快。
- **简单易学**:由国人开发,提供中文文档,语言障碍小,易于理解和学习。
- **双向数据绑定**:保留Angular的特点,简化了数据操作,提高了开发效率。
- **组件化**:借鉴React的优点,实现了HTML的封装和重用,适合构建大型单页应用。
- **视图、数据、结构分离**:使得数据变更更加简单,无需修改逻辑代码,只需操作数据。
- **虚拟DOM**:避免了频繁的DOM操作,提升了性能。
- **运行速度快**:与React相比,Vue在虚拟DOM操作上有性能优势。
可以使用`$emit` 来触发一个事件,并在父组件中监听这个事件,以此来实现子组件调用父组件的方法。(父组件向子组件传递数据可以通过props进行,子组件向父组件传递事件或数据则可以通过$emit方法。)
具体:
在Vue中,子组件可以通过 `$emit` 方法触发一个自定义事件,然后父组件可以通过监听这个自定义事件来调用相应的方法。具体步骤如下:
1. **子组件触发事件**:在子组件中使用 `$emit` 方法触发一个自定义事件,并传递需要传递的参数。
```javascript
// 子组件中
this.$emit('customEvent', payload);
```
2. **父组件监听事件**:在父组件中使用 `v-on` 或 `@` 来监听子组件发出的自定义事件,并绑定一个方法。
```html
<!-- 父组件模板中 -->
<child-component @customEvent="handleEvent"></child-component>
```
3. **父组件处理事件**:定义一个方法来处理子组件发出的自定义事件,在该方法内部调用父组件的方法或进行其他操作。
```javascript
// 父组件中
methods: {
handleEvent(payload) {
// 在这里调用父组件的方法或进行其他操作
}
}
```
这样子组件就可以通过触发自定义事件来调用父组件的方法或实现其他与父组件的通信。
计算属性(computed)和侦听器(watch)都是用于监听数据变化并执行相应操作的功能,但它们的使用场景和实现方式略有不同。
具体:
1. **计算属性(computed)**:
计算属性是Vue.js中一种用于动态计算衍生数据的属性。依赖于其他属性的值,并且只有在依赖的属性发生变化时才会重新求值。计算属性的值会被缓存起来,只有当其依赖的属性发生改变时才会重新计算。
使用场景:
- 当需要根据其他数据动态计算衍生数据时,通常使用计算属性。
- 当某个数据依赖于其他数据的变化,并且需要动态更新时,可以使用计算属性。
computed: {
fullName() {
return this.firstName + ' ' + this.lastName;
}
}
2. **侦听器(watch)**:
侦听器是一种观察和响应数据变化的功能。当数据发生变化时,侦听器可以执行异步操作、复杂计算或其他逻辑。与计算属性不同,侦听器可以监听任何数据的变化,而不仅限于计算属性所依赖的属性。
使用场景:
- 当需要在数据变化时执行异步操作、复杂计算或其他逻辑时,通常使用侦听器。
- 当需要监听某个特定数据的变化,并且需要执行特定的操作时,可以使用侦听器。
watch: {
firstName(newVal, oldVal) {
// 当 firstName 发生变化时执行操作
},
lastName(newVal, oldVal) {
// 当 lastName 发生变化时执行操作
}
}
总结:
- 计算属性适用于根据其他数据计算衍生数据,并且需要缓存结果的情况。
- 侦听器适用于监听特定数据的变化,并且需要执行特定操作的情况。
10
1. BIM数据的准备
首先,需要确保BIM数据是最新的,并且包含了所有必要的信息,如几何结构、属性、材料等。BIM数据通常使用Revit等软件创建和编辑。
2. BIM数据格式转换
BIM数据需要从其原始格式(如Revit的.RVT格式)转换为Cesium支持的格式。常见的转换方法包括:
使用插件或工具:例如,使用BimAngle Engine for Revit这样的插件可以直接将Revit模型转换为3D Tiles或GLTF格式。
导出FBX文件:从Revit中直接导出FBX文件,然后使用如Cesiumlab这样的转换工具将FBX文件转换为3D Tiles格式。(**需要注意的是,我多次尝试过,这种方法会丢失贴图和其他一些属性信息**)。
通过Navisworks转换:安装Autodesk的Navisworks Exporters插件来导出NWC文件,然后使用Navisworks Manage导入NWC文件并导出FBX。**这种方法可以保留更多的属性信息,但流程较为复杂**。
3. 解决坐标系和方向问题
在转换过程中,可能会遇到坐标系不一致或模型方向错误的问题。如从Revit导出的FBX文件可能存在YZ轴反转的问题。可以通过调整导出设置或在Cesiumlab中使用通用模型工具进行自动转换来解决这些问题。
4. 3D Tiles数据的生成
完成BIM数据的格式转换和问题解决后,将转换后的数据生成3D Tiles格式(Cesiumlab)。
5. 在Cesium中加载3D Tiles数据
博客:
https://blog.csdn.net/weixin_44857463/article/details/129157708
B站:
https://space.bilibili.com/610654927?spm_id_from=..0.0