【问题标题】:Overlays in GMap.Net WpfGMap.Net Wpf 中的叠加层
【发布时间】:2015-09-04 11:54:44
【问题描述】:

我正在构建一个应用程序,该应用程序需要用于呈现地理地图的工具,此外,该应用程序还需要该工具来提供一种添加自定义叠加层的方法。

我发现 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())) 中,而无法将标记合成到单独的覆盖。

如何在 Wpf 版本的 GMap.Net 中使用叠加层?

【问题讨论】:

标签: c# wpf gmap.net


【解决方案1】:

解决方案是自己实现一个覆盖集合。保留一组共享相同ZIndex 的标记作为一个叠加层,并保留一个包含所有叠加层的集合。

我希望它像 WinFrom 版本一样。

【讨论】:

  • 抱歉唤醒了一个旧线程。我也在阅读同一个例子,并且想知道两件事。其中一个是你问的,另一个问题是如何使用GMarkerGoogleType 枚举?我认为如果我可以直接从 API 中获取标记,而不是自己绘制出来,或者从其他地方下载图像,那就太好了。
【解决方案2】:

为了更好地理解(GMapMarker) marker,让我们来看看它们是怎样的 已添加。

设置标记的(UIElement) Shape,通过

  • MainWindow 实例
  • 坐标 (a.o.)
  • 工具提示文本

(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);
}

the demo 中,我使用ComboBoxSelectedIndex 设置新标记的ZIndex。如您所见,标记已添加到(ObservableCollection) MainMap.Markers。当我们不需要它们时,很容易删除/过滤集合中的标记。这种方法的问题在于,当(UIElement) Shapes 从视图中移除时,它们会被丢弃并需要重建。这会导致不良行为,特别是如果您希望能够一次显示所有叠加层。

相反,我选择仅向集合添加标记(通过用户交互)并根据当前的combobox.SelectedIndex 设置Shapes 的Visibility

// 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;
    }
}

我只用基本框架链接了一个设置,请注意这些库中还有更多功能。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-22
    • 2016-10-12
    • 1970-01-01
    • 2019-01-20
    • 2016-05-26
    • 1970-01-01
    • 2016-12-09
    相关资源
    最近更新 更多