Unity3D中GPS定位信息及经纬度转换方法

Unity3D官方给开发者提供了定位相关的API,可以在官方文档搜索Location

LocationService
1.isEnabledByUser   -- 用户设置里的定位服务是否启用
2.lastData   -- 最近一次测量的地理位置  
3.status   -- 定位服务的状态(Stopped服务停止,Initializing正在初始化,Running正在运行,Failed用户拒绝访问位置)
4.Start()方法有桑重载,主要是设置desiredAccuracyInMeters(服务所需的精度,默认值是10米)updateDistanceInMeters(最小距离,默认值是10米)这两个参数
5.Stop ( )  -- 停止定位服务的定位更新,耗电量比较大,要及时关闭


LocationInfo
1.altitude -- 海拔高度  
2.horizontalAccuracy -- 水平精度  
3.latitude -- 纬度  
4.longitude -- 经度  
5.timestamp -- 最近一次定位的时间戳,从1970开始  
6.verticalAccuracy -- 垂直精度

但是官方提供的API我们只能获取经纬度信息,还需要借助第百度地图开放平台来转换为地理位置信息,在定位服务中找到获取密钥,创建服务端应用,复制密钥

贴代码,详情见注释

 //负责启动或者关闭地理定位
        private const string ak = "百度地图地理位置转换授权码";

        public static async void GetLocationMsg()
        {
	        if(!Input.location.isEnabledByUser) //用户位置信息未启用
	        {
		        return;
	        }
	        Input.location.Start(500,500);//启动定位服务
            int maxWait = 5;
            while (Input.location.status == LocationServiceStatus.Initializing && maxWait > 0)//等待定位服务初始化
            {
                await ETModel.Game.Scene.GetComponent<ETModel.TimerComponent>().WaitAsync(1000);//ET框架内容,等待1000毫秒,可以改用协程等待
                maxWait--;
            }

            if (maxWait < 1 || Input.location.status == LocationServiceStatus.Failed)//启动失败
                return;
            else
            {
                //获取经度纬度信息
                string latitude = Input.location.lastData.latitude.ToString();
                string longitude = Input.location.lastData.longitude.ToString();
                GetAdress(latitude,longitude);
            }
        }

       public static async void  GetAdress(string Latitude,string Longitude)
        {
            float latitude;
            float longitude;
            string location = "";
            if (float.TryParse(Latitude,out latitude)&& float.TryParse(Longitude,out  longitude))
            {
                //填入百度密钥,经纬度信息
                string addressUrl = string.Format("http://api.map.baidu.com/geocoder/v2/?output=json&ak={0}&location={1},{2}",ak,latitude,longitude);
                //可以用UnityWebRequestAsync去获取地理位置信息,此处为ET框架内容
                using (UnityWebRequestAsync webRequestAsync = ETModel.ComponentFactory.Create<UnityWebRequestAsync>())
                {
                    await webRequestAsync.DownloadAsync(addressUrl);
                    location = webRequestAsync.Request.downloadHandler.text;//获取到地理位置信息,Json数据,需要转换
                }
            }         
       }

 

  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Unity3d是一款常用的游戏引擎,而GPS经纬度与空间坐标在游戏开发也经常被使用。Unity3d提供了方法完成经纬度和空间坐标的转换。 在Unity3d,使用LocationService类获取GPS经纬度信息,获取到的经纬度信息为WGS84坐标系下的经纬度。而Unity3d的坐标系是以Vector3三维向量形式存在,需要将WGS84坐标系下的经纬度转换为Unity3d的坐标系。 可以使用以下方法将经纬度转换为Unity3d的坐标系: 1. 使用WGS84坐标系下的经纬度计算出该点在地球球面上的X、Y、Z坐标。 2. 使用转化矩阵将地球球面坐标系下的X、Y、Z转换为Unity3d的坐标系。 以下是代码示例: ```csharp using UnityEngine; using System; public class GPSToUnity : MonoBehaviour { // 地球平均半径 private const double EarthRadius = 6378137.0; // 转化矩阵 private static readonly Matrix4x4 wgs84ToUnity = Matrix4x4.TRS(Vector3.zero, Quaternion.Euler(-90, 0, 0), Vector3.one); // 将GPS经纬度转换为Unity3d的坐标系 public static Vector3 GPSToUnityCoord(double longitude, double latitude) { double lonRad = longitude * (Math.PI / 180.0); double latRad = latitude * (Math.PI / 180.0); double x = EarthRadius * Math.Cos(latRad) * Math.Cos(lonRad); double z = EarthRadius * Math.Cos(latRad) * Math.Sin(lonRad); double y = EarthRadius * Math.Sin(latRad); Vector3 coord = wgs84ToUnity.MultiplyPoint3x4(new Vector3((float)x, (float)y, (float)z)); return coord; } } ``` 以上方法是将经纬度转换为Unity3d的坐标系,也可以使用相反的方法将Unity3d的坐标系转换为经纬度。需要注意的是,在坐标系转换,我们一般使用的WGS84坐标系转化矩阵并不适用于所有情况,可能会存在一定误差。因此在使用需要根据实际情况选择正确的转换方法,减少误差。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值