SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

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

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

  • X ポスト
  • このエントリーをはてなブックマークに追加

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

 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の地図コンポーネントが使用する地図を切り替えられることも、より日本に即した地図を選択することでアプリの見やすさを向上できるなど、幅広く応用が効きます。

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

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
現役エンジニア直伝! 「現場」で使えるコンポーネント活用術(ComponentOne Studio)連載記事一覧

もっと読む

この記事の著者

初音玲(ハツネアキラ)

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

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/8188 2014/11/07 15:23

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング