Desarrollo de una aplicación SIG con C#
-
Upload
independent -
Category
Documents
-
view
1 -
download
0
Transcript of Desarrollo de una aplicación SIG con C#
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: