GMap.Net Wpf 中的叠加层

Overlays in GMap.Net Wpf

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

我发现 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 版本中使用覆盖?

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

我希望它像 WinFrom 版本中那样。

为了更好地理解 (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) Shape 从视图中移除时,它们将被处置并需要重建。这会导致不良行为,尤其是当您希望能够一次显示所有叠加层时。

相反,我选择仅向集合添加标记(通过用户交互)并根据当前 combobox.SelectedIndex.[=25= 设置 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;
    }
}

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