C# 在画布中显示GPS坐标
我试图在画布上显示GPS坐标。 我在法国和美国有400个城镇。我只想在画布上展示它们 对于每个城镇,我都有它的纬度和经度(使用谷歌api:)。 我已使用此线程获得了第一个结果: 以下是我的结果: 我的代码如下(假设“_liste”包含城镇列表):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
为什么不为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);
}