我正在.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);
}
}