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

但是当我接近WPFGMap.Net 版本时,我注意到叠加层消失了,我不得不将标记直接添加到标记集合 ( mymap.Markers.Add(new Marker())) 中,而无法将标记合成到单独的叠加层中。

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

4

2 回答 2

5

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

我希望它像WinFrom版本一样。

于 2015-07-24T13:56:49.610 回答
2

为了更好地理解(GMapMarker) marker,让我们看看它们是如何添加的。

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

  • MainWindow实例_
  • 坐标(ao)
  • 工具提示文本

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

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

相反,我选择仅向集合添加标记(通过用户交互)并基于 current 设置 sVisibility的。Shapecombobox.SelectedIndex

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

我只用简单的骨架链接了一个设置,请注意这些库中有更多的功能。

于 2017-03-11T09:50:25.483 回答