Está en la página 1de 33

2

0
1
4

DESARROLLO DE UNA
APLICACIN SIG CON
C#

Antonio MATA MARAVILLA

Copyright (c) 2013, MATA MARAVILLA Antonio.


Se otorga el permiso para copiar, distribuir y/o
modificar este documento bajo los trminos de
GNU Free Documentation License, Version 1.3 o
cualquier versin publicada posteriormente por
Free Software Foundation; sin Secciones
Invariantes ni Textos de la Cubierta Delantera
ni Textos de Cubierta Trasera.

DESARROLLO DE UNA APLICACIN SIG CON C#

2014

INTRODUCCIN
Sistema diseado para capturar,
almacenar, manipular, analizar,
administrar y mostrar todo tipo de
dato geogrfico

Tcnicamente, un sistema de informacin geogrfica (SIG) se define como una


tecnologa orientada al manejo de informacin geogrfica, la cual est conformada por
equipos electrnicos (hardware) programados adecuadamente (software), permitiendo el
manejo y el anlisis de una serie de datos espaciales (informacin geogrfica), siguiendo los
criterios definidos por el usuario de ellos (personal).
Desde la perspectiva informtica, un SIG es una aplicacin capaz de realizar tareas
orientadas al manejo de datos georreferenciados, los cuales combinan bases de datos
especializadas con elementos grficos para representar elementos geogrficos.

COMPONENTES
Un sistema de informacin geogrfica se encuentra constituido por cuatro elementos
Las computadoras utilizadas en
bsicos: hardware, software, datos y personas.
un SIG son equipos de alto
desempeo y con gran capacidad de
almacenamiento de datos
El hardware, o componente fsico, est conformado por todos aquellos equipos, especialmente
de cmputo, que permiten recopilar, almacenar, procesar y mostrar datos cartogrficos
digitales: computadoras, monitores, impresoras, graficadores, discos duros, entre otros.

El software es la parte encargada de suministrar las herramientas necesarias para el anlisis


y la visualizacin de los datos geogrficos.
La parte ms importante de todo sistema es el dato, ya que en ste se basa la razn de ser de la
aplicacin. Dentro de un SIG, los datos pueden ser catalogados en espaciales y tabulares, los
cuales mantienen entre s una relacin muy estrecha, pues para cada elemento especial (grfico)
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 disea
y mantiene el sistema; un especialista tiene la funcin de elaborar las consultas, analizar la
informacin e introducir los datos al sistema, y el usuario final es aquel que hace uso de la
informacin existente en el sistema.

MODELACIN ESPACIAL
En la actualidad, los sistemas de informacin geogrfica son de gran utilidad en toda
aquella organizacin cuya gestin de productos y/o servicios de su inters puedan ser
representados de manera geogrfica: recursos naturales, ubicacin de clientes y
proveedores, distribucin de sucursales, rasgos culturales de sitios de inters, entre otros.
Para llevar a cabo esa gestin, un SIG maneja dos modelos de datos: vectorial y mapa de
bits.
1

COMPONENTES

DESARROLLO DE UNA APLICACIN SIG CON C#

2014

VECTORIALES
Lmites polticos /
administrativos
Calles
Parcelas

Usos del suelo

Elevacin

Mundo real

Representacin de diversos
elementos geogrficos con vectores y
mapas de bits

Los datos vectoriales son una abstraccin de un elemento del mundo real, que es
representado por medio de un grfico, el cual hace uso de diversos sistemas de
coordenadas para ubicar al elemento sobre la superficie terrestre, manteniendo las
caractersticas geomtricas del elemento.
En los datos vectoriales, el inters de las representaciones se centra en la precisin de
localizacin de los elementos geogrficos sobre el espacio y donde los fenmenos a
representar son discretos, es decir, de lmites definidos. Cada una de estas geometras 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
fenmenos.
El modelo de datos vectorial hace uso de tres tipos de grficas para la representacin de
distintos elementos geogrficos del mundo real: punto, lnea y polgono.
Los puntos son utilizados para las entidades geogrficas que pueden ser expresadas por un
nico punto de referencia, es decir, por su simple ubicacin. Por ejemplo, las localizaciones
de los pozos, picos de elevaciones o puntos de inters. Los puntos transmiten la menor
cantidad de informacin de estos tipos de archivo y no son posibles las mediciones.
Tambin pueden ser utilizados para representar zonas a una escala pequea. Por ejemplo,
las ciudades en un mapa del mundo estarn representadas por puntos en lugar de
polgonos.
Las lneas unidimensionales son usadas para rasgos lineales como ros, caminos,
ferrocarriles, rastros, lneas topogrficas o curvas de nivel. De igual forma que en las
entidades puntuales, en pequeas escalas pueden ser utilizados para representar polgonos.
En este tipo de elemento, pueden realizarse medicin de distancias o de longitudes.
Los polgonos bidimensionales se utilizan para representar elementos geogrficos que
cubren un rea particular sobre la superficie de la tierra. Estas entidades pueden
representar lagos, lmites de parques naturales, edificios, provincias, o los usos del suelo,
por ejemplo. Los polgonos transmiten la mayor cantidad de informacin en archivos con
datos vectoriales y en ellos se pueden medir el permetro y el rea.

MAPAS DE BITS
Un mapa de bits es una matriz de puntos, o pixeles, donde cada celda hace referencia a una
posicin nica de la superficie terrestre, y en conjunto representan el elemento geogrfico
de inters.
Los mapas de bits pueden ser imgenes, 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
2

MODELACIN ESPACIAL

DESARROLLO DE UNA APLICACIN SIG CON C#

2014

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 clulas. La resolucin 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 estndar
basado en la estructura de TIFF o JPEG, hasta grandes objetos binarios (BLOB), que son
almacenados directamente en sistema de gestin de base de datos. El almacenamiento en
bases de datos, cuando se indexan, por lo general permiten una rpida recuperacin de ste
tipo de datos, pero a costa de requerir el almacenamiento de millones registros con un
importante tamao de memoria. En un modelo de mapa de bits, cuanto mayor sea la
dimensin de cada celda, menor es la precisin o detalle de la representacin del espacio
geogrfico.

FUTURO DE LOS SISTEMAS DE INFORMACIN


GEOGRFICA
Muchas disciplinas se han beneficiado de la tecnologa subyacente en los SIG. El activo
mercado de los sistemas de informacin geogrfica se ha traducido en una reduccin de
costos y mejoras continuas en los componentes de hardware y software de los sistemas.
Esto ha provocado que el uso de esta tecnologa haya sido asimilada por universidades,
gobiernos, empresas e instituciones que lo han aplicado a sectores como los bienes races,
la salud pblica, la criminologa, la defensa nacional, el desarrollo sostenible, los recursos
naturales, la arqueologa, la ordenacin del territorio, el urbanismo, el transporte, la
sociologa o la logstica entre otros.
En la actualidad los SIG estn teniendo una fuerte implantacin en los llamados servicios
basados en la localizacin (LBS, Location Based Services) debido al abaratamiento y masificacin
de la tecnologa GPS integrada en dispositivos mviles de consumo (telfonos mviles,
computadoras porttiles). Los LBS permiten a los dispositivos mviles con GPS mostrar su
ubicacin respecto a puntos de inters fijos (restaurantes, gasolineras, cajeros, hidrantes, etc.
ms cercanos), mviles (amigos, hijos, autobuses, coches de polica) o para transmitir su
posicin a un servidor central para su visualizacin u otro tipo de tratamiento.

No obstante que la mayora 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 anlisis espacial especfico, 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 informtica
que posean las aptitudes necesarias para llevar a cabo el desarrollo y la gestin de este tipo
de sistemas de informacin.

FUTURO DE LOS SISTEMAS DE INFORMACIN


GEOGRFICA

DESARROLLO DE UNA APLICACIN SIG CON C#

2014

CREANDO UNA APLICACIN SIG


En el mercado actual existe una gran cantidad de soluciones, comerciales y gratuitas,
orientadas al manejo de informacin cartogrfica digital, todas ellas con entornos
especializados para la gestin de ese tipo de informacin, imposibilitando su integracin a
los desarrollos personalizados de una organizacin.
Esto hace que el usuario tenga que recurrir a ms de una herramienta informtica para
obtener la informacin de su inters, 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 tecnologa, conozca las bases tericas y tcnicas para su
implementacin.
En este captulo se presentarn las bases para el desarrollo de una aplicacin con Visual
Studio 2010, utilizando el lenguaje de programacin C# y el control ActiveX MapWinGIS,
que permite la integracin de la tecnologa SIG en una aplicacin de escritorio.

OBTENIENDO MAPWINGIS
Como un esfuerzo en el desarrollo de cdigo 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 versin del componente AciveX
antes de dar inicio a cualquier proyecto de desarrollo. La manera ms comn, y cmoda, es
descargar el paquete de instalacin de MapWinGIS de la siguiente direccin:
http://mapwingis.codeplex.com/releases/view/110285
Se recomiendo descargar e instalar el paquete para 32 bits, aun cuando la tecnologa 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 botn derecho del ratn, del men
emergente, se elige la opcin Elegir Elementos
(Choose Items).

CREANDO UNA APLICACIN SIG

DESARROLLO DE UNA APLICACIN SIG CON C#

2014

En la ventana de dilogo
Elegir Elementos de la Caja
de Herramientas (Choose
Toolbox Items), abrir la
pestaa Componentes COM
(COM Components) y
buscar la entrada Map
Control, marcarla y presionar
el botn Ok. Con lo anterior
se agrega a la Caja de
Herramientas (Toolbox) el
control MapWinGIS,
quedando listo para ser
incorporado en la aplicacin donde ser utilizado.

AGREGAR UN MAPA
Para que el mapa se redimensione
automticamente cuando el formulario
cambia de tamao, establecer los
valores adecuados a la propiedad
Anchor en la ventana de
Propiedades (Properties)

Para agregar un componente axMap de MapWinGIS a un formulario de la aplicacin


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 diseo de la aplicacin.

CREANDO UNA APLICACIN SIG

DESARROLLO DE UNA APLICACIN SIG CON C#

2014

Adems, dentro del cdigo del formulario se crea una


instancia de MapWinGIS que por omisin se recibe el
nombre de AxMap1.
La gestin de las capas que contienen la informacin
cartogrfica a visualizar dentro de la aplicacin es
realizada dentro del cdigo de la aplicacin, utilizando la
instancia AxMap1.

AADIR UNA CAPA DE DATOS AL MAPA


El mtodo AddLayer retorna un
valor numrico entero, conocido como
manejador, a travs del cual es
posible acceder y manipular la capa
aadida al mapa

Una vez que se tiene el control MapWinGIS incorporado en la aplicacin, el primer paso
es cargar los datos geogrficos 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 mtodo llamado Open, el cual recibe como
parmetro el nombre del archivo que contiene la informacin a mostrar.
Una vez que el objeto que contiene los datos geogrficos, debe ser agregado a la instancia
AxMap1 mediante el mtodo AddLayer, el cual recibe el nombre del objeto y un valor
lgico para indicar si se muestra o no la informacin al ser cargado por primera vez.
MapWinGIS.Shapefile vectorial = new MapWinGIS.Shapefile();
cobertura.Open(ubicacin_archivo);
this.axMap1.AddLayer(vectorial, true);

y
MapWinGIS.Image mapa_bits = new MapWinGIS.Image();
cobertura.Open(ubicacin_archivo);
this.axMap1.AddLayer(mapa_bits, true);

Cuando los datos son agregados al control, por omisin se activa el modo de acercamiento,
cambiando la apariencia del cursor del ratn al de una lupa con el signo + en su interior. En
este modo, es posible ampliar el mapa al pulsar el botn izquierdo del ratn sobre l o
dibujando un rea rectangular que abarque el rea de inters. Para realizar un alejamiento, se
pulsa el botn derecho del ratn sobre el mapa.
MapWinGIS usa varias tcnicas de
optimizacin para agilizar el
despliegue. Esto se aprecia en especial
en la actividad de acercamiento: es ms
rpido el redibujado al definir un rea
pequea y ms lento al mostrar toda
la informacin. Esto se debe a una
optimizacin que slo dibuja las
figuras que caen dentro de la extensin
actual en cada acercamiento o arrastre

Acercamiento y Arrastre
Una de las caractersticas distintivas de una aplicacin SIG es su capacidad de navegacin
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 enumeracin tkCursorMode, sta
ltima definida dentro del paquete MapWinGIS.
6

CREANDO UNA APLICACIN SIG

DESARROLLO DE UNA APLICACIN SIG CON C#

2014

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 navegacin 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 mayora 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 tcnicas como los esquemas de colores, marcadores,
etiquetas y otros tipos de simbologa para mejorar el valor visual de un mapa digital. La
simbologa puede utilizarse para transmitir informacin sobre los datos, tales como la
poblacin de un pas, o simplemente llamar la atencin sobre determinada parte del mapa,
poniendo de relieve cierta caracterstica. En este captulo, se muestra la manera de ajustar
las propiedades globales de despliegue para una capa de informacin, la forma de aplicar
un esquema de colores a los datos, y cmo agregarles etiquetas.

AJUSTANDO LAS PROPIEDADES DE DESPLIEGUE


Cuando los datos geogrficos, 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 smbolos, 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 numrico, enteros o
punto flotante, y se establecen desde el objeto AxMap1 al invocar a una serie de mtodos
que reciben, en su mayora, dos parmetros: el manejador de los datos cuya apariencia se
modificar, y un valor numrico que representa su apariencia.
En los datos vectoriales, las propiedades de relacionadas con el color de los elementos,
aceptan valores numricos enteros, mientras que aquellas que definen el ancho de lnea y
tamao de un smbolo 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
mtodo AddLayer.
int manejador = AxMap1.AddLayer(datos_vector, visible);

La manipulacin de la apariencia de los datos geogrficos har referencia al manejador que


se les asign.
Algunos de los mtodos para definir la apariencia de los elementos grficos de una capa
ms utilizados son los siguientes:
7

MOSTRANDO DATOS VECTORIALES, ESQUEMAS


DE COLORES Y ETIQUETAS

DESARROLLO DE UNA APLICACIN SIG CON C#


Mtodo
set_ShapeLayerDrawFill (int
manejador, bool rellenar)
set_ShapeLayerDrawLine (int
manejador, bool delinear)
set_ShapeLayerDrawPoint (int
manejador, bool puntear)
set_ShapeLayerFillColor (int
manejador, UInt32
colorRelleno)
set_ShapeLayerFillStipple (int
manejador,
MapWinGIS.tkFillStipple
achurado)
set_ShapeLayerFillTransparency
(int manejador, single
porcienTransparente)
set_ShapeLayerLineColor (int
manejador, UInt32 color)
set_ShapeLayerLineStipple (int
manejador,
MapWinGIS.tkLineStipple
punteado)
set_ShapeLayerLineWidth (int
manejador, single ancho)
set_ShapeLayerPointColor (int
manejador, UInt32 color)
set_ShapeLayerPointSize (int
manejador, single tamao)
set_ShapeLayerPointType (int
manejador,
MapWinGIS.tkPointType
tipoPunto)

2014

Descripcin
Define si los polgonos
sern rellenados al ser
dibujados
Indica si los polgonos o
arcos sern delineados
al ser dibujados
Establece si sern
mostrados los vrtices
(polgonos o arcos) o
puntos al ser dibujados
Define el color a utilizar
en el relleno de los
polgonos
Establece el achurado
con el cual se dibujar el
relleno de los polgonos

Aplicable a
Polgonos

Define el porcentaje de
transparencia del relleno
de los polgonos
Establece el color de la
lnea
Define el punteado con
el cual se dibujar la
lnea

Polgonos

Establece el ancho con


el cual se dibujar la
lnea
Establece el color con el
cual se dibujar el punto
Define el tamao del
punto o vrtice al ser
dibujado
Establece el tipo de
punto a utilizar

Arcos
Polgonos

Arcos
Polgonos
Arcos
Polgonos
Puntos
Polgonos
Polgonos

Arcos
Polgonos
Arcos
Polgonos

Puntos
Puntos
Puntos

El cdigo tpico para manejar la apariencia de los elementos grficos de una capa es el
siguiente:
//Para polgonos
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);

MOSTRANDO DATOS VECTORIALES, ESQUEMAS


DE COLORES Y ETIQUETAS

DESARROLLO DE UNA APLICACIN SIG CON C#

2014

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 mtodos antes presentados utilizan
enumeraciones obsoletas.
MapWinGIS toma al pixel de la
esquina superior izquierda del
mapa de bits como el color de
transparencia. Si se desea tener
transparencia en algn 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

Debido a que MapWinGIS fue diseado para soportar ambientes de desarrollo tanto .NET
como no-.NET, no soporta la numeracin de colores que ofrece .NET, por ello se utiliza
su representacin de entero largo.
Para utilizar un icono personalizado como icono en las capas de puntos, se pasa
MapWinGIS.tkPointType.ptUserDefined como parmetro al mtodo
set_ShapeLayerPointType. A continuacin se presenta una porcin de cdigo, 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 trmino esquema de colores hace referencia al uso de colores para
diferenciar los elementos de una capa, basndose en los valores de los atributos de la tabla
que tiene relacionada.
Para la aplicacin de sta tcnica, 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 categoras basadas en el valor del atributo con el cual se asociarn los colores.
9

MOSTRANDO DATOS VECTORIALES, ESQUEMAS


DE COLORES Y ETIQUETAS

DESARROLLO DE UNA APLICACIN SIG CON C#

2014

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 mtodo SetColors de la clase ColorScheme genera una rampa de colores a partir


del par de valores pasados a ste como argumentos.
En el mtodo Generate de la propiedad Categories, el primer argumento hace
referencia a la posicin del campo dentro de la tabla relacionada con la capa, y cuyos
valores servirn de base para generar las categoras; el segundo argumento recibe un valor
del tipo enumerado tkClassificationType, indicando el tipo de clasificacin que se
aplicar en la generacin de las categoras. El ltimo argumento establece la cantidad de
categoras a generar; en caso de utilizar el valor
tkClassificationType.ctUniqueValues en el segundo argumento, este ltimo
parmetro es omitido.
Otra forma de definir la apariencia visual que tendr cada categora es asignarle
manualmente las caractersticas grficas con las cuales se desplegar. Para lo anterior se
hace uso de la propiedad DrawingOptions perteneciente a la categora, quien a su vez
contiene una coleccin de propiedades que establecen la apariencia de visualizacin de los
puntos, lneas y polgonos que conforman la categora.
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.caractersticaVisual = valor;
}

USO DE SMBOLOS PARA PUNTOS


Para las capas con topologa de puntos, MapWinGis ofrece tres formas grficas de
presentarlos: smbolos predefinidos, imgenes y caracteres. La forma a utilizar se define en
el atributo PointType de la clase ShapeDrawingOptions, cuyo conjunto de valores es
el siguiente:
Valor

Descripcin

ptSymbolStandard

Los componentes de la capa se dibujarn usando los tipos de


smbolos definidos en la enumeracin tkPointShapeType.

ptSymbolFontCharacter

Los componentes de la capa se dibujarn tomando de los


caracteres de la fuente ANSI definida.

ptSymbolPicture

Los componentes de la capa se dibujarn con el contenido de


las instancias de la clase Image.

10

MOSTRANDO DATOS VECTORIALES, ESQUEMAS


DE COLORES Y ETIQUETAS

DESARROLLO DE UNA APLICACIN SIG CON C#

2014

Cuando se establece el ptSymbolStandard, el smbolo 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 smbolo con el cual se
dibujarn 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 utilizarn iconos para dibujar los puntos de la capa, con base en el valor
de un atributo de la tabla asociada con la capa, agrupndolos en categoras, de manera muy
similar al esquema de colores. A cada categora se le asigna una imagen la cual se usar para
dibujar los puntos que cumplen con la expresin de filtrado de la categora.
El cdigo tipo para llevar a cabo esta accin 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;

Tambin es posible agregar las categoras de manera manual, utilizando el mtodo Add de
la propiedad Categories, guardando el valor devuelto en una variable de tipo
ShapefileCategory a travs de la cual se define la expresin de filtrado, tipo de
smbolo 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();

11

MOSTRANDO DATOS VECTORIALES, ESQUEMAS


DE COLORES Y ETIQUETAS

DESARROLLO DE UNA APLICACIN SIG CON C#

2014

ETIQUETADO DE ELEMENTOS
El etiquetado de elementos de una capa es un arte muy difcil de automatizar. Existen
cuestiones tales como el tamao de la etiqueta, fuente, escala, rotacin, seguimiento de
lneas, centrado en polgonos, colocacin por puntos, colisin con otras etiquetas, y
muchas ms.
MapWinGIS posee un robusto y flexible conjunto de funciones de etiquetacin, 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 informacin de la posicin donde sern
mostradas las etiquetas. Finalmente se necesita determinar la apariencia de las etiquetas que
se utilizarn y la manera en que sern colocadas dentro del mapa.
El cdigo 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, rotacin, categora);
}

La personalizacin de las etiquetas puede llevarse a cabo desde la instancia de


AxMapWinGis o desde ShapeFile. Un objeto derivado de AxMapWinGis posee una
serie de mtodos 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
travs 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 funcin
LayerFont, especificando la fuente y tamao de sta a utilizar.
axMap1.LayerFont(manejador, fuente, tamaoFuente);

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);

12

MOSTRANDO DATOS VECTORIALES, ESQUEMAS


DE COLORES Y ETIQUETAS

DESARROLLO DE UNA APLICACIN SIG CON C#

2014

Un desfasamiento global en la etiquetas de una capa especfica puede establecer,


ajustndolas verticalmente en base a un nmero 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
funcin set_LayerLabelVisible:
axMap1.set_LayerLabelVisible(manejador, true);

Otra funcin que permite adicionar etiquetas en una capa es AddLabelEx, la cual posee
un caracterstica adicional: la rotacin de las etiquetas. Su forma es la siguiente:
axMap1.AddLabelEx(manejador, etiqueta, colorEtiqueta, coordX, coordY,
MapWinGIS.tkHJustification.hjCenter, anguloRotacin);

Cuando se tienen muchas etiquetas en una capa, sta puede hacerse ilegible, especialmente
cuando se traslapan entre s. MapWinGIS proporcionar la funcin
set_UseLabelCollision, cuyo propsito es evitar el empalme de etiquetas, asegurando
que todas las etiquetas estarn separadas lo suficiente para que sean legibles.
Para activar la evitacin automtica de colisin de etiquetas, se utiliza el cdigo siguiente:
AxMap1.set_UseLabelCollision(manejador, true);

La evitacin automtica de colisiones es particularmente til cuando se utilizan etiquetas de


tamao fijo. En ste caso, al realizar un alejamiento, las etiquetas mantienen un tamao
constante, comenzando a bloquearse y empalmarse entre s.

13

MOSTRANDO DATOS VECTORIALES, ESQUEMAS


DE COLORES Y ETIQUETAS

DESARROLLO DE UNA APLICACIN SIG CON C#

2014

EJEMPLO PRCTICO
La realizacin de este ejemplo requiere tener instalado en el equipo de cmputo Visual
Studio 2010, y dentro de esta IDE el control ActiveX WinMapGIS, siguiendo los pasos
expuestos al inicio del captulo Creando una Aplicacin GIS.
A continuacin se presentan los pasos bsicos para crear una aplicacin GIS funcional,
aplicando la teora mostrada en los captulos anteriores.

AGREGANDO UN MAPA
1. Crear una aplicacin de escritorio, nombrando a la solucin WSCartogafia y al
proyecto WFAPrincipal.
Una vez que creada la carpeta de la solucin y del proyecto, copiar dentro de sta ltima la
carpeta cartografia, la cual contiene la informacin cartogrfica 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 trabajarn. El conjunto de datos vectoriales
representan rasgos geogrficos de las localidades urbanas existentes en el municipio de
Lerdo, Durango; cada nombre de cobertura inicia con nueve dgitos, correspondientes a la
clave de la localidad, y terminan con una o ms letras que hacen referencia al tipo de
elemento cartogrfico urbano que contiene, cuyo significado es el siguiente:
Clave

Topologa

Descripcin

SIP

Punto

Sitios de inters. Ubicacin de sitios de inters, tales como


plazas, escuelas, centros de asistencia mdica, templos y
tanques de agua entre otros.

Punto

Tipo de vialidad. Elementos con categora, nombre y tipo de la


vialidad.

CA

Lnea

Carretera. Trayectoria de las carreteras dentro de la localidad


urbana, as como la condicin de la misma, la pavimentacin
que posee y el tipo de transito (libre o peaje).

Lnea

Eje vial. Trayectoria de las vialidades en la localidad urbana,


conteniendo su nombre y tipo.

SIL

Lnea

Sitios de inters. Trayectoria de sitios de inters, tales como


puentes, linderos y canales entre otros.

Polgono

rea geoestadstica bsica. Delimitacin de la superficie que


abarca el rea de geoestadstica bsica (AGEB), con la cual
INEGI divide una localidad para cuestiones censales.

Polgono

Lmite. Superficie territorial que ocupa la localidad urbana.

Polgono

Manzanas. Delimitacin de las manzanas que conforman la


localidad urbana.

14

AGREGANDO UN MAPA

DESARROLLO DE UNA APLICACIN SIG CON C#


Clave
SIA

Topologa
Polgono

2014

Descripcin
Sitios de inters. Delimitacin de la superficie que abarcan
diversos sitios de inters, 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

Len Guzmn

100120023

La Loma

100120028

Nazareno

100120057

Ciudad Jurez

100120084

Villa de Guadalupe

Cuando la carpeta cartografa ha sido copiada dentro del directorio del proyecto, en
el Explorador de la Solucin forzar el despliegue de sta, marcarla y pulsar sobre ella el
botn derecho del ratn, para seleccionar la opcin Incluir en el Proyecto. Despus
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 opcin Copiar si es ms
Nuevo (Copy if newer), esto har que al momento de construir la aplicacin, los archivos
de datos sean tambin copiados al directorio de distribucin.
2. Asignar a la propiedad Text del formulario del proyecto el valor Sistema
Cartogrfico.
3. De la caja de herramientas, en la seccin Containers y seleccionar el control
SplitContainer, arrastrndolo al interior de la forma.

15

AGREGANDO UN MAPA

DESARROLLO DE UNA APLICACIN SIG CON C#

2014

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 aplicacin se crea una instancia de la clase AxMap,
nombrada por omisin axMap1, y es a travs de ella que se gestionan las capas de datos
cartogrficos.
5. Ajustar el tamao del control, de forma tal que los datos
cartogrficos 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.

16

AGREGANDO UN MAPA

DESARROLLO DE UNA APLICACIN SIG CON C#

2014

AADIENDO CAPAS DE DATOS


CARTOGRFICOS
Una vez que el control AxMapWinGis ha sido insertado en el formulario, se est en
posibilidad mostrar la informacin cartogrfica dentro de l.
6. Despus 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 cdigo dentro del mtodo 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 continuacin:

7. Como se tienen datos cartogrficos de diferentes localidades urbanas del municipio de


Lerdo, la aplicacin deber permitir al usuario elegir una ciudad y mostrar sus lmites
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 poblacin 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 aplicacin mostrar los lmites de la localidad elegida.
8. Antes de implementar la nueva capacidad, es necesario eliminar todo el contenido del
mtodo Form1_Load, ya que no es necesario cargar alguna cobertura al iniciar la
ejecucin de la aplicacin. Como la accin de cargar una capa al seleccionar uno de los
17

AADIENDO CAPAS DE DATOS CARTOGRFICOS

DESARROLLO DE UNA APLICACIN SIG CON C#

2014

RadioButton agregados es la misma, se desarrollar un solo mtodo para llevar a


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

controles. El cdigo y nombre del mtodo 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 ejecucin de la aplicacin son los siguientes:

9. Cada localidad tiene asociado un conjunto de elementos cartogrficos, los cuales se


encuentran almacenados en distintas capas (archivos), por lo que es conveniente que al
momento de seleccionar una localidad, tambin se carguen las capas de los elementos
cartogrficos 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
cartogrfico urbano, que al momento de seleccionarlo sea mostrado.
18

AADIENDO CAPAS DE DATOS CARTOGRFICOS

DESARROLLO DE UNA APLICACIN SIG CON C#

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.

2014

10. Enseguida se crea un mtodo llamado cargaElementos, el cual recibe un parmetro


de tipo String, que contiene la clave de la localidad de la cual se cargarn sus
elementos cartogrficos asociados. ste mtodo es invocado despus 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;
}

19

AADIENDO CAPAS DE DATOS CARTOGRFICOS

DESARROLLO DE UNA APLICACIN SIG CON C#

2014

else
{
botones[i].Enabled = false;
}
}
}

El arreglo elementos contiene las claves de los elementos cartogrficos 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
cartogrficos. Cada vez que se trata de cargar un elemento cartogrfico 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 mtodo con el nombre elementos_CheckedChanged y se asocia
con el evento CheckedChanged de cada caja de verificacin.
private void elementos_CheckedChanged(object sender, EventArgs e)
{
CheckBox boton = (CheckBox)sender;
this.axMap1.set_LayerVisible((int)boton.Tag, boton.Checked);
}

Ahora la aplicacin permite mostrar informacin de diferentes localidades y los elementos


cartogrficos que posee.

20

AADIENDO CAPAS DE DATOS CARTOGRFICOS

DESARROLLO DE UNA APLICACIN SIG CON C#

2014

AGREGANDO FUNCIONALIDADES DE
NAVEGACIN
12. En la caja de herramientas, de la
seccin Menus & Toolbars,
seleccionar un control MenuStrip
y colocarlo en la parte superior del
formulario, para despus 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
travs de su propiedad
CursorMode, permitiendo
navegar sobre el mapa.
Para activar la funcionalidad de cada opcin, se codifica el mtodo 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 ejecucin de la aplicacin genera los resultados siguientes:

21

AGREGANDO FUNCIONALIDADES DE
NAVEGACIN

DESARROLLO DE UNA APLICACIN SIG CON C#

2014

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 visualizacin (colores y
tipos de relleno y lnea). No obstante, es posible modificarlos a las necesidades propias de
la aplicacin, antes de que se muestren. En esta seccin se presentan los mtodos del
control AxMapWinGis para establecer colores y tipos de los elementos grficos de una
cobertura.
13. Crear un nuevo mtodo dentro de la clase Form1 que reciba el nombre
aparienciaLocalidad, que no retorne valor y que reciba un parmetro de tipo
entero, el cual recibe el valor del manejador de la capa a definir su apariencia. Dentro
de este mtodo se insertarn las lneas de cdigo que modifican la apariencia visual de
la capa, y ser invocado inmediatamente despus 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 mtodo 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)

22

MODIFICANDO LA APARIENCIA DE UNA CAPA DE


DATOS

DESARROLLO DE UNA APLICACIN SIG CON C#

2014

{
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 ejecucin de la aplicacin es la siguiente:

14. Crear un nuevo mtodo con el nombre aparienciaElementos, el cual no retorne


valor y reciba dos parmetros: uno de tipo numrico entero y el otro de tipo cadena de
caracteres. Con este mtodo se define la manera de cmo son presentados
grficamente los elementos cartogrficos urbanos, estandarizando su apariencia visual.
El cdigo es el siguiente:
private void aparienciaElementos(int manejador, String elemento)
{
switch (elemento)
{
case "SIP":
this.axMap1.set_ShapeLayerPointColor(manejador,

23

MODIFICANDO LA APARIENCIA DE UNA CAPA DE


DATOS

DESARROLLO DE UNA APLICACIN SIG CON C#

2014

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);

24

MODIFICANDO LA APARIENCIA DE UNA CAPA DE


DATOS

DESARROLLO DE UNA APLICACIN SIG CON C#

2014

this.axMap1.set_ShapeLayerLineStipple(manejador,
MapWinGIS.tkLineStipple.lsTrainTracks);
break;
}
}

El mapa resultante se muestra a continuacin:

VISUALIZACIN POR CATEGORAS


Hasta el momento, los elementos cartogrficos de una capa han sido mostrados con las
mismas propiedades grficas, 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 categora,
permitiendo diferenciarlos entre s.
MapWinGis permite la coloracin de categoras utilizando rampa de colores o asignacin
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 despus ser asignada a las categoras generadas de manera automtica.
MapWinGIS.Shapefile capa = axMap1.get_Shapefile(manejador);
MapWinGIS.ColorScheme esquema = new MapWinGIS.ColorScheme();
esquema.SetColors(colorInicial, colorFinal);

25

VISUALIZACIN POR CATEGORAS

DESARROLLO DE UNA APLICACIN SIG CON C#

2014

capa.Categories.Generate(indiceCampo,
MapWinGIS.tkClassificationType.ctUniqueValues, numCategorias);
capa.Categories.ApplyColorScheme(MapWinGIS.tkColorSchemeType.ctSchemeGr
aduated, esquema);

En la asignacin manual de colores a cada categora se realiza una vez que stas han sido
generadas y el valor del color es almacenado en la propiedad
DrawingOptions.FillColor de cada categora.
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 mtodos: el primero llamado rampaColores, que posea tres
parmetros, donde el primero es de tipo numrico 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 parmetros, el
primero de tipo numrico entero que representa el manejador de la capa y el segundo
es un arreglo de tipo Color, que recibe la coleccin 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]);
}
}

26

VISUALIZACIN POR CATEGORAS

DESARROLLO DE UNA APLICACIN SIG CON C#

2014

16. La invocacin de los mtodos anteriores se lleva a cabo dentro del mtodo
aparienciaElementos, en aquellas selecciones de capas con topologa de lneas (E
y SIL) y de polgonos (A, M y SIA). Tambin es posible utilizar el manejo de rampa de
colores y asignacin manual para topologas 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 aplicacin con las modificaciones anteriores, el resultado es el siguiente:

27

VISUALIZACIN POR CATEGORAS

DESARROLLO DE UNA APLICACIN SIG CON C#

2014

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 SMBOLOS
17. Crear un nuevo mtodo al que se nombrar simbolosIconos, que no retorne valor
y reciba como argumento un valor numrico entero que representa el manejador de la
capa. Mediante cdigo se asignar una imagen (mapa de bits) a los componentes de
cada categora 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);

28

USO DE SMBOLOS

DESARROLLO DE UNA APLICACIN SIG CON C#

2014

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 sealar que debern existir los archivos con las imgenes a asignar a cada
categora. La ejecucin de la aplicacin mostrar el mapa como sigue:

USO DE ETIQUETAS
18. Crear un nuevo mtodo llamado etiquetas, que no retorne valor y reciba dos
argumentos: el primero de tipo numrico entero que representa el manejador de la
capa y el segundo el ndice del campo del cual se tomar su contenido para etiquetar
29
USO DE ETIQUETAS

DESARROLLO DE UNA APLICACIN SIG CON C#

2014

los componentes de la capa. Con este cdigo 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 cdigo anterior es invocado dentro del mtodo aparienciaElementos(), en


algunas de las opciones de la instruccin 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 aplicacin, el mapa se muestra de la siguiente manera:

30

USO DE ETIQUETAS

DESARROLLO DE UNA APLICACIN SIG CON C#

31

2014

USO DE ETIQUETAS

También podría gustarte