Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Mapsuiで地図表示

 Mapsuiで地図表示

2024/12/21(土)に開催された .NET Conf2024 .NETラボ 勉強会 2024年12月( https://dotnetlab.connpass.com/event/333400/ ) に参加した時に当日受付LTで発表した資料です。 #dotnetlab

なかしょ

December 21, 2024
Tweet

More Decks by なかしょ

Other Decks in Technology

Transcript

  1. 自己紹介 • なかしょ(中島進也) @nakasho_dev • 所属:NTTテクノクロス株式会社 デジタルトランスフォーメーション事業部 • 業務:MaaS関連のスマートフォンアプリ開発担当 •

    趣味: ➢妻とモンハンデート ➢IT関連の勉強会(主にモバイル系 or アジャイル系) ➢技術コミュニティの運営スタッフ ✓eXtreme Programming Japan User Group(XPJUG) 2019〜 ✓TDD BootCamp Online (TDDBC) 2020~ ※本資料は私個人の意見であり、所属企業・部門見解を代表するものではありません。
  2. MAUIでの地図表示 4 • Maui Maps(Maui 公式の地図機能) ➢https://learn.microsoft.com/ja-jp/dotnet/maui/user-interface/controls/map • ArcGIS Maps

    SDK for .NET ➢https://www.esrij.com/products/arcgis-maps-sdk-for-dotnet/ • ThinkGeo Mobile Maps ➢https://thinkgeo.com/mobile-maps • Ignite UI for Blazor Map ➢https://jp.infragistics.com/products/ignite-ui- blazor/blazor/components/geo-map • Mapbox SDK for .NET MAUI ➢https://github.com/tuyen-vuduc/mapbox-maui • MapsUI ➢https://github.com/Mapsui/Mapsui .NET9 に対応 .NET9 に対応
  3. Mapsui 6 • 様々な.NETのフレームワークに対応したMapコンポーネント ➢MAUI, WPF, Avalonia, Uno, Blazor, WinUI,

    Eto, .NET Android and .NET iOS • OpenStreeetMapの表示に対応 • SkiaSharpにより地図描画を実現 • NetTopologySuiteによる2次元線形ジオメトリをサポート • BruTileによるタイルサービスへのアクセスをサポート ➢OpenStreetMaps以外のタイルサービスにも対応可能
  4. internal static class AzureMap { public static IPersistentCache<byte[]>? DefaultCache; private

    static readonly BruTile.Attribution _azureMapsAttribution = new( //著作権情報を設定 “© TomTom”, “https://www.tomtom.com/legal/en_us/copyrights/”); public static TileLayer CreateTileLayer(string? userAgent = null) { userAgent ??= $“user-agent-of-{Path.GetFileNameWithoutExtension(System.AppDomain.CurrentDomain.FriendlyName)}”; return new TileLayer(CreateTileSource(userAgent)) { Name = “AzureMaps” }; } private static HttpTileSource CreateTileSource(string userAgent) { return new HttpTileSource(new GlobalSphericalMercator(), “https://atlas.microsoft.com/map/tile?subscription-key=xxxxxxxxx&api-version=2022-08- 01&tilesetId=microsoft.base.road&zoom={z}&x={x}&y={y}”, //Azure MapsのTilemapAPI を指定 name: "AzureMaps", attribution: _azureMapsAttribution, configureHttpRequestMessage: (r) => r.Headers.TryAddWithoutValidation("User-Agent", userAgent), persistentCache: DefaultCache); } } MapsuiでAzureMapsのTilemap APIから地図を取得
  5. private void InitializeMap() { var mapControl = new Mapsui.UI.Maui.MapControl(); //

    地図タイルレイヤーを追加 var tileLayer = AzureMap.CreateTileLayer(); mapControl.Map?.Layers.Add(tileLayer); var center = CreateMPoint(139.7405407, 35.6265801); // この緯度経度は? // Navigatorを使用してマップの中心点とズームレベルを設定 mapControl.Map?.Navigator.CenterOn(center); mapControl.Map?.Navigator.ZoomTo(2); Content = mapControl; } //座標をWebメルカトル座標系に変換し、Mapsui.MPointオブジェクトを作成 private MPoint CreateMPoint(double longitude, double latitude) { var sphericalMercatorCoordinate = SphericalMercator.FromLonLat(longitude, latitude); return new MPoint(sphericalMercatorCoordinate.x, sphericalMercatorCoordinate.y); } 単純な地図表示
  6. // マーカーレイヤーを追加 var markerLayer = new MemoryLayer { Name =

    "Markers" }; var features = new List<IFeature>(); var marker1 = new PointFeature(CreateMPoint(139.7405407, 35.6265801)); marker1.Styles.Add(CreateMarkerStyle(Mapsui.Styles.Color.Red)); marker1.Styles.Add(CreateLabelStyle("日本マイクロソフト")); features.Add(marker1); var marker2 = new PointFeature(CreateMPoint(139.743045, 35.628471)); marker2.Styles.Add(CreateMarkerStyle(Mapsui.Styles.Color.Blue)); marker2.Styles.Add(CreateLabelStyle("個室ダイニング 天空")); features.Add(marker2); markerLayer.Features = features; mapControl.Map?.Layers.Add(markerLayer); ~ ~ ~ ~ ~ ~ ~ ~ // マーカーのスタイルを指定 private IStyle CreateMarkerStyle(Mapsui.Styles.Color color){~ ~ ~ ~} // ラベルのスタイルを指定 private IStyle CreateLabelStyle(string text){~ ~ ~ ~} 地図にマーカーを追加