2015-06-18 3 views
4

Я создаю приложение, которое нуждается в инструменте для рендеринга географической карты, кроме того, приложение нуждается в этом инструменте, чтобы обеспечить способ добавления пользовательских оверлеев.Наложения в 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?

+0

Возможно, вы должны задать этот вопрос на своей [странице обсуждения] (https://greatmaps.codeplex.com/discussions/topics/4903/wpf). – Clemens

+0

И это соответствующая [thread] (https://greatmaps.codeplex.com/discussions/640141) – rdoubleui

+1

Да, это был я – Matan

ответ

5

Решение состоит в том, чтобы самостоятельно реализовать накладные коллекции. Храните коллекцию маркеров, которые имеют один и тот же номер ZIndex в виде одного наложения и коллекции, в которой хранятся все накладки.

Желательно, чтобы это было в версии WinFrom.

+1

Извините за пробуждение старой темы. Я также читал тот же пример и задавался вопросом две вещи. Один из них - это то, что вы задали, а другой вопрос - как использовать перечисление GMarkerGoogleType?Я подумал, что было бы неплохо, если бы я мог просто захватить маркеры прямо из API, а не рисовать сам или загрузить изображение из другого места. – Jai

0

Чтобы лучше понять (GMapMarker) marker, давайте посмотрим, как они добавлены .

(UIElement) Shape маркера устанавливается, проходя

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

В the demo Я использовал ComboBoxSelectedIndex, чтобы установить ZIndex новых маркеров. Как видите, маркеры добавляются к (ObservableCollection) MainMap.Markers. Заманчиво удалять/фильтровать маркеры в коллекции, когда нам это не нужно. Проблема с этим подходом заключается в том, что когда (UIElement) Shape с удалены из представления, они расположены и нуждаются в реконструкции. Это приводит к нежелательному поведению, особенно если вы хотите показывать все оверлеи одновременно.

Вместо этого я решил добавить маркеры в коллекцию (путем взаимодействия с пользователем) и установить Visibility из Shape с, исходя из текущего combobox.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; 
    } 
} 

Я связал установку только с голыми костями, обратите внимание, что в этих библиотеках есть намного больше функциональности.

Смежные вопросы