【Unity】坐标转换经纬度方法(应用篇)

【Unity】坐标转换经纬度方法(应用篇)

解决地图中经纬度坐标转换与unity坐标互转的问题。使用线性变换的方法,理论上可以解决小范围内所有坐标转换的问题。

之前有写过[Unity]坐标转换经纬度方法(原理篇),在实际使用中,由于步骤比较繁琐,基于之前的方法,详细说明使用方法。

案例资源下载地址

一、使用步骤

  • 绑定脚本
  • 建立控制原点和配准点
  • 获得变换二项式
  • 坐标互转方法

1.绑定脚本

导入资源包后可以看见一下目录结构

  • Examples下的坐标转换使用是演示demo

  • Transfromation下的是功能脚本

将ChangeMatrixMgr拖入场景中的任意一个GameObject下即可,演示demo中是放在空物体GameManager下。

2.建立控制原点和配准点

(1)建立控制原点

在目录中找到Prefab下的Piont拖入场景中,并摆放到一个比较特殊容易辨别的位置。(控制点尽量放在地图的中间区域)

随便在网上找到一个获取经纬度的网站,用于获取经纬度。

经纬度查询定位 拾取坐标系统

选择影像图,在地图中找到Piont摆放的位置

这里可以得到该点的经纬度。把经纬度填写到Piont下的组件ChangePoint里的LonLatPoint中,X填纬度,Y填经度

将控制原点Piont拖入ChangeMatrixMgr中的OriginPoint下(红框放入控制点)

(2)建立配准点

配准点的建立和控制点一样,建立后放如GruberPoints数值中。

注意:配准点至少建立两个

3.获得变换二项式

配准点和控制原点建立好后,便可以创建变换的二项式

读取配准点对应的经纬度坐标和本地坐标到数组

  List<DoubleVector2> LonLatPoints;//经纬度坐标点数组
  List<DoubleVector2> LocalPoints;//本地坐标点数组  
void ExtractionCoordinate()
    {
        LonLatPoints = new List<DoubleVector2>();
        LocalPoints = new List<DoubleVector2>();
        int length = GruberPoints.Length;
        for (int i = 0; i < length; i++)
        {
            LonLatPoints.Add(GruberPoints[i].LonLatPoint - OriginPoint.LonLatPoint);
            LocalPoints.Add(GruberPoints[i].LocalPoint - OriginPoint.LocalPoint);
        }
    }

创建二项式

    public DoubleVector4 ToLonLatMatrix;//转经纬度二项式
    public DoubleVector4 ToLocalMatrix;//转本地坐标二项式
    void CreateMatrix()
    {
        ExtractionCoordinate();
        changeMatrixUtil = new ChangeMatrixUtil(LonLatPoints, LocalPoints, errorValue);
        ToLonLatMatrix = changeMatrixUtil.ToLonLatMatrix;
        ToLocalMatrix = changeMatrixUtil.ToLocalMatrix;
    }

二项式的值只需要创建一次,后面可以复用。

可以单独复制赋值,赋值后可以移除配准点,上面的ExtractionCoordinate和CreateMatrix两个方法可以不调用。

二项式只要有值,重新运行也不影响。

4.坐标互转方法

        /// <summary>
        /// 变换坐标
        /// </summary>
        /// <param name="Vector">要转换的坐标</param>
        /// <param name="ChangeMatrix">变换行列式</param>
        /// <param name="BZero">变换后原点坐标</param>
        /// <param name="FZero">要转换的原点坐标</param>
        /// <returns></returns>
        public static DoubleVector2 GetChangeVector(DoubleVector2 Vector, DoubleVector4 ChangeMatrix, DoubleVector2 BZero, DoubleVector2 FZero)

demo

  DoubleVector2 lonLatPoint= DoubleVector2.GetChangeVector(test.LocalPoint, ToLonLatMatrix, OriginPoint.LonLatPoint, OriginPoint.LocalPoint);

经纬度转本地

第一个参数传入经纬度坐标;

第二个参数传入转本地坐标的二项式;

第三个参数传入本地坐标的控制原点;

第四个参数传入经纬度坐标控制原点

本地转经纬度

第一个参数传入本地坐标;

第二个参数传入转经纬度坐标的二项式;

第三个参数传入经纬度坐标控制原点;

第四个参数传入本地坐标的控制原点

二、扩展

1.产生误差的原因

地球是不规则的球体,将球体投影到平面上是不能正交投影的,必然出现变形导致位置的偏移,投影方式的不同就会产生不同的投影坐标系,比如高斯投影、墨卡托投影、UTM投影 等平面坐标系。
我们获取的也有可能是大地坐标系的经纬度坐标(比如 WGS_84、西安80、GCJ-02),大地坐标系是抽象的空间坐标系,由于参考的椭球不同,同样的经纬度在不同的大地坐标系下位置也是不一样的,而且差距很大。
如果我们是基于大地坐标系进行配准的,由于我们的场景是平面的,二大地坐标系的立体的,造成随着范围距离的变大,误差就会随之变大。

2.报NaN计算出错的原因

当配准点过多时,配准点的位置和出现错误,或者配准点的坐标系不一致,会导致二项式无法求出。

解决方法:

  1. 减少配准点数量
  2. 修改ChangeMatrixMgr下的ErrorValue参数
  3. 检查配准点
  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论
### 回答1: 在Unity游戏开发中,有时候需要将经纬度Unity坐标进行相互换。经纬度是用来表示地球上某一点位置的地理坐标,而Unity坐标则是用来表示游戏场景中各个对象的位置。 首先,我们来看如何将经纬度换为Unity坐标。这个过程涉及到地球模型和坐标系的换。首先需要了解Unity中使用的坐标系,Unity引擎使用的是左手坐标系,其中X轴是向右的,Y轴是向上的,而Z轴是向前的。 假设我们已经获得了一个地理位置的经纬度,可以通过Unity提供的API将经纬度换为空间坐标。可以使用Unity的LocationService类来获取设备当前的地理位置信息,其中有一个属性latitude是用来表示纬度的,另一个属性longitude是用来表示经度的。 Unity中的LocationService类还提供了方法经纬度换为Unity的空间坐标。具体的换过程可以使用LocationService的方法:Input.compass.trueHeading可以获取真北指向的方向,然后通过一些数学计算和换矩阵可以将经纬度换为Unity坐标。 反过来,如果我们已经有了一个Unity坐标,想要换为经纬度,也是可以的。可以使用Unity提供的方法Unity坐标转换为屏幕坐标,然后可以通过一些数学和地理计算,将屏幕坐标转换经纬度。 总结一下,经纬度Unity坐标之间的换是一个比较常见的需求,在Unity游戏开发中可以使用Unity提供的LocationService类和一些数学计算方法来实现。同时,也可以利用一些第三方库来简化这个换过程。 ### 回答2: Unity是一款流行的游戏引擎,它提供了许多实用功能来帮助开发者创建游戏。其中一个实用功能是经纬度Unity坐标之间的换。 经纬度是地球上地理位置的表示方式,由纬度(latitude)和经度(longitude)组成。在许多应用中,我们可能需要将经纬度坐标转换Unity中的坐标系统,以便在游戏中定位和展示地理位置。 在Unity中,可以使用提供的API函数来进行经纬度Unity坐标之间的换。首先,我们可以使用"LocationService"类来获取设备的经纬度信息。通过调用"Input.location.Start()"函数和"Input.location.lastData.latitude"和"Input.location.lastData.longitude"属性,我们可以获取到当前设备的经纬度。 接下来,我们可以将获得的经纬度信息换为Unity坐标。这可以通过将经纬度映射到Unity坐标系范围内来实现。一种常见的映射方式是将地球的纬度范围[-90, 90]换为Unity的Y坐标范围[-10, 10],将地球的经度范围[-180, 180]换为Unity的X坐标范围[-10, 10]。可以使用简单的比例缩放来完成这个映射过程。 通过将经纬度换为Unity坐标,我们可以在游戏中使用这些坐标来定位和展示地理位置。例如,我们可以在游戏世界中创建一个物体,并将其放置在经纬度对应的Unity坐标上,以此在游戏中呈现地理位置。这对于开发基于地理位置的游戏和应用程序非常有用。 总之,Unity提供了经纬度Unity坐标之间换的实用功能,使得开发者可以方便地在游戏中定位和展示地理位置。通过将经纬度换为Unity坐标,我们可以使用这些坐标来在游戏中呈现地球上的地理位置。 ### 回答3: 在Unity中,经纬度Unity坐标之间的换是一个相当实用的功能,尤其在开发地理位置相关的应用程序时。 首先,我们来看经纬度换为Unity坐标的过程。经度表示了地球上某个点的东西方向位置,而纬度表示了地球上某个点的南北方向位置。在Unity中,我们可以使用脚本来将经纬度换为Unity中的坐标。我们可以使用标准的经纬度坐标系,其中纬度的范围是-90到90,经度的范围是-180到180。首先,我们需要确定Unity世界中一个参考点的经纬度,然后计算指定经纬度点与参考点之间的水平和垂直距离,将其换为Unity坐标的单位。 另一方面,Unity坐标转换经纬度也是一个常见的需求。在这种情况下,我们需要使用Unity中的Unity API来获取场景中某个物体的位置坐标,然后将其换为经纬度值。首先,我们需要确定一个参考点的经纬度作为原点,然后计算指定点与参考点之间的水平和垂直距离。最后,通过一些数学运算和公式,我们可以将该距离换为对应的经度和纬度值。 总结起来,经纬度Unity坐标之间的换可以通过一些简单的数学运算和公式实现。这个功能在开发地理位置相关的应用程序时非常有用,例如在虚拟现实游戏中创建基于真实地理位置的游戏世界,或者在实际物理位置点周围放置虚拟对象等等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小生云木

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值