unity定位

前言

最近在做一款手游,然后策划给的需求就是定位到当前用户所在的城市,然后花了一个上午给做了出来,思路大概就是通过手机定位获取到当前位置的经度和纬度,然后通过各个地图(我这里用的是百度地图)给出的接口进行逆地理编码

经纬度

在unity中的Input类里面有location这个属性,这个属性返回一个LocationService类可以为我们做一些GPS定位的操作,而其中
的LocationInfo则是定位完成后返回的一些数据。unity官网链接:https://docs.unity3d.com/ScriptReference/LocationService.Start.html
LocationService类:
1.isenabledbyuser 用户是否开启了定位服务(好像没什么用,一直是true)

2.lastdata 最后一次获取到的位置信息

3.status 定位的服务状态

4.start 启动定位服务

5.stop 停止定位服务
LocationInfo 结构体:
(1) altitude – 海拔高度

(2) horizontalAccuracy – 水平精度

(3) latitude – 纬度

(4) longitude – 经度

(5) timestamp – 最近一次定位的时间戳,从1970开始

(6) verticalAccuracy – 垂直精度

这些属性,除了timestamp为double外, 其余全为 float 型。
参考链接:https://blog.csdn.net/Superficialtise/article/details/77443980

获取经纬度

    /// <summary>/// 打开定位服务并获取经纬度/// </summary>/// <returns></returns>IEnumerator OpenGps(){if (!Input.location.isEnabledByUser){debug.Log("未获取定位权限", null);GpsFaile?.Invoke(FailCode.DontRoot);GpsFaile = null;yield break;}Input.location.Start(500, 500); //这里精度我设为了500int maxSecend = 5; //5秒钟计时 WaitForSeconds wait = new WaitForSeconds(1);while (Input.location.status == LocationServiceStatus.Initializing&&maxSecend>0){yield return wait;maxSecend--;}if (Input.location.status == LocationServiceStatus.Failed){debug.Log("定位失败",null);yield break;}//注意:这里不能直接访问 Input.location.lastData,检索通过Input.location.lastData,服务无法立即开始发送位置数据。代码应检查Input.location.status当前的服务状态float latitude = Input.location.lastData.latitude; //经度float longitude = Input.location.lastData.longitude;//纬度Input.location.Stop();}

这里需要注意的是Input.location.lastData 服务无法立即开始发送位置数据

百度地图

百度地图平台链接:http://lbsyun.baidu.com/products/products/location
百度地图逆地理编码链接:http://lbsyun.baidu.com/index.php?title=webapi/guide/webservice-geocoding-abroad
首先需要注册并创建应用获取到appkey,然后在unity中请求返回信息,数据为json格式

    /// <summary>/// 从百度地图获取逆地理信息/// </summary>/// <returns></returns>IEnumerator GetInfoFromBaidu(float latitude, float longitude){//这里要注意在手机上请求http是不能获取结果的,所以这里用的是httpsstring baiduUrl= string.Format("https://api.map.baidu.com/reverse_geocoding/v3/?ak={0}&output=json&coordtype=wgs84ll&location={1},{2}", BaiduKey.appKey, latitude, longitude);debug.Log("baiduUrl", baiduUrl);UnityWebRequest webRequest = UnityWebRequest.Get(baiduUrl);yield return webRequest.SendWebRequest();int maxSecond = 20;WaitForSeconds wait = new WaitForSeconds(1);while (webRequest.isDone == false){yield return wait;maxSecond--;}if (maxSecond <= 0){debug.Log("超时", null);yield break;}if (webRequest.isDone&&string.IsNullOrEmpty(webRequest.error)){info = webRequest.downloadHandler.text;yield break;}debug.Log("获取位置失败:", webRequest.error);}

注意:这里请求网址的时候如果是在手机端则需要使用https请求,否则将获取不到结果

Sn校验码的问题

有时候返回sn校验码与服务端校验码不对的时候,在链接里加入sn校验码,sn校验码计算方式

/// <summary>
/// 百度地图sn校验码
/// </summary>
public class AKSNCaculater
{private static string MD5(string password){byte[] textBytes = System.Text.Encoding.UTF8.GetBytes(password);try{System.Security.Cryptography.MD5CryptoServiceProvider cryptHandler;cryptHandler = new System.Security.Cryptography.MD5CryptoServiceProvider();byte[] hash = cryptHandler.ComputeHash(textBytes);string ret = "";foreach (byte a in hash){ret += a.ToString("x");}return ret;}catch{throw;}}private static string UrlEncode(string str){str = System.Web.HttpUtility.UrlEncode(str);byte[] buf = Encoding.ASCII.GetBytes(str);//等同于Encoding.ASCII.GetBytes(str)for (int i = 0; i < buf.Length; i++)if (buf[i] == '%'){if (buf[i + 1] >= 'a') buf[i + 1] -= 32;if (buf[i + 2] >= 'a') buf[i + 2] -= 32;i += 2;}return Encoding.ASCII.GetString(buf);//同上,等同于Encoding.ASCII.GetString(buf)}private static string HttpBuildQuery(IDictionary<string, string> querystring_arrays){StringBuilder sb = new StringBuilder();foreach (var item in querystring_arrays){sb.Append(UrlEncode(item.Key));sb.Append("=");sb.Append(UrlEncode(item.Value));sb.Append("&");}sb.Remove(sb.Length - 1, 1);return sb.ToString();}/// <summary>/// 获取百度地图的校验码/// </summary>/// <param name="ak"></param>/// <param name="sk"></param>/// <param name="url"></param>/// <param name="querystring_arrays"></param>/// <returns></returns>public static string CaculateAKSN(string ak, string sk, string url, IDictionary<string, string> querystring_arrays){var queryString = HttpBuildQuery(querystring_arrays);var str = UrlEncode(url + "?" + queryString + sk);return MD5(str);}
}

Unity GPS定位之逆地理编码(获取经纬度并转换成地理位置)相关推荐

  1. 利用GeoHash实现逆地理编码(经纬度坐标转换行政区划)

    目录 前言 理解GeoHash GeoHash精度 GeoHash特征 GeoHash规律 逆地理编码 实现逆地理编码的基本思路 1.全国范围内6位精度GeoHash计算 2.获取全国范围内区/县/三 ...

  2. python调用百度地图api定位_逆地理编码 rgc 反geo检索 | 百度地图API SDK

    使用方法 如不访问境外POI,走以下服务使用流程 编码说明 API请求中需要用到中文或一些特殊字符的参数,如query.region等,为了避免提交到后台乱码,需要对这几个参数值进行编码处理,转换成U ...

  3. java逆地理编码通过经纬度转换为地理位置(通过百度开发API)

    java通过经纬度获取地理位置信息 先看效果图 百度API接口文档地址 (1)首先需要百度开发者账号创建一个应用得到ak (2)java部分实现 @Component @ConfigurationPr ...

  4. 高德地图的逆地理编码 | 将经纬度坐标转化为对应的地理位置

    官网 地理/逆地理编码-API文档-开发指南-Web服务 API | 高德地图API 官方解释:地理编码/逆地理编码 API 是通过 HTTP/HTTPS 协议访问远程服务的接口,提供结构化地址与经纬 ...

  5. 高德地图API-地理/逆地理编码开发

    1.应用场景 ● 地理编码:将详细的结构化地址转换为高德经纬度坐标.且支持对地标性名胜景区.建筑物名称解析为高德经纬度坐标. 结构化地址举例:北京市朝阳区阜通东大街6号转换后经纬度:116.48088 ...

  6. 调用高德逆地理接口_PHP实现高德地图的地理/逆地理编码

    最近因为项目需求,需要把 酒店地址和 经纬度互相转换,于是就学习使用了高德地图WEB服务端API-地理编码/逆地理编码,下面分享出来. 产品介绍 地理编码/逆地理编码 API 是通过 HTTP/HTT ...

  7. android studio高德地图的显示于定位(附带逆地理编码围栏)

    首先注册高德成为开发者(打开高德地图,点击底部的开发者平台),创建应用,按照要求填写相应信息 网站:http://lbs.amap.com/api/android-sdk/guide/create-p ...

  8. Android高德地图的使用,狠详细!手把手!(地图+定位+逆地理编码+输入提示+Poi搜索)

    最近项目用到高德地图,因此来写一篇文章理一下高德的使用步骤方法,希望对大家有用! ##1.注册+配置 废话不多说,要使用高德地图首先要去高德开放平台注册成为开发者(http://lbs.amap.co ...

  9. 【HMS Core】定位地图服务常见问题,穿戴设备支持、比例尺支持、在非华为手机上逆地理编码的支持?

     1.关于华为HMS-定位服务穿戴设备的支持问题. 想为华为手表开发定位服务相关的app,华为哪些手表支持定位服务,并且定位数据可以提供给开发者.基于华为自己的编译器开发的app,能否打包成apk包提 ...

最新文章

  1. android读取xml 字符串,Android 读取本地Xml文件,并转换成String
  2. 有關window.showModalDialog的應用11/30
  3. boost::msm::mpl_graph::adjacency_list_graph相关的测试程序
  4. 子集和与一个整数相等算法_背包问题的一个变体:如何解决Java中的分区相等子集和问题...
  5. 海洋大数据关键技术及在灾害天气下船舶行为预测上的应用
  6. Linux配置ospf命令,OSPF单区域配置
  7. 程序员经常遇见的9大困难你造么?
  8. 蜂鸣器驱动电路 专为机动车使用
  9. python 京东签到_Python实战—京东用户行为分析
  10. navicat下载安装、连接MySQL数据库操作教程(官网下载)
  11. 如何使用node批量修改文件后缀名
  12. 小米组织架构调整:雷军兼任中国区总裁,王川组建大家电部发力白电市场
  13. 颈部肌肉的锻炼方法?
  14. 微信公众号的三大分类及功能
  15. 我的世界服务器自定义附魔外挂,我的世界怎么用命令方块刷自定义附魔神器
  16. matlab画梯形并平移,matlab 批量处理梯形变形
  17. C#中如何将uint16转为int16
  18. 【Nginx基础知识】
  19. 计算机二级c教程ppt,计算机国家二级C语言教程 第一二章.ppt
  20. windows环境下kafka-console-consumer.bat接受中文乱码问题

热门文章

  1. 三脚架代表人生_如何选择和使用三脚架
  2. 迅雷快车旋风链接转换成普通链接工具
  3. BGP双平面预配实验
  4. 数据中心服务器芯片温度,【DKV】新建数据中心气流——第二部分:入口温度VS服务器性能...
  5. VMware中Linux网络配置VMnet8还原默认配置不成功解决办法(亲测有效)
  6. 学了 Python 能用来做什么?
  7. 骁龙835(MSM8998)芯片数据参考
  8. 区块链笔记 - 1、区块链的来龙去脉
  9. python PyAutoGUI 模拟鼠标键盘操作和截屏
  10. 微信小程序使用 checkbox 如何修改样式?