GMap.Net Wpf中的覆盖层

6

我正在开发一个需要渲染地理地图并支持添加自定义覆盖层工具的应用程序。

我发现GMap.Net是完成此任务的绝佳工具。

在网上,我找到了很多WinForm示例来创建自定义覆盖层,例如:

GMapOverlay markersOverlay = new GMapOverlay("markers");
GMarkerGoogle marker = new GMarkerGoogle(new PointLatLng(-25.966688, 32.580528), GMarkerGoogleType.green);
markersOverlay.Markers.Add(marker);
gmap.Overlays.Add(markersOverlay);

但是当我接触到GMap.Net的WPF版本时,我发现覆盖层已经消失了,而且我只能将标记直接添加到标记集合中(mymap.Markers.Add(new Marker())), 而不能在一个单独的覆盖层中组合标记。

在GMap.Net的Wpf版本中如何使用覆盖层?


你应该在他们的讨论页面上提出那个问题。 - Clemens
这是相应的线程 - rdoubleui
2个回答

5
解决方案是自己实现重叠集合。维护一个标记集合,共享与一个覆盖层相同的 ZIndex ,以及一个包含所有覆盖层的集合。
我希望它像 WinFrom 版本一样。

1
抱歉打扰了一个旧的帖子。我也在阅读同样的例子,有两个问题想问。其中一个是你问的,另一个问题是如何使用 GMarkerGoogleType 枚举?如果我可以直接从API中获取标记,而不是自己绘制或从其他地方下载图像,那就太好了。 - Jai

2
为了更好地理解(GMapMarker)标记,让我们看一下它们是如何添加的。
设置标记的(UIElement)形状,传递以下内容:
- MainWindow实例 - 坐标(等等) - ToolTipText
到(UserControl)CustomMarkerDemo的构造函数。
// add marker
private void addMarker_Click(object sender, RoutedEventArgs e)
{
    GMapMarker marker = new GMapMarker(currentMarker.Position);
    {
        ... // ToolTipText fetching logic

        marker.Shape = new CustomMarkerDemo(this, marker, ToolTipText);
        marker.ZIndex = combobox.SelectedIndex;
    }
    MainMap.Markers.Add(marker);
}

示例中,我使用了ComboBoxSelectedIndex来设置新标记的ZIndex。正如您所看到的,标记被添加到(ObservableCollection)MainMap.Markers中。当我们不需要这些标记时,删除/过滤集合中的标记是很诱人的。但是这种方法的问题在于,当从视图中移除(UIElement)Shape时,它们会被处理并需要重新构建。这会导致不希望出现的行为,特别是如果您想能够同时显示所有覆盖层。

相反,我选择仅通过用户交互将标记添加到集合中,并根据当前的combobox.SelectedIndex设置ShapeVisibility

// change overlays
private void combobox_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    ComboBox combobox = sender as ComboBox;
    if (combobox != null && MainMap != null)
    {
        // show all overlays
        if (combobox.SelectedIndex == combobox.Items.Count - 1)
        {
            foreach (GMapMarker marker in MainMap.Markers)
                marker.Shape.Visibility = Visibility.Visible;
        }
        // show only selected overlay
        else
        {
            foreach (GMapMarker marker in MainMap.Markers)
            {
                if (marker.ZIndex == combobox.SelectedIndex)
                    marker.Shape.Visibility = Visibility.Visible;
                else
                    marker.Shape.Visibility = Visibility.Collapsed;
            }
        }
        currentMarker.Shape.Visibility = Visibility.Visible;
    }
}

我只链接了一个最基本的设置,需要注意的是这些库中还有更多功能。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接