Практические советы: Графические слои, символы и способы отображения

С помощью ArcGIS API for Silverlight вы можете динамически отображать графику на карте с использованием графического слоя. Графический слой может использоваться, к примеру, для хранения полигонов, нарисованных пользователем, или для отображения объектов, удовлетворяющих пользовательскому запросу.

Символы отражают не связанные с географией аспекты показа объектов на карте. Это цвет, толщина границы, прозрачность графики и т.д. ArcGIS API for Silverlight содержит большое количество классов символов, каждый из которых позволит вам указать свои виды условных обозначений. Каждый тип символа относится к определенному типу геометрии (точка, линия или полигон).

Способы представления определяют один или несколько символов, с использованием которых будет отображаться слой. Символ, примененный к каждому графическому элементу, зависит от атрибутов графики. Способ отображения указывает, какие значения атрибутов соответствуют определенному символу.

Следующие разделы содержат практические советы по работе с графическими слоями, символами и способами отображения.

Установите свойство GraphicsLayer.Renderer

Необходимо использование свойства GraphicsLayer.Renderer для определения символов слоя. Если свойство способа отображения (Renderer) не установлено, при добавлении на карту графического слоя значение этого свойства будет автоматически заполнено способом отображения по умолчанию. Вам, следовательно, нужно обязательно указать свойство GraphicsLayer.Renderer перед добавлением слоя на карту. Свойство способа отображения Renderer графического слоя всегда замещает любые символы, установленные в Graphic.Symbol.

GraphicsLayer gl = new GraphicsLayer()
{
    ID = "IdentifyResultsLayer",
    Renderer = new SimpleRenderer()
    {
          Symbol = identifyDialog.Resources["RedMarkerSymbol"] as Symbol
    }
};

Поддерживаемые способы отображения

В настоящий момент поддерживаются только способы UniqueValueRenderer, ClassBreaksRenderer и SimpleRenderer. Если используется не поддерживаемый способ, пользователи не смогут настраивать символы слоя после того, как он будет добавлен на карту. Например, рассмотрим инструмент, добавляющий на карту графический слой. Пользователи Application Builder могут запускать такой инструмент во время редактирования приложения вьюера. При использовании поддерживаемого способа отображения пользователи могут менять символы результирующего слоя после его добавления на карту. Кроме того, если они сохраняют или развертывают такое приложение, слой результатов может быть сохранен в качестве части карты приложения. Эти возможности недоступны для графических слоев, использующих не поддерживающие настройки и сохранение способов отображения (например, TemporalRenderer).

Если используемый способ отображения другой (не UniqueValueRenderer, ClassBreaksRenderer или SimpleRenderer), не запускайте такой инструмент из Application Builder. Такая ситуация связана с тем, что способы отображения, отличающиеся от перечисленных, не поддерживают сохранение и настройку. Для этого проверьте, что значение свойства Application.Current.IsEditMode равно true, и затем предотвратите запуск инструмента.

Символы графического слоя

Объявите символы, используемые вашим графическим слоем в наборе ресурса Extensible Application Markup Language (XAML) вашего пользовательского интерфейса. Поскольку символы могут создаваться программно, объявление их в XAML значительно проще и удобнее.

<UserControl.Resources>
   <ResourceDictionary>
       <esri:SimpleMarkerSymbol x:Key="RedMarkerSymbol" Color="Red" Size="12" Style="Circle" />
   </ResourceDictionary>
</UserControl.Resources>

Имя слоя

Для получения или задания имени слоя, показанного на панели содержания карты, воспользуйтесь свойством MapApplication.LayerNameProperty. Можно указать имя, вызвав Layer.SetValue(MapApplication.LayerNameProperty, “имя слоя”), либо получить имя, вызвав Layer.GetValue(MapApplication.LayerNameProperty).

GraphicsLayer gl = new GraphicsLayer();
gl.SetValue(MapApplication.LayerNameProperty, "Identify Results");
gl.GetValue(MapApplication.LayerNameProperty);
6/8/2012