Extendendo a ESRI ArcGIS API For Microsoft Silverlight/WPF – Parte 2

Na segunda parte desse post irei demonstrar como utilizar o método de extensão.

How can I use it?

Para utilizar o método de extensão vamos criar uma aplicação Silverlight simples que irá mostrar a informação de um layer oriundo de um serviço da ESRI.

Criamos então uma nova aplicação Silverlight 4 no Visual Studio 2010.

Adicione uma referência ao projeto que contém o método de extensão e também ao assembly ESRI.ArcGIS.Client.

Coloque o seguinte código no arquivo MainPage.xaml.

<UserControl x:Class="ArcGISServerAPIExtensionSample.MainPage"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
             xmlns:esri="clr-namespace:ESRI.ArcGIS.Client;assembly=ESRI.ArcGIS.Client"
             mc:Ignorable="d">

    <Grid x:Name="LayoutRoot">

        <esri:Map x:Name="MainMap">
            <esri:ArcGISDynamicMapServiceLayer ID="DynamicLayer"
                                               Url="http://sampleserver1.arcgisonline.com/ArcGIS/rest/services/Specialty/ESRI_StateCityHighway_USA/MapServer"
                                               Initialized="ArcGISDynamicMapServiceLayer_Initialized" />
        </esri:Map>

        <Grid Background="Black"
              Margin="10"
              Width="450"
              VerticalAlignment="Top"
              HorizontalAlignment="Left">

            <Grid.RowDefinitions>
                <RowDefinition Height="30" />
                <RowDefinition Height="30" />
                <RowDefinition Height="250" />
            </Grid.RowDefinitions>

            <ComboBox x:Name="cmbLayers"
                      HorizontalAlignment="Left"
                      Width="180"
                      Margin="2"
                      Grid.Row="0" />

            <Button x:Name="btnTeste"
                    Width="180"
                    Margin="2"
                    HorizontalAlignment="Left"
                    Content="Testar Método de Extensão"
                    Grid.Row="1"
                    Click="btnTeste_Click" />

            <TextBox x:Name="txtResultado"
                     Margin="2"
                     Grid.Row="2"
                     TextWrapping="Wrap" />

        </Grid>

    </Grid>
    
</UserControl>

O código XAML é bem simples e o objetivo é o usuário selecionar um layer no ComboBox e então clicar no Button, que realiza a chamada ao método de extensão.

No code-behind da página realize a inclusão dos namespaces abaixo:

using System.Text;
using ArcGISServerAPIExtension;
using ESRI.ArcGIS.Client;

Ainda no code-behind da página realize o data binding dos layers existentes no serviço DynamicLayer do mapa após o mesmo ser inicializado (evento Initialized).

private void ArcGISDynamicMapServiceLayer_Initialized(object sender, EventArgs e)
{
    // recupera layer
    var dynamicLayer = sender as ArcGISDynamicMapServiceLayer;

    // data binding
    this.cmbLayers.SelectedValuePath = "ID";
    this.cmbLayers.DisplayMemberPath = "Name";
    this.cmbLayers.ItemsSource = dynamicLayer.Layers;
}

Também faça a implementação do evento Click do Button para mostrar as informações do layer selecionado.

private void btnTeste_Click(object sender, RoutedEventArgs e)
{
    // verifica se algum layer foi selecionado
    if (this.cmbLayers.SelectedValue == null)
        return;

    // referência ao layer dinâmico que está no mapa
    var dynamicLayer = this.MainMap.Layers["DynamicLayer"] as ArcGISDynamicMapServiceLayer;

    dynamicLayer.GetLayerDetails((int)this.cmbLayers.SelectedValue, 
        (r) =>
        {
            // verifica erro
            if (r.Error != null)
            {
                this.txtResultado.Text = r.Error.Message;
                return;
            }

            // recupera resultado do método
            var layerDetails = r.Result;

            // cria string que contém as informações do layer
            var stringBuilder = new StringBuilder();

            // adiciona informações
            stringBuilder.AppendFormat("ID: {0}\n", layerDetails.ID);
            stringBuilder.AppendFormat("Name: {0}\n", layerDetails.Name);
            stringBuilder.AppendFormat("Description: {0}\n", layerDetails.Description);
            stringBuilder.AppendFormat("GeometryType: {0}\n", layerDetails.GeometryType);
            stringBuilder.AppendFormat("MinScale: {0}\n", layerDetails.MinScale);
            stringBuilder.AppendFormat("MaxScale: {0}\n", layerDetails.MaxScale);

            // adiciona campos (fields)
            stringBuilder.AppendLine("-----------------------");
            stringBuilder.AppendLine("Fields");
            stringBuilder.AppendLine("-----------------------");

            foreach (var field in layerDetails.Fields)
                stringBuilder.AppendLine(field.Name);

            this.txtResultado.Text = stringBuilder.ToString();
        }
    );
}

Esse método realiza o tratamento do método callback por meio de uma expressão lambda ( (r) =>) e mostra algumas das informações recuperadas do serviço.

Done !

O código-fonte do exemplo e do método de extensão você encontra aqui.

Espero que tenham gostado.

Um comentário:

  1. Outro artigo bem legal da serie.

    Ari, me passe seu contato. Sou gerente de uma equipe de .NET e utilizamos as APIs da ESRI.

    No meu site tem um form de contato.

    http://ctrlclabs.blogspot.com/

    Nosso projeto: http://www.informs.conder.ba.gov.br/

    Abraços!

    ResponderExcluir