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
1 COMPONENTES
Sistema diseado para capturar, almacenar, manipular, analizar, administrar y mostrar todo tipo de dato geogrfico Las computadoras utilizadas en un SIG son equipos de alto desempeo y con gran capacidad de almacenamiento de datos INTRODUCCIN 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 bsicos: hardware, software, datos y personas. 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. DESARROLLO DE UNA APLICACIN SIG CON C# 2014
2 MODELACIN ESPACIAL
VECTORIALES 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
Representacin de diversos elementos geogrficos con vectores y mapas de bits Lmites polticos / administrativos Calles Parcelas Usos del suelo Elevacin Mundo real DESARROLLO DE UNA APLICACIN SIG CON C# 2014
3 FUTURO DE LOS SISTEMAS DE INFORMACIN GEOGRFICA
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. DESARROLLO DE UNA APLICACIN SIG CON C# 2014
4 CREANDO UNA APLICACIN SIG
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). DESARROLLO DE UNA APLICACIN SIG CON C# 2014
5 CREANDO UNA APLICACIN SIG
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 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. 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) DESARROLLO DE UNA APLICACIN SIG CON C# 2014
6 CREANDO UNA APLICACIN SIG
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 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. 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. 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 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 DESARROLLO DE UNA APLICACIN 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 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: DESARROLLO DE UNA APLICACIN SIG CON C# 2014
8 MOSTRANDO DATOS VECTORIALES, ESQUEMAS DE COLORES Y ETIQUETAS
Mtodo Descripcin Aplicable a set_ShapeLayerDrawFill (int manejador, bool rellenar) Define si los polgonos sern rellenados al ser dibujados Polgonos set_ShapeLayerDrawLine (int manejador, bool delinear) Indica si los polgonos o arcos sern delineados al ser dibujados Arcos Polgonos set_ShapeLayerDrawPoint (int manejador, bool puntear) Establece si sern mostrados los vrtices (polgonos o arcos) o puntos al ser dibujados Arcos Polgonos Puntos set_ShapeLayerFillColor (int manejador, UInt32 colorRelleno) Define el color a utilizar en el relleno de los polgonos Polgonos set_ShapeLayerFillStipple (int manejador, MapWinGIS.tkFillStipple achurado) Establece el achurado con el cual se dibujar el relleno de los polgonos Polgonos set_ShapeLayerFillTransparency (int manejador, single porcienTransparente) Define el porcentaje de transparencia del relleno de los polgonos Polgonos set_ShapeLayerLineColor (int manejador, UInt32 color) Establece el color de la lnea Arcos Polgonos set_ShapeLayerLineStipple (int manejador, MapWinGIS.tkLineStipple punteado) Define el punteado con el cual se dibujar la lnea Arcos Polgonos set_ShapeLayerLineWidth (int manejador, single ancho) Establece el ancho con el cual se dibujar la lnea Arcos Polgonos set_ShapeLayerPointColor (int manejador, UInt32 color) Establece el color con el cual se dibujar el punto Puntos set_ShapeLayerPointSize (int manejador, single tamao) Define el tamao del punto o vrtice al ser dibujado Puntos set_ShapeLayerPointType (int manejador, MapWinGIS.tkPointType tipoPunto) Establece el tipo de punto a utilizar 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); DESARROLLO DE UNA APLICACIN SIG CON C# 2014
9 MOSTRANDO DATOS VECTORIALES, ESQUEMAS DE COLORES Y ETIQUETAS
//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. 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. 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 DESARROLLO DE UNA APLICACIN 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 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. DESARROLLO DE UNA APLICACIN SIG CON C# 2014
11 MOSTRANDO DATOS VECTORIALES, ESQUEMAS DE COLORES Y ETIQUETAS
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);
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(); DESARROLLO DE UNA APLICACIN 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 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); DESARROLLO DE UNA APLICACIN SIG CON C# 2014
13 MOSTRANDO DATOS VECTORIALES, ESQUEMAS DE COLORES Y ETIQUETAS
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. DESARROLLO DE UNA APLICACIN SIG CON C# 2014
14 AGREGANDO UN MAPA
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. T 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). E 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. A 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. L Polgono Lmite. Superficie territorial que ocupa la localidad urbana. M Polgono Manzanas. Delimitacin de las manzanas que conforman la localidad urbana. DESARROLLO DE UNA APLICACIN SIG CON C# 2014
15 AGREGANDO UN MAPA
Clave Topologa Descripcin SIA Polgono 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. DESARROLLO DE UNA APLICACIN 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 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.
DESARROLLO DE UNA APLICACIN SIG CON C# 2014
17 AADIENDO CAPAS DE DATOS CARTOGRFICOS
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 DESARROLLO DE UNA APLICACIN SIG CON C# 2014
18 AADIENDO CAPAS DE DATOS CARTOGRFICOS
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. DESARROLLO DE UNA APLICACIN SIG CON C# 2014
19 AADIENDO CAPAS DE DATOS CARTOGRFICOS
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; } 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 APLICACIN SIG CON C# 2014
20 AADIENDO CAPAS DE DATOS CARTOGRFICOS
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.
DESARROLLO DE UNA APLICACIN SIG CON C# 2014
21 AGREGANDO FUNCIONALIDADES DE NAVEGACIN
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 moverseToolStripMenuItem_Click(object sender, EventArgs e) { this.axMap1.CursorMode = MapWinGIS.tkCursorMode.cmPan; } La ejecucin de la aplicacin genera los resultados siguientes: DESARROLLO DE UNA APLICACIN 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 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();
private void aparienciaLocalidad(int localidad) DESARROLLO DE UNA APLICACIN 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 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, DESARROLLO DE UNA APLICACIN 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 APLICACIN SIG CON C# 2014
25 VISUALIZACIN POR CATEGORAS
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); DESARROLLO DE UNA APLICACIN SIG CON C# 2014
26 VISUALIZACIN POR CATEGORAS
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();
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 APLICACIN SIG CON C# 2014
27 VISUALIZACIN POR CATEGORAS
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: DESARROLLO DE UNA APLICACIN SIG CON C# 2014
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);
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 DESARROLLO DE UNA APLICACIN SIG CON C# 2014
30 USO DE ETIQUETAS
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);
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: DESARROLLO DE UNA APLICACIN SIG CON C# 2014