当前位置:   article > 正文

cesium-unreal移植坐标转换

cesium for ue4 模仿googleearth

Part1cesium-unreal简介

5ca474e0fd79e64c0ec2b72af726fac8.png

a5f75f1c817689cc4cd104f79e892b50.pngCesium for Unreal将3D地理空间生态系统带入了Unreal引擎。通过将高精度全尺寸WGS84地球、开放式API和开放式空间索引标准(如3Dtiles)以及基于云的Cesium Ion真实世界内容与Unreal Engine相结合,该项目开创了3D地理空间软件的新纪元。914702195498fb81e56cf3af1084266f.pngCesium for Unreal支持基于开放标准和API的云和私有网络内容和服务。您可以自由使用任何支持的内容源、标准、API与Cesium for Unreal的组合。
github地址:
https://github.com/CesiumGS/cesium-unreal

Part2坐标转换

Cesium for Unreal坐标转换涉及到3个类,都是基于C++实现。坐标转换的概念可以参考下面博客,C++测试结果与这篇完全一致。

玩转"经纬度  地心坐标  东北天坐标"

1Ellipsoid类

该类路径地址如下:

cesium-native/CesiumGeospatial/include/CesiumGeospatial/Ellipsoid.h

主要功能为定义了椭球对象,并实现了WGS84的椭球模型。这个对象还实现了求解球面某点法线、经纬度转笛卡尔坐标系,笛卡尔转经纬度。相关函数名称如下:
求解球面某点法:

  1. glm::dvec3
  2.   geodeticSurfaceNormal(const Cartographic& cartographic) const noexcept;

经纬度转笛卡尔坐标系:

  1. glm::dvec3
  2.   cartographicToCartesian(const Cartographic& cartographic) const noexcept;

笛卡尔转经纬度:

  1. std::optional<Cartographic>
  2.   cartesianToCartographic(const glm::dvec3& cartesian) const noexcept;

2Cartographic类

该类地址路径如下:

cesium-native/CesiumGeospatial/include/CesiumGeospatial/Cartographic.h

主要保存了经纬度和大地高的椭球数据。保存在如下成员变量中:

  1. /**
  2.    * @brief The longitude, in radians.
  3.    */
  4.   double longitude;
  5.   /**
  6.    * @brief The latitude, in radians.
  7.    */
  8.   double latitude;
  9.   /**
  10.    * @brief The height, in meters.
  11.    */
  12.   double height;

3Transforms类

该类地址路径如下:

cesium-native/CesiumGeospatial/include/CesiumGeospatial/Transforms.h

主要实现了东北天坐标转地心坐标。实现函数如下:

  1. static glm::dmat4x4 eastNorthUpToFixedFrame(
  2.       const glm::dvec3& origin,
  3.       const Ellipsoid& ellipsoid = Ellipsoid::WGS84) noexcept;

Part3代码移植

我们将上面3个类移植到C++工程中,即可实现经纬度、地心坐标、东北天坐标的转换。

cmake组织如下:

  1. cmake_minimum_required(VERSION 3.0.0)
  2. project(eastNorthUp VERSION 0.1.0)
  3. set(CMAKE_CXX_STANDARD 17)
  4. AUX_SOURCE_DIRECTORY(./src SC_FILES)
  5. INCLUDE_DIRECTORIES ("src")
  6. add_executable(eastNorthUp ${SC_FILES})
  7. target_include_directories(eastNorthUp
  8. SYSTEM PUBLIC
  9. ${CMAKE_CURRENT_LIST_DIR}/extern/glm
  10. )

说明:
1、cesium-unreal采用C++17编写,所以我们通过 set(CMAKE_CXX_STANDARD 17)来设置编译为C++17
2、代码路径在src下面,通过AUX_SOURCE_DIRECTORY遍历所有文件并赋值给变量SC_FILES
3、这里还调用了glm的数学矩阵库,所以通过target_include_directories来设置头文件目录包含。

4经纬度转地心坐标

  1. auto ct = Cartographic::fromDegrees(11639);
  2.   auto center = Ellipsoid::WGS84.cartographicToCartesian(ct);
  3.   std::cout << std::setprecision(10)
  4.             << "x:" << center.x << " "
  5.             << "Y:" << center.y << " "
  6.             << "z:" << center.z << std::endl;

输出

x:-2175779.4973128252 Y:4461009.0617699539 z:3992317.0227517267

5地心坐标转经纬度

  1. auto cartographic = Ellipsoid::WGS84.cartesianToCartographic(center);
  2.   auto ctvalue = cartographic.value();
  3.   std::cout << std::setprecision(10)
  4.             << "longitude:" << HMath::radiansToDegrees(ctvalue.longitude) << " "
  5.             << "latitude:" << HMath::radiansToDegrees(ctvalue.latitude) << std::endl;

输出:

longitude:116.0000000000 latitude:39.0000000000

6东北天转地心坐标

  1. auto enr2ffTransforms = Transforms::eastNorthUpToFixedFrame(center);
  2.   glm::dvec3 enrPoint(000);
  3.   auto result1 = glm::dvec3(enr2ffTransforms * glm::dvec4(enrPoint, 1));
  4.   std::cout << std::setprecision(10)
  5.             << "x:" << result1.x << " "
  6.             << "Y:" << result1.y << " "
  7.             << "z:" << result1.z << std::endl;

输出

x:-2175779.4973128252 Y:4461009.0617699539 z:3992317.0227517267

7地心坐标转东北天

  1. auto enr2ffTransformsInverse = glm::inverse(enr2ffTransforms);
  2.   auto result2 = glm::dvec3(enr2ffTransformsInverse * glm::dvec4(result1, 1));
  3.   std::cout << std::setprecision(10)
  4.             << "x:" << result2.x << " "
  5.             << "Y:" << result2.y << " "
  6.             << "z:" << result2.z << std::endl;

输出

x:0.0000000000 Y:0.0000000005 z:-0.0000000014

输出结果符合预期。

Part4总结

本文主要介绍了cesium-unreal项目,并从该项目中提取出了C++版本的经纬度、地心坐标、东北天坐标互相转换的方法。
欢迎加技术交流群交流。218383068cb225413fce35604341e0a8.png

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
  

闽ICP备14008679号