Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在画布中显示GPS坐标_C#_Wpf_Gps_Wpf Controls - Fatal编程技术网

C# 在画布中显示GPS坐标

C# 在画布中显示GPS坐标,c#,wpf,gps,wpf-controls,C#,Wpf,Gps,Wpf Controls,我试图在画布上显示GPS坐标。 我在法国和美国有400个城镇。我只想在画布上展示它们 对于每个城镇,我都有它的纬度和经度(使用谷歌api:)。 我已使用此线程获得了第一个结果: 以下是我的结果: 我的代码如下(假设“_liste”包含城镇列表): 为什么不为WPF使用映射控件?它将从lat/lon投影到笛卡尔坐标,并在点下方显示地图(如OpenStreetMap提供的地图)。也就是说,最常用的地图投影是所谓的Web墨卡托投影。OpenStreetMap、Google Maps和Bing Map

我试图在画布上显示GPS坐标。 我在法国和美国有400个城镇。我只想在画布上展示它们

对于每个城镇,我都有它的纬度和经度(使用谷歌api:)。 我已使用此线程获得了第一个结果:

以下是我的结果:

我的代码如下(假设“_liste”包含城镇列表):


为什么不为WPF使用映射控件?它将从lat/lon投影到笛卡尔坐标,并在点下方显示地图(如OpenStreetMap提供的地图)。也就是说,最常用的地图投影是所谓的Web墨卡托投影。OpenStreetMap、Google Maps和Bing Maps都使用它。我没有找到任何WPF的免费地图控件(我的控件需要脱机,并且能够脱机绘制国家/城市)。我可以推荐,因为我是该库的作者。它能够显示脱机(缓存)内容。您还可以添加自己的自定义地图内容提供程序。即使不显示底图,该控件仍可以为您进行坐标投影,并在其MapItemsControl中显示项目集合。控件的样式如何?如何在缓存中添加国家?基本地图层显示(可选缓存)地图磁贴位图(256*256像素),就像Bing地图控件一样。然后可以添加具有贴图几何图形的任意覆盖。如果将一个国家的边界作为纬度/经度值的集合,则可以从该数据创建填充和笔划贴图多段线。
private void Button_visualise_Click(object sender, RoutedEventArgs e)
        {

                    System.Diagnostics.Stopwatch watch = new System.Diagnostics.Stopwatch();
                    watch.Start();
                    List<Town> _list = LibDAO.Towns_DAO.GetAllTown().Where(u=>u.IdPays == 2 || u.IdPays == 1).ToList<Town>();

                    this.my_canvas.Children.Clear();
                    double min_x = 0;
                    double max_x = 0;
                    double min_y = 0;
                    double max_y = 0;
                    for (int i = 0; i < _list .Count; i++)
                    {
                        Ellipse ell = new Ellipse() { Width = 30, Height = 30, Fill = Brushes.Blue };
                        Point p = ToCanvas(_list [i].Latitude, _list [i].Longitude);
                        Canvas.SetLeft(ell, p.X);
                        Canvas.SetTop(ell, p.Y);

                        if (p.X < min_x) min_x = p.X;
                        if (p.X > max_x) max_x = p.X;
                        if (p.Y < min_y) min_y = p.Y;
                        if (p.Y > max_y) max_y = p.Y;
                        this.my_canvas.Children.Add(ell);
                    }
                    SetCoordinateSystem(this.my_canvas, min_x, max_x, min_y, max_y);
                    watch.Stop();


        }
        public static Canvas SetCoordinateSystem(Canvas canvas, Double xMin, Double xMax, Double yMin, Double yMax)
        {
            var width = xMax - xMin;
            var height = yMax - yMin;

            var translateX = -xMin;
            var translateY = height + yMin;

            var group = new TransformGroup();

            group.Children.Add(new TranslateTransform(translateX, -translateY));
            group.Children.Add(new ScaleTransform(canvas.ActualWidth / width, canvas.ActualHeight / -height));

            canvas.RenderTransform = group;

            return canvas;
        }
        private const int earthRadius = 6367;
        private Point ToCanvas(double lat, double lon)
        {
            lon = ConvertToRadians(lon);
            lat = ConvertToRadians(lat);

            double x = earthRadius * Math.Cos(lat) * Math.Cos(lon); //((lon * my_canvas.ActualWidth) / 360.0) - 180.0; ;// // 
            double y = earthRadius * Math.Cos(lat) * Math.Sin(lon);// ((lat * my_canvas.ActualHeight) / 180.0) - 90.0;
            return new Point(x, y);
        }
        public double ConvertToRadians(double angle)
        {
            return (Math.PI / 180) * angle;
        }
private Point ToCanvas(double lat, double lon)
        {
            // Equirectangular projection
            double x1 = lon * Math.Cos(ConvertToRadians(lat));
            double y1 = lat;

            //lon = ConvertToRadians(lon);
            //lat = ConvertToRadians(lat);

            //double x = earthRadius * Math.Cos(lat) * Math.Cos(lon); //((lon * my_canvas.ActualWidth) / 360.0) - 180.0; ;// // 
            //double y = earthRadius * Math.Cos(lat) * Math.Sin(lon);// ((lat * my_canvas.ActualHeight) / 180.0) - 90.0;
            return new Point(x1 * 10, y1 * 10);
        }