在并发环境中更新Bing Map映射

时间:2014-08-28 12:12:47

标签: c# wpf xaml gps bing-maps

我一直在研究GPS地图应用程序,其中GPS(L76)开发板的NMEA数据是通过串口获得的。解析CSV数据,然后将经度/纬度信息保存在队列中。目标是在通过串行端口获得位置信息时,在基于WPF的映射应用程序上动态显示图钉。

<WPF:Map Name="XAMLMap" ZoomLevel="17" CredentialsProvider="the key" Mode="road" Margin="241,157,10.334,10">
</WPF:Map>

应用程序通过以下代码成功显示其初始Bing地图显示:

Dispatcher.Invoke(() =>
{
    XAMLMap.CredentialsProvider = new ApplicationIdCredentialsProvider("the key");
    XAMLMap.Center = new Microsoft.Maps.MapControl.WPF.Location(50.8, -1.12222);

    Pushpin currentPushpin = new Pushpin();
    currentPushpin.Location = new Microsoft.Maps.MapControl.WPF.Location(50.8, -1.12222);
    XAMLMap.ZoomLevel = 18;
    XAMLMap.Margin = new Thickness(243, 151, 0, 0);
    XAMLMap.Children.Add(currentPushpin);
    mapGrid.Children.Add(XAMLMap);
});

但是,当在以下事件方法中从串行数据动态生成推针位置坐标时,会出现实际挑战:

void serialPortHandler_NewSerialDataRecieved(object sender, SerialDataEventArgs e)
{
    AddLocation(currentLocation);
}

private void AddLocation(Location location)
{
    Dispatcher.Invoke(() =>
    {
        try
        {                           
            Microsoft.Maps.MapControl.WPF.Location currentLocation = new Microsoft.Maps.MapControl.WPF.Location(location.latitude, location.longitude);

            Pushpin currentPushpin = new Pushpin();
            currentPushpin.Location = currentLocation;    
            XAMLMap.Margin = new Thickness(243, 151, 0, 0);                        
            XAMLMap.Children.Add(currentPushpin);
            mapGrid.Children.Add(XAMLMap);    
        }
        catch (Exception exc)
        {    
        }
    });
} 

更新后的坐标纬度/经度值仍然可以正确放置在地图上(XAMLMap)。然而,当地图被缩小/缩小或平移时,地图内容(即道路,地理细节,分辨率)根本不更新,即新的可见地图信息根本不会更新,留下不规则补丁的拼图。

另外,请注意,该问题与我在上面的代码或任何其他子代中将XAMLMap对象添加到网格的方式无关。

我已经研究过解决这个问题的各种可能性,但到目前为止还没有成功。这还包括:

  1. 将映射应用程序保留在单独的线程中
  2. 使用计时器控件并使用Peek方法返回并显示队列中最顶层的位置对象
  3. 在这方面的任何帮助或指示都将受到高度赞赏。

1 个答案:

答案 0 :(得分:2)

看起来您的代码不断将地图添加到网格中。您应该在XAML中创建一次映射,并仅在那里设置凭据。无需在代码中设置凭据。在添加图钉时,我也不确定为什么要更改地图的边距。也不需要那个代码。

您的AddLocation方法应如下所示:

private void AddLocation(Location location)
{
    Dispatcher.Invoke(() =>
    {
        try
        {                           
Microsoft.Maps.MapControl.WPF.Location currentLocation = new Microsoft.Maps.MapControl.WPF.Location(location.latitude, location.longitude);

            Pushpin currentPushpin = new Pushpin();
            currentPushpin.Location = currentLocation;                         
            XAMLMap.Children.Add(currentPushpin);
        }
        catch (Exception exc)
        {    
        }
    });
}