使用する地図を切り替える
C1Mapsが通常使用する地図はBing Mapsですが、これを他の地図に切り替えることもできます。
C1Mapsでは、巨大な地図画像を例えば256ピクセルx256ピクセルの小さなタイルに分割しておき、描画に必要な箇所のタイルだけを読み込むことでスムーズな地図描画を実現しています。このタイルを読み込む部分がC1MultiScaleTileSourceのGetTileLayersメソッドになります。
このGetTileLayersメソッドをオーバーライドして、本来のBing MapsではなくOpenStreetMapの画像を渡すようにすれば地図を切り替えることができます。具体的には、C1MapsのSourceプロパティにGetTileLayersメソッドをオーバーライドしたC1MultiScaleTileSourceを設定することになります。
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を呼び出してタイルを取得します。
まとめ
ComponentOne Studioの地図コンポーネントが通常利用している地図は、本文中でも触れていますがBing Mapsです。しかし、Bing Maps SDKは使っていないため、プラットフォームに「Any CPU」が指定できます。これはBing Maps SDKが内部的にC++のモジュールを使っているがためにプラットフォームを明示的に指定しなければならないのとは対照的に、ComponentOne Studioの地図コンポーネントがとてもWindowsストアアプリにフィットした実装になっているともいえるでしょう。
またBing Maps SDKでも可能なのですが、ComponentOne Studioの地図コンポーネントが使用する地図を切り替えられることも、より日本に即した地図を選択することでアプリの見やすさを向上できるなど、幅広く応用が効きます。
標準の方法があるけれど、それを置き換えて機能アップするという市販コンポーネントを選択する利点をぜひ体験してみてください。