在 Unity 中使用 GPS 和 Google Maps API

感谢你们的辛勤工作。
我是来自横滨办公室的松山,现在是系统开发部的员工。

距离我上次发帖已经有一段时间了。
我暂时放下增强现实(AR)的话题,来聊聊GPS功能和谷歌地图。
我们来尝试做个类似这样的东西。

做什么

- 使用 GPS 获取您的当前位置
- 显示以该位置为中心的地图图像
- 如果您正在移动,则定期更新地图
- 在地图上的当前位置显示图标

获取位置信息

首先,可以使用 LocationService 类获取位置信息。
参考 LocationService

首先,开始更新您的位置。
同时,启用指南针功能。
参考指南针

输入.location.Start(); 输入.compass.enabled = true;

由于在程序启动之前无法获取信息,因此将等待以下判决。

// 如果用户未启用 GPS,则不允许使用 GPS;否则,跳出循环;// 等待直到服务状态为“正在运行”;当输入位置状态不等于 LocationServiceStatus.Running 时,返回 null;

如果不允许使用 GPS,那就没办法了,但以防万一。

另外,请注意,如果您未在 ProjectSettings 中设置位置使用说明,
则无法在实际设备上获取位置信息!

可以使用 LocationService 的 lastData 查看位置信息(纬度和经度)。

LocationInfo curr = Input.location.lastData;

获取到当前位置(纬度和经度)后,即可根据这些坐标获取地图图像。

地图显示

要使用谷歌地图,您必须先注册谷歌地图平台。(无需解释。)
谷歌地图平台官方网站

如果您想显示简单的地图图像,可以使用 Google 静态地图 API,该 API
将检索以您当前位置为中心的图像,该位置是通过 GPS 获取的。

① 在URL中指定参数

// 基本 URL 字符串 url = @"https://maps.googleapis.com/maps/api/staticmap?"; // 中心坐标 url += "center=" + curr.latitude + "," + curr.longitude; // 缩放比例 url += "&zoom=" + 18; // 默认值为 0,请将其设置为合适的大小。 // 图片大小(最大 640x640) url += "&size=" + 640 + "x" + 640; // API 密钥(由 Google Maps Platform 颁发的密钥) url += "&key=" + GoogleApiKey;

② 使用 UnityWebRequest 下载地图图像

url = UnityWebRequest.UnEscapeURL(url); UnityWebRequest req = UnityWebRequestTexture.GetTexture(url); yield return req.SendWebRequest();

③ 将下载的图像显示为精灵图

// 创建纹理。Texture2D tex = new Texture2D(MapSpriteSize, MapSpriteSize); tex.LoadImage(data); // 动态创建精灵(实例)。mapImage.sprite = Sprite.Create(tex, new Rect(0, 0, tex.width, tex.height), Vector2.zero);

然后,
我们用协程运行这个过程,定期更新地图。
无需一直更新地图,因此只有当坐标相对于先前坐标移动了一定距离时,我们才会更新地图。
距离的计算方式如下:

///<summary> /// 纬度(经度)1 度的距离(米)///</summary> private const float Lat2Meter = 111319.491f; private float getDistanceFromLocation(LocationInfo curr, LocationInfo prev) { Vector3 cv = new Vector3((float)curr.longitude, 0, (float)curr.latitude); Vector3 pv = new Vector3((float)prev.longitude, 0, (float)prev.latitude); return Vector3.Distance(cv, pv) * Lat2Meter; }

将光标置于当前位置

将光标放在地图上,旋转光标使其朝向你所面对的方向。

this.transform.localEulerAngles = new Vector3(0, 0, 360 - Input.compass.trueHeading);

就这样。

成品长这样。

概括

这件事最终变得比较简单,我就先总结一下吧。以下
是我的一些想法:
・谷歌地图API的功能非常丰富,所以尝试使用它应该会很有意思。
・GPS误差相当大。
・如果误差只有这么多,代码可以写得非常简单。

既然我们已经有了增强现实和地图(GPS),下次我们不妨尝试将它们结合起来,创造一些东西。
今天就到这里。

我会把它上传到 GitHub。Unity
示例

最后

我开设了我所属的系统开发服务网站“SEKARAKU Lab”。
Beyond是从服务器设计搭建到运营的一站式服务,所以如果您在服务器端开发方面遇到任何问题,请随时联系我们。
SEKARAKU 实验室: [https://sekarakulab.beyondjapan.com/](https://sekarakulab.beyondjapan.com/)

如果您觉得这篇文章有帮助,请点赞!
1
加载中...
1 票,平均:1.00 / 11
8,783
X Facebook 哈特纳书签 口袋

写这篇文章的人

关于作者

松山贤章

他长期在一家游戏开发公司工作,从事程序和项目管理工作。
2019年加入超越株式会社。
在横滨办事处工作。 主要负责服务器端开发工作的项目管理。
(有时编程)我的爱好是骑自行车(公路赛车)和观看赛马。