Google Map Tiles API を使用してタイルを表示する

[緯度,経度およびZoomからOpenStreetMapのタイルを得る](https://qiita.com/ELIXIR/items/c4e12345b3eeafbd4b93)
ではURLのみでマップタイルを表示できましたが、
[googleMapTilesAPI](https://developers.google.com/maps/documentation/tile?hl=ja)はURLのみではタイルを表示できないようです。

なお、現時点では

::: note warn
Map Tiles API は現在プレビュー版（pre-GA）です。一般提供前のプロダクトと機能では、サポートが制限されることがあります。また、一般提供前のプロダクトや機能の変更は、他の一般提供前のバージョンと互換性がない場合があります。pre-GA のサービスには、Google Maps Platform Service Specific Terms が適用されます。詳細については、リリース ステージの説明をご覧ください。
:::

となっています。

まずは結果から
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/372ba2e3-5419-cf6f-b756-dcdfbd654fd1.png)

[説明](https://developers.google.com/maps/documentation/tile/session_tokens?hl=ja)にあるように、
```
curl -X POST -d '{
  "mapType": "roadmap",
  "language": "en-US",
  "region": "US"
}' \
-H 'Content-Type: application/json' \
"https://tile.googleapis.com/v1/createSession?key=YOUR_API_KEY"
```
でセッションをリクエストすると

```
{
  "session": "AJVsH2yTmy--bfUBuiOr6pogD3Bac6aNwqiHdV151e-...  ...",
  "expiry": "1706288086",
  "tileWidth": 256,
  "imageFormat": "png",
  "tileHeight": 256
}
```
のような結果が返ってきます。この
```AJVsH2yTmy--bfUBuiOr6pogD3Bac6aNwqiHdV151e-...  ...```
の部分を、
```
curl "https://tile.googleapis.com/v1/2dtiles/z/x/y?session=YOUR_SESSION_TOKEN&key=YOUR_API_KEY&orientation=0_or_90_or_180_or_270"
```
の```YOUR_SESSION_TOKEN```に入れてあげると、冒頭部で示した画像が返ってきます。
/z/x/yに表示したいタイル番号を手に入れるためには
[緯度,経度およびZoomからOpenStreetMapのタイルを得る](https://qiita.com/ELIXIR/items/c4e12345b3eeafbd4b93)
が便利です（２回目）




<details><summary>コードはこちら</summary>

```c#:Google2DTilesTest.cs
using System.Collections;
using System.Collections.Generic;
using System.Net;
using System.Text;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.Networking;

namespace GoogleMapTilesTest
{
    public class Google2DTilesTest : MonoBehaviour
    {
        [SerializeField] RawImage image;
        [SerializeField] Vector3Int pos = new Vector3Int(909, 403, 10);
        private string sessionUrl = "https://tile.googleapis.com/v1/createSession";
        private string tileUrl = "https://tile.googleapis.com/v1/2dtiles/{2}/{0}/{1}";
        [SerializeField] private string apiKey = "[YOUR_API_KEY]";

        class Google2DTilesSession
        {
            public string session;
            public string expiry;
            public string imageFormat;
            public int tileWidth;
            public int tileHeight;
        }

        // Start is called before the first frame update
        async void Start()
        {
            string json = "{\"mapType\":\"roadmap\",\"language\":\"en-US\",\"region\":\"US\"}";
            byte[] bodyRaw = Encoding.UTF8.GetBytes(json);
            UploadHandlerRaw uploadHandler = new UploadHandlerRaw(bodyRaw);
            DownloadHandler downloadHandler = new DownloadHandlerBuffer();
            UnityWebRequest request = new UnityWebRequest(sessionUrl + "?key=" + apiKey, UnityWebRequest.kHttpVerbPOST);
            request.SetRequestHeader("ContentType", "application/json");
            request.uploadHandler = uploadHandler;
            request.downloadHandler = downloadHandler;
            await request.SendWebRequest();
            string retJson = request.downloadHandler.text;
            Debug.Log(retJson);

            Google2DTilesSession sessionObj = JsonUtility.FromJson<Google2DTilesSession>(retJson);
            var sessionID = sessionObj.session;
            //Debug.Log(sessionID);
            request.Dispose();

            string uri = string.Format(tileUrl, pos.x, pos.y, pos.z) + string.Format("?session={0}&key={1}", sessionID, apiKey);
            //Debug.Log(uri);

            UnityWebRequest texRequest = UnityWebRequest.Get(uri);
            await texRequest.SendWebRequest();
            var res = texRequest.result;
            if (res == UnityWebRequest.Result.ConnectionError)
            {
                Debug.Log(texRequest.error);
            }
            else
            {
                Texture2D tex = new Texture2D(2, 2);
                tex.LoadImage(texRequest.downloadHandler.data);
                image.texture = tex;
            }
            texRequest.Dispose();
            Debug.Log("done:" + res);
        }

        // Update is called once per frame
        void Update()
        {

        }
    }
}
```
</details>