cesium中各个坐标
创始人
2024-04-27 06:32:23
0次

目录

viewer.scene.pick(e.position) 

viewer.scene.pickPosition(e.position)  场景坐标

viewer.scene.globe.pick(viewer.camera.getPickRay(e.position), viewer.scene))  地表坐标

​viewer.camera.pickEllipsoid(e.position)  世界坐标


鼠标点击点位置,有以下情形:

  • 获取点击处屏幕坐标 
  • 获取鼠标点的对应椭球面位置
  • 获取加载地形后对应的经纬度和高程
  • 获取倾斜摄影或模型点击处的坐标

其中,e.position中的x,y为屏幕坐标,屏幕左上角为原点

 

viewer.scene.pick(e.position) 

viewer.scene.pick (windowPosition,width , height ) →0bject 

拾取cesium场景中的空间对象,且返回最前面的一个空间对象,可以拾取entity实体,primitive图元,数据源datasource,3dtiles瓦片数据。

只有点击entity等实体才不为undefined,否则就算点击地球也会是undefined

    let handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas);handler.setInputAction((e) => {console.log("e:", e);let pickedObject = viewer.scene.pick(e.position)// 通过屏幕坐标获取当前位置的实体信息console.log("viewer.scene.pick(e.position):", viewer.scene.pick(e.position));//只有点击entity才不为undefined,否则就算点击地球也会是undefinedif (!Cesium.defined(pickedObject)) {console.log("没有拾取到空间对象")return;}}, Cesium.ScreenSpaceEventType.LEFT_CLICK);

viewer.scene.pickPosition(e.position)  场景坐标

  •     获取场景里的点的经纬度(模型上的点)。相机看过去第一个被挡住的模型(如entity)上的坐标
  •     可以采集entity,primitive,3dtile的坐标
  •     当拾取区域无entity,primitive,3dtile时,将返回一个无法预料的坐标(标准椭球面以下,无法使用,无法预料)
  • 只有在开启深度测试且不使用默认地形的情况下才是准确的,在未开启“地形深度检测”的情况下只能在3DTile上准确获取空间坐标

viewer.scene.pickPosition (windowPosition,result)→Cartesian3 

注意:获取到笛卡尔坐标存在不准确性:

1.在无地形的情况下,不开启深度测试,在地球上拾取是准确的;

2.在有地形的情况下,不开启深度测试,在地球上拾取是不准确的;因为存在深度问题,必须开启深度测试,即 viewer.scene.globe.depthTestAgainstTerrain = true。

总结:

pickPosition在depthTestAgainstTerrain=false时只能在3DTile上获取准确位置

当depthTestAgainstTerrain=true时,在3DTile和底图上均能获取准确位置

    let handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas);handler.setInputAction((e) => {console.log("e:", e);let cartesian = viewer.scene.pickPosition(e.position);console.log("cartesian:", cartesian);let cartographic = Cesium.Cartographic.fromCartesian(cartesian);console.log("cartographic:", cartographic);let lng = Cesium.Math.toDegrees(cartographic.longitude); // 经度let lat = Cesium.Math.toDegrees(cartographic.latitude); // 纬度let alt = cartographic.height; // 高度let coordinate = {longitude: Number(lng.toFixed(6)),latitude: Number(lat.toFixed(6)),altitude: Number(alt.toFixed(2)),};console.log("coordinate:", coordinate);}, Cesium.ScreenSpaceEventType.LEFT_CLICK);

viewer.scene.globe.pick(viewer.camera.getPickRay(e.position), viewer.scene))  地表坐标

  • 此方法无论是否存在地形,无论是否开启地形深度检测,获取与地形的笛卡尔坐标都是准确的,因为此方法只是与地形的求交,不包括模型、倾斜摄影表面 
  •     获取地表面的点的经纬度(地形上的点)
  •     将无视entity、3dtile,不能拾取其表面坐标
  •     获取当前点击视线与地球表面相交的坐标(有无地形时候均可用,无地形时高程几乎为0)

 let ray = viewer.camera.getPickRay(e.position);

viewer.scene.globe.pick (ray,scene,result ) →Cartesian3

    let handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas);handler.setInputAction((e) => {console.log("e:", e);let ray = viewer.camera.getPickRay(e.position);console.log("ray:", ray);let cartesian = viewer.scene.globe.pick(ray, viewer.scene);console.log("cartesian:", cartesian);let cartographic = Cesium.Cartographic.fromCartesian(cartesian);console.log("cartographic:", cartographic);let lng = Cesium.Math.toDegrees(cartographic.longitude); // 经度let lat = Cesium.Math.toDegrees(cartographic.latitude); // 纬度let alt = cartographic.height; // 高度let coordinate = {longitude: Number(lng.toFixed(6)),latitude: Number(lat.toFixed(6)),altitude: Number(alt.toFixed(2)),};console.log("coordinate:", coordinate);}, Cesium.ScreenSpaceEventType.LEFT_CLICK);

viewer.camera.pickEllipsoid(e.position)  世界坐标

  •     获取椭球上的点的经纬度(数学模型上的椭球)
  •     获取当前点击视线与标准椭球面相交处的坐标,无高程(恒为0)

viewer.scene.camera.pickEllipsoid (windowPosition,ellipsoid , result ) →Cartesian3

pickEllipsoid 只用于无地形椭球面的获取坐标,不可用于加载地形场景。在加载地形的场景上获取的坐标不准确

    let handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas);handler.setInputAction((e) => {console.log("e:", e);let cartesian = viewer.camera.pickEllipsoid(e.position);console.log("cartesian:", cartesian);let cartographic = Cesium.Cartographic.fromCartesian(cartesian);console.log("cartographic:", cartographic);let lng = Cesium.Math.toDegrees(cartographic.longitude); // 经度let lat = Cesium.Math.toDegrees(cartographic.latitude); // 纬度let alt = cartographic.height; // 高度,椭球面height永远等于0let coordinate = {longitude: Number(lng.toFixed(6)),latitude: Number(lat.toFixed(6)),altitude: Number(alt.toFixed(2)),};console.log("coordinate:", coordinate);}, Cesium.ScreenSpaceEventType.LEFT_CLICK);

相关内容

热门资讯

前端-session、jwt 目录:   (1)session (2&#x...
linux入门---制作进度条 了解缓冲区 我们首先来看看下面的操作: 我们首先创建了一个文件并在这个文件里面添加了...
关于测试,我发现了哪些新大陆 关于测试 平常也只是听说过一些关于测试的术语,但并没有使用过测试工具。偶然看到编程老师...
前缀和与对数器与二分法 1. 前缀和 假设有一个数组,我们想大量频繁的去访问L到R这个区间的和,...
nodejs:本地安装nvm实... 一、背景-使用不同版本node的原因 vue3+ts、nuxt3版本,node...
JAVA集合知识整理 Java集合知识整理 HashMap相关 HashMap的底层数据结构:jdk1.8之...
无刷直流电机介绍及单片机控制实... 无刷直流电机介绍及单片机控制实例前言基本概念优势与劣势使用寿命基本结构使用单片机控制实例电子调速器&...
fwdiary(2) dp2 1.传纸条  AcWing 275. 传纸条 - AcWing 走两条路,走一条最大的...
常用的DOS命令 常用的DOS命令 DOS(Disk Operating System,磁...
<C++> 类和对象(下) 1.const成员函数将const修饰的“成员函数”称之为const成员函数,cons...