分享
首页 资讯 技术分享 查看内容

森技能 | 经纬度坐标转为园区相对坐标的方法

发表于 2022-8-5 09:58
zzv_icon895 zzr_icon0
摘要: 开发数字孪生可视化项目过程中你是不是也有这种感觉:坐标系让人头晕,坐标转换令人头大。坐标系的相互转换在项目中使用非常普遍,比如有一些巡检轨迹点的数据是用经纬度坐标表示的,如果园区在地球上,可以直接使用 ...

开发数字孪生可视化项目过程中你是不是也有这种感觉:坐标系让人头晕,坐标转换令人头大。

森技能 | 经纬度坐标转为园区相对坐标的方法

坐标系的相互转换在项目中使用非常普遍,比如有一些巡检轨迹点的数据是用经纬度坐标表示的,如果园区在地球上,可以直接使用经纬读数据进行展示巡检轨迹,但是如果是只在园区中展示,就需要转为园区相对坐标。又比如对某一个物体的实时位置进行监控,物体的位置也是使用经纬度表示,但是需要在园区内将物体的实时位置进行展示。

在已知园区位置角度的情况下,如何将经纬度坐标转为园区相对坐标呢?下面就以低代码ThingJS和森数据DIX为例,详细讲解一下坐标转换的过程。


整体思路:

1.根据待求点经纬度,高度转为三维地球场景中的世界坐标(为方便计算,uEarth采用圆球来模拟地球,球半径为6378000m)。

2.根于园区的经纬度,高度,方位角计算园区点在三维地球场景中的旋转和位置信息,构建一个矩阵。

3.求出步骤2中计算得到的矩阵的逆矩阵。

4.使用步骤1中求出的世界坐标与步骤3中求出的矩阵进行相乘,得到待求点相对于园区的相对坐标。


01

使用低代码ThingJS进行坐标转换

在低代码ThingJS中在线开发编辑窗口输入代码如下:

//假设园区经纬度为[115.9238, 40.5127],方位角为65度,海拔高度为0 待求点的经纬度为[115.9237889951027,40.51291036498085] 海拔为0const app =  THING.App.current;const baseObj =app.create({type:'BaseObject'}) // 创建⼀个物体基类(参照点)baseObj.position = THING.Math.lonlat2World([115.9238, 40.5127],6378000); //第二个参数为地球半径,如果海拔高度不为0,可以将高度加到第二个参数上// 设置物体基类的坐标点为园区所在的坐标baseObj.angles = THING.Math.getAnglesFromLonlat([115.9238, 40.5127],65); // 根据经纬度和方位角得到参照点贴地 的旋转角度const worldPosition = THING.Math.lonlat2World([115.9237889951027,40.51291036498085],6378000); // 将待求点经纬度转化成世界坐标,如果海拔高度不为0,可以将高度加到第二个参数上const selfPosition = baseObj.worldToSelf(worldPosition); // 根据参照点将待求点世界坐标系下的位置转换成园区坐标系的坐标系下的坐标
输出结果为:[21.616811162326485, -0.0000430569052696228, 9.052460958948359]


02

基于森数据DIX进行坐标转换

(1) 打开森数据首页,新建与数据接口

森技能 | 经纬度坐标转为园区相对坐标的方法

(2)选择接入配置:

森技能 | 经纬度坐标转为园区相对坐标的方法

根据实际业务数据的来源选择,这里就以RabbitMQ为例。

(3)编写代码:

森技能 | 经纬度坐标转为园区相对坐标的方法

参数的来源需要也需要写代码进行获取,这里为了简化将参数写为静态值。核心代码只有一行,即:
//getLocalPosition为内置方法 提供了根据园区经纬度,方位角 将经纬度转为园区相对坐标的功能 var result = getLocalPosition(campusCoordinates, azimuth, gpsCoordinates);

(4)输出结果

森技能 | 经纬度坐标转为园区相对坐标的方法