#HowTo: Hacer mapping y no morir en el intento 7/7

lunes, 27 de agosto de 2012

ESRI también provee varios APIs para la web y para escritorio, que mediante controles de alto nivel, permiten proveer cartografía a nuestros usuarios. Aunque claro, llevan algunas limitaciones, que en algunos casos sólo puedes resolver con un licencia de ArcGIS Server, que por supuesto ya no es gratis.

Ficha técnica:
  • ESRI API 3.0 for Silverlight
  • C#.NET (4.0)

He seleccionado este API, aunque Silverlight ya no es una prioridad para el gigante de Redmond, el código que vamos a generar servirá para enlazar con el siguiente post, ya que el código XAML y el code behind serán aproximadamente los mismos.

Lo primero que hemos de hacer es descargar el API de la página de descargas de ESRI, si no eres usuario, te puedes registrar rápidamente para descargarlo.

Una vez descargado, procedemos a instalar.

Instalación API

Configurando Instalación

Creamos un nuevo proyecto de Silverlight / ESRI Standard Map Application

image

Una vez creamos el proyecto, seleccionando una de las plantillas que nos ofrece ESRI, debemos actualizar las referencias de Microsoft.Expressions.Interactions y System.Windows.Interactivity. Generamos y voila, tenemos mapa.

Plantilla Standard en ejecución

Esta plantilla está muy bien, tenemos un control de mapa, con un montón de elementos y funcionalidades, qué a priori, a parte de estar muy estético, puede resultar que no nos sirva para nada. Así, que vamos a crear nuestra propio control al que le iremos añadiendo los componentes que consideramos necesarios. Para ello, agregamos un nuevo proyecto de Silverlight.

Nuevo proyecto

Si la instalación del API ha sido correcto, tendremos en nuestro cuadro de herramientas los controles de ESRI, pero sino es así. Lo más sencillo, y más "limpio" es agregar las referencias a mano, para ello, agregamos la referencia ESRI.ArcGIS.Client a nuestro proyecto, y a nuestro marcado.

<UserControl x:Class="SilverlightApplication2.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="http://schemas.esri.com/arcgis/client/2009"
    mc:Ignorable="d" d:DesignHeight="600" d:DesignWidth="800">

    <Grid x:Name="LayoutRoot" Background="White" />
</UserControl>

Una vez lo hemos agregado, incluimos un nuevo control de mapa en el grid.

    <Grid x:Name="LayoutRoot" Background="White">
        <esri:Map x:Name="map1" WrapAround="True">
            <esri:Map.Layers>
                <esri:LayerCollection>
                    <esri:ArcGISTiledMapServiceLayer Url="http://services.arcgisonline.com/ArcGIS/rest/services/World_Street_Map/MapServer" />
                </esri:LayerCollection>
            </esri:Map.Layers>
        </esri:Map>
    </Grid>

Y con esto, tenemos un control de mapa pelado sin ningún componente más. Ahora lo que vamos a hacer es incluir un servicio WMS, concretamente el del PNOA, el cual nos va a permitir cargar el servicio web del plan nacional de ortofotografía aérea española. Para ello, agregamos otra referencia al proyecto de Silverlight, ESRI.ArcGIS.Client.Toolkit.DataSources, y dejamos el control de mapa sin ninguna capa, ya que vamos a agregar el servicio wms desde el código.

            var wms = new WmsLayer
                          {
                              Url = "http://www.idee.es/wms/PNOA/PNOA",
                              SkipGetCapabilities = false,
                              Layers = new string[] { "PNOA" },
                              Version = "1.3.0",
                              ProxyUrl = "http://tusitio.web/proxy.ashx"
                          };

El API de Silverlight, requiere de un proxy para realizar las peticiones al servicio WMS, para ello ESRI sirve un ejemplo para que puedas incluirlo en tu sitio web, más información.

Después continuamos creando una capa KML, y agregando tanto el sevicio WMS como el KML que hemos agregado.

            var kml = new KmlLayer
                          {
                              Url = new Uri("http://tusitio.web/fichero.kml"),
                              ProxyUrl = "http://tusitio.web/proxy.ashx"
                          };
            MyMap.Layers.Add(wms);
            MyMap.Layers.Add(kml);

Por último incorporamos al control de usuario una barra de progreso para que nos indique el proceso de carga de las capas, un control de navegación, la leyenda y la escala.

<UserControl x:Class="SilverlightApplication2.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="http://schemas.esri.com/arcgis/client/2009"
    mc:Ignorable="d" d:DesignHeight="600" d:DesignWidth="800" Loaded="UserControlLoaded">

    <Grid x:Name="LayoutRoot" Background="AliceBlue">
        <esri:Map x:Name="MyMap" WrapAround="True">
            <esri:Map.Extent>
                <esri:Envelope XMin="-21.37979367" XMax="5.07891717" YMin="27.14108121" YMax="44.03141073" >
                    <esri:Envelope.SpatialReference>
                        <esri:SpatialReference WKID="4326"/>
                    </esri:Envelope.SpatialReference>
                </esri:Envelope>
            </esri:Map.Extent>
        </esri:Map>
        <esri:ScaleLine x:Name="Scale" Map="{Binding ElementName=MyMap}" 
        HorizontalAlignment="Left" VerticalAlignment="Bottom" Visibility="Visible" />
        <esri:Legend x:Name="Legend" Map="{Binding ElementName=MyMap}" 
        HorizontalAlignment="Right" VerticalAlignment="Center"/>
        <esri:Navigation x:Name="Navigation" Map="{Binding ElementName=MyMap}"/>
        <esri:MapProgressBar x:Name="PBar" Map="{Binding ElementName=MyMap}" 
        HorizontalAlignment="Center" VerticalAlignment="Center" Width="200" Height="30"/>
    </Grid>
</UserControl>

Aplicación Silverlight

Deja un comentario

Buscar

Search