Bing map
Bing map是微軟開發的地圖, 可以簡易的崁入wpf裏. 以前都說只有英文的地址. 但經測試, 現在的台灣地圖都是中文地址了.
套件
首先需由Nuget庫新增三個sdk:MaterialDesignThemes, MaterialDesignColors及Microsoft.Maps.MapControl.WPF
App.xaml
打開App.xaml新增 <ResourceDictionary>
此段為改變整個畫面的Theme, 所以可以不用改.
<Application x:Class="BingMapTest.App" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="clr-namespace:BingMapTest" StartupUri="MainWindow.xaml"> <Application.Resources> <ResourceDictionary> <ResourceDictionary.MergedDictionaries> <ResourceDictionary Source="pack://application:,,,/MaterialDesignThemes.Wpf;component/Themes/MaterialDesignTheme.Dark.xaml"/> <ResourceDictionary Source="pack://application:,,,/MaterialDesignThemes.Wpf;component/Themes/MaterialDesignTheme.Defaults.xaml"/> <ResourceDictionary Source="pack://application:,,,/MaterialDesignColors;component/Themes/Recommended/Primary/MaterialDesignColor.Blue.xaml"/> <ResourceDictionary Source="pack://application:,,,/MaterialDesignColors;component/Themes/Recommended/Accent/MaterialDesignColor.LightBlue.xaml"/> </ResourceDictionary.MergedDictionaries> </ResourceDictionary> </Application.Resources> </Application>
xaml設定
請依如下在 Grid填入元件, 其中的 CredentialsProvider 必需填入一組key.
此key請到微軟網站 https://www.bingmapsportal.com/Application , 註冊登入後, 再由my account/my key 申請一組key, 再將之填入
<Window x:Class="BingMapTest.MainWindow" ....... mc:Ignorable="d" xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes" xmlns:m="clr-namespace:Microsoft.Maps.MapControl.WPF;assembly=Microsoft.Maps.MapControl.WPF" Title="MainWindow" Height="450" Width="800"> <Grid> <m:Map Mode="Road" Grid.Column="1" Grid.Row="1" ZoomLevel="16" Center="25.0870304,121.5606103" CredentialsProvider="請到微軟申請一組key"> <Canvas m:MapLayer.Position="-23.1870304,-50.6606103" m:MapLayer.PositionOrigin="BottomCenter" Width="30" Height="30"> <materialDesign:PackIcon Kind="MapMarker" Width="30" Height="30" Foreground="#FF3C3C3C"/> </Canvas> </m:Map> </Grid>
圖例如下
按二下圖釘及取得經緯度
經緯度的資訊在Location裏. 而Location可以使用ViewportPointToLocation方法傳入mouse的 x,y 座標計算出來.
private void map_MouseDoubleClick(object sender, MouseButtonEventArgs e) { e.Handled = true; // Determin the location to place the pushpin at on the map. //Get the mouse click coordinates Point mousePosition = e.GetPosition(map); //Convert the mouse coordinates to a locatoin on the map Location pinLocation = map.ViewportPointToLocation(mousePosition); // The pushpin to add to the map. Pushpin pin = new Pushpin(); pin.Location = pinLocation; //MessageBox要放在e.GetPosition(map)後面, 否則鼠標座標會跑掉 MessageBox.Show(pinLocation.Latitude + ":" + pinLocation.Longitude); // Adds the pushpin to the map. map.Children.Add(pin); }
Pushpin拖曳
Pushpin pin { get; set; } private void map_MouseDoubleClick(object sender, MouseButtonEventArgs e) { e.Handled = true; Point mousePosition = e.GetPosition(map); Location location = map.ViewportPointToLocation(mousePosition); //MessageBoxResult result = MessageBox.Show("確定要更改經緯度嗎?", "道路巡查案件維護", MessageBoxButton.YesNo, MessageBoxImage.Warning); //if (result == MessageBoxResult.No) return; txt經度.Text = string.Format("{0:f5}", location.Longitude); txt緯度.Text = string.Format("{0:f5}", location.Latitude); mapPushPin(location); } private void mapPushPin(Location location) { if (pin != null) { map.Children.Remove(pin); } pin = new Pushpin(); pin.Location = location; pin.MouseDown += new MouseButtonEventHandler(pin_MouseDown); pin.MouseUp += new MouseButtonEventHandler(pin_MouseUp); map.Children.Add(pin); } bool dragPin = false; Vector mouseToMarker; void pin_MouseDown(object sender, MouseButtonEventArgs e) { e.Handled = true; pin = sender as Pushpin; dragPin = true; mouseToMarker = Point.Subtract( map.LocationToViewportPoint(pin.Location), e.GetPosition(map)); } void pin_MouseUp(object sender, MouseButtonEventArgs e) { e.Handled = true; pin = sender as Pushpin; dragPin = false; } private void map_MouseMove(object sender, MouseEventArgs e) { if (e.LeftButton == MouseButtonState.Pressed) { if (dragPin && pin != null) { pin.Location = map.ViewportPointToLocation( Point.Add(e.GetPosition(map), mouseToMarker)); e.Handled = true; txt經度.Text = string.Format("{0:f5}", pin.Location.Longitude); txt緯度.Text = string.Format("{0:f5}", pin.Location.Latitude); } } }
底下是微軟官網的說明
https://docs.microsoft.com/en-us/previous-versions/bing/wpf-control/hh868035(v%3Dmsdn.10)
Mapbox(未完成)
下載sdk
https://github.com/mapbox/mapbox-sdk-cs
載入參考
將上述代碼download下來了, 使用VS 開啟sln, 再按建置專案, 如此在 bin/debug 下, 就會有Mapbox.dll的檔案.
然後開啟新wpf專案, 如入參考, 把mapbox.dll加入即可
地圖存取碼
登入 https://www.mapbox.com/studio to obtain an access token.