2024 WebGIS面试题(第一期)

1. 详细说一下栅格瓦片和矢量瓦片的区别

概述

栅格瓦片和矢量瓦片都是地图瓦片技术中常用的两种瓦片类型。地图瓦片技术是指将地图预先切分成许多小图片,并按照一定的规则进行存储和组织,以便在需要时快速加载和显示。

主要区别

区别项 栅格瓦片 矢量瓦片
存储格式 栅格图片(如 PNG、JPEG) 矢量数据格式(如 GeoJSON、MVT)
体积大小 较大 较小
生成效率 较低 较高
更新频率 较低 较高
显示效果 依赖缩放级别,可能出现模糊 清晰
缩放能力 依赖预先生成的瓦片,缩放级别有限 可根据需求动态缩放
可交互性 较低 较高
适用场景 底图、静态地图 动态地图、频繁更新的地图、需要交互的地图

详细说明

1. 存储格式

栅格瓦片使用栅格图片格式存储,如 PNG、JPEG 等。矢量瓦片使用矢量数据格式存储,如 GeoJSON、MVT 等。

2. 体积大小

由于矢量数据格式的压缩率更高,因此矢量瓦片的体积通常比栅格瓦片小很多。

3. 生成效率

栅格瓦片的生成过程需要对地图进行渲染和切片,因此生成效率较低。矢量瓦片的生成过程相对简单,因此生成效率较高。

4. 更新频率

栅格瓦片的更新需要重新渲染和切片,因此更新频率较低。矢量瓦片的更新只需要更新矢量数据,因此更新频率较高。

5. 显示效果

栅格瓦片的显示效果依赖缩放级别,在低缩放级别下可能会出现模糊。矢量瓦片的显示效果清晰,不受缩放级别影响。

6. 缩放能力

栅格瓦片的缩放能力依赖预先生成的瓦片,如果需要更高的缩放级别,需要重新生成瓦片。矢量瓦片可以根据需求动态缩放,不受预先生成的瓦片限制。

7. 可交互性

栅格瓦片的可交互性较低,通常只能用于查看地图。矢量瓦片的可交互性较高,可以支持各种地图操作,如查询、标注、测量等。

8. 适用场景

栅格瓦片适用于对显示效果要求不高、更新频率较低的底图和静态地图。矢量瓦片适用于对显示效果和可交互性要求较高的动态地图、频繁更新的地图以及需要交互的地图。

2. Cesium中,飞机漫游初始状态的朝向

在 Cesium 中,飞机漫游的初始状态朝向可以通过以下几种方式设置:

1. 使用方向向量

const heading = Cesium.Heading.fromDegrees(90); // 90 度表示正东
const pitch = Cesium.Pitch.fromDegrees(0); // 0 度表示水平
const roll = Cesium.Roll.fromDegrees(0); // 0 度表示不倾斜

const initialOrientation = Cesium.Transforms.headingPitchRollToQuaternion(heading, pitch, roll);

// 创建飞机实体
const entity = viewer.entities.add({
position: Cesium.Cartesian3.fromDegrees(120, 30, 1000),
orientation: initialOrientation,
model: {
uri: "path/to/model.glb",
},
});

2. 使用相机位置和目标点

const cameraPosition = Cesium.Cartesian3.fromDegrees(120, 30, 1000);
const cameraTarget = Cesium.Cartesian3.fromDegrees(120.1, 30.1, 1000);

const initialOrientation = Cesium.Transforms.lookAt(cameraPosition, cameraTarget, Cesium.Cartesian3.UNIT_Z);

// 创建飞机实体
const entity = viewer.entities.add({
position: cameraPosition,
orientation: initialOrientation,
model: {
uri: "path/to/model.glb",
},
});

3. 使用自定义函数

function getInitialOrientation(position) {
// 根据位置计算朝向
// ...

return Cesium.Quaternion.fromHeadingPitchRoll(heading, pitch, roll);
}

// 创建飞机实体
const entity = viewer.entities.add({
position: Cesium.Cartesian3.fromDegrees(120, 30, 1000),
orientation: getInitialOrientation(position),
model: {
uri: "path/to/model.glb",
},
});

示例

const viewer = new Cesium.Viewer("cesiumContainer");

const heading = Cesium.Heading.fromDegrees(90);
const pitch = Cesium.Pitch.fromDegrees(0);
const roll = Cesium.Roll.fromDegrees(0);

const initialOrientation = Cesium.Transforms.headingPitchRollToQuaternion(heading, pitch, roll);

// 创建飞机实体
const entity = viewer.entities.add({
position: Cesium.Cartesian3.fromDegrees(120, 30, 1000),
orientation: initialOrientation,
model: {
uri: "path/to/model.glb",
},
});

这个示例将创建一个朝向正东的飞机实体。

3. 谈谈GeoServer中coverages、feature

GeoServer 中的 CoveragesFeatures 是两种重要的地理数据类型。

Coverages 代表栅格数据,例如卫星图像、航拍照片、地形图等。它们通常用于表示连续的空间现象,例如地表温度、植被覆盖率、降水量等。

Features 代表矢量数据,例如点、线和面。它们通常用于表示离散的空间对象,例如道路、建筑物、河流等。

Coverages

GeoServer 支持多种栅格数据格式,包括 GeoTIFF、JPEG 2000、PNG、ASCII Grid 等。

Coverage 在 GeoServer 中由以下几个要素组成:

  • CoverageStore:存储栅格数据的存储库。GeoServer 支持多种栅格数据存储,例如文件系统、数据库、Web 服务器等。

  • CoverageInfo:描述栅格数据集的元数据,例如名称、描述、坐标系、范围、分辨率等。

  • Coverage:栅格数据集本身。

Features

GeoServer 支持多种矢量数据格式,包括 Shapefile、GeoJSON、KML/KMZ、GML 等。

Feature 在 GeoServer 中由以下几个要素组成:

  • FeatureStore:存储矢量数据的存储库。GeoServer 支持多种矢量数据存储,例如文件系统、数据库、Web 服务器等。

  • FeatureTypeInfo:描述矢量数据集的元数据,例如名称、描述、坐标系、属性字段等。

  • Feature:矢量数据集中的单个要素。

区别

CoveragesFeatures 的主要区别在于它们表示空间数据的方式:

  • Coverages 使用栅格来表示连续的空间现象。

  • Features 使用矢量来表示离散的空间对象。

其他区别:

  • Coverages 通常用于底图和背景图。

  • Features 通常用于叠加图和专题图。

4. Cesium中坐标系之间是如何互转的

在Cesium中,可以使用内置的方法进行不同坐标系之间的互相转换。下面是一些常用的转换方法:

  1. 地理坐标系(经纬度)和笛卡尔坐标系之间的转换:

– 将地理坐标(经度、纬度、高度)转换为笛卡尔坐标:

var cartesianPosition = Cesium.Cartesian3.fromDegrees(longitude, latitude, height);

– 将笛卡尔坐标转换为地理坐标:

var cartographicPosition = Cesium.Cartographic.fromCartesian(cartesianPosition);
var longitude = Cesium.Math.toDegrees(cartographicPosition.longitude);
var latitude = Cesium.Math.toDegrees(cartographicPosition.latitude);
var height = cartographicPosition.height;

2. 屏幕坐标系和地理坐标系之间的转换:

– 将屏幕坐标(像素坐标)转换为地理坐标:

var mousePosition = new Cesium.Cartesian2(screenX, screenY);
var cartesianPosition = viewer.camera.pickEllipsoid(mousePosition, scene.globe.ellipsoid);
var cartographicPosition = Cesium.Cartographic.fromCartesian(cartesianPosition);
var longitude = Cesium.Math.toDegrees(cartographicPosition.longitude);
var latitude = Cesium.Math.toDegrees(cartographicPosition.latitude);

3. 笛卡尔坐标系和屏幕坐标系之间的转换:

– 将笛卡尔坐标转换为屏幕坐标:

var screenPosition = Cesium.SceneTransforms.wgs84ToWindowCoordinates(scene, cartesianPosition);
var screenX = screenPosition.x;
var screenY = screenPosition.y;

– 将屏幕坐标转换为笛卡尔坐标:

var mousePosition = new Cesium.Cartesian2(screenX, screenY);
var cartesianPosition = viewer.scene.pickPosition(mousePosition);

5.Cesium中默认坐标有哪些

Cesium中默认支持以下坐标系:

1. 地理坐标系 (Geodetic)

  • 经度 (longitude):范围为[-180°,180°],表示地球表面点与本初子午面的夹角。

  • 纬度 (latitude):范围为[-90°,90°],表示地球表面点与赤道平面的夹角。

  • 高程 (height):表示地球表面点到参考椭球体的距离。

Cesium中使用 Cesium.Cartographic 类来表示地理坐标系。

2. 笛卡尔坐标系 (Cartesian)

  • X:表示点到原点的距离在X轴上的投影。

  • Y:表示点到原点的距离在Y轴上的投影。

  • Z:表示点到原点的距离在Z轴上的投影。

Cesium中使用 Cesium.Cartesian3 类来表示笛卡尔坐标系。

3. 东北天坐标系 (East North Up)

  • 东 (East):表示点到原点的距离在X轴上的投影。

  • 北 (North):表示点到原点的距离在Y轴上的投影。

  • 上 (Up):表示点到原点的距离在Z轴上的投影。

Cesium中使用 Cesium.EastNorthUp 类来表示东北天坐标系。

4. 单位

Cesium中默认使用以下单位:

  • 经度和纬度:度 (°)。

  • 高程:米 (m)。

  • 笛卡尔坐标:米 (m)。

5. 坐标系转换

Cesium提供了 Cesium.Transforms 类来进行不同坐标系之间的转换。

6. 注意事项

  • 使用 Cesium 进行开发时,需要明确所使用的坐标系,并根据需要进行坐标系转换。

  • 不同坐标系之间转换可能会导致精度损失,因此需要根据实际应用选择合适的转换方法。

6. Cesium如何将经纬度坐标转成世界坐标

Cesium中,经纬度坐标可以转换成世界坐标,具体方法如下:

1. 使用 Cesium.Cartographic

const cartographic = Cesium.Cartographic.fromDegrees(longitude, latitude, height);
const cartesian = Cesium.Ellipsoid.WGS84.cartographicToCartesian(cartographic);
  • longitude:经度,范围为[-180°,180°]。

  • latitude:纬度,范围为[-90°,90°]。

  • height:高程,单位为米。

  • cartographic:经纬度坐标对象。

  • ellipsoid:椭球体对象,默认使用 WGS84 椭球体。

  • cartesian:世界坐标对象。

2. 使用 Cesium.Cartesian3

const cartesian = Cesium.Cartesian3.fromDegrees(longitude, latitude, height);
  • longitude:经度,范围为[-180°,180°]。

  • latitude:纬度,范围为[-90°,90°]。

  • height:高程,单位为米。

  • cartesian:世界坐标对象。

3. 使用 Cesium.Transforms

const position = Cesium.Transforms.eastNorthUpToFixedFrame(
Cesium.Ellipsoid.WGS84.cartographicToCartesian(cartographic),
Cesium.Transforms.eastNorthUpToFixedFrame(Cesium.Cartesian3.fromDegrees(referenceLongitude, referenceLatitude, 0))
);
  • cartographic:经纬度坐标对象。

  • referenceLongitude:参考经度,范围为[-180°,180°]。

  • referenceLatitude:参考纬度,范围为[-90°,90°]。

  • position:世界坐标对象。

注意事项

  • 经纬度坐标转成世界坐标时,需要指定椭球体。

  • 不同坐标系之间转换可能会导致精度损失,因此需要根据实际应用选择合适的转换方法。


原文始发于微信公众号(前端大大大):2024 WebGIS面试题(第一期)

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/259067.html

(0)
土豆大侠的头像土豆大侠

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!