CodeZine(コードジン)

特集ページ一覧

Bing Mapsよりも使いやすい? ComponentOne Studioの地図コンポーネントでストアアプリを作ろう

  • ブックマーク
  • LINEで送る
  • このエントリーをはてなブックマークに追加
2014/10/20 14:00
目次

使用する地図を切り替える

 C1Mapsが通常使用する地図はBing Mapsですが、これを他の地図に切り替えることもできます。

 C1Mapsでは、巨大な地図画像を例えば256ピクセルx256ピクセルの小さなタイルに分割しておき、描画に必要な箇所のタイルだけを読み込むことでスムーズな地図描画を実現しています。このタイルを読み込む部分がC1MultiScaleTileSourceのGetTileLayersメソッドになります。

 このGetTileLayersメソッドをオーバーライドして、本来のBing MapsではなくOpenStreetMapの画像を渡すようにすれば地図を切り替えることができます。具体的には、C1MapsのSourceプロパティにGetTileLayersメソッドをオーバーライドしたC1MultiScaleTileSourceを設定することになります。

リスト4 MainPage.xaml.vb
Namespace Views
    Public NotInheritable Class MainPage
        Inherits Page

        :
     (中略)
        :

        Private Async Sub NavigationHelper_LoadState(sender As Object, e As Common.LoadStateEventArgs)
            Try
                Await App.MainVM.GetItems("愛知県", "豊田市")
                Me.C1Maps1.Source = New OfflineMapsSource
                SetCenterPos()
                Me.C1Maps1.Zoom -= 1
                Me.C1Maps1.Zoom += 1
            Catch ex As Exception

            End Try

        End Sub

        :
     (中略)
        :

        Public Class OfflineMapsSource
            Inherits C1.Xaml.Maps.C1MultiScaleTileSource

            Private Const uriFormat As String = "http://a.tile.openstreetmap.org/{Z}/{X}/{Y}.png"

            Sub New()
                MyBase.New(&H8000000, &H8000000, &H100, &H100, 0)
            End Sub

            Protected Overrides Sub GetTileLayers(tileLevel As Integer,
                                                    tilePositionX As Integer,
                                                    tilePositionY As Integer,
                                                    tileImageLayerSources As IList(Of Object))
                If (tileLevel > 8) Then
                    Dim zoom = tileLevel - 8
                    Dim Uri = uriFormat
                    Uri = Uri.Replace("{X}", tilePositionX.ToString())
                    Uri = Uri.Replace("{Y}", tilePositionY.ToString())
                    Uri = Uri.Replace("{Z}", zoom.ToString())
                    tileImageLayerSources.Add(New Uri(Uri))
                End If
            End Sub
        End Class
    End Class
End Namespace

 GetTileLayersはタイルが必要になった時に呼び出されるので、その中でa.tile.openstreetmap.orgを呼び出してタイルを取得します。

図6 サンプル実行
図6 サンプル実行

まとめ

 ComponentOne Studioの地図コンポーネントが通常利用している地図は、本文中でも触れていますがBing Mapsです。しかし、Bing Maps SDKは使っていないため、プラットフォームに「Any CPU」が指定できます。これはBing Maps SDKが内部的にC++のモジュールを使っているがためにプラットフォームを明示的に指定しなければならないのとは対照的に、ComponentOne Studioの地図コンポーネントがとてもWindowsストアアプリにフィットした実装になっているともいえるでしょう。

 またBing Maps SDKでも可能なのですが、ComponentOne Studioの地図コンポーネントが使用する地図を切り替えられることも、より日本に即した地図を選択することでアプリの見やすさを向上できるなど、幅広く応用が効きます。

 標準の方法があるけれど、それを置き換えて機能アップするという市販コンポーネントを選択する利点をぜひ体験してみてください。



  • ブックマーク
  • LINEで送る
  • このエントリーをはてなブックマークに追加

著者プロフィール

  • 初音玲(ハツネアキラ)

     国内SIerのSEでパッケージ製品開発を主に行っており、最近は、空間認識や音声認識などを応用した製品を手掛けています。  個人的には、仕事の内容をさらに拡張したHoloLensなどのMRを中心に活動しています。  Microsoft MVP for Windows Development...

バックナンバー

連載:現役エンジニア直伝! 「現場」で使えるコンポーネント活用術(ComponentOne Studio)

もっと読む

All contents copyright © 2005-2020 Shoeisha Co., Ltd. All rights reserved. ver.1.5