上班的日子非常不好受,现在整个人都是班味十足。而且国企工资也没有那么高,虽然可能比公务员事业单位工资高一些,但是感觉工作这两个月来也没存下什么钱,干什么都是钱。所以如果能进大厂的还是可以考虑进大厂,国企也并不能躺,内卷严重,有考核有绩效。进去大厂干几年然后走国企社招,在回来。近些天跟国企外包的聊了聊,他们也是华为当地的员工。有些技术非常强,他们之前在上海,工资比较高,我问为啥不留在那边,有一个跟我说,最后大家都会回到家乡来结婚生子,想想也是。就是想说大家不要以为进了国企就会舒服,现在国企内卷压力也比较大。说实话我目前在的公司我最看好的就是食堂,吃的还是非常好的。
这段时间有个小项目一致在跟进,非常忙,所以好久也没有整理东西。周末在录视频,录Cesium一些基础学习视频,后期B站会上线,但是感觉还需要一段时间,第一次系统的录视频经常返工。
1、如何使用ArcGIS进行GIS坐标系转换?
在ArcGIS中进行GIS坐标系转换通常涉及以下步骤:
定义坐标系:首先,确保你的数据具有正确的坐标系定义。如果数据没有定义坐标系,你需要使用“定义投影”工具来指定正确的坐标系。
选择转换工具:根据你的数据类型(矢量或栅格),选择相应的转换工具。对于矢量数据,使用“投影”工具;对于栅格数据,使用“投影栅格”工具。
设置转换参数:在进行坐标系转换时,可能需要指定“地理转换”参数。这个参数取决于你的数据是否涉及不同的地理坐标系。如果ArcGIS已知二者之间的转换方法,则该参数是可选的;如果未知,则必须自定义转换方法。
使用自定义地理变换:如果ArcGIS不提供所需的坐标系转换方法,你可以使用“创建自定义地理变换”工具来创建新的转换方法。这通常涉及到三参数或七参数变换,其中七参数变换提供了更高精度的转换。
执行转换:设置好所有参数后,运行转换工具。转换过程可能需要一些时间,具体取决于数据的大小和复杂性。
验证结果:转换完成后,检查结果的准确性。你可以通过与已知坐标的点进行比较来验证转换的精度。
保存和输出:一旦确认转换结果无误,保存转换后的数据,并根据需要进行进一步的分析或编辑。
2、Cesium中的Cartesian3坐标系的原点在哪里?它的轴是如何定义的?
Cartesian3坐标系的原点位于地球中心,通常用作地球的质心。X轴指向东经0度、北纬0度的方向;Y轴指向东经90度、北纬0度的方向;Z轴指向东经0度、北纬90度的方向
3、如何在Cesium中使用矩阵进行坐标系转换。
建立转换矩阵:首先,需要建立一个从局部坐标系到世界坐标系(或反之)的转换矩阵。这通常涉及到使用
Cesium.Transforms.eastNorthUpToFixedFrame
方法,该方法以一个世界坐标系中的点为基础,创建一个局部坐标系,其中x轴指向东,y轴指向北,z轴指向上(通常是椭球体的法线方向)。使用矩阵进行转换:一旦有了转换矩阵,就可以使用
Cesium.Matrix4.multiplyByPoint
或Cesium.Matrix4.multiplyByVector
方法来将点或向量从局部坐标系转换到世界坐标系,或者进行反向转换。转换经纬度坐标:如果需要在世界坐标系(WGS84)和笛卡尔坐标系之间转换,可以使用
Cesium.Cartesian3.fromDegrees
或Cesium.Cartesian3.fromRadians
方法将经纬度坐标转换为笛卡尔坐标。反向转换可以使用Cesium.Cartographic.fromCartesian
方法。局部坐标系转换:在处理局部坐标系(如模型或地形的局部坐标系)时,你可能需要将局部坐标转换为全局坐标系中的点。这可以通过将局部坐标乘以模型矩阵来实现,模型矩阵可以从实体的模型中获取。
优化转换性能:在进行大量的坐标转换时,考虑性能优化是非常重要的。Cesium提供了一些工具和方法来减少计算量,例如使用
Cesium.Transforms.eastNorthUpToFixedFrame
来创建一个高效的转换矩阵,该矩阵可以直接应用于多个坐标点。
4、在Cesium中,如何将屏幕坐标转换为地球表面的坐标?
在Cesium中,将屏幕坐标(通常是鼠标点击位置)转换为地球表面的坐标(如经纬度坐标)的过程通常涉及到以下几个步骤:
获取屏幕坐标:首先需要获取用户的点击位置,这通常是通过监听
LEFT_CLICK
事件来完成的。将屏幕坐标转换为归一化的设备坐标:将屏幕坐标转换为归一化的设备坐标(normalized device coordinates),这是相对于屏幕尺寸的一个比例坐标。
使用相机的光线投射功能:利用Cesium中的
camera.pickEllipsoid
方法,从归一化的设备坐标发射一条光线,这条光线会穿过地球模型,直到与地球相交的第一个点。获取交点的地理坐标:最后,将得到的交点坐标从笛卡尔坐标系(3D直角坐标系)转换为地理坐标系(经纬度坐标)。
下面是具体的JavaScript代码示例:
// 获取屏幕坐标
var handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas);
handler.setInputAction(function(click) {
// 获取点击位置的屏幕坐标
var screenPosition = click.position;
// 创建一个Ray对象,表示从摄像机发出的光线
var ray = viewer.camera.getPickRay(screenPosition);
// 使用pickEllipsoid方法找到光线与地球椭球体的交点
var cartesian3 = viewer.scene.globe.pick(ray, viewer.scene);
// 检查是否找到了交点
if (Cesium.defined(cartesian3)) {
// 将笛卡尔坐标转换为地理坐标
var cartographic = Cesium.Cartographic.fromCartesian(cartesian3);
// 将地理坐标(弧度)转换为经纬度(度)
var longitude = Cesium.Math.toDegrees(cartographic.longitude);
var latitude = Cesium.Math.toDegrees(cartographic.latitude);
var height = cartographic.height;
// 输出结果
console.log("经度: " + longitude + ", 纬度: " + latitude + ", 高度: " + height);
}
}, Cesium.ScreenSpaceEventType.LEFT_CLICK);
在这个示例中:
screenPosition
是点击位置的屏幕坐标。ray
是从摄像机发出的一条光线。viewer.scene.globe.pick
方法用于找到光线与地球椭球体的交点。Cesium.Cartographic.fromCartesian
方法将笛卡尔坐标转换为地理坐标。Cesium.Math.toDegrees
方法将弧度转换为度数。
这段代码将会打印出点击位置的经纬度坐标和高度。
5、Cesium 中的 Cartesian3 和 Cartographic 有什么区别?
**Cartesian3
**:笛卡尔坐标系,使用 x, y, z
三个维度来表示物体在空间中的位置,单位为米。
**Cartographic
**:地理坐标系,使用经度、纬度和高度来表示物体在地球表面的位置,经纬度单位为度,高度单位为米。
6、Cesium 中的地心坐标系(ECI)与地固坐标系(ECEF)有什么区别?
ECI(Earth-Centered Inertial):地心惯性坐标系,与地球的自转无关,是惯性参考系。
ECEF(Earth-Centered Earth-Fixed):地固坐标系,固定在地球上,随着地球的自转而转动,是 Cesium 中常用的坐标系。
7、Cesium 中为什么采用 WGS84 坐标系?
WGS84 是全球使用的标准地理坐标系统,具有高度的精度和广泛的使用范围,Cesium 使用它来确保兼容性和一致性。
8、如何处理 Cesium 中的坐标系漂移问题?
Cesium 提供了一些工具来减少坐标精度的影响,例如使用 relativeToCenter
来处理相对坐标,以避免精度损失。
9、如果要将一个在本地坐标系下的模型加载到 Cesium 中,并且要正确定位在地球表面,需要考虑哪些坐标系相关的问题?
需要考虑本地坐标系与 Cesium 坐标系的转换关系,可能需要知道模型在本地坐标系中的位置、旋转、缩放等信息,并通过合适的方法转换到 Cesium 的世界坐标系中。
详细:
在将一个本地坐标系下的模型加载到 Cesium 中并正确定位在地球表面时,需要考虑以下坐标系相关的问题:
1. 本地坐标系与全球坐标系的转换
本地坐标系:通常是指模型在局部的平面或三维坐标系下(如建筑物或小区域的局部坐标),通常以模型中心或某一特定点作为原点。 全球坐标系:Cesium 使用的全球坐标系是地球固定坐标系 (ECEF - Earth-Centered Earth-Fixed),即地球椭球体中心为原点的笛卡尔坐标系。
将本地坐标系下的模型放置到 Cesium 中的全球坐标系下,需要对模型的原点位置进行转换,并考虑旋转和缩放问题。
2. 坐标系原点的转换
本地坐标系的原点需要映射到地球上的某一特定位置。这个位置通常通过经纬度(
longitude
和latitude
)以及高度(height
)来指定。方法:使用
Cesium.Cartesian3.fromDegrees(longitude, latitude, height)
将经纬度和高度转换为 Cesium 的全球笛卡尔坐标。var modelPosition = Cesium.Cartesian3.fromDegrees(longitude, latitude, height);
3. 模型的旋转
本地坐标系的方向通常不符合地球坐标系的方向(东、北、上)。需要考虑模型的旋转角度:
轴的对齐:Cesium 的地球坐标系使用的是 ECEF 坐标系( x
向量指向赤道上的本初子午线方向,z
向量指向北极),而模型可能使用其他轴定义。调整旋转矩阵:可以通过给模型添加旋转矩阵或四元数来调整模型的姿态。Cesium 提供了 Matrix4
和Quaternion
来进行矩阵变换和旋转。
例如,可以使用 Cesium.Transforms.headingPitchRollQuaternion
根据模型的朝向角(heading)、俯仰角(pitch)、滚动角(roll)进行姿态调整:
var orientation = Cesium.Transforms.headingPitchRollQuaternion(
modelPosition,
new Cesium.HeadingPitchRoll(heading, pitch, roll)
);
4. 缩放问题
本地坐标系中的模型可能需要根据其实际大小进行缩放,以确保在全球坐标系中的正确尺寸。
Cesium 支持通过
scale
属性设置模型的缩放因子。例如:model.scale = 2.0; // 将模型放大 2 倍
5. 地球曲率的影响
本地坐标系通常是平面的,但在 Cesium 中模型是放置在曲面的地球椭球体上。如果模型覆盖的区域较大,则需要考虑地球曲率的影响,可能需要对模型的平面坐标进行变换,使其适应地球的球形表面。
6. 模型的局部平移和旋转
如果模型在本地坐标系中有相对的平移或旋转,可以通过 Cesium 的 ModelMatrix
来处理这些局部变换:
平移:如果需要对模型在本地坐标系中进行相对的平移,可以调整模型的 ModelMatrix
来实现。局部旋转:通过修改 ModelMatrix
进行局部旋转,保持模型的相对方向。
7. Cesium 中的 ModelMatrix
Cesium 中的 ModelMatrix
可以用来定义模型的位置、旋转和缩放变换。你可以根据上述经纬度、旋转和缩放信息设置模型的矩阵。例如:
var modelMatrix = Cesium.Transforms.eastNorthUpToFixedFrame(modelPosition);
var model = viewer.scene.primitives.add(Cesium.Model.fromGltf({
url : 'model.gltf',
modelMatrix : modelMatrix,
scale: 1.0
}));
8. 高程数据的处理
如果模型的位置需要精确匹配地形,可以考虑使用 Cesium 的高程数据服务,通过 sampleTerrain
方法来查询特定经纬度的地形高度:
var terrainProvider = Cesium.createWorldTerrain();
Cesium.sampleTerrain(terrainProvider, 11, [cartographic]).then(function(updatedPositions) {
var height = updatedPositions[0].height;
});
博客:
https://blog.csdn.net/weixin_44857463/article/details/129157708
B站:
https://space.bilibili.com/610654927?spm_id_from=..0.0