在 Unity 中使用 GPS 和 Google Maps API

您好,
我是系统开发部(原横滨办事处)的松山先生。

距离我上次发帖已经有一段时间了。
我暂时放下AR项目,这次我想写一些关于GPS功能和谷歌地图的文章。
我们来尝试做个类似这样的东西。

做什么

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

获取位置信息

首先,关于位置信息,可以使用 LocationService 类获取。
(参考:LocationService)

首先,我们来更新位置信息。
同时,我们也启用指南针功能。
(参考指南针)

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

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

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

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

顺便提一下,请注意,如果您未在项目设置中设置位置使用说明,
则将无法获取实际设备上的位置信息!

可以使用 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);

就这样。

成品长这样。

概括

今天就先简单说说,就到这里吧。
以下是我的一些总体印象:
• Google Maps API 功能丰富,值得好好研究一下。
• GPS 误差相当大。
• 对于这种程度的误差,代码可以做得比较简单。

我们已经介绍了增强现实和地图(GPS),所以下次或许可以尝试将它们结合起来,创造出一些东西。
今天就到这里。

我把它上传到 GitHub 以防万一。Unity
示例

最后

我已推出“SEKARAKU Lab”,这是我所属系统开发公司的服务网站。Beyond
提供从服务器设计、构建到运维的一站式服务,如果您在服务器端开发方面遇到任何问题,欢迎随时联系我们。SEKARAKU
Lab:[https://sekarakulab.beyondjapan.com/](https://sekarakulab.beyondjapan.com/)

如果您觉得这篇文章对您有帮助,请点个“赞”!
1
加载中...
1票,平均分:1.00/11
8,925
X Facebook Hatena书签 口袋

这篇文章的作者

关于作者

松山健翔

我曾在一家游戏开发公司工作多年,负责编程和项目管理等工作。
2019年,我加入Beyond Inc.,在横滨办公室工作。
我主要负责服务器端开发的项目管理(偶尔也参与编程)。
我的爱好是公路自行车赛和观看赛马。