Unity 实用教程 之 快速计算两经纬度间的距离

2025-10-09 13:19:09

1、打开Unity,新建一个空工程,具体如下图

Unity 实用教程 之 快速计算两经纬度间的距离

2、在场景中,新建一个画布Canas,添加一个Image作为背景,添加一个按钮,和两个Text显示获取到的经纬度信息和两经纬度的距离,具体如下图

Unity 实用教程 之 快速计算两经纬度间的距离

3、保存场景,然后在工程中新建一个脚本,双击打开脚本进行编写代码获取经纬度信息以及计算两个经纬度之间的距离,具体如下图

Unity 实用教程 之 快速计算两经纬度间的距离

4、编写代码,首先获取当前经纬度的距离,代码具体如下图

Unity 实用教程 之 快速计算两经纬度间的距离

Unity 实用教程 之 快速计算两经纬度间的距离

5、然后计算当前经纬度与指定经纬度之间的距离,计算方法具体如下图

Unity 实用教程 之 快速计算两经纬度间的距离

6、脚本具体代码如下:

using System.Collections;

using System.Collections.Generic;

using UnityEngine;

using UnityEngine.UI;

using System;

public class GetGPS : MonoBehaviour {

    string GetGps = "";  

    public Text ShowGPS;  

    public Text distanceText;

    private const double LAT1 = 22.72555f;

    private const double LNG1 = 114.2108f;

    /// <summary>  

    /// 初始化一次位置  

    /// </summary>  

    void Start()  

    {  

        StartCoroutine(StartGPS());  

        GetGps = "N:" +  Input.location.lastData.latitude + " E:" + Input.location.lastData.longitude;  

        GetGps = GetGps + " Time:" + Input.location.lastData.timestamp;  

        ShowGPS.text = GetGps;  

        Debug.Log(GetGps);    

    }  

    /// <summary>  

    /// 刷新位置信息(按钮的点击事件)  

    /// </summary>  

    public void updateGps()  

    {  

        StartCoroutine(StartGPS());  

        GetGps = "N:" + Input.location.lastData.latitude + " E:" + Input.location.lastData.longitude;  

        GetGps = GetGps + " Time:" + Input.location.lastData.timestamp;          ShowGPS.text = GetGps;  

        Debug.Log(GetGps);  

        //计算距离

        double distanceAB = GetDistance(LAT1, LNG1, Input.location.lastData.latitude, Input.location.lastData.longitude);

        distanceText.text = "距离22.72555, 114.2108是:" + distanceAB;

    }  

    /// <summary>  

    /// 停止刷新位置(节省手机电量)  

    /// </summary>  

    void StopGPS()  

    {  

        Input.location.Stop();  

    }  

    /// <summary>

    /// Starts the GP.

    /// </summary>

    /// <returns>The GP.</returns>

    IEnumerator StartGPS()  

    {  

        // Input.location 用于访问设备的位置属性(手持设备), 静态的LocationService位置    

        // LocationService.isEnabledByUser 用户设置里的定位服务是否启用  

        if (!Input.location.isEnabledByUser)  

        {  

            GetGps = "isEnabledByUser value is:" + Input.location.isEnabledByUser.ToString() + " Please turn on the GPS";  

            yield return false;  

        }  

        // LocationService.Start() 启动位置服务的更新,最后一个位置坐标会被使用    

        Input.location.Start(10.0f, 10.0f);  

        int maxWait = 20;  

        while (Input.location.status == LocationServiceStatus.Initializing && maxWait > 0)  

        {  

            // 暂停协同程序的执行(1秒)   

            yield return new WaitForSeconds(1);  

            maxWait--;  

        }  

        if (maxWait < 1)  

        {  

            GetGps = "Init GPS service time out";  

            yield return false;  

        }  

        if (Input.location.status == LocationServiceStatus.Failed)  

        {  

            GetGps = "Unable to determine device location";  

            yield return false;  

        }  

        else  

        {  

            GetGps = "N:" + Input.location.lastData.latitude + " E:" + Input.location.lastData.longitude;  

            GetGps = GetGps + " Time:" + Input.location.lastData.timestamp;

            Debug.Log ("Keyidingwei");

            yield return new WaitForSeconds(100);  

        }  

    } 

#region 计算两经纬度间的距离

    private const double EARTH_RADIUS = 6378137;

    /// <summary>

    /// 计算两点位置的距离,返回两点的距离,单位 米

    /// 该公式为GOOGLE提供,误差小于0.2米

    /// </summary>

    /// <param name="lat1">第一点纬度</param>

    /// <param name="lng1">第一点经度</param>

    /// <param name="lat2">第二点纬度</param>

    /// <param name="lng2">第二点经度</param>

    /// <returns></returns>

    public static double GetDistance(double lat1, double lng1, double lat2, double lng2)

    {

        double radLat1 = Rad(lat1);

        double radLng1 = Rad(lng1);

        double radLat2 = Rad(lat2);

        double radLng2 = Rad(lng2);

        double a = radLat1 - radLat2;

        double b = radLng1 - radLng2;

        double result = 2 * Math.Asin(Math.Sqrt(Math.Pow(Math.Sin(a / 2), 2) + Math.Cos(radLat1) *  Math.Cos(radLat2) * Math.Pow(Math.Sin(b / 2), 2))) * EARTH_RADIUS;

        return result;

    }

    /// <summary>

    /// 经纬度转化成弧度

    /// </summary>

    /// <param name="d"></param>

    /// <returns></returns>

    private static double Rad(double d)

    {

        return (double)d * Math.PI / 180d;

    }

    #endregion

}

7、脚本编译正确后,回到Unity界面,把脚本挂在到摄像机上,并把对应的Text赋值给脚本,按钮添加上“updateGps”函数,具体如下图

Unity 实用教程 之 快速计算两经纬度间的距离

Unity 实用教程 之 快速计算两经纬度间的距离

8、然后导出iOS或者Andorid应用,安装到手机上,点击“刷新信息”按钮,即可显示经纬度信息,并且计算出两个经纬度间的距离,具体如下图

Unity 实用教程 之 快速计算两经纬度间的距离

Unity 实用教程 之 快速计算两经纬度间的距离

9、如是iOS导出,没有显示地理位置,必要的时候,在“Build”前,把“Player Settings”的 “Location Usage Description”填写一下,具体如下图

Unity 实用教程 之 快速计算两经纬度间的距离

10、到此,《Unity 实用教程 之 快速计算两经纬度间的距离》讲解结束,谢谢

声明:本网站引用、摘录或转载内容仅供网站访问者交流或参考,不代表本站立场,如存在版权或非法内容,请联系站长删除,联系邮箱:site.kefu@qq.com。
猜你喜欢