{菏泽人才}:WPF使用 Gmap.NET 绘制极坐标运动轨迹

admin 6个月前 (04-10) 科技 38 0

  “大家好”, 已经良久没有更新了[,「今天」写一篇关于WPF 使用[ Gmap.NET 相关【的】[,(网上许多)Winform“【的】很”**,〖以〗是我给Wpf『举行』一些弥补。虽然它 已经良久没有更新了[,「然则也只能用这个了」。{没其余好选择【的】},<究竟它也没啥可更新【的】>,“也可以明白”。

   使用[它之前请Nuget 安装一下[GMap.NET.Core、GMap.NET.WindowsPresentation “【的】库”。ok 《我们直接最先》。

  【我们在】MainWindows《中写上一个》WrapPanel “用于存放”Gmap「【的】容器」。

  <WrapPanel Grid.Row="1" Grid.Column="1" Grid.RowSpan="2" x:Name="mapPanel">

  随后【我们在】MainWindows『组织函数中举行设置』,{然后给}mapPanel<中添加了>radarMap<控件>。(另有鼠标右击【的】)

public MainWindow()
        {
            m_viewModel = new ViewModelMain();
            InitializeComponent();
            radarMap = new GMap.NET.WindowsPresentation.GMapControl();
            InitMapControl(radarMap);
            this.mapPanel.Children.Add(radarMap);
            radarMap.MouseRightButtonUp += RadarMap_MouseRightButtonUp;
            this.videoWindows.Child = pictureBox;
            DrawWarningArea();
        }

  “随”后在初始化容器中设置一些舆图【的】设置,「这内里有一个静态文件」,“内里也没啥”。(自己也可以写),(我就不把)Config‘写出来了’。

 private void InitMapControl(GMap.NET.WindowsPresentation.GMapControl radarMap)
        {
            //radarMap.Name = "radarMap";
            radarMap.Manager.Mode = AccessMode.ServerAndCache;
            radarMap.Position = Config.CenterPoint;
            radarMap.ShowCenter = false;
            radarMap.DragButton = System.Windows.Input.MouseButton.Left;
            radarMap.MinZoom = Config.MINZOOM;
            radarMap.MaxZoom = Config.MAXZOOM;
            radarMap.Zoom = Config.INITZOOM;
            radarMap.OnMapZoomChanged += radarMap_OnMapZoomChanged;
        }

  <这个是鼠标右击添加>Marker【的】,【这个就对照恶心】了,『由于』Wpf〖中没有〗overlays【的】观点,<以是你就直接添加>marker“就行”。『详细看代码』,这个内里有个自定义<控件>。

List<PointLatLng> pointLatlngs = new List<PointLatLng>();
        private void RadarMap_MouseRightButtonUp(object sender, MouseButtonEventArgs e)
        {
            Point clickPoint = e.GetPosition(radarMap);
            PointLatLng point = radarMap.FromLocalToLatLng((int)clickPoint.X, (int)clickPoint.Y);
            pointLatlngs.Add(point);
            GMapMarker currentMarker = new GMapMarker(point);
            {
                currentMarker.Shape = new CustomMarker(1,currentMarker, "custom position marker");
                currentMarker.Offset = new System.Windows.Point(-15, -15);
                currentMarker.ZIndex = int.MaxValue;
                radarMap.Markers.Add(currentMarker);
            }
        }

  详细是写了个<控件>,(要)不Wpf『没办法渲染上』。

<UserControl x:Class="DisplayControlTerminal.Map.CustomMarker"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"   
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:local="clr-namespace:DisplayControlTerminal.Map"
             mc:Ignorable="d" 
             d:DesignHeight="5.75" d:DesignWidth="6">
    <Image Name="icon" Source="/Resources/bigMarkerGreen.png" VerticalAlignment="Center" HorizontalAlignment="Center" Height="4" Margin="1,0,3,3" Width="2"/>
</UserControl>

(另有谁人)Circle 是在[DrawWarningArea里画出来【的】,调用了内里带参【的】组织函数,(然后内里就不用管了)。

private void DrawWarningArea()
        {
            for (int i = 0; i < Config.SCOPE_DIS; i++)
            {
                GMapMarker it = new GMapMarker(Config.CenterPoint);
                it.ZIndex = -1;
                Circle c = new Circle((i + 1).ToString() + "km", (i + 1) * 1000);
                c.Tag = it;
                c.IsHitTestVisible = false;
                c.UpdateCircle(radarMap);
                it.Shape = c;
                radarMap.Markers.Add(it);
                Circles.Add(it);
            }
            GMapMarker crossCenter = new GMapMarker(Config.CenterPoint);
            Cross cross = new Cross();
            cross.Tag = crossCenter;
            cross.SetOffset();
            crossCenter.Shape = cross;
            //crossCenter.ZIndex = 55;
            radarMap.Markers.Add(crossCenter);
            //m.Shape = new CustomMarker(this, m, "ceshi");
            //m.ZIndex = 55;
            //radarMap.Markers.Add(m);
        }

  最主要【的】是若何画轨迹,{我第一时间就想到了}Pen 类[,《然后凭据》pointlatlng<这个聚集我们想办法去搞事>情,「果不其然」,我们只需要让你【的】硬件装备给你【的】那 pointLatlngs 聚集中添加“就行”,(但若何将经纬度转换成内陆)坐标 「就对照复杂了」。

List<PointLatLng> pointLatlngs = new List<PointLatLng>();
private void Button_Click(object sender, RoutedEventArgs e)
        {
            for (int i = 0; i < pointLatlngs.Count; i++)
            {
                GMapRoute gmRoute = new GMapRoute(new List<PointLatLng>() {
                    pointLatlngs[i] , pointLatlngs.Count-1 == i ? pointLatlngs[i] : pointLatlngs[i + 1]})
                {
                    Shape = new Line()
                    {
                        StrokeThickness = 4,
                        Stroke = System.Windows.Media.Brushes.BlueViolet
                    }
                };
                radarMap.Markers.Add(gmRoute);
            }
        }

《最后效果图》

 

,

《阳光诚信在线》平台

〖阳光诚信在线官〗网(『原诚信在线官网』)「现已开」放阳光在线手机版、{阳光在线电}脑客户端下载。{阳光在线娱乐戏公平}、【公开】、(公正),‘用’实力赢取信誉。

申博声明:该文看法仅代表作者自己,与本平台无关。转载请注明:{菏泽人才}:WPF使用 Gmap.NET 绘制极坐标运动轨迹

网友评论

  • (*)

最新评论