夜風のMixedReality

xRと出会って変わった人生と出会った技術を書き残すためのGeekなHoloRangerの居場所

Microsoft Map-SDK for Unity その5 Map Services Example

本日はツールの調査枠です。

MicrosoftからはMixedRealityToolkit以外にも多くの開発者向けのSDKが公開されています。

 その一例として[Microsoft Map-SDK for Unity(以下Map-SDK)]を調査しています。

 第一回ではMap-SDKを導入しました。

redhologerbera.hatenablog.com

 第二回からExamplesを読み解いています。

〇Exampleを読み解く

Map-SDKにはExamplesとしてサンプルシーンが同梱されており、Map-SDKを用いたデモを体験できます。

f:id:Holomoto-Sumire:20200830164000j:plain

各シーンごとに[Map]オブジェクト内の[Map Session]コンポーネントの[Developer Key]を入力する必要があります。

この[Developer Key]はその1の導入の記事で紹介しています。

redhologerbera.hatenablog.com

前回の記事では[City Tour]を見ていきました。

redhologerbera.hatenablog.com

[City Tour]では立体的なマップを使ってシアトルの各所を巡る旅を体験できます。

その2では[HubExample]を見ていきました。

redhologerbera.hatenablog.com

[HubExample]では航空写真と地図の表示の切り替え、気象データの表示、ジェスチャーを用いての地図のスクロールを見ることができます。

その3では[MapPinExample]を調査しました。

redhologerbera.hatenablog.com

これはcsvファイルからマップ上の座標に沿ってピン止めされます。

今回は[Map Services Example]を調査します。

〇Map Services Example

f:id:Holomoto-Sumire:20200909081240j:plain

このサンプルでは地図上をAirTapすることでその場所の住所情報が表示されます。

f:id:Holomoto-Sumire:20200909082027g:plain

この地図上をAirTapした時のイベントを起こすコンポーネントは[pointerHandler]コンポーネントです。

f:id:Holomoto-Sumire:20200909082420j:plain

[PointerHandler]コンポーネントは[Map-SDK for Unity]で提供されているものではなくMRTKで提供されているコンポーネントです。

HandRayのカーソルに対してのイベントを発火させます。シーンではAirTapした際に発火する[On Pointer Clikced()]イベントに[Map.ReverseGeocodeOnClick.OnMapClick]が指定されています。

f:id:Holomoto-Sumire:20200909083516j:plain

[ReverseGeocodeOnClick]コンポーネントは指定した場所から逆ジオコーディングされた各場所の住所をピン止めします。

f:id:Holomoto-Sumire:20200909082943j:plain

逆ジオコーディングとは位置座標から住所や地名を割り出すことです。

[OnMapClick()]は次のように実装されています。

  public async void OnMapClick(MixedRealityPointerEventData mixedRealityPointerEventData)
    {
        if (ReferenceEquals(MapSession.Current, null) || string.IsNullOrEmpty(MapSession.Current.DeveloperKey))
        {
            Debug.LogError(
                "Provide a Bing Maps key to use the map services. " +
                "This key can be set on a MapSession component.");
            return;
        }

        var focusProvider = CoreServices.InputSystem.FocusProvider;
        if (focusProvider.TryGetFocusDetails(mixedRealityPointerEventData.Pointer, out var focusDetails))
        {
            var location = _mapRenderer.TransformWorldPointToLatLon(focusDetails.Point);
            var finderResult = await MapLocationFinder.FindLocationsAt(location);

            string formattedAddressString = null;
            if (finderResult.Locations.Count > 0)
            {
                formattedAddressString = finderResult.Locations[0].Address.FormattedAddress;
            }

            if (_mapPinPrefab != null)
            {
                // Create a new MapPin instance, using the location of the focus details.
                var newMapPin = Instantiate(_mapPinPrefab);
                newMapPin.Location = location;
                var textMesh = newMapPin.GetComponentInChildren<TextMeshPro>();
                textMesh.text = formattedAddressString ?? "No address found.";

                _mapPinLayer.MapPins.Add(newMapPin);
            }
        }
        else
        {
            // Unexpected.
            Debug.LogWarning("Unable to get FocusDetails from Pointer.");
        }
    }

[MixedRealityPointerEventData mixedRealityPointerEventData]にはクリックした際のポインター情報が渡されます。

前回のMapPinExample同様座標データがピンとして表示されます。

redhologerbera.hatenablog.com

これは地図上のあらゆる点から取得でき、東京のデータも取得できます。

f:id:Holomoto-Sumire:20200909085648j:plain

しかし文字化けしてしまっています。 これはTextMeshProのフォントが日本語に対応していないからです。

日本語に変更するか英語表記に変更するかの2種類の解決法があるのですが、今回は後者を実行します。

[MapSession]には使用言語を指定できますが、デフォルトではオートで日本語が指定されるようになっています。

f:id:Holomoto-Sumire:20200909090044j:plain

[AutoDetectLanglage]のチェックボックスからチェックを外し言語を[English]に変更します。

f:id:Holomoto-Sumire:20200909090246j:plain

これで文字化けが解消されました。

f:id:Holomoto-Sumire:20200909090505j:plain

以上がMapServices Exampleです。