在WPF中使用GMap


1.安裝GMap.Net.Presentation(實際上就是添加GMap.Net.Core.dll和GMap.Net.WindowsPresentation.dll)

 

 

 

 2.直接聲明GMap控件

using GMap.NET.WindowsPresentation;

namespace Test2
{
    class MapControl:GMapControl
    {
    }

3.將控件添加到xaml里面

 <local:MapControl x:Name="mapControl" Zoom="13" MaxZoom="24" MinZoom="1" Width="600" Height="350" />

4.初始化GMap控件,效果圖,定位在南京

  try
            {
                System.Net.IPHostEntry e = System.Net.Dns.GetHostEntry("ditu.google.cn");
            }
            catch
            {
//離線地圖,默認位置C:\Users\[用戶名]\AppData\Local\GMap.NET mapControl.Manager.Mode
= AccessMode.CacheOnly; MessageBox.Show("No internet connection avaible, going to CacheOnly mode.", "GMap.NET Demo", MessageBoxButton.OK, MessageBoxImage.Warning); } mapControl.MapProvider = GMapProviders.GoogleChinaMap; //google china 地圖 mapControl.MinZoom = 2; //最小縮放 mapControl.MaxZoom = 17; //最大縮放 mapControl.Zoom = 5; //當前縮放 mapControl.ShowCenter = false; //不顯示中心十字點 mapControl.DragButton = MouseButton.Left; //左鍵拖拽地圖 mapControl.Position = new PointLatLng(32.064, 118.704); //地圖中心位置:南京(緯度,經度)

 

 5.右擊鼠標畫坐標,畫三個黑色坐標

  mapControl.MouseRightButtonDown += new MouseButtonEventHandler(mapControl_MouseRightButtonDown);



  void mapControl_MouseRightButtonDown(object sender, MouseButtonEventArgs e)
        {
          

            Point clickPoint = e.GetPosition(mapControl);
            PointLatLng point = mapControl.FromLocalToLatLng((int)clickPoint.X, (int)clickPoint.Y);
            GMapMarker currentMarker = new GMapMarker(point);
            {
                var converter = TypeDescriptor.GetConverter(typeof(Geometry));
                //currentMarker.Shape = new Ellipse() { Width = 20, Height = 20, Stroke = Brushes.Red };
                currentMarker.Shape = new Path()
                {
                    StrokeThickness = 1,
                    Stretch = Stretch.Fill,

                    Stroke = Brushes.Black
                    ,
                    Width = 20,
                    Height = 20,
                    Data = (Geometry)converter.ConvertFrom("M 808.6 403.2 c 0 -178.8 -129.8 -308.5 -308.5 -308.5 c -170.1 0 -308.5 138.4 -308.5 308.5 c 0 125.6 170.6 338.3 262.3 452.6 l 6.8 8.4 c 9.6 12 24 18.9 39.5 18.9 c 15.4 0 29.8 -6.9 39.5 -18.9 l 6.8 -8.4 c 91.5 -114.3 262.1 -327 262.1 -452.6 Z m -310.1 89.4 c -62.9 0 -114 -51.1 -114 -114 s 51.1 -114 114 -114 s 114 51.1 114 114 s -51.1 114 -114 114 Z M 500.1 67.8 c -184.9 0 -335.4 150.4 -335.4 335.4 c 0 135 174.5 352.5 268.2 469.4 l 6.7 8.4 c 14.8 18.4 36.8 29 60.4 29 s 45.6 -10.6 60.4 -29 l 6.8 -8.4 C 661 755.7 835.4 538.2 835.4 403.2 c 0 -194.3 -141 -335.4 -335.3 -335.4 Z m 0 815.3 c -15.4 0 -29.8 -6.9 -39.5 -18.9 l -6.8 -8.4 c -91.7 -114.3 -262.3 -327 -262.3 -452.6 c 0 -170.1 138.4 -308.5 308.5 -308.5 c 178.8 0 308.5 129.8 308.5 308.5 c 0 125.6 -170.6 338.3 -262.3 452.6 l -6.8 8.4 c -9.5 12 -23.9 18.9 -39.3 18.9 Z")
                };
                //(currentMarker.Shape as CustomMarker).SetContent(point, "1"); 這種方法可以觸發SetContent
                currentMarker.ZIndex = -1;
                currentMarker.Position = point;
                mapControl.Markers.Add(currentMarker);
               
                this.Focus();
            }
        }

 

 6.點擊鼠標左鍵畫路徑,畫三條紅色的線,連接三個城市

 int id = 1;

        PointLatLng point_last;
        void mapControl_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
          

            Point clickPoint = e.GetPosition(mapControl);
            PointLatLng point_show = mapControl.FromLocalToLatLng((int)clickPoint.X, (int)clickPoint.Y);
       
            if (id > 1)
            {
                GMapRoute gmRoute = new GMapRoute(new List<PointLatLng>() {

point_last, //上一次的位置

point_show //當前顯示的位置

});
                
                    gmRoute.Shape = new  Path() { StrokeThickness = 1 ,Stroke=Brushes.Red};
                
              
               
                mapControl.Markers.Add(gmRoute);
            }
            id += 1;
            point_last = point_show;


        }

 

 7.坐標閃爍動畫效果,讓第一個坐標閃爍

   private void Button_Click_3(object sender, RoutedEventArgs e)
        {
            Path path = (Path)mapControl.Markers.Where(x => x.GetType() == typeof(GMapMarker)).ToList()[0].Shape;
            path.Stroke = Brushes.Red;

            ObjectAnimationUsingKeyFrames animation = new ObjectAnimationUsingKeyFrames();
            DiscreteObjectKeyFrame kf1 = new DiscreteObjectKeyFrame(Visibility.Hidden, new TimeSpan(0, 0, 0,0,500));
            DiscreteObjectKeyFrame kf2 = new DiscreteObjectKeyFrame(Visibility.Visible, new TimeSpan(0, 0, 0,1));
            animation.Duration = new TimeSpan(0, 0, 1);
            animation.RepeatBehavior = RepeatBehavior.Forever;
            animation.KeyFrames.Add(kf1);
            animation.KeyFrames.Add(kf2);
            path.BeginAnimation(Path.VisibilityProperty, animation);
        }

8.清除所有的路徑和坐標

  //清除所有的坐標
        private void Button_Click(object sender, RoutedEventArgs e)
        {

            foreach (var item in mapControl.Markers.Where(x => x.GetType() == typeof(GMapMarker)).ToList())
            {
                mapControl.Markers.Remove(item);
            }

        }
        //清除所有的路徑
        private void Button_Click_1(object sender, RoutedEventArgs e)
        {
            foreach (var item in mapControl.Markers.Where(x => x.GetType() == typeof(GMapRoute)).ToList())
            {
                mapControl.Markers.Remove(item);
            }
        
        }

 9.根據經緯度畫圖(經緯度轉換為極坐標),連接上海與無錫

  private void btn4_Click(object sender, RoutedEventArgs e)
        {
            //上海經緯度(緯度,經度)
            PointLatLng p1 = new PointLatLng(31.2, 121.47);
            //無錫經緯度(緯度,經度)
            PointLatLng p2 = new PointLatLng(31.568, 120.299);



            GMapRoute gmRoute = new GMapRoute(new List<PointLatLng>() {

p1, //上海的位置

p2 //無錫的位置

});

            gmRoute.Shape = new Path() { StrokeThickness = 1, Stroke = Brushes.Red };



            mapControl.Markers.Add(gmRoute);
        }

 10.使用離線地圖

 

加載離線地圖

  private bool _isLoaded;

            public bool Load(string fileName)
            {
                if (!_isLoaded)
                {
                    new Thread(() => GMaps.Instance.ImportFromGMDB(fileName)).Start();
                    _isLoaded = true;
                }
                return _isLoaded;
            }

 

11.已知兩個經緯度算距離,直接調用Distance

   static double EARTH_RADIUS = 6371.0;
        /// <summary>
        /// 給定的經度1,緯度1;經度2,緯度2. 計算2個經緯度之間的距離。
        /// </summary>
        /// <param name="lat1">經度1</param>
        /// <param name="lon1">緯度1</param>
        /// <param name="lat2">經度2</param>
        /// <param name="lon2">緯度2</param>
        /// <returns>距離(公里、千米)</returns>
        public static double Distance(double lat1, double lon1, double lat2, double lon2)
        {
            //用haversine公式計算球面兩點間的距離。
            //經緯度轉換成弧度
            lat1 = ConvertDegreesToRadians(lat1);
            lon1 = ConvertDegreesToRadians(lon1);
            lat2 = ConvertDegreesToRadians(lat2);
            lon2 = ConvertDegreesToRadians(lon2);

            //差值
            var vLon = Math.Abs(lon1 - lon2);
            var vLat = Math.Abs(lat1 - lat2);

            //h is the great circle distance in radians, great circle就是一個球體上的切面,它的圓心即是球心的一個周長最大的圓。
            var h = HaverSin(vLat) + Math.Cos(lat1) * Math.Cos(lat2) * HaverSin(vLon);

            var distance = 2 * EARTH_RADIUS * Math.Asin(Math.Sqrt(h));

            return distance;
        }
        public static double HaverSin(double theta)
        {
            var v = Math.Sin(theta / 2);
            return v * v;
        }
        public static double ConvertDegreesToRadians(double degrees)
        {
            return degrees * Math.PI / 180;
        }

        public static double ConvertRadiansToDegrees(double radian)
        {
            return radian * 180.0 / Math.PI;
        }

 12.標記拖拽功能

首先添加三個事件

 mapControl.MouseMove += MapControl_MouseMove;
            mapControl.MouseDown += MapControl_MouseDown;
            mapControl.MouseLeftButtonDown += MapControl_MouseLeftButtonDown;
GMapMarker _currentElement;
  private void MapControl_MouseDown(object sender, MouseButtonEventArgs e)
        {//判斷是否點擊了標注
            if (_currentElement == null)
            {
                Point pt = e.GetPosition(mapControl);
                PointLatLng point = mapControl.FromLocalToLatLng((int)pt.X, (int)pt.Y);

                PointHitTestParameters parameters = new PointHitTestParameters(pt);
                VisualTreeHelper.HitTest(mapControl, null, HitTestCallback, parameters);
            }
        }
  private HitTestResultBehavior HitTestCallback(HitTestResult result)
        {
           
            Path path = result.VisualHit as Path;
            if (path != null)
            {
                _currentElement = mapControl.Markers.Where(x => x.Shape == path).ToList().FirstOrDefault();
                return HitTestResultBehavior.Stop;
            }
            return HitTestResultBehavior.Continue;
        }
 private void MapControl_MouseMove(object sender, MouseEventArgs e)
        {
           if (checkMoveFlag.IsChecked == true &&
                e.LeftButton == MouseButtonState.Pressed
                && _currentElement != null)
            {
                //獲取坐標
                Point pt = e.GetPosition(mapControl);
                //轉換成地理坐標
                PointLatLng point = mapControl.FromLocalToLatLng((int)pt.X, (int)pt.Y);
                _currentElement.Position = point;
            }
        }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM