Desarrollo de una aplicación SIG con C#

33
DESARROLLO DE UNA APLICACIÓN SIG CON C# Antonio MATA MARAVILLA

Transcript of Desarrollo de una aplicación SIG con C#

DESARROLLO DE UNA APLICACIÓN SIG CON C#

2

0

1

4

Antonio MATA MARAVILLA

Copyright (c) 2013, MATA MARAVILLA Antonio.

Se otorga el permiso para copiar, distribuir y/o

modificar este documento bajo los términos de

GNU Free Documentation License, Version 1.3 o

cualquier versión publicada posteriormente por

Free Software Foundation; sin Secciones

Invariantes ni Textos de la Cubierta Delantera

ni Textos de Cubierta Trasera.

DESARROLLO DE UNA APLICACIÓN SIG CON C# 2014

1 COMPONENTES

Sistema diseñado para capturar, almacenar, manipular, analizar, administrar y mostrar todo tipo de dato geográfico

Las computadoras utilizadas en un SIG son equipos de alto desempeño y con gran capacidad de almacenamiento de datos

INTRODUCCIÓN

Técnicamente, un sistema de información geográfica (SIG) se define como una

tecnología orientada al manejo de información geográfica, la cual está conformada por

equipos electrónicos (hardware) programados adecuadamente (software), permitiendo el

manejo y el análisis de una serie de datos espaciales (información geográfica), siguiendo los

criterios definidos por el usuario de ellos (personal).

Desde la perspectiva informática, un SIG es una aplicación capaz de realizar tareas

orientadas al manejo de datos georreferenciados, los cuales combinan bases de datos

especializadas con elementos gráficos para representar elementos geográficos.

COMPONENTES

Un sistema de información geográfica se encuentra constituido por cuatro elementos

básicos: hardware, software, datos y personas.

El hardware, o componente físico, está conformado por todos aquellos equipos, especialmente

de cómputo, que permiten recopilar, almacenar, procesar y mostrar datos cartográficos

digitales: computadoras, monitores, impresoras, graficadores, discos duros, entre otros.

El software es la parte encargada de suministrar las herramientas necesarias para el análisis

y la visualización de los datos geográficos.

La parte más importante de todo sistema es el dato, ya que en éste se basa la razón de ser de la

aplicación. Dentro de un SIG, los datos pueden ser catalogados en espaciales y tabulares, los

cuales mantienen entre sí una relación muy estrecha, pues para cada elemento especial (gráfico)

tiene vinculado uno tabular (registro).

Otro componente fundamental en un SIG es el personal, el cual puede ser clasificado de

manera general como experto, especialista y final. El experto es aquel usuario quien diseña

y mantiene el sistema; un especialista tiene la función de elaborar las consultas, analizar la

información e introducir los datos al sistema, y el usuario final es aquel que hace uso de la

información existente en el sistema.

MODELACIÓN ESPACIAL

En la actualidad, los sistemas de información geográfica son de gran utilidad en toda

aquella organización cuya gestión de productos y/o servicios de su interés puedan ser

representados de manera geográfica: recursos naturales, ubicación de clientes y

proveedores, distribución de sucursales, rasgos culturales de sitios de interés, entre otros.

Para llevar a cabo esa gestión, un SIG maneja dos modelos de datos: vectorial y mapa de

bits.

DESARROLLO DE UNA APLICACIÓN SIG CON C# 2014

2 MODELACIÓN ESPACIAL

VECTORIALES

Los datos vectoriales son una abstracción de un elemento del mundo real, que es

representado por medio de un gráfico, el cual hace uso de diversos sistemas de

coordenadas para ubicar al elemento sobre la superficie terrestre, manteniendo las

características geométricas del elemento.

En los datos vectoriales, el interés de las representaciones se centra en la precisión de

localización de los elementos geográficos sobre el espacio y donde los fenómenos a

representar son discretos, es decir, de límites definidos. Cada una de estas geometrías está

vinculada a un registro en una base de datos, en donde sus atributos son descritos.

Los datos vectoriales se pueden utilizar para representar variaciones continuas de

fenómenos.

El modelo de datos vectorial hace uso de tres tipos de gráficas para la representación de

distintos elementos geográficos del mundo real: punto, línea y polígono.

Los puntos son utilizados para las entidades geográficas que pueden ser expresadas por un

único punto de referencia, es decir, por su simple ubicación. Por ejemplo, las localizaciones

de los pozos, picos de elevaciones o puntos de interés. Los puntos transmiten la menor

cantidad de información de estos tipos de archivo y no son posibles las mediciones.

También pueden ser utilizados para representar zonas a una escala pequeña. Por ejemplo,

las ciudades en un mapa del mundo estarán representadas por puntos en lugar de

polígonos.

Las líneas unidimensionales son usadas para rasgos lineales como ríos, caminos,

ferrocarriles, rastros, líneas topográficas o curvas de nivel. De igual forma que en las

entidades puntuales, en pequeñas escalas pueden ser utilizados para representar polígonos.

En este tipo de elemento, pueden realizarse medición de distancias o de longitudes.

Los polígonos bidimensionales se utilizan para representar elementos geográficos que

cubren un área particular sobre la superficie de la tierra. Estas entidades pueden

representar lagos, límites de parques naturales, edificios, provincias, o los usos del suelo,

por ejemplo. Los polígonos transmiten la mayor cantidad de información en archivos con

datos vectoriales y en ellos se pueden medir el perímetro y el área.

MAPAS DE BITS

Un mapa de bits es una matriz de puntos, o pixeles, donde cada celda hace referencia a una

posición única de la superficie terrestre, y en conjunto representan el elemento geográfico

de interés.

Los mapas de bits pueden ser imágenes, donde cada celda almacena un valor de color.

Otros valores registrados para cada celda puede ser un valor discreto, como el uso del

suelo, valores continuos, como temperaturas, o un valor nulo si no se dispone de datos. Si

Representación de diversos elementos geográficos con vectores y mapas de bits

Límites políticos / administrativos

Calles

Parcelas

Usos del suelo

Elevación

Mundo real

DESARROLLO DE UNA APLICACIÓN SIG CON C# 2014

3 FUTURO DE LOS SISTEMAS DE INFORMACIÓN

GEOGRÁFICA

bien una trama de celdas almacena un valor único, estas pueden ampliarse mediante el uso

de las bandas del mapa de bits para representar los colores RGB (rojo, verde, azul), o una

tabla extendida de atributos con una fila para cada valor único de células. La resolución del

conjunto de datos del mapa de bits es el ancho de la celda en unidades sobre el terreno.

Los mapas de bits son almacenados en diferentes formatos, desde un archivo estándar

basado en la estructura de TIFF o JPEG, hasta grandes objetos binarios (BLOB), que son

almacenados directamente en sistema de gestión de base de datos. El almacenamiento en

bases de datos, cuando se indexan, por lo general permiten una rápida recuperación de éste

tipo de datos, pero a costa de requerir el almacenamiento de millones registros con un

importante tamaño de memoria. En un modelo de mapa de bits, cuanto mayor sea la

dimensión de cada celda, menor es la precisión o detalle de la representación del espacio

geográfico.

FUTURO DE LOS SISTEMAS DE INFORMACIÓN

GEOGRÁFICA

Muchas disciplinas se han beneficiado de la tecnología subyacente en los SIG. El activo

mercado de los sistemas de información geográfica se ha traducido en una reducción de

costos y mejoras continuas en los componentes de hardware y software de los sistemas.

Esto ha provocado que el uso de esta tecnología haya sido asimilada por universidades,

gobiernos, empresas e instituciones que lo han aplicado a sectores como los bienes raíces,

la salud pública, la criminología, la defensa nacional, el desarrollo sostenible, los recursos

naturales, la arqueología, la ordenación del territorio, el urbanismo, el transporte, la

sociología o la logística entre otros.

En la actualidad los SIG están teniendo una fuerte implantación en los llamados servicios

basados en la localización (LBS, Location Based Services) debido al abaratamiento y masificación

de la tecnología GPS integrada en dispositivos móviles de consumo (teléfonos móviles,

computadoras portátiles). Los LBS permiten a los dispositivos móviles con GPS mostrar su

ubicación respecto a puntos de interés fijos (restaurantes, gasolineras, cajeros, hidrantes, etc.

más cercanos), móviles (amigos, hijos, autobuses, coches de policía) o para transmitir su

posición a un servidor central para su visualización u otro tipo de tratamiento.

No obstante que la mayoría de las organizaciones que han implementado soluciones SIG

se dan cuenta de la necesidad de personalizar este tipo de aplicaciones, con el fin de

mantener los datos actualizados y realizar un modelaje y análisis espacial específico, existe

en el mercado poco personal con el perfil necesario para llevar a cabo dichas tarea, lo que

representa un nicho laboral importante para aquellos profesionistas del área de informática

que posean las aptitudes necesarias para llevar a cabo el desarrollo y la gestión de este tipo

de sistemas de información.

DESARROLLO DE UNA APLICACIÓN SIG CON C# 2014

4 CREANDO UNA APLICACIÓN SIG

CREANDO UNA APLICACIÓN SIG

En el mercado actual existe una gran cantidad de soluciones, comerciales y gratuitas,

orientadas al manejo de información cartográfica digital, todas ellas con entornos

especializados para la gestión de ese tipo de información, imposibilitando su integración a

los desarrollos personalizados de una organización.

Esto hace que el usuario tenga que recurrir a más de una herramienta informática para

obtener la información de su interés, así como depender de personal capacitado en el

manejo del SIG.

Por eso la importancia que el desarrollador de aplicaciones hechas a la medida, las cuales

necesiten incluir este tipo de tecnología, conozca las bases teóricas y técnicas para su

implementación.

En este capítulo se presentarán las bases para el desarrollo de una aplicación con Visual

Studio 2010, utilizando el lenguaje de programación C# y el control ActiveX MapWinGIS,

que permite la integración de la tecnología SIG en una aplicación de escritorio.

OBTENIENDO MAPWINGIS

Como un esfuerzo en el desarrollo de código abierto activo, el proyecto GIS MapWindow

y su control ActiveX MapWinGIS son actualizados regularmente para su mejora. Debido a

esto, siempre se debe considerar hacerse de la última versión del componente AciveX

antes de dar inicio a cualquier proyecto de desarrollo. La manera más común, y cómoda, es

descargar el paquete de instalación de MapWinGIS de la siguiente dirección:

http://mapwingis.codeplex.com/releases/view/110285

Se recomiendo descargar e instalar el paquete para 32 bits, aun cuando la tecnología del

equipo de desarrollo sea de 64 bits.

Una vez instalado el control MapWinGIS, lo siguiente es

agregarlo a la caja de herramientas del entorno de desarrollo de

Visual Studio. Como primer paso, es recomendable agregar un

nuevo grupo de herramientas dentro de la Caja de

Herramientas (ToolBox), y darle el nombre de MapWinGIS.

Una vez que se tiene el nuevo grupo de herramientas, se

procede agregar el control ActiveX MapWinGIS

previamente instalado, para lo cual se expande el nuevo

grupo y al pulsar el botón derecho del ratón, del menú

emergente, se elige la opción Elegir Elementos…

(Choose Items…).

DESARROLLO DE UNA APLICACIÓN SIG CON C# 2014

5 CREANDO UNA APLICACIÓN SIG

En la ventana de diálogo

Elegir Elementos de la Caja

de Herramientas (Choose

Toolbox Items), abrir la

pestaña Componentes COM

(COM Components) y

buscar la entrada Map

Control, marcarla y presionar

el botón Ok. Con lo anterior

se agrega a la Caja de

Herramientas (Toolbox) el

control MapWinGIS,

quedando listo para ser

incorporado en la aplicación donde será utilizado.

AGREGAR UN MAPA

Para agregar un componente axMap de MapWinGIS a un formulario de la aplicación

donde será utilizado, solo basta tomarlo de la Caja de Herramientas (Toolbox) y

arrastrarlo hacia el interior de éste, mostrando un área en blanco, la cual puede ser

redimensionada de acuerdo al diseño de la aplicación.

Para que el mapa se redimensione automáticamente cuando el formulario cambia de tamaño, establecer los valores adecuados a la propiedad Anchor en la ventana de Propiedades (Properties)

DESARROLLO DE UNA APLICACIÓN SIG CON C# 2014

6 CREANDO UNA APLICACIÓN SIG

Además, dentro del código del formulario se crea una

instancia de MapWinGIS que por omisión se recibe el

nombre de AxMap1.

La gestión de las capas que contienen la información

cartográfica a visualizar dentro de la aplicación es

realizada dentro del código de la aplicación, utilizando la

instancia AxMap1.

AÑADIR UNA CAPA DE DATOS AL MAPA

Una vez que se tiene el control MapWinGIS incorporado en la aplicación, el primer paso

es cargar los datos geográficos digitales, o capas, a mostrar dentro de él, para lo cual se

utilizará la instancia AxMap1.

Dependiendo del tipo del modelo de dato a insertar, será el objeto necesario a crear y agregar

dentro de AxMap1: para datos vectoriales, crear una instancia de la clase ShapeFile,

mientras que para mapas de bits, instanciar la clase Image. Ambas clases se encuentran dentro

del paquete MapWinGIS.

Las ShapeFile e Image poseen un método llamado Open, el cual recibe como

parámetro el nombre del archivo que contiene la información a mostrar.

Una vez que el objeto que contiene los datos geográficos, debe ser agregado a la instancia

AxMap1 mediante el método AddLayer, el cual recibe el nombre del objeto y un valor

lógico para indicar si se muestra o no la información al ser cargado por primera vez.

MapWinGIS.Shapefile vectorial = new MapWinGIS.Shapefile();

cobertura.Open(“ubicación_archivo”);

this.axMap1.AddLayer(vectorial, true);

y

MapWinGIS.Image mapa_bits = new MapWinGIS.Image();

cobertura.Open(“ubicación_archivo”);

this.axMap1.AddLayer(mapa_bits, true);

Cuando los datos son agregados al control, por omisión se activa el modo de acercamiento,

cambiando la apariencia del cursor del ratón al de una lupa con el signo “+” en su interior. En

este modo, es posible ampliar el mapa al pulsar el botón izquierdo del ratón sobre él o

dibujando un área rectangular que abarque el área de interés. Para realizar un alejamiento, se

pulsa el botón derecho del ratón sobre el mapa.

Acercamiento y Arrastre

Una de las características distintivas de una aplicación SIG es su capacidad de navegación

en el mapa, al implementar acciones de acercamiento y arrastre.

Para activar estas acciones, simplemente se asigna a la propiedad CursorMode de la

instancia AxMap1 el valor apropiado tomado de la enumeración tkCursorMode, ésta

última definida dentro del paquete MapWinGIS.

El método AddLayer retorna un valor numérico entero, conocido como manejador, a través del cual es posible acceder y manipular la capa añadida al mapa

MapWinGIS usa varias técnicas de optimización para agilizar el despliegue. Esto se aprecia en especial en la actividad de acercamiento: es más rápido el redibujado al definir un área pequeña y más lento al mostrar toda la información. Esto se debe a una optimización que sólo dibuja las figuras que caen dentro de la extensión actual en cada acercamiento o arrastre

DESARROLLO DE UNA APLICACIÓN SIG CON C# 2014

7 MOSTRANDO DATOS VECTORIALES, ESQUEMAS

DE COLORES Y ETIQUETAS

this.axMap1.CursorMode = MapWinGIS.tkCursorMode.cmZoomIn;

this.axMap1.CursorMode = MapWinGIS.tkCursorMode.cmZoomOut;

this.axMap1.CursorMode = MapWinGIS.tkCursorMode.cmPan;

Cuando no es necesario realizar ninguna tarea de navegación sobre el mapa, se asigna a la

propiedad CursorMode el valor tkCursorMode.cmNone.

this.axMap1.CursorMode = MapWinGIS.tkCursorMode.cmNone;

MOSTRANDO DATOS VECTORIALES,

ESQUEMAS DE COLORES Y ETIQUETAS

La mayoría de las veces, los desarrolladores de aplicaciones SIG necesitan la capacidad

para crear mapas ricos e informativos al mostrar los datos de manera visualmente

estimulante. Por lo general, se utilizan técnicas como los esquemas de colores, marcadores,

etiquetas y otros tipos de simbología para mejorar el valor visual de un mapa digital. La

simbología puede utilizarse para transmitir información sobre los datos, tales como la

población de un país, o simplemente llamar la atención sobre determinada parte del mapa,

poniendo de relieve cierta característica. En este capítulo, se muestra la manera de ajustar

las propiedades globales de despliegue para una capa de información, la forma de aplicar

un esquema de colores a los datos, y cómo agregarles etiquetas.

AJUSTANDO LAS PROPIEDADES DE DESPLIEGUE

Cuando los datos geográficos, ya sean vectoriales o mapas de bits, han sido agregados al

objeto derivado de la clase AxMap, el programado tiene la capacidad de modificar su

apariencia antes de ser mostrados, modificando colores, texturas y símbolos, al utilizar el

manejador obtenido al agregar los datos a la instancia de AxMap.

Los valores asignados a las propiedades de despliegue son de tipo numérico, enteros o

punto flotante, y se establecen desde el objeto AxMap1 al invocar a una serie de métodos

que reciben, en su mayoría, dos parámetros: el manejador de los datos cuya apariencia se

modificará, y un valor numérico que representa su apariencia.

En los datos vectoriales, las propiedades de relacionadas con el color de los elementos,

aceptan valores numéricos enteros, mientras que aquellas que definen el ancho de línea y

tamaño de un símbolo son de tipo punto flotante.

Para poder modificar la apariencia de una capa, es necesario recuperar el manejador del

mismo, al momento de agregarlo al objeto derivado de la clase AxMap por medio del

método AddLayer.

int manejador = AxMap1.AddLayer(datos_vector, visible);

La manipulación de la apariencia de los datos geográficos hará referencia al manejador que

se les asignó.

Algunos de los métodos para definir la apariencia de los elementos gráficos de una capa

más utilizados son los siguientes:

DESARROLLO DE UNA APLICACIÓN SIG CON C# 2014

8 MOSTRANDO DATOS VECTORIALES, ESQUEMAS

DE COLORES Y ETIQUETAS

Método Descripción Aplicable a

set_ShapeLayerDrawFill (int manejador, bool rellenar)

Define si los polígonos serán rellenados al ser dibujados

Polígonos

set_ShapeLayerDrawLine (int manejador, bool delinear)

Indica si los polígonos o arcos serán delineados al ser dibujados

Arcos Polígonos

set_ShapeLayerDrawPoint (int manejador, bool puntear)

Establece si serán mostrados los vértices (polígonos o arcos) o puntos al ser dibujados

Arcos Polígonos Puntos

set_ShapeLayerFillColor (int manejador, UInt32 colorRelleno)

Define el color a utilizar en el relleno de los polígonos

Polígonos

set_ShapeLayerFillStipple (int manejador, MapWinGIS.tkFillStipple achurado)

Establece el achurado con el cual se dibujará el relleno de los polígonos

Polígonos

set_ShapeLayerFillTransparency (int manejador, single porcienTransparente)

Define el porcentaje de transparencia del relleno de los polígonos

Polígonos

set_ShapeLayerLineColor (int manejador, UInt32 color)

Establece el color de la línea

Arcos Polígonos

set_ShapeLayerLineStipple (int manejador, MapWinGIS.tkLineStipple punteado)

Define el punteado con el cual se dibujará la línea

Arcos Polígonos

set_ShapeLayerLineWidth (int manejador, single ancho)

Establece el ancho con el cual se dibujará la línea

Arcos Polígonos

set_ShapeLayerPointColor (int manejador, UInt32 color)

Establece el color con el cual se dibujará el punto

Puntos

set_ShapeLayerPointSize (int manejador, single tamaño)

Define el tamaño del punto o vértice al ser dibujado

Puntos

set_ShapeLayerPointType (int manejador, MapWinGIS.tkPointType tipoPunto)

Establece el tipo de punto a utilizar

Puntos

El código típico para manejar la apariencia de los elementos gráficos de una capa es el

siguiente:

//Para polígonos

int poligono = AxMap1.AddLayer(datos_vector, visible);

UInt32 colorRelleno = Convert.ToUInt32(Color.RGB(Color.color.R,

Color.color.G, Color.color.B));

UInt32 colorLinea = Convert.ToUInt32(Color.RGB(0, 255, 255));

single anchoLinea = 2.0;

AxMap1.set_ShapeLayerDrawFill(poligono, true);

AxMap1.set_ShapeLayerFillColor(poligono, colorRelleno);

DESARROLLO DE UNA APLICACIÓN SIG CON C# 2014

9 MOSTRANDO DATOS VECTORIALES, ESQUEMAS

DE COLORES Y ETIQUETAS

AxMap1.set_ShapeLayerLineColor(poligono, colorLinea);

AxMap1.set_ShapeLayerLineWidth(poligono, anchoLinea);

//Para arcos

int arco = AxMap1.AddLayer(datos_vector, visible);

UInt32 colorLinea = Convert.ToUInt32(Color.RGB(0, 255, 255));

single anchoLinea = 2.0;

AxMap1.set_ShapeLayerDrawLine(arco, true);

AxMap1.set_ShapeLayerLineColor(arco, colorLinea);

AxMap1.set_ShapeLayerLineWidth(arco, anchoLinea);

//Para puntos

int punto = AxMap1.AddLayer(datos_vector, visible);

UInt32 colorPunto = Convert.ToUInt32(Color.RGB(255, 255, 0));

single tamPunto = 8.0;

AxMap1.set_ShapeLayerDrawPoint(punto, true);

AxMap1.set_ShapeLayerPointColor(punto, colorPunto);

AxMap1.set_ShapeLayerPointSize(punto, tamPunto);

AxMap1.set_ShapeLayerPointType(punto, MapWinGIS.tkPointType.ptCircle);

Las nuevas versiones de MapWinGIS recomiendan hacer uso de la propiedad

DrawingOptions, la cual deriva de la clase ShapeDrawingOptions, de la capa de

datos a modificar su apariencia, debido a que los métodos antes presentados utilizan

enumeraciones obsoletas.

Debido a que MapWinGIS fue diseñado para soportar ambientes de desarrollo tanto .NET

como no-.NET, no soporta la numeración de colores que ofrece .NET, por ello se utiliza

su representación de entero largo.

Para utilizar un icono personalizado como icono en las capas de puntos, se pasa

MapWinGIS.tkPointType.ptUserDefined como parámetro al método

set_ShapeLayerPointType. A continuación se presenta una porción de código, en

donde se utiliza una imagen personalizada para mostrar los puntos de una capa:

int punto = AxMap1.AddLayer(datos_vector, visible);

AxMap1.set_ShapeLayerPointType(punto,

MapWinGIS.tkPointType.ptUserDefined);

MapWinGIS.Image icono = new MapWinGIS.Image();

icono.Open(“icono.bmp”);

AxMap1.set_UDPointType(punto, icono);

DEFINIENDO UN ESQUEMA DE COLORES

En MapWinGIS, el término “esquema de colores” hace referencia al uso de colores para

diferenciar los elementos de una capa, basándose en los valores de los atributos de la tabla

que tiene relacionada.

Para la aplicación de ésta técnica, es necesario un objeto de la clase ColorScheme, donde

se encuentran los colores a utilizar, y un objeto derivado de Shapefile, para generar un

grupo de categorías basadas en el valor del atributo con el cual se asociarán los colores.

MapWinGIS toma al pixel de la esquina superior izquierda del mapa de bits como el color de transparencia. Si se desea tener transparencia en algún lugar del mapa de bits, elegir el color que se desplegará transparente y colocar un pixel con este color en la esquina superior izquierda de la imagen.superior izquierda de la imagen

DESARROLLO DE UNA APLICACIÓN SIG CON C# 2014

10 MOSTRANDO DATOS VECTORIALES, ESQUEMAS

DE COLORES Y ETIQUETAS

Shapefile capa = AxMap1.get_Shapefile(manejador);

ColorScheme esquema = new MapWinGIS.ColorScheme();

esquema.SetColors(colorInicio, colorFinal);

capa.Categories.Generate(0, tkClassificationType.ctUniqueValues,

numCategorias);

capa.Categories.ApplyColorScheme(tkColorSchemeType.ctSchemeGraduated,

esquema);

El método SetColors de la clase ColorScheme genera una rampa de colores a partir

del par de valores pasados a éste como argumentos.

En el método Generate de la propiedad Categories, el primer argumento hace

referencia a la posición del campo dentro de la tabla relacionada con la capa, y cuyos

valores servirán de base para generar las categorías; el segundo argumento recibe un valor

del tipo enumerado tkClassificationType, indicando el tipo de clasificación que se

aplicará en la generación de las categorías. El último argumento establece la cantidad de

categorías a generar; en caso de utilizar el valor

tkClassificationType.ctUniqueValues en el segundo argumento, este último

parámetro es omitido.

Otra forma de definir la apariencia visual que tendrá cada categoría es asignarle

manualmente las características gráficas con las cuales se desplegará. Para lo anterior se

hace uso de la propiedad DrawingOptions perteneciente a la categoría, quien a su vez

contiene una colección de propiedades que establecen la apariencia de visualización de los

puntos, líneas y polígonos que conforman la categoría.

MapWinGIS.Shapefile capa = this.axMap1.get_Shapefile(manejador);

capa.Categories.Generate(indiceCampo,

MapWinGIS.tkClassificationType.ctUniqueValues, numCategorias);

for (int i = 0; i < capa.Categories.Count; i++)

{

MapWinGIS.ShapefileCategory categoria = capa.Categories.get_Item(i);

categoria.DrawingOptions.característicaVisual = valor;

}

USO DE SÍMBOLOS PARA PUNTOS

Para las capas con topología de puntos, MapWinGis ofrece tres formas gráficas de

presentarlos: símbolos predefinidos, imágenes y caracteres. La forma a utilizar se define en

el atributo PointType de la clase ShapeDrawingOptions, cuyo conjunto de valores es

el siguiente:

Valor Descripción

ptSymbolStandard Los componentes de la capa se dibujarán usando los tipos de símbolos definidos en la enumeración tkPointShapeType.

ptSymbolFontCharacter Los componentes de la capa se dibujarán tomando de los caracteres de la fuente ANSI definida.

ptSymbolPicture Los componentes de la capa se dibujarán con el contenido de las instancias de la clase Image.

DESARROLLO DE UNA APLICACIÓN SIG CON C# 2014

11 MOSTRANDO DATOS VECTORIALES, ESQUEMAS

DE COLORES Y ETIQUETAS

Cuando se establece el ptSymbolStandard, el símbolo a utilizar es definido en la

propiedad PointShape; al utilizar el valor ptSymbolFontCharacter, el nombre de la

fuente de caracteres es definida en la propiedad FontName y el símbolo con el cual se

dibujarán los componentes de la capa se establece en la propiedad PointCharacter. Al

usar ptSymbolPicture, la instancia de la clase Image es asignada a la propiedad

Picture.

Como ejemplo se utilizarán iconos para dibujar los puntos de la capa, con base en el valor

de un atributo de la tabla asociada con la capa, agrupándolos en categorías, de manera muy

similar al esquema de colores. A cada categoría se le asigna una imagen la cual se usará para

dibujar los puntos que cumplen con la expresión de filtrado de la categoría.

El código tipo para llevar a cabo esta acción se muestra en seguida:

ShapeFile capa = AxMap1.get_Shapefile(manejador);

MapWinGIS.Image imagen1 = new MapWinGIS.Imagen();

MapWinGIS.Image imagen2 = new MapWinGIS.Imagen();

MapWinGIS.Image imagenN = new MapWinGIS.Imagen();

int numCampo = posicionDeCampoEnTabla;

imagen1.Open(“mapa_bits1”);

imagen2.Open(“mapa_bits2”);

imagenN.Open(“mapa_bitsN”);

AxMap1.set_ShapeLayerPointType(manejador, tkPointType.ptUserDefined);

capa.Categories.Generate(numCampo,

tkClassificationType.ctUniqueValue, 0);

ShapefileCategory categoria = capa.Categories.Item[0];

categoria.DrawingOptions.PointType = tkPointSymbolType.ptSymbolPicture;

categoria.DrawingOptions.Picture = imagen1;

categoria = capa.Categories.Item[1];

categoria.DrawingOptions.PointType = tkPointSymbolType.ptSymbolPicture;

categoria.DrawingOptions.Picture = imagen2;

categoria = capa.Categories.Item[N];

categoria.DrawingOptions.PointType = tkPointSymbolType.ptSymbolPicture;

categoria.DrawingOptions.Picture = imagenN;

También es posible agregar las categorías de manera manual, utilizando el método Add de

la propiedad Categories, guardando el valor devuelto en una variable de tipo

ShapefileCategory a través de la cual se define la expresión de filtrado, tipo de

símbolo e imagen a utilizar.

ShapefileCategory categoria = capa.Categories.Add(“nombreCategoria”);

categoria.Expression = “expression_filtrado”;

categoria.DrawingOptions.PointType = tkPointSymbolType.ptSymbolPicture;

categoria.DrawingOptions.Picture = imagen1;

capa.Categories.ApplyExpressions();

DESARROLLO DE UNA APLICACIÓN SIG CON C# 2014

12 MOSTRANDO DATOS VECTORIALES, ESQUEMAS

DE COLORES Y ETIQUETAS

ETIQUETADO DE ELEMENTOS

El etiquetado de elementos de una capa es un arte muy difícil de automatizar. Existen

cuestiones tales como el tamaño de la etiqueta, fuente, escala, rotación, seguimiento de

líneas, centrado en polígonos, colocación por puntos, colisión con otras etiquetas, y

muchas más.

MapWinGIS posee un robusto y flexible conjunto de funciones de etiquetación, pero deja

gran parte de la responsabilidad de esa tarea al programador.

Antes de iniciar, es importante decidir qué elementos se desean etiquetar, y que texto se

aplicará. En seguida será necesario obtener información de la posición donde serán

mostradas las etiquetas. Finalmente se necesita determinar la apariencia de las etiquetas que

se utilizarán y la manera en que serán colocadas dentro del mapa.

El código para llevar a cabo el etiquetado de elementos es muy similar al visto en esquema

de colores: se va tomando cada uno de los elementos de la capa, recupera el valor a usar

como etiqueta, así como las coordenadas de éste, para finalmente agregar la etiqueta que

tendrá asociada.

ShapeFile capa = AxMap1.get_Shapefile(manejador);

String etiqueta;

UInt32 colorEtiqueta = Convert.ToUInt32(RGB(0, 0, 0));

double coordX, coordY;

int numCampo = posicionDeCampoEnTabla;

for (int numElemento = 0; numElemento < capa.NumShapes; numElemento++){

etiqueta = capa.get_CellValue(numCampo, numElemento);

coordX = capa.Shape[numElemento].get_Point(0).x;

coordY = capa.Shape[numElemento].get_Point(0).y;

capa.Labels.AddLabel(etiqueta, coordX, coordY, rotación, categoría);

}

La personalización de las etiquetas puede llevarse a cabo desde la instancia de

AxMapWinGis o desde ShapeFile. Un objeto derivado de AxMapWinGis posee una

serie de métodos que permiten definir la apariencia de las etiquetas a mostrar en una capa;

cuando se utiliza una instancia de ShapeFile, la apariencia de las etiquetas se define a

través de la propiedad Labels, que es una instancia de la clase del mismo nombre,

modificando el contenido de las propiedades que tiene asociadas.

Para personalizar la apariencia de las etiquetas de una capa se utiliza la función

LayerFont, especificando la fuente y tamaño de ésta a utilizar.

axMap1.LayerFont(manejador, “fuente”, tamañoFuente);

El escalado de etiquetas es utilizando cuando se necesita que las etiquetas crezcan o

contraigan con el mapa, al momento en que el usuario realiza un acercamiento o un

alejamiento:

axMap1.set_LayerLabelScale(manejador, true);

DESARROLLO DE UNA APLICACIÓN SIG CON C# 2014

13 MOSTRANDO DATOS VECTORIALES, ESQUEMAS

DE COLORES Y ETIQUETAS

Un desfasamiento global en la etiquetas de una capa específica puede establecer,

ajustándolas verticalmente en base a un número constante de pixeles. Esto es muy

utilizado para evitar colisiones entre la etiqueta y un icono personalizado de un punto.

axMap1.set_LayerLabelOffset(manejador, numPixeles);

El sombreado de las etiquetas ayuda a que sean legibles, al pintar alrededor de ellas.

axMap1.set_LayerLabelShadow(manejador, true);

axMap1.set_LayerLabelShadowColor(manejador, colorSombra);

Una vez aplicadas las etiquetas en una capa, es posible mostrarlas u ocultarlas utilizando la

función set_LayerLabelVisible:

axMap1.set_LayerLabelVisible(manejador, true);

Otra función que permite adicionar etiquetas en una capa es AddLabelEx, la cual posee

un característica adicional: la rotación de las etiquetas. Su forma es la siguiente:

axMap1.AddLabelEx(manejador, etiqueta, colorEtiqueta, coordX, coordY,

MapWinGIS.tkHJustification.hjCenter, anguloRotación);

Cuando se tienen muchas etiquetas en una capa, ésta puede hacerse ilegible, especialmente

cuando se traslapan entre sí. MapWinGIS proporcionar la función

set_UseLabelCollision, cuyo propósito es evitar el empalme de etiquetas, asegurando

que todas las etiquetas estarán separadas lo suficiente para que sean legibles.

Para activar la evitación automática de colisión de etiquetas, se utiliza el código siguiente:

AxMap1.set_UseLabelCollision(manejador, true);

La evitación automática de colisiones es particularmente útil cuando se utilizan etiquetas de

tamaño fijo. En éste caso, al realizar un alejamiento, las etiquetas mantienen un tamaño

constante, comenzando a bloquearse y empalmarse entre sí.

DESARROLLO DE UNA APLICACIÓN SIG CON C# 2014

14 AGREGANDO UN MAPA

EJEMPLO PRÁCTICO

La realización de este ejemplo requiere tener instalado en el equipo de cómputo Visual

Studio 2010, y dentro de esta IDE el control ActiveX WinMapGIS, siguiendo los pasos

expuestos al inicio del capítulo “Creando una Aplicación GIS”.

A continuación se presentan los pasos básicos para crear una aplicación GIS funcional,

aplicando la teoría mostrada en los capítulos anteriores.

AGREGANDO UN MAPA

1. Crear una aplicación de escritorio, nombrando a la solución WSCartogafia y al

proyecto WFAPrincipal.

Una vez que creada la carpeta de la solución y del proyecto, copiar dentro de ésta última la

carpeta cartografia, la cual contiene la información cartográfica digital a utilizar en el

ejemplo.

La carpeta catografia contiene a su vez la carpeta vector, en donde se encuentran los

datos de tipo vectorial con los cuales se trabajarán. El conjunto de datos vectoriales

representan rasgos geográficos de las localidades urbanas existentes en el municipio de

Lerdo, Durango; cada nombre de cobertura inicia con nueve dígitos, correspondientes a la

clave de la localidad, y terminan con una o más letras que hacen referencia al tipo de

elemento cartográfico urbano que contiene, cuyo significado es el siguiente:

Clave Topología Descripción

SIP Punto Sitios de interés. Ubicación de sitios de interés, tales como plazas, escuelas, centros de asistencia médica, templos y tanques de agua entre otros.

T Punto Tipo de vialidad. Elementos con categoría, nombre y tipo de la vialidad.

CA Línea Carretera. Trayectoria de las carreteras dentro de la localidad urbana, así como la condición de la misma, la pavimentación que posee y el tipo de transito (libre o peaje).

E Línea Eje vial. Trayectoria de las vialidades en la localidad urbana, conteniendo su nombre y tipo.

SIL Línea Sitios de interés. Trayectoria de sitios de interés, tales como puentes, linderos y canales entre otros.

A Polígono Área geoestadística básica. Delimitación de la superficie que abarca el área de geoestadística básica (AGEB), con la cual INEGI divide una localidad para cuestiones censales.

L Polígono Límite. Superficie territorial que ocupa la localidad urbana.

M Polígono Manzanas. Delimitación de las manzanas que conforman la localidad urbana.

DESARROLLO DE UNA APLICACIÓN SIG CON C# 2014

15 AGREGANDO UN MAPA

Clave Topología Descripción

SIA Polígono Sitios de interés. Delimitación de la superficie que abarcan diversos sitios de interés, tales como áreas verdes, camellones, plazas, instalaciones deportivas o recreativas, escuelas y templos, entre otros.

Las localidades contenidas son las siguientes:

Clave Nombre

100120001 Lerdo

100120007 Carlos Real

100120018 El Huarache

100120021 León Guzmán

100120023 La Loma

100120028 Nazareno

100120057 Ciudad Juárez

100120084 Villa de Guadalupe

Cuando la carpeta cartografía ha sido copiada dentro del directorio del proyecto, en

el Explorador de la Solución forzar el despliegue de ésta, marcarla y pulsar sobre ella el

botón derecho del ratón, para seleccionar la opción Incluir en el Proyecto. Después

expandir cada una de las carpetas contenidas dentro de la carpeta vector y seleccionar

todos los archivos que contienen, abrir la ventana de propiedades y en la propiedad Copiar

al Directorio de Salida (Copy to Output Directory) elegir la opción Copiar si es más

Nuevo (Copy if newer), esto hará que al momento de construir la aplicación, los archivos

de datos sean también copiados al directorio de distribución.

2. Asignar a la propiedad Text del formulario del proyecto el valor “Sistema

Cartográfico”.

3. De la caja de herramientas, en la sección Containers y seleccionar el control

SplitContainer, arrastrándolo al interior de la forma.

DESARROLLO DE UNA APLICACIÓN SIG CON C# 2014

16 AGREGANDO UN MAPA

4. Nuevamente, desde la caja de herramientas, seleccionar el control Map Control y

arrastrar hacia el interior del Panel2 del SplitContainer.

Al insertar éste control, dentro de la aplicación se crea una instancia de la clase AxMap,

nombrada por omisión axMap1, y es a través de ella que se gestionan las capas de datos

cartográficos.

5. Ajustar el tamaño del control, de forma tal que los datos

cartográficos puedan ser visualizados lo mejor posible. Se

recomienda utilizar la propiedad Dock del control y asignarle

el valor Fill haciendo que ocupe toda el área del contenedor

que la alberga.

DESARROLLO DE UNA APLICACIÓN SIG CON C# 2014

17 AÑADIENDO CAPAS DE DATOS CARTOGRÁFICOS

AÑADIENDO CAPAS DE DATOS

CARTOGRÁFICOS

Una vez que el control AxMapWinGis ha sido insertado en el formulario, se está en

posibilidad mostrar la información cartográfica dentro de él.

6. Después de haber insertado el control axMap1, cargar la capa 100120001L, que

muestra la superficie que ocupa la ciudad de Lerdo, Durango. Para esto se ingresa el

siguiente código dentro del método asociado con el evento Load del control Form1:

MapWinGIS.Shapefile cobertura = new MapWinGIS.Shapefile();

cobertura.Open(“cartografia\\vector\\100120001\\100120001L.shp”);

this.axMap1.AddLayer(cobertura, true);

El resultado se muestra a continuación:

7. Como se tienen datos cartográficos de diferentes localidades urbanas del municipio de

Lerdo, la aplicación deberá permitir al usuario elegir una ciudad y mostrar sus límites

urbanos, para lo cual se adicionará a la funcionalidad de cargar cualquiera de las

localidades. Primero se agrega en el Panel1 del control SplitContainer un

control RadioButton por cada localidad, que en éste caso son ocho, y a cada uno

asignarle el nombre de la población que representa en la propiedad Text y la clave de

la misma en la propiedad Tag. Ahora cada vez que el usuario seleccione uno de los

botones, la aplicación mostrará los límites de la localidad elegida.

8. Antes de implementar la nueva capacidad, es necesario eliminar todo el contenido del

método Form1_Load, ya que no es necesario cargar alguna cobertura al iniciar la

ejecución de la aplicación. Como la acción de cargar una capa al seleccionar uno de los

DESARROLLO DE UNA APLICACIÓN SIG CON C# 2014

18 AÑADIENDO CAPAS DE DATOS CARTOGRÁFICOS

RadioButton agregados es la misma, se desarrollará un solo método para llevar a

cabo dicha tarea y asociarlo con el evento CheckedChanged de cada uno de estos

controles. El código y nombre del método son los siguientes:

private void localidad_CheckedChanged(object sender, EventArgs e)

{

MapWinGIS.Shapefile cobertura = new MapWinGIS.Shapefile();

RadioButton boton = (RadioButton)sender;

String cveLocalidad = boton.Tag.ToString();

this.axMap1.RemoveAllLayers();

cobertura.Open("cartografia\\vector\\" + cveLocalidad + "\\" +

cveLocalidad + "L.shp");

int localidad = this.axMap1.AddLayer(cobertura, true);

}

Los resultados de la ejecución de la aplicación son los siguientes:

9. Cada localidad tiene asociado un conjunto de elementos cartográficos, los cuales se

encuentran almacenados en distintas capas (archivos), por lo que es conveniente que al

momento de seleccionar una localidad, también se carguen las capas de los elementos

cartográficos urbanos de la misma. Primero será necesario agregar nueve controles

CheckBox dentro del Panel1 del control SplitContainer, debajo del área donde

se encuentran los controles RadioButton, donde cada uno representará un elemento

cartográfico urbano, que al momento de seleccionarlo sea mostrado.

DESARROLLO DE UNA APLICACIÓN SIG CON C# 2014

19 AÑADIENDO CAPAS DE DATOS CARTOGRÁFICOS

10. Enseguida se crea un método llamado cargaElementos, el cual recibe un parámetro

de tipo String, que contiene la clave de la localidad de la cual se cargarán sus

elementos cartográficos asociados. Éste método es invocado después de cargada la

capa de la localidad, dentro del procedimiento localidad_CheckedChanged

previamente declarada.

private void cargaElementos(string cveLocalidad)

{

String[] elementos = new String[] {"SIP", "T", "CA", "E", "SIL",

"A", "M", "SIA"};

CheckBox[] botones = new CheckBox[]{this.checkBox1, this.checkBox2,

this.checkBox3, this.checkBox4,

this.checkBox5, this.checkBox6,

this.checkBox8, this.checkBox9};

for (int i = 0; i < elementos.Length; i++)

{

MapWinGIS.Shapefile cobertura = new MapWinGIS.Shapefile();

if (cobertura.Open("cartografia\\vector\\" + cveLocalidad + "\\"

+ cveLocalidad + elementos[i] + ".shp"))

{

int elemento = this.axMap1.AddLayer(cobertura, false);

botones[i].Tag = elemento;

botones[i].Enabled = true;

}

Las capas son dibujadas en el mapa en el orden en que fueron agregadas en él, de forma tal que en primer plano se tiene la última y en el fondo se encuentra la primera.

DESARROLLO DE UNA APLICACIÓN SIG CON C# 2014

20 AÑADIENDO CAPAS DE DATOS CARTOGRÁFICOS

else

{

botones[i].Enabled = false;

}

}

}

El arreglo elementos contiene las claves de los elementos cartográficos que

posiblemente tenga asociados la localidad urbana seleccionada; el arreglo botones almacena

las instancias de los controles CheckBox que representan cada uno de los elementos

cartográficos. Cada vez que se trata de cargar un elemento cartográfico y está tiene éxito, el

control CheckBox correspondiente es activado y el manejador que le asigna el control

axMap1 a la capa cuando es agregada es guardado en su propiedad Tag.

11. Como la tarea desencadenada al marcar un control CheckBox es la misma para todos

ellos, se crea un método con el nombre elementos_CheckedChanged y se asocia

con el evento CheckedChanged de cada caja de verificación.

private void elementos_CheckedChanged(object sender, EventArgs e)

{

CheckBox boton = (CheckBox)sender;

this.axMap1.set_LayerVisible((int)boton.Tag, boton.Checked);

}

Ahora la aplicación permite mostrar información de diferentes localidades y los elementos

cartográficos que posee.

DESARROLLO DE UNA APLICACIÓN SIG CON C# 2014

21 AGREGANDO FUNCIONALIDADES DE

NAVEGACIÓN

AGREGANDO FUNCIONALIDADES DE

NAVEGACIÓN

12. En la caja de herramientas, de la

sección Menus & Toolbars,

seleccionar un control MenuStrip

y colocarlo en la parte superior del

formulario, para después agregar en

éste tres opciones: Acercamiento,

Alejamiento y Moverse. Cuando

el usuario elija alguna de las

opciones del menú, el cursor del

objeto axMap1 es cambiando a

través de su propiedad

CursorMode, permitiendo

navegar sobre el mapa.

Para activar la funcionalidad de cada opción, se codifica el método asociado con el evento

Click de cada uno de los controles ToolStripMenuItem, de la siguiente manera:

private void acercarmientoToolStripMenuItem_Click(object sender,

EventArgs e)

{

this.axMap1.CursorMode = MapWinGIS.tkCursorMode.cmZoomIn;

}

private void alejamientoToolStripMenuItem_Click(object sender,

EventArgs e)

{

this.axMap1.CursorMode = MapWinGIS.tkCursorMode.cmZoomOut;

}

private void moverseToolStripMenuItem_Click(object sender, EventArgs e)

{

this.axMap1.CursorMode = MapWinGIS.tkCursorMode.cmPan;

}

La ejecución de la aplicación genera los resultados siguientes:

DESARROLLO DE UNA APLICACIÓN SIG CON C# 2014

22 MODIFICANDO LA APARIENCIA DE UNA CAPA DE

DATOS

MODIFICANDO LA APARIENCIA DE UNA CAPA

DE DATOS

Cada vez que una nueva cobertura es insertada dentro el control de AxMapWinGis, éste le

asigna valores aleatorios o predeterminados a sus propiedades de visualización (colores y

tipos de relleno y línea). No obstante, es posible modificarlos a las necesidades propias de

la aplicación, antes de que se muestren. En esta sección se presentan los métodos del

control AxMapWinGis para establecer colores y tipos de los elementos gráficos de una

cobertura.

13. Crear un nuevo método dentro de la clase Form1 que reciba el nombre

aparienciaLocalidad, que no retorne valor y que reciba un parámetro de tipo

entero, el cual recibe el valor del manejador de la capa a definir su apariencia. Dentro

de este método se insertarán las líneas de código que modifican la apariencia visual de

la capa, y será invocado inmediatamente después de que ésta ha sido insertada. Es

importante mencionar que para alterar la apariencia de una capa es necesario contar

con el identificador que se le asigna al momento en que es agregada al mapa; el

manejador es una variable de tipo entero y recibe el resultado del método AddLayer

del objeto axMap1, y en este ejemplo recibe el nombre localidad.

private void localidad_CheckedChanged(object sender, EventArgs e)

{

MapWinGIS.Shapefile cobertura = new MapWinGIS.Shapefile();

RadioButton boton = (RadioButton)sender;

String cveLocalidad = boton.Tag.ToString();

this.axMap1.RemoveAllLayers();

cobertura.Open("cartografia\\vector\\" + cveLocalidad + "\\" +

cveLocalidad + "L.shp");

int localidad = this.axMap1.AddLayer(cobertura, true);

carga_elementos(cveLocalidad);

aparienciaLocalidad(localidad);

}

private void aparienciaLocalidad(int localidad)

DESARROLLO DE UNA APLICACIÓN SIG CON C# 2014

23 MODIFICANDO LA APARIENCIA DE UNA CAPA DE

DATOS

{

this.axMap1.set_ShapeLayerFillColor(localidad,

ToUint(Color.FromArgb(253, 255, 217)));

this.axMap1.set_ShapeLayerLineColor(localidad,

ToUint(Color.DarkGray));

this.axMap1.set_ShapeLayerLineWidth(localidad, 3.1f);

this.axMap1.set_ShapeLayerLineStipple(localidad,

MapWinGIS.tkLineStipple.lsDashDotDash);

}

private UInt32 ToUint(Color color)

{

return Convert.ToUInt32(ColorTranslator.ToOle(color));

}

La ejecución de la aplicación es la siguiente:

14. Crear un nuevo método con el nombre aparienciaElementos, el cual no retorne

valor y reciba dos parámetros: uno de tipo numérico entero y el otro de tipo cadena de

caracteres. Con este método se define la manera de cómo son presentados

gráficamente los elementos cartográficos urbanos, estandarizando su apariencia visual.

El código es el siguiente:

private void aparienciaElementos(int manejador, String elemento)

{

switch (elemento)

{

case "SIP":

this.axMap1.set_ShapeLayerPointColor(manejador,

DESARROLLO DE UNA APLICACIÓN SIG CON C# 2014

24 MODIFICANDO LA APARIENCIA DE UNA CAPA DE

DATOS

ToUint(Color.ForestGreen));

this.axMap1.set_ShapeLayerPointSize(manejador, 10.0f);

this.axMap1.set_ShapeLayerPointType(manejador,

MapWinGIS.tkPointType.ptSquare);

break;

case "T":

this.axMap1.set_ShapeLayerPointColor(manejador,

ToUint(Color.Purple));

this.axMap1.set_ShapeLayerPointSize(manejador, 8.0f);

this.axMap1.set_ShapeLayerPointType(manejador,

MapWinGIS.tkPointType.ptCircle);

break;

case "CA":

this.axMap1.set_ShapeLayerLineColor(manejador,

ToUint(Color.Red));

this.axMap1.set_ShapeLayerLineWidth(manejador, 2.0f);

this.axMap1.set_ShapeLayerLineStipple(manejador,

MapWinGIS.tkLineStipple.lsTrainTracks);

break;

case "E":

this.axMap1.set_ShapeLayerLineColor(manejador,

ToUint(Color.Red));

this.axMap1.set_ShapeLayerLineWidth(manejador, 1.5f);

this.axMap1.set_ShapeLayerLineStipple(manejador,

MapWinGIS.tkLineStipple.lsTrainTracks);

break;

case "SIL":

this.axMap1.set_ShapeLayerLineColor(manejador,

ToUint(Color.OrangeRed));

this.axMap1.set_ShapeLayerLineWidth(manejador, 1.0f);

this.axMap1.set_ShapeLayerLineStipple(manejador,

MapWinGIS.tkLineStipple.lsTrainTracks);

break;

case "A":

this.axMap1.set_ShapeLayerFillColor(manejador,

ToUint(Color.LightGreen));

this.axMap1.set_ShapeLayerLineColor(manejador,

ToUint(Color.DarkOliveGreen));

this.axMap1.set_ShapeLayerLineWidth(manejador, 1f);

this.axMap1.set_ShapeLayerLineStipple(manejador,

MapWinGIS.tkLineStipple.lsTrainTracks);

break;

case "M":

this.axMap1.set_ShapeLayerFillColor(manejador,

ToUint(Color.Yellow));

this.axMap1.set_ShapeLayerLineColor(manejador,

ToUint(Color.GreenYellow));

this.axMap1.set_ShapeLayerLineWidth(manejador, 1f);

this.axMap1.set_ShapeLayerLineStipple(manejador,

MapWinGIS.tkLineStipple.lsTrainTracks);

break;

case "SIA":

this.axMap1.set_ShapeLayerFillColor(manejador,

ToUint(Color.Gray));

this.axMap1.set_ShapeLayerLineColor(manejador,

ToUint(Color.DarkGray));

this.axMap1.set_ShapeLayerLineWidth(manejador, 1f);

DESARROLLO DE UNA APLICACIÓN SIG CON C# 2014

25 VISUALIZACIÓN POR CATEGORÍAS

this.axMap1.set_ShapeLayerLineStipple(manejador,

MapWinGIS.tkLineStipple.lsTrainTracks);

break;

}

}

El mapa resultante se muestra a continuación:

VISUALIZACIÓN POR CATEGORÍAS

Hasta el momento, los elementos cartográficos de una capa han sido mostrados con las

mismas propiedades gráficas, sin embargo, es posible agruparlos con base al valor de uno

de los campos de datos asociados con la capa y definir la apariencia de cada categoría,

permitiendo diferenciarlos entre sí.

MapWinGis permite la coloración de categorías utilizando rampa de colores o asignación

manual del color a cada una de ellas. Para el uso de una rampa de colores, se utiliza una

instancia de la clase ColorScheme, en la cual se define el color inicial y final de la rampa,

para después ser asignada a las categorías generadas de manera automática.

MapWinGIS.Shapefile capa = axMap1.get_Shapefile(manejador);

MapWinGIS.ColorScheme esquema = new MapWinGIS.ColorScheme();

esquema.SetColors(colorInicial, colorFinal);

DESARROLLO DE UNA APLICACIÓN SIG CON C# 2014

26 VISUALIZACIÓN POR CATEGORÍAS

capa.Categories.Generate(indiceCampo,

MapWinGIS.tkClassificationType.ctUniqueValues, numCategorias);

capa.Categories.ApplyColorScheme(MapWinGIS.tkColorSchemeType.ctSchemeGr

aduated, esquema);

En la asignación manual de colores a cada categoría se realiza una vez que éstas han sido

generadas y el valor del color es almacenado en la propiedad

DrawingOptions.FillColor de cada categoría.

MapWinGIS.Shapefile capa = this.axMap1.get_Shapefile(manejador);

capa.Categories.Generate(indiceCampo,

MapWinGIS.tkClassificationType.ctUniqueValues, numCategorias);

for (int i = 0; i < capa.Categories.Count; i++)

{

MapWinGIS.ShapefileCategory categoria = capa.Categories.get_Item(i);

categoria.DrawingOptions.FillColor = ToUint(colores[i]);

}

15. Agregar dos métodos: el primero llamado rampaColores, que posea tres

parámetros, donde el primero es de tipo numérico entero, el cual recibe el manejador

de la capa, y los dos últimos de tipo Color, definiendo el color inicial y final de la

rampa; el segundo llevará el nombre de categorias, definiendo dos parámetros, el

primero de tipo numérico entero que representa el manejador de la capa y el segundo

es un arreglo de tipo Color, que recibe la colección de colores a aplicar en los

componentes de la capa.

private void rampaColores(int element, Color inicio, Color final)

{

MapWinGIS.Shapefile capa = this.axMap1.get_Shapefile(elemento);

MapWinGIS.ColorScheme esquema = new MapWinGIS.ColorScheme();

esquema.SetColors(this.ToUint(inicio),

this.ToUint(final));

capa.Categories.Generate(0,

MapWinGIS.tkClassificationType.ctUniqueValues, 0);

capa.Categories.ApplyColorScheme(

MapWinGIS.tkColorSchemeType.ctSchemeGraduated, esquema);

}

private void categorias(int elemento, Color[] colores)

{

MapWinGIS.Shapefile capa = this.axMap1.get_Shapefile(elemento);

capa.Categories.Generate(0,

MapWinGIS.tkClassificationType.ctUniqueValues, 0);

for (int i = 0; i < capa.Categories.Count; i++)

{

MapWinGIS.ShapefileCategory categoria =

capa.Categories.get_Item(i);

categoria.DrawingOptions.FillColor = ToUint(colores[i]);

}

}

DESARROLLO DE UNA APLICACIÓN SIG CON C# 2014

27 VISUALIZACIÓN POR CATEGORÍAS

16. La invocación de los métodos anteriores se lleva a cabo dentro del método

aparienciaElementos, en aquellas selecciones de capas con topología de líneas (E

y SIL) y de polígonos (A, M y SIA). También es posible utilizar el manejo de rampa de

colores y asignación manual para topologías de puntos.

private void aparienciaElementos(int manejador, String elemento)

{

switch (elemento)

{

...

case "E":

rampaColores(manejador, Color.Green, Color.HotPink);

this.axMap1.set_ShapeLayerLineWidth(manejador, 2.5f);

this.axMap1.set_ShapeLayerLineStipple(manejador,

MapWinGIS.tkLineStipple.lsTrainTracks);

break;

case "SIL":

categorias(manejador, new Color[] {Color.OrangeRed,

Color.GreenYellow, Color.LightSalmon, Color.MediumPurple,

Color.Orchid, Color.Sienna});

this.axMap1.set_ShapeLayerLineWidth(manejador, 1.0f);

this.axMap1.set_ShapeLayerLineStipple(manejador,

MapWinGIS.tkLineStipple.lsTrainTracks);

break;

...

case "M":

rampaColores(manejador, Color.Blue, Color.Blue);

this.axMap1.set_ShapeLayerLineColor(manejador,

ToUint(Color.GreenYellow));

this.axMap1.set_ShapeLayerLineWidth(manejador, 1f);

this.axMap1.set_ShapeLayerLineStipple(manejador,

MapWinGIS.tkLineStipple.lsTrainTracks);

break;

case "SIA":

categorias(manejador, new Color[] {Color.Aqua, Color.Beige,

Color.Blue, Color.Brown, Color.Coral, Color.Cyan,

Color.Fuchsia, Color.Gold, Color.Green, Color.Indigo,

Color.Ivory, Color.Khaki, Color.Magenta, Color.Maroon,

Color.Navy});

this.axMap1.set_ShapeLayerLineColor(manejador,

ToUint(Color.Gray));

this.axMap1.set_ShapeLayerLineWidth(manejador, 1f);

this.axMap1.set_ShapeLayerLineStipple(manejador,

MapWinGIS.tkLineStipple.lsTrainTracks);

break;

}

}

Al ejecutar la aplicación con las modificaciones anteriores, el resultado es el siguiente:

DESARROLLO DE UNA APLICACIÓN SIG CON C# 2014

28 USO DE SÍMBOLOS

MapWinGIS.Shapefile cobertura = new MapWinGIS.Shapefile();

cobertura.Open(“coverages\\vectors\\CAPITALES.shp”);

capitales = this.axMap1.AddLayer(cobertura, true);

aparienciaCapitales();

private void aparienciaCapitales()

{

this.axMap1.set_ShapeLayerPointColor(capitales,

ToUint(Color.Yellow));

this.axMap1.set_ShapeLayerPointSize(capitales, 14.0f);

this.axMap1.set_ShapeLayerPointType(capitales,

MapWinGIS.tkPointType.ptSquare);

}

USO DE SÍMBOLOS

17. Crear un nuevo método al que se nombrará simbolosIconos, que no retorne valor

y reciba como argumento un valor numérico entero que representa el manejador de la

capa. Mediante código se asignará una imagen (mapa de bits) a los componentes de

cada categoría generada a partir del valor de uno de los atributos de la tabla de datos

que tiene asociada la capa.

private void simbolosIconos(int elemento)

{

MapWinGIS.Shapefile capa = this.axMap1.get_Shapefile(elemento);

DESARROLLO DE UNA APLICACIÓN SIG CON C# 2014

29 USO DE ETIQUETAS

capa.Categories.Generate(0,

MapWinGIS.tkClassificationType.ctUniqueValues, 0);

this.axMap1.set_ShapeLayerPointType(elemento,

MapWinGIS.tkPointType.ptUserDefined);

for (int i = 0; i < capa.Categories.Count; i++)

{

MapWinGIS.Image imagen = new MapWinGIS.Image();

imagen.Open("Recursos\\" + capa.Categories.get_Item(i).Name +

".png");

capa.Categories.Item[i].DrawingOptions.PointType =

MapWinGIS.tkPointSymbolType.ptSymbolPicture;

capa.Categories.Item[i].DrawingOptions.Picture = imagen;

}

}

Es importante señalar que deberán existir los archivos con las imágenes a asignar a cada

categoría. La ejecución de la aplicación mostrará el mapa como sigue:

USO DE ETIQUETAS

18. Crear un nuevo método llamado etiquetas, que no retorne valor y reciba dos

argumentos: el primero de tipo numérico entero que representa el manejador de la

capa y el segundo el índice del campo del cual se tomará su contenido para etiquetar

DESARROLLO DE UNA APLICACIÓN SIG CON C# 2014

30 USO DE ETIQUETAS

los componentes de la capa. Con este código se asigna una etiqueta a cada

componente de la capa especificada; la apariencia de las etiquetas es definida utilizando

la propiedad Labels de la capa.

private void etiquetas(int elemento, int numCampo)

{

MapWinGIS.Shapefile capa = this.axMap1.get_Shapefile(elemento);

for (int numFigura = 0; numFigura < capa.NumShapes; numFigura++)

{

MapWinGIS.Shape componente = capa.Shape[numFigura];

String texto = capa.get_CellValue(numCampo,

numFigura).ToString();

double coordX = capa.Shape[numFigura].get_Point(0).x;

double coordY = capa.Shape[numFigura].get_Point(0).y;

capa.Labels.FontName = "Arial Narrow";

capa.Labels.FontSize = 8;

capa.Labels.CollisionBuffer = 100;

capa.Labels.AddLabel(texto, coordX, coordY);

}

}

El código anterior es invocado dentro del método aparienciaElementos(), en

algunas de las opciones de la instrucción switch.

private void aparienciaElementos(int manejador, String elemento)

{

switch (elemento)

{

...

case "E":

...

etiquetas(manejador, 6);

break;

...

case "SIA":

...

etiquetas(manejador, 6);

break;

}

}

Al ejecutar la aplicación, el mapa se muestra de la siguiente manera:

DESARROLLO DE UNA APLICACIÓN SIG CON C# 2014

31 USO DE ETIQUETAS