我正在.net 4.0中创建一个WPF应用程序。WPF 2010静态地图
基本上我想有一个世界地图(2D),我可以放置图像,取决于他们的国家位置。但是,这张地图可能是一张图片,很难确定位置的坐标吗?
有人能为我提供最简单的方法吗?
我正在.net 4.0中创建一个WPF应用程序。WPF 2010静态地图
基本上我想有一个世界地图(2D),我可以放置图像,取决于他们的国家位置。但是,这张地图可能是一张图片,很难确定位置的坐标吗?
有人能为我提供最简单的方法吗?
我会通过放置图像/形状对象在画布面板(面板与坐标系统),我也会添加一个wpf toolkit zoomviewer得到很好的平移和缩放地图。
然后,我会做一个字典,其中键是国家的名称和价值是一个点应放置图片。
有很多解决方案,这取决于你的设计(和口味)。
在所有情况下,需要记住的是,项目在地图上的位置总是与地图的大小相关,并且只要背景地图的大小发生变化就需要重新计算。该计算将取决于地图本身(即,它是矩形还是圆形,是经度/纬度固定和相等的网格,地图的布局等)。
一种可能的方式来设置主窗口是这样的:
这假定有一个名为“资源”包含称为图像文件夹“世界地图.jpg“,其”生成操作“设置为”资源“。
然后,在你的代码背后,你必须有一些东西在适当的地方添加一个新的图像到地图上。个人而言,我可能会创建一个类(可能是自定义或用户控件)来保存图像信息,包括纬度/经度,图像对象等。主窗口(或ViewModel)可能会收集一组图像这些对象会在调整大小时将它们放在正确的位置。例如:
public partial class Window1 : Window
{
ObservableCollection<MyMapImageClass> mapImages = new ObservableCollection<MyMapImageClass>();
public Window1()
{
InitializeComponent();
layout.SizeChanged += new SizeChangedEventHandler(layout_SizeChanged);
}
void layout_SizeChanged(object sender, SizeChangedEventArgs e)
{
foreach (MyMapImageClass mapImage in mapImages)
{
Point point = CalculateImagePosition(mapImage.latitude, mapImage.longitude);
mapImage.Image.SetValue(Canvas.LeftProperty, point.X);
mapImage.Image.SetValue(Canvas.TopProperty, point.Y);
}
}
Point CalculateImagePlacement(double latitude, double longitude)
{
Point point = new Point();
// Do the calculations appropriate to your map
point.X = LongCalculation(longitude);
point.Y = LatCalculation(latitude);
}
void PlaceImage(double latitude, double longitude)
{
Image img = new Image();
ImageSourceConverter converter = new ImageSourceConverter();
string path = "pack://application:,,,/Resources/SomeImage.png";
ImageSource source = (ImageSource)converter.ConvertFromString(path);
img.Source = source;
img.Width = 10d;
Point point = CalculateImagePlacement(latitude, longitude);
img.SetValue(Canvas.LeftProperty, point.X);
img.SetValue(Canvas.TopProperty, point.Y);
layout.Children.Add(img);
MyMapImageClass mapImage = new MyMapImageClass();
mapImage.Latitude = latitude;
mapImage.Longitude = longitude;
mapImage.Image = img;
mapImages.Add(mapImage);
}
}