質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

2回答

2564閲覧

[Unity] GoogleMapをUnity上で表示する方法

amber_snob

総合スコア30

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

1グッド

0クリップ

投稿2019/08/05 14:34

編集2019/08/08 08:43

現在オライリー・ジャパンの書籍"UnityによるARゲーム開発"を参考にしてゲーム開発しています。

問題

画像1
上の画面では、Planeを配置してアッタチしたGoogleMapTilesからgoogleマップを表示させようとしているのですがうまくいきません。

画像2
(正常に動作すればこのようにPlaneにgoogleマップが表示されます。)

エラーの内容

画像3
一つ目はgoogleマップへの画像リクエストのクエリの表示で、

Tile 0x0 requested with

center=37.62815,-122.4265 // リクエストする地図の中心の座標の緯度と経度
&zoom=15 // 地図のズームレベル
&size=640x640 // リクエストされた画像の画素サイズ
&scale=2
&maptype=roadmap // 地図の種類(この場合は道など)
&format=png // 取得する画像の形式
&style=element:geometry|invert_lightness:true|weight:3.1|hue:0x00ffd5
&style=element:labels|visibility:off&sensor=false

二つはエラーになります。
表示する画像にエラーがあった時に表示される文章のようです。

Error loading tile 0x0: exception=HTTP/1.1 403 Forbidden

UnityEngine.MonoBehaviour:print(Object)
packt.FoodyGO.Mapping.<_RefreshMapTile>d__16:MoveNext() (at Assets/FoodyGo/Scripts/Mapping/GoogleMapTile.cs:123)
UnityEngine.SetupCoroutine:InvokeMoveNext(IEnumerator, IntPtr)

"HTTP/1.1 403 Forbidden"はクライアントエラーレスポンスコードで、サーバーがリクエストを理解したものの、認証が拒否されたことを示しているようなので、APIの取得に失敗している可能性があります。

また、他の座標を示しても結果は変わりませんでした。

詳しい方がいらっしゃいましたら、エラーの解決法を教えていただきたいです。

ソースコード

ソースコード(PlaneにアタッチしているGoogleMapTlle.csなど)は以下のリンクから手に入ります。
Chapter2.unitypackage

C#

1using UnityEngine; 2using UnityEngine.Networking; 3using System.Collections; 4using packt.FoodyGo.Mapping; 5using packt.FoodyGo.Services; 6 7namespace packt.FoodyGO.Mapping 8{ 9 [AddComponentMenu("Mapping/GoogleMapTile")] 10 public class GoogleMapTile : MonoBehaviour 11 { 12 public enum MapType 13 { 14 RoadMap, 15 Satellite, 16 Terrain, 17 Hybrid 18 } 19 20 //Google Maps API Staticmap URL 21 private const string GOOGLE_MAPS_URL = "https://maps.googleapis.com/maps/api/staticmap"; 22 23 [Header("Map Settings")] 24 [Range(1,20)] 25 [Tooltip("Zoom Level, 1=global - 20=house")] 26 public int zoomLevel = 1; 27 [Tooltip("Type of map, Road, Satellite, Terrain or Hybrid")] 28 public MapType mapType = MapType.RoadMap; 29 [Range(64,1024)] 30 [Tooltip("Size in pixels of the map image")] 31 public int size = 640; 32 [Tooltip("Double the pixel resolution of the image returned")] 33 public bool doubleResolution = true; 34 35 public MapLocation worldCenterLocation; 36 37 [Header("Tile Settings")] 38 [Tooltip("Sets the tiles position in tile units")] 39 public Vector2 TileOffset; 40 [Tooltip("Calculated tile center")] 41 public MapLocation tileCenterLocation; 42 [Tooltip("Calculated tile corners")] 43 public Vector2 TopLeftCorner; 44 public Vector2 BottomRightCorner; 45 46 [Header("GPS Settings")] 47 [Tooltip("GPS service used to locate world center")] 48 public GPSLocationService gpsLocationService; 49 private double lastGPSUpdate; 50 51 // Use this for initialization 52 void Start () 53 { 54 RefreshMapTile (); 55 } 56 57 // Update is called once per frame 58 void Update () 59 { 60 // 新しい位置が取得されたかどうかを確認する 61 if (gpsLocationService != null && 62 gpsLocationService.IsServiceStarted && 63 lastGPSUpdate < gpsLocationService.Timestamp) 64 { 65 lastGPSUpdate = gpsLocationService.Timestamp; 66 worldCenterLocation.Latitude = gpsLocationService.Latitude; 67 worldCenterLocation.Longitude = gpsLocationService.Longitude; 68 print("GoogleMapTile refreshing map texture"); 69 RefreshMapTile(); 70 } 71 } 72 73 public void RefreshMapTile() { 74 75 StartCoroutine(_RefreshMapTile()); 76 } 77 78 IEnumerator _RefreshMapTile () 79 { 80 // タイル中心の緯度/経度を取得 81 tileCenterLocation.Latitude = GoogleMapUtils.adjustLatByPixels(worldCenterLocation.Latitude, (int)(size * 1 * TileOffset.y), zoomLevel); 82 tileCenterLocation.Longitude = GoogleMapUtils.adjustLonByPixels(worldCenterLocation.Longitude, (int)(size * 1 * TileOffset.x), zoomLevel); 83 84 var url = GOOGLE_MAPS_URL; 85 var queryString = ""; 86 87 // 地図タイルをリクエストするクエリ文字列パラメーターを作成する 88 queryString += "center=" + WWW.UnEscapeURL (string.Format ("{0},{1}", tileCenterLocation.Latitude, tileCenterLocation.Longitude)); 89 queryString += "&zoom=" + zoomLevel.ToString (); 90 queryString += "&size=" + WWW.UnEscapeURL (string.Format ("{0}x{0}", size)); 91 queryString += "&scale=" + (doubleResolution ? "2" : "1"); 92 queryString += "&maptype=" + mapType.ToString ().ToLower (); 93 queryString += "&format=" + "png"; 94 95 // 地図のスタイルを追加する 96 queryString += "&style=element:geometry|invert_lightness:true|weight:3.1|hue:0x00ffd5"; 97 queryString += "&style=element:labels|visibility:off"; 98 99 var usingSensor = false; 100#if MOBILE_INPUT 101 usingSensor = Input.location.isEnabledByUser && Input.location.status == LocationServiceStatus.Running; 102#endif 103 104 queryString += "&sensor=" + (usingSensor ? "true" : "false"); 105 106 //set map bounds rect 107 TopLeftCorner.x = GoogleMapUtils.adjustLonByPixels(tileCenterLocation.Longitude, -size, zoomLevel); 108 TopLeftCorner.y = GoogleMapUtils.adjustLatByPixels(tileCenterLocation.Latitude, size, zoomLevel); 109 110 BottomRightCorner.x = GoogleMapUtils.adjustLonByPixels(tileCenterLocation.Longitude, size, zoomLevel); 111 BottomRightCorner.y = GoogleMapUtils.adjustLatByPixels(tileCenterLocation.Latitude, -size, zoomLevel); 112 113 print(string.Format("Tile {0}x{1} requested with {2}", TileOffset.x, TileOffset.y, queryString)); 114 115 // 最後に、画像をリクエストする 116 var req = UnityWebRequestTexture.GetTexture(GOOGLE_MAPS_URL + "?" + queryString); //obsolute 117 // サービスが応答するまで待つ 118 yield return req.Send(); 119 // 最初に古いテクスチャーを破棄する 120 Destroy(GetComponent<Renderer>().material.mainTexture); 121 // エラーをチェックする 122 if (req.error != null) { 123 print (string.Format ("Error loading tile {0}x{1}: exception={2}", 124 TileOffset.x, TileOffset.y, req.error)); 125 } else { 126 // レンダリング画像がエラーがなければ戻ってきた画像をタイルテクスチャーとして設定する 127 GetComponent<Renderer> ().material.mainTexture = ((DownloadHandlerTexture)req.downloadHandler).texture; 128 print (string.Format ("Tile {0}x{1} textured", TileOffset.x, TileOffset.y)); 129 } 130 } 131 } 132} 133

追記

<追記1>
「UnityによるARゲーム開発 」(O’Reillyの書籍 日本語訳バージョン)
上記のサイトを拝見したのですが、課金しないとGoogleMapのAPIは使えないのでしょうか...?

<追記2>
イメージ説明
API取得画面はこんな感じです。

<追記3>
イメージ説明
MapsStaticAPIを有効にしてAPIキーをクエリに追加することでWeb上で画像を表示できました。

renshira_82👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

クエリをWebブラウザで直接実行してみたところ、このような文が表示されました。

The Google Maps Platform server rejected your request. You must use an API key to authenticate each request to Google Maps Platform APIs. For additional information, please refer to http://g.co/dev/maps-no-account

APIKeyがないとGoogleMapsのAPIは使えないよ、詳しくはhttp://g.co/dev/maps-no-accountを参照してね、との趣旨のことが書いてありますので、URL先のページを参考にしつつ、APIKeyの取得を行って見てはどうでしょうか?

追記
GoogleCloudPlatformから
Maps Static APIを有効化し、認証情報からAPIKeyを発行し、クエリに&key=APIKeyの形式で追加したところ、実際に画像を取得することができました。イメージ説明

追記
APIキーの取得画面ですが、このような画面となっています。
イメージ説明

投稿2019/08/05 18:26

編集2019/08/06 09:20
Ram.Type-0

総合スコア424

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

amber_snob

2019/08/06 08:06 編集

返信ありがとうございます。 https://developers.google.com/maps/documentation/maps-static/get-api-key?hl=ja&authuser=0 を参考にしてAPIキーを習得して、クエリに&key="MY KEY"を追加したのですが、 >The Google Maps Platform server rejected your request. This API project is not authorized to use this API.(Google Maps Platformサーバーはリクエストを拒否しました。このAPIプロジェクトは、このAPIの使用を許可されていません。) とエラーが出ました。
Ram.Type-0

2019/08/06 08:49

追記に実際に取得してみた例を記載しましたが、取得したAPIキーは Maps Static API ですか? Maps系のAPIはいっぱいあるので、類似した他のAPIキーを取得していないかどうか、確認してみてください。
amber_snob

2019/08/06 09:12 編集

何度も返信ありがとうございます???? googleマップの表示に成功されているようですね。 Maps Static APIでした!質問の追記2でAPI取得の画面を追記したのですが、これと同じ画面でしょうか?
Ram.Type-0

2019/08/06 09:22

それはそのプロジェクトに割り当てられたAPIキーの画面ですね。 どうやらAPIキーがプロジェクトに対して発行され、 プロジェクトに対してAPIを有効化すると、 プロジェクトのAPIキーを用いてそのプロジェクトで有効なAPIを利用できるようになっているようです。
amber_snob

2019/08/07 07:15 編集

ありがとうございます。 GoogleCloudPlatformからMapsStaticAPIを有効にして発行されたAPIキーをクエリに追加したところweb上でGoogleマップを表示できました(追記3)が、Unity上では同じエラーがでてしまいました。
Ram.Type-0

2019/08/07 11:38

403 forbidden以外のエラーメッセージは表示されませんか? ブラウザで見られる詳細なエラーメッセージがUnityでも取得できれば原因究明に繋がるのですが…
amber_snob

2019/08/07 14:44

それ以外はないですね... もしかしてGoogleCloudPlatformとunityを紐づける必要があるんでしょうか...?
Ram.Type-0

2019/08/08 00:24

APIキーの制限をかけているならその可能性もありますが… GetTextureの代わりにGetTextなどでメッセージが取得できませんか?
amber_snob

2019/08/08 07:32

UnityWebRequest.Get(string url)を試したのですが、結局同じくHTTP/1.1 403 Forbiddenでした。。
Ram.Type-0

2019/08/08 10:14

Unityに組み込めるWebブラウザーのアセットなどはありますか?そちらだとどうでしょう?
amber_snob

2019/08/10 07:19 編集

返信遅れてすみません???? GoogleMapからデータを取得するのは審査が必要なので難しいです。 調べたところ、AROW(https://arow.world/ja/)というマップデータと3Dモデルを提供してくれる開発者支援ツールを使って解決できそうです。 色々教えて下さりありがとうございました! APIを使ってGoogleMapをweb上で表示できましたし、ベストアンサーとさせていただきます。
Ram.Type-0

2019/08/11 04:34

解決できたそうで良かったです!
guest

0

こちらを参考にしてみてください(^ ^)
UnityでGoogleMapを表示する方法

投稿2019/08/08 07:46

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問