Cesium坐标系统

前言

        补一篇Cesium坐标系知识,草草开稿竟把GIS中重中之重的坐标系抛之脑后,实在草率,各位道友招待不周!

        坐标系是一切花里胡哨的基础与开端,倘若坐标系不能明确展示、计算、分析结果将毫无意义,由于Cesium起源于国外团队,其坐标系与国内尚有差别,需要拿出来系统的剖解一下。以下内容均个人浅见,我将以我的方式和大伙聊聊,如有谬误,还望道友们指正!

一、坐标系基础知识

1.三维地理坐标系

        简单来说,数据采集时使用的最原始频次最高的坐标系,宏观描述目标点在地球位置的坐标系。可以这么理解,测绘人员用全站仪、水准仪测量地球表面的原始数据就是用这个来描述的,经度、纬度、高程。描述单位为度(degree),米(m),例如A(114°,29°,100000m)(实际采集数据记录时单位不写)。

2.三维投影坐标系

        先给结论:

投影坐标系 = 地理坐标系 + 投影方式

        这个三维里面用的不多,但还是介绍一下。投影属于地理坐标系的一个属性,这么说吧,一个规范的图层它一定有地理坐标系,但它不一定有投影,但一个投影坐标系必然对应着一个地理坐标系。例如A图层的坐标系是WGS84地理坐标系(4326),将 WGS84 经纬度坐标系通过莫卡托投影方式进行投影后会得到 Web Mercator投影坐标系(3857)。

         这个投影你可以理解成在球体内部中心放个光源,在球体外部放个外切圆柱,光影映射到圆柱侧面后将圆柱测面展开得到,其实莫卡托是一种数学映射模型,通过映射公式使得球面上每点的经纬在平面上都能找到一一对应的点。

         以这个思路去推演,每一个地理坐标系有0个或多个投影坐标系,关键取决于你需不需要投影坐标系以及你用什么投影方式(当然与地理位置经度带也有关,这里不展开说),中国使用的是高斯克里格投影,这种投影对于我们大中国、俄罗斯这种狭长大陆国家比较适用。

3.三维笛卡尔坐标系(也称世界坐标系)

        Cesium、Three.js 等其它三维库都与计算机图形学紧密相关,Cesium中所有运算都在该坐标系下,也被称为三维笛卡尔坐标系Cartesian3。拿大白话来说,我去计算三维平移、翻转、矩阵,你总不能让我拿着经纬度算吧?经纬度单位在数学界很不受待见,不然弧度概念就不会被发明辽。

        

4.二维笛卡尔坐标系(也称屏幕坐标系)

        无论多绚酷的效果,咱用户也是通过屏幕去看,通过屏幕去交互,用户交互输入方式全部与屏幕坐标系锁死,你秀任你秀,我只有二尺小屏幕。

        屏幕坐标系 以右上角为原点,单位为像素。

        这里有个误区啊,很多人以为原点是屏幕的左上角,其实不是的,在Cesium里面,原点为实例化Cesim的dom元素的左上角,网上很多说的都是错的。

二、Cesium中坐标系

         进入正题,现在将上述的坐标系依次在Cesium具象化。

1.经纬度地理坐标系

        Cesium对你抛出了一个错误,表示查无此类。Cesium中没有定义经纬度地理坐标系的对象,需要通过其它去转换,转换下面会展开讲。

2.弧度地理坐标系(Cartographic)

        引入弧度是为了进行数值统一,更方便进行数学计算。

const cartographic = new Cesium.Cartographic(lon,lat,height)(lon,lat单位度,height单位米)

 3.三维笛卡尔坐标系(Cartesian3

const cartesian3 = new Cesium.Cartesian3(x, y, z)(x,y单位弧度,z单位米)

4.二维笛卡尔坐标系(Cartesian2) 

const cartesian2 = new Cesium.Cartesian2(x,y)(x,y单位像素)

三、Cesium坐标转换 

1. 经纬度地理坐标转弧度地理坐标

        引入弧度是为了进行数值统一,更方便进行计算,只需记得180°=π (单位rad)即可,那么会有下面的结论:

度到弧度:L = (θ * π) / 180   单位(rad)
弧度到度:θ = (L * 180) / π   单位(°)

        为了方面起见Cesium将换算过程封装成了方法:

弧度到经度:const degrees = Cesium.Math.toRadians(degrees)
经度转弧度:const radians = Cesium.Math.toDegrees(radians)

2.经纬度地理坐标与Cartesian3坐标互转

2.1 经纬度地理坐标转Cartesian3坐标

        这个场景是采集到的真实世界数据放到Cesium球体中使用,使用频次很高,还有其它的说法,例如地理坐标系转世界坐标系,经纬度转C3等等都是指这个。

const cartesian3 = new Cesium.Cartesian3.fromDegrees(lon, lat, height);
const cartesian3 = new Cesium.Cartesian3.fromDegrees(114, 29, 1000);

2.2 Cartesian3坐标转经纬度地理坐标

        Cesium中的点转回经纬度,由于Cesium中没有经纬度地理坐标系的类,所以不能像上面一步完成,需要借助弧度(Cartographic)进行中转。

第一步:世界坐标转地理弧度坐标
const cartographic = new Cesium.Cartographic.fromCartesian
第二步:将地理弧度坐标转地理经纬度坐标系
const lon = Cesium.Math.toDegrees(cartographic.longidute)
const lat = Cesium.Math.toDegrees(cartographic.latgitude)
const height = cartographic.height

3.Cartesian2与Cartesian3互转

3.1 Cartesian2转Cartesian3

        该转换使用频次很高,是个重点,场景是用书鼠标拾取一个操作点后,该点产生的坐标是屏幕坐标(像素点Cartesian2坐标),要进行计算分析的话一定得先转成Cartesian3。

const cartesian3 = viewer.scene.globe.pick(viewer.camera.getPickRay(cartesian2),viewer.scene);

        检验代码:

    //监听鼠标左键点击事件,捕捉event上的位置信息const handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas);handler.setInputAction(event => {//type为Cartesian2const windowPosition = event.position;console.log("windowPosition", windowPosition);const cartesian3_pick = viewer.scene.globe.pick(viewer.camera.getPickRay(windowPosition),viewer.scene);console.log("cartesian3_pick", cartesian3_pick);}, Cesium.ScreenSpaceEventType.LEFT_CLICK);

3.2 Cartesian3转Cartesian2

const C2 =Cesium.SceneTransforms.wgs84ToWindowCoordinates(scene, C3)

       

        再将3.1中获取的C3转回C2即可检验该方法。

    const handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas);handler.setInputAction(event => {//type为Cartesian2const windowPosition = event.position;console.log("windowPosition", windowPosition);const cartesian3_pick = viewer.scene.globe.pick(viewer.camera.getPickRay(windowPosition),viewer.scene);console.log("cartesian3_pick", cartesian3_pick);// 再把C3转回C2let cartesian2 = Cesium.SceneTransforms.wgs84ToWindowCoordinates(viewer.scene,cartesian3_pick);console.log("cartesian2", cartesian2);}, Cesium.ScreenSpaceEventType.LEFT_CLICK);

四、Cesium初始化坐标系

        针对不同项目,在初始化球体时就要设置好基准的坐标系,配置项在Viewer对象上:

       (tip:无论是二维还是三维里面初始化都会有projection、mapProjection类的配置项用于设置坐标系,其实这些名称以及文档解释是不合理的,最贴切的应该改成coordinate或者其它的,再不济也不能把它解释称地图投影,你解释称坐标投影都可以。解释成地图投影意味着这个配置项只能设置投影坐标系,就没有意义了)

    //初始化Viewer设置坐标系new Cesium.Viewer("cesiumContainer", {mapProjection:new Cesium.GeographicProjection(Cesium.Ellipsoid.WGS84)});//Cesium.Ellipsoid.WGS84是Cesium默认的坐标系,不传时就相当于上述这样设置

        那在我国,要使用4490坐标系咋办?关于Cesium初始化设置球体坐标系为4490后面单独开一个文章来说,比较麻烦,涉及到改源码。

五、SuperMap iClient for Cesium设置适合我国坐标系

1.设置坐标系

        iClient for Cesium毕竟是国产化封装,必然对我国坐标系进行了适配,对一些坐标进行了底层注入,在iClient for Cesium下设置CGCS2000、西安80都很便捷。

         设置代码:

     //设置4490坐标系new Cesium.Viewer("cesiumContainer", {mapProjection:new Cesium.GeographicProjection(Cesium.Ellipsoid.CGCS2000)});//设置西安80坐标系new Cesium.Viewer("cesiumContainer", {mapProjection:new Cesium.GeographicProjection(Cesium.Ellipsoid.XIAN80)});

2.检验是否设置成功

        检验标准在globe上的ellipsoid属性,设置成功后,该属性会和下图标红的椭球体参数对应上。

    // 获取当前坐标系var ellipsoid = viewer.scene.globe.ellipsoid;console.log("ellipsoid", ellipsoid);

         大家可以尝试一下,这里有一个比较有趣的点,就是默认的球体时圆球体而不是椭球体,不设置坐标系直接打印ellipsoid将会得到x=y=z=6378137。自己动手进行椭球化后才能和WGS84的椭球参数对上。

      // 将WGS84椭球化,默认是x=y=z=6378137mCesium.Ellipsoid.WGS84 = Object.freeze(new Cesium.Ellipsoid(6378137.0, 6378137.0, 6356752.3142451793));

        设置完4490之后的椭球参数对比:

        收工,下次见!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/638009.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

STM32之RTC实时时钟

一、实时时钟概述 1、实时时钟介绍 英文缩写:RTC。显示年、月、日、时、分、秒、星期,自动计算闰年,能够区分每个月的天数。 RTC特点:能从RTC获取到具体的日期时间,断掉后再开机时间仍然准确(需要纽扣电池&#xff…

构建STM32MP133的Buildroot环境

意法半导体ST在坚持用 Yocto构建他们的OpenSTLinux MP1系列MCU,编译费劲,而且我们的应用不需要Yocto的环境,所以基于Buildroot的最小Linux系统更适合我们。 STM32MP133微处理器基于单Arm Cortex-A7内核,运行频率可达1 GHz&#x…

如何通过idea使用JDK8.0创建Spring项目

目前 IDEA 进行了优化,所以我们在创建 Spring 项目时会发现,以及不能选择通过 JDK8.0 创建了,这是因为官方已经不再提供 JDK8.0 创建 Spring 项目,我们可以通过修改创建 Spring 项目的路径来解决该问题 在创建 Spring 项目的页面&…

如何快速搭建springboot+前后端分离(vue),多商户客户端实现微信小程序+ios+app使用uniapp(一处编写,处处编译)

kxmalls外卖生鲜多商户,针对中小商户、企业和个人学习者开发。使用Java编码,采用SpringBoot、Mybatis-Plus等易用框架,适合个人学习研究。同时支持单机部署、集群部署,用户与店铺范围动态定位,中小商户企业可根据业务动…

SpringCloud Aliba-Sentinel【上篇】-从入门到学废【4】

🎵诗词分享🎵 大江东去,浪淘尽,千古风流人物。 ——苏轼《念奴娇赤壁怀古》 目录 🍿1.Sentinel是什么 🧂2.特点 🧈3.下载 🌭4.sentinel启动 🥓5.实例演示 1.Senti…

【MySQL进阶】存储引擎

文章目录 存储引擎基本介绍引擎对比引擎选择引擎操作 存储引擎 基本介绍 对比其他数据库,MySQL 的架构可以在不同场景应用并发挥良好作用,主要体现在存储引擎,插件式的存储引擎架构将查询处理和其他的系统任务以及数据的存储提取分离&#x…

遍历二叉树

王有志,一个分享硬核Java技术的互金摸鱼侠加入Java人的提桶跑路群:共同富裕的Java人 今天我们继续学习数据结构与算法的内容,主要是如何遍历一棵二叉树,那么我们直接开始吧。 创建二叉树 在数据结构:认识一棵树的最后…

合肥先进光源束测步进电机控制方案介绍

合肥先进光源束测步进电机及驱动器的选择 关于电机控制那些事 我工作中的tips总结--电机控制篇 上面提到现在业界常用的ethercat驱动器和电机,和以前的脉冲方式相比,接线就规整多了,驱动电流几安培的电机一根网线就可以了,并且这…

2024年,给程序员的六点建议

作为程序员,持续进步和发展是至关重要的。除了技术能力的提升,还有一些关键的行为和思维方式可以帮助工程师在职业生涯中取得更大的成功。本文将提供六个重要的建议,这些建议将帮助程序员在职业生涯中迈出成功的步伐。 走出舒适区 走出舒适区…

详解Redisson

第1章:Redisson简介 大家好,我是小黑,咱们今天来聊聊Redisson,Redisson不只是简单地对Redis进行了封装,它还提供了一系列高级的分布式Java数据结构,像是分布式锁、原子长整型这种。 首先,Redi…

AutoDL——终端训练神经网络模型(忽略本地问题)

前言: 本人之前分享过一篇文章:使用pycharm连接远程GPU训练神经网络模型(超详细!),其中详细介绍了如何利用pycharm连接AutoDL算力云平台租用的GPU服务器训练网络模型。但有些小伙伴可能会因为一些原因而导…

Linux-nginx(安装配置nginx、配置反向代理、Nginx配置负载均衡、动静分离)

关于代理 正向代理: 客户明确知道自己访问的网站是什么 隐藏客户端的信息 目录 关于代理 一、Nginx的安装与配置 1、安装依赖 2、安装nginx (1)上传压缩包到目录 /usr/nginx里面 (2)解压文件 (3&#xff09…

c++IO类库

c对IO流的操作必须使用特定的类对象进行操作。 上图就是c中相关IO操作的类封装, ios_base: 是最基本的类,存放IO流的基本信息 ios: ios类是ios_base的子类。是相应的IO流的基类 Istream,ostream: 这两个类都是ios的子类,分别是输…

基于YOLOv8的学生课堂行为检测,引入BRA注意力和Shape IoU改进提升检测能力

💡💡💡本文摘要:介绍了学生课堂行为检测,并使用YOLOv8进行训练模型,以及引入BRA注意力和最新的Shape IoU提升检测能力 1.SCB介绍 摘要:利用深度学习方法自动检测学生的课堂行为是分析学生课堂表…

protobuf-Java使用.md

protobuf 环境配置 1、安装编译器 下载地址 直接解压缩。 2、配置环境变量 环境变量Path 中增加安装目录的路径 3、检查是否配置成功 protoc Usage: protoc [OPTION] PROTO_FILES Parse PROTO_FILES and generate output based on the options given:-IPATH, --proto_pa…

cmake-动态库和静态库及使用OpenCV第三方库

文章目录 静态库准备的文件CMakeLists文件使用静态库 动态库准备的文件CMakeLists文件使用动态库 使用OpenCV库 项目中会有单个源文件构建的多个可执行文件的可能。项目中有多个源文件,通常分布在不同子目录中。这种实践有助于项目的源代码结构,而且支持…

《WebKit 技术内幕》之五(2): HTML解释器和DOM 模型

2.HTML 解释器 2.1 解释过程 HTML 解释器的工作就是将网络或者本地磁盘获取的 HTML 网页和资源从字节流解释成 DOM 树结构。 这一过程中,WebKit 内部对网页内容在各个阶段的结构表示。 WebKit 中这一过程如下:首先是字节流,经过解码之…

某马头条——day07

APP端搜索 搭建ES环境 docker pull elasticsearch:7.4.0 docker run -id --name elasticsearch -d --restartalways -p 9200:9200 -p 9300:9300 -v /usr/share/elasticsearch/plugins:/usr/share/elasticsearch/plugins -e "discovery.typesingle-node" elasticsear…

如何通过frp、geoserver发布家里电脑的空间数据教程

如何通过家里电脑的geoserver发布空间数据的教程 简介 大家好,我是锐多宝,最近我在开发一个新网站的时候遇到一个需求,这里记录一下以帮助需要用到的网友。 我的需求是:用户通过网站前端上传空间数据后,即可在前端展…

视频监控需求记录

记录一下最近要做的需求,我个人任务还是稍微比较复杂的 需求:需要实现一个视频实时监控、视频回放、视频设备管理,以上都是与组织架构有关 大概的界面长这个样子 听着需求好像很简单,但是~我们需要在一个界面上显示两个厂商的视…