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中我使用了ComboBox
的SelectedIndex
来设置新标记的ZIndex
。如您所见,标记已添加到 (ObservableCollection) MainMap.Markers
。当我们不需要时,很容易删除/过滤集合中的标记。这种方法的问题在于,当 (UIElement) Shape
从视图中移除时,它们将被处置并需要重建。这会导致不良行为,尤其是当您希望能够一次显示所有叠加层时。
相反,我选择仅向集合添加标记(通过用户交互)并根据当前 combobox.SelectedIndex
.[=25= 设置 Shape
的 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;
}
}
我只链接了一个基本框架,注意这些库中有更多的功能。
我正在构建一个需要渲染地理地图的工具的应用程序,此外,该应用程序还需要该工具提供一种添加自定义叠加层的方法。
我发现 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中我使用了ComboBox
的SelectedIndex
来设置新标记的ZIndex
。如您所见,标记已添加到 (ObservableCollection) MainMap.Markers
。当我们不需要时,很容易删除/过滤集合中的标记。这种方法的问题在于,当 (UIElement) Shape
从视图中移除时,它们将被处置并需要重建。这会导致不良行为,尤其是当您希望能够一次显示所有叠加层时。
相反,我选择仅向集合添加标记(通过用户交互)并根据当前 combobox.SelectedIndex
.[=25= 设置 Shape
的 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;
}
}
我只链接了一个基本框架,注意这些库中有更多的功能。