使用する地図を切り替える
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の地図コンポーネントが使用する地図を切り替えられることも、より日本に即した地図を選択することでアプリの見やすさを向上できるなど、幅広く応用が効きます。
標準の方法があるけれど、それを置き換えて機能アップするという市販コンポーネントを選択する利点をぜひ体験してみてください。

