Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Tema4 Gps Sig
Tema4 Gps Sig
2 Utilizar MapWindow.
Abrimos el programa MapWindow, y localizamos un mapa de Ejemplo en la carpeta
C:\Archivos de Programa\MapWindow\ Sample Projects, en la imagen siguiente se ve
la pantalla que presenta si el elegido es World, despus de hacer zoom hacia Espaa.
En la parte inferior del formulario, ya fuera del mismo se observan los nombres de los
componentes creados. Con ese nombre haremos referencia a ellos desde el cdigo
cuando los necesitamos. Por ejemplo, para el cuadro de dilogo de apertura cuando lo
queramos utilizar escribiremos OpenFileDialog1.
Escribimos ahora las opciones del men. De momento ponemos:
Archivo
Agregar Tema
Salir
Ver
Leyenda
Agregar
Tema
Eliminar
Tema
Encuadre
Zoom
Extensin
Zoom
Aumentar
Zoom
Disminuir
3
Ahora vamos con el diseo interior del formulario. Colocaremos el Mapa y la leyenda.
Para utilizar estos controles que nos proporciona MapWindow, agregamos al panel de
herramientas de Visual un grupo que se llame Componentes SIG. Pulsamos con el
botn derecho del ratn en la parte inferior del panel de herramientas dnde pone
General y seleccionamos Agregar Ficha, luego ponemos el nombre Componentes SIG.
Ahora pulsamos al botn derecho del ratn en la ficha creada y seleccionamos elegir
elementos, aadiremos el componente de MapWindow, en la ficha Componentes COM,
seleccionamos Map Control.
En la barra vertical de separacin nos permite modificar el rea dedicada a cada uno de
los paneles. El aspecto ser:
Al de Zoom Extensin:
Mapa.ZoomToMaxExtents()
Al de Aumentar
Mapa.CursorMode = MapWinGIS.tkCursorMode.cmZoomIn
Al de Reducir
Mapa.CursorMode = MapWinGIS.tkCursorMode.cmZoomOut
Al de Zoom Previo
Mapa.ZoomToPrev()
Vamos ahora con el men Ver/Leyenda. Lo primero ser poner la propiedad Checked
del mismo a true. Eso lo hacemos seleccionndolo y cambiando el valor en la lista de
propiedades. Luego le asignamos el cdigo:
Private Sub LeyendaToolStripMenuItem_Click(ByVal sender As System.Object,
ByVal e As System.EventArgs) Handles LeyendaToolStripMenuItem.Click
If SplitContainer1.Panel1Collapsed = False Then 'Si la leyenda se ve
SplitContainer1.Panel1Collapsed = True 'Escondo el panel de la
Izquierda, el de la leyenda
LeyendaToolStripMenuItem.Checked = False 'Quito la marca al men
Else
SplitContainer1.Panel1Collapsed = False 'Si no muestro el panel
de la leyenda
LeyendaToolStripMenuItem.Checked = True 'Pongo la marca al menu
End If
End Sub
Borramos el formulario form1 que nos crea con el botn derecho sobre l en el
Explorador de Soluciones y pulsando Eliminar.
Tendramos una aplicacin igual a la de antes. Ahora eliminamos la opcin del men
Agregar/Tema, y los botones de Aadir y eliminar capas. Cargaremos la informacin en
el evento Load del formulario. Quitamos tambin el control OpenFileDialog1. Si
seleccionamos el formulario, en el evento Load, (lo vemos en las propiedades dando al
rayo
), le escribimos lo siguiente:
10
Como vemos hay tres bloques que aaden una capa con informacin de polgonos, otra
con informacin lineal y otra con informacin puntual. Adems modifican el aspecto de
las formas creadas. Al elegir el tipo de punto cabe la posibilidad de utilizar smbolos a
procedentes de imgenes que se cargan con las instrucciones de las ltimas lineas
comentadas.
Con esto ejecutamos el programa. Ahora sera un mapa previamente preparado. El
usuario se limitara a ampliar y reducir el mapa y ha desplazar la zona visualizada. El
aspecto que presentara es:
En el Ejercicio anterior cogamos el nombre de la capa para la leyenda del nombre del
archivo SHP cargado. Ahora como los archivos de forma a cambiar son fijos podemos
poner el nombre a mano. Cambiamos:
11
La lnea
Leyenda.Map.LayerName(unacapa) =
System.IO.Path.GetFileNameWithoutExtension(nombreTema)
Por
Leyenda.Map.LayerName(unacapa) = "PAISES DEL MUNDO"
Leyenda.Map.LayerName(unacapa) = "PRINCIPALES RIOS"
Leyenda.Map.LayerName(unacapa) = "CAPITALES"
Para cada una de las capas cargadas segn el caso. Ahora nos queda:
12
Ahora mostramos el cdigo del formulario, podemos hacerlo pulsando con el botn
derecho sobre su nombre en el explorador de Soluciones y eligiendo Ver Cdigo.
Vamos a incorporar un constructor sobrecargado para este formulario de modo que
admita una capa, que ser la capa de la que queremos visualizar sus atributos. Adems
creamos una variable privada para manejar esa capa. En el constructor asignamos la
capa pasada a esta variable creada y el nombre de la capa. El cdigo para el constructor
queda:
Public Class frm_tabla
Private capa_a_mostrar As MapWinGIS.Shapefile 'Variable para
manejar la capa actual
Private titulo As String 'Para poner el ttulo en el formulario
Public Sub New(ByVal capa As MapWinGIS.Shapefile, ByVal untitulo
As String)
capa_a_mostrar = capa 'asigno la variable el valor pasado en
el constructor
titulo = untitulo 'Lo mismo para el nombre de la capa en la
leyenda
InitializeComponent() 'Para que nos cree los componentes
aadidos
End Sub
13
Lo que hacemos es aadir una columna para cada campo de la tabla seleccionada.
Luego recorremos las formas y agregamos una fila para los datos de cada una ellas. Al
final asignamos la tabla formada al DataViewGrid.
Para que nos muestre el formulario le ponemos el cdigo al men Atributos/Ver Tabla
creado:
Private Sub VerTablaToolStripMenuItem_Click(ByVal sender As
System.Object, ByVal e As System.EventArgs) Handles
VerTablaToolStripMenuItem.Click
Dim miCapa As New MapWinGIS.Shapefile 'Variable de tipo
forma para manejar la capa
miCapa = Mapa.get_GetObject(Leyenda.SelectedLayer) 'Tomo la
capa correspondiente al elementoseleccioando en la Leyenda
'Creo una instancia del formulario que nos mostrar los
atributos
'Pasandole el manejador de la capa y el ttulo
Dim visorAtributos As New frm_tabla(miCapa,
Leyenda.Map.LayerName(Leyenda.SelectedLayer))
'Muestro el formulario
visorAtributos.ShowDialog()
End Sub
14
En el formulario declaramos una variable para recibir el mapa del principal y creamos
un constructor sobrecargado quedar:
Public Class frm_BuscarPais
Private miMapa As AxMapWinGIS.AxMap 'Variable para recibir el
mapa
Public Sub New(ByVal unMapa As AxMapWinGIS.AxMap)
miMapa = unMapa 'Asigno a la variable el mapa pasado
InitializeComponent()
End Sub
15
Guardamos el proyecto.
16
17
5.2 Aadir etiquetas a una capa segn el texto de uno de los campos.
Puede que en la tabla de atributos asociada a una capa tengamos un campo con
etiquetas que queremos que se visualicen en el mapa.
Si
tenemos
una
MapWinGIS.Shapefile,
con:
For i = 0 To formaSF.NumShapes - 1
Podemos asignar auna variable de tipo String(texto) el valor del campo en el que se
encuentra la etiqueta para cada forma
texto = formaSF.CellValue(campo, i)
Necesitamos indicarle en qu posicin deber colocar la etiqueta, una posibilidad es
usar las propiedades Extents.xMin y Extents.yMin, y las mismas para las mximas para
calcular el punto medio en orizontal y en vertical de la forma.
x = formaSF.Shape(i).Extents.xMin + ((formaSF.Shape(i).Extents.xMax formaSF.Shape(i).Extents.xMin) / 2)
y = formaSF.Shape(i).Extents.yMin + ((formaSF.Shape(i).Extents.yMax formaSF.Shape(i).Extents.yMin) / 2)
Por ltimo pomos modificar el tipo y el tamao de las etiquetas para la capa que
estamos rotulndo.
Mapa.LayerFont(unacapa, "Times new roman", 8)
18
Ahora le ponemos que utilice como tipo de punto para la capa uno definido por el
usuario.
Mapa.set_ShapeLayerPointType(unacapa,
MapWinGIS.tkPointType.ptUserDefined)
Borramos el formulario form1 que nos crea con el botn derecho sobre l en el
Explorador de Soluciones y pulsando Eliminar.
Escuela Politcnica Superior de vila
Universidad de Salamanca
19
Tendramos una aplicacin igual a la de antes. Ahora eliminamos la opcin del men
Consultas. Cargaremos la informacin en el evento Load del formulario. Si
seleccionamos el formulario, en el evento Load, (lo vemos en las propiedades dando al
rayo
), tambin haciendo doble-clic sobre l. Escribimos lo siguiente para cargar la
capa del lmite provincial. Antes deberemos guardar el proyecto y copiar los temas que
se proporcionan en una subcarpeta llamada vila dentro de la carpeta Debug en la
ruta de la aplicacin:
Private Sub frm_Visor_Load(ByVal sender As System.Object, ByVal e
As System.EventArgs) Handles MyBase.Load
Dim formaSF As MapWinGIS.Shapefile 'Nueva Forma a aadir
Dim nombreTema As String 'Nombre del tema para la leyenda
Dim unacapa As Integer 'Variable para manejar la capa
cargada y modificar sus propiedades
'Asignamos el mapa a la leyenda para enlazarlos
Leyenda.Map = Mapa.GetOcx()
'AGREGAMOS EL LIMITE PROVINCIAL DE LA PROVINCIA DE VILA
'Creamos una forma nueva
formaSF = New MapWinGIS.Shapefile
'Cogemos el nombre seleccionado
nombreTema = Application.StartupPath + "\Avila\Avila.shp"
'Abrimos el archivo indicado como Objeto de forma
formaSF.Open(nombreTema)
'aadimos la capa a la leyenda
unacapa = Leyenda.Layers.Add(formaSF, True)
'Ponemos como nombre de la capa en la leyenda el nombre del
archivo
Leyenda.Map.LayerName(unacapa) = "LIMITE PROVINCIAL"
'System.IO.Path.GetFileNameWithoutExtension(nombreTema)
'Cambiamos el grosor de Linea de la capa aadida
Mapa.set_ShapeLayerLineWidth(unacapa, 2)
'Cambiamos el Color de linea de la forma
Mapa.set_ShapeLayerLineColor(unacapa,
Convert.ToUInt32(Drawing.ColorTranslator.ToOle(Color.Black)))
'Cambiamos el Color del relleno de la forma poligonal
Mapa.set_ShapeLayerFillColor(unacapa,
Convert.ToUInt32(Drawing.ColorTranslator.ToOle(Color.Orange)))
20
La siguiente capa que aadiremos es la capa Gredos.shp que tiene informacin con los
municipios de la comarca.
'AGREGAMOS LOS MUNICIPIOS DE LA ZONA
'Creamos una forma nueva
formaSF = New MapWinGIS.Shapefile
'Cogemos el nombre seleccionado
nombreTema = Application.StartupPath + "\Avila\gredos.shp"
'Abrimos el archivo indicado como Objeto de forma
formaSF.Open(nombreTema)
'aadimos la capa a la leyenda
unacapa = Leyenda.Layers.Add(formaSF, True)
'Ponemos como nombre de la capa en la leyenda el nombre del
archivo
Leyenda.Map.LayerName(unacapa) = "GREDOS"
'System.IO.Path.GetFileNameWithoutExtension(nombreTema)
'Cambiamos el grosor de Linea de la capa aadida
Mapa.set_ShapeLayerLineWidth(unacapa, 2)
'Cambiamos el Color de linea de la forma
Mapa.set_ShapeLayerLineColor(unacapa,
Convert.ToUInt32(Drawing.ColorTranslator.ToOle(Color.Black)))
'Cambiamos el Color del relleno de la forma poligonal
Mapa.set_ShapeLayerFillColor(unacapa,
Convert.ToUInt32(Drawing.ColorTranslator.ToOle(Color.Chocolate)))
21
Si nos fijamos la segunda columna presenta el campo Area con la superficie de los
municipios en m2. La columna Hectares tiene la superficie en Hectreas. El campo area
aunque es la segunda columna tiene el ndice 1, ya que los ndices para manejar campos
comienzan en 0. Aprovechamos los valores de esta columna para crear un esquema de
color segn la superficie. Utilizamos las clases comentadas en el captulo anterior para
esquemas de color.
'CREAR ESQUEMA DE COLOR PARA LA CAPA GREDOS SEGUN LA
SUPERFICIE DE LOS MUNICIPIOS
Dim esquemaColor As MapWinGIS.ShapefileColorScheme
Dim intervalo As MapWinGIS.ShapefileColorBreak
Dim i As Long
Dim min, max As Double
'Creamos una forma nueva
formaSF = New MapWinGIS.Shapefile
'Cogemos el nombre seleccionado
nombreTema = Application.StartupPath + "\Avila\gredos.shp"
'Abrimos el archivo indicado como Objeto de forma
formaSF.Open(nombreTema)
'Buscamos el mayor y el menor de los valores para el campo 1
que es el rea
For i = 0 To formaSF.NumShapes - 1
If i = 0 Then
max = formaSF.CellValue(1, i)
min = formaSF.CellValue(1, i)
End If
If formaSF.CellValue(1, i) > max Then
max = formaSF.CellValue(1, i)
ElseIf formaSF.CellValue(1, i) < min Then
min = formaSF.CellValue(1, i)
End If
Next
En esta primera parte declaramos las variables que utilizaremos, entre ellas la
correspondiente al esquema de color y la correspondiente al intervalo.
Escuela Politcnica Superior de vila
Universidad de Salamanca
22
Al final de este bloque recorremos todas las formas de la capa analizando el valor del
rea, comparamos con el almacenado para las variables max y min, de modo que al
terminar el recorrido, estas variables tendrn el valor menor para el rea y el valor
mayor respectivamente.
Ahora continuamos creando el esquema de color:
'aadimos la capa a la leyenda
unacapa = Leyenda.Layers.Add(formaSF, True)
'Ponemos como nombre de la capa en la leyenda el nombre del
archivo
Leyenda.Map.LayerName(unacapa) = "MUNICIPIOS DE GREDOS"
'Cambiamos el Color del relleno de la forma poligonal
Mapa.set_ShapeLayerFillColor(unacapa,
Convert.ToUInt32(Drawing.ColorTranslator.ToOle(Color.LightSteelBlue)
))
'Creamos un objeto Esquema de Color asociado al campo 1
esquemaColor = New MapWinGIS.ShapefileColorScheme
esquemaColor.LayerHandle = unacapa
esquemaColor.FieldIndex = 1
'Creamos un degradado del mayor al menor de los valores
intervalo = New MapWinGIS.ShapefileColorBreak
'Ttulo para el intervalo
intervalo.Caption = "Degradado segn superficie"
'Valor de comienzo la superficie mnima de las existentes
intervalo.StartValue = min
'Valor de final, la superficie mayor
intervalo.EndValue = max
'Color de comienzo en este caso Azul claro metalizado
intervalo.StartColor =
Convert.ToUInt32(Drawing.ColorTranslator.ToOle(Color.LightSteelBlue)
)
'Color de fin Verde
intervalo.EndColor =
Convert.ToUInt32(Drawing.ColorTranslator.ToOle(Color.Green))
'Aadimos el intervalo
esquemaColor.Add(intervalo)
'Aplicamos el esquema al mapa
Mapa.ApplyLegendColors(esquemaColor)
'Refrescamos la leyenda para que refleje el degradado
Leyenda.Layers.ItemByHandle(unacapa).Refresh()
23
Intentaremos ahora el uso de etiquetas para la capa Municipios de Gredos que acabamos
de aadir. Si volvemos a mirar la tabla de datos mostrada anteriormente nos daremos
cuenta que la primera columna contiene los nombres de los municipios. Esas son las
etiquetas que queremos colocar.
'COLOCAMOS LOS NOMBRES DE LOS MUNICIPIOS COMO ETIQUETAS
Dim campo As Integer
Dim texto As String
Dim x As Double, y As Double
Dim uncolor As UInt32
'Asignamos a la variable el manejador de la capa 3, la 4
que es la que vamos a rotular
unacapa = Mapa.get_LayerHandle(3)
'Asignamos a la variable de forma la capa anterior
formaSF = Mapa.get_GetObject(unacapa)
'Asignamos el campo que contiene los rtulos, el 0
campo = 0
'Para no tener una llamada a la funcin muy larga asignamos
el color a esta variable
uncolor =
System.Convert.ToUInt32(Drawing.ColorTranslator.ToOle(Color.Black))
'Recorremos todas las formas de los municipios para poner el
nombre a cada una
For i = 0 To formaSF.NumShapes - 1
'Tomamos en la variable texto el nombre que est en la
columna 0 y fila la forma contemplada
texto = formaSF.CellValue(campo, i)
'Calculamos la x y la y dnde colocar los textos. Ser
el centro aproximado de la forma
x = formaSF.Shape(i).Extents.xMin +
((formaSF.Shape(i).Extents.xMax - formaSF.Shape(i).Extents.xMin) / 2)
y = formaSF.Shape(i).Extents.yMin +
((formaSF.Shape(i).Extents.yMax - formaSF.Shape(i).Extents.yMin) / 2)
24
En ese campo los valores son: Muy alto, Alto, Moderado, Bajo, Muy bajo. Queremos
asignar un color para cada uno de los valores. Utilizaremos esquemas de color, con
varios intervalos uno para cada valor:
'Abrimos el archivo indicado como Objeto de forma
formaSF.Open(nombreTema)
'aadimos la capa a la leyenda
unacapa = Leyenda.Layers.Add(formaSF, True)
'Ponemos el nombre de la capa en la leyenda
Leyenda.Map.LayerName(unacapa) = "RIESGO INCENDIOS"
'Cambiamos el Color del relleno de la forma poligonal
Mapa.set_ShapeLayerFillColor(unacapa,
Convert.ToUInt32(Drawing.ColorTranslator.ToOle(Color.Red)))
'Creamos un objeto Esquema de Color asociado al campo 1
esquemaColor = New MapWinGIS.ShapefileColorScheme
'Le asociamos el manejador a la capa
esquemaColor.LayerHandle = unacapa
'El campo que tiene los valores es el 6
esquemaColor.FieldIndex = 6
'Creamos un intervalo para el valor muy alto
intervalo = New MapWinGIS.ShapefileColorBreak
'Titulo del intervalo
intervalo.Caption = "MUY ALTO"
intervalo.StartValue = "Muy alto" 'Cuidado con la
coincidencia exacta. Tambin sensible a maysculas
intervalo.EndValue = "Muy alto" 'Mismo valor de final
intervalo.StartColor =
Convert.ToUInt32(Drawing.ColorTranslator.ToOle(Color.DarkRed))
'Color de comienzo y fin iguales
intervalo.EndColor =
Convert.ToUInt32(Drawing.ColorTranslator.ToOle(Color.DarkRed))
'Aadimos el intervalo
esquemaColor.Add(intervalo)
Hasta aqu hemos creado el esquema, y el primer intervalo para el valor Muy alto,
ponemos un nico color y un nico valor en comienzo y fin.
Escuela Politcnica Superior de vila
Universidad de Salamanca
25
Vamos con los siguientes intervalos. Como vemos solo cambian los ttulos, valores y
colores, se van aadiendo al esquema cada uno de ellos. Al final aplicamos el esquema
al mapa y reflejamos la leyenda:
'Creamos un intervalo para el valor alto
intervalo = New MapWinGIS.ShapefileColorBreak
intervalo.Caption = "ALTO"
intervalo.StartValue = "Alto"
intervalo.EndValue = "Alto"
intervalo.StartColor =
Convert.ToUInt32(Drawing.ColorTranslator.ToOle(Color.Red))
intervalo.EndColor =
Convert.ToUInt32(Drawing.ColorTranslator.ToOle(Color.Red))
'Aadimos el intervalo
esquemaColor.Add(intervalo)
'Creamos un intervalo para el valor moderado
intervalo = New MapWinGIS.ShapefileColorBreak
intervalo.Caption = "MODERADO"
intervalo.StartValue = "Moderado"
intervalo.EndValue = "Moderado"
intervalo.StartColor =
Convert.ToUInt32(Drawing.ColorTranslator.ToOle(Color.Orange))
intervalo.EndColor =
Convert.ToUInt32(Drawing.ColorTranslator.ToOle(Color.Orange))
'Aadimos el intervalo
esquemaColor.Add(intervalo)
'Creamos un intervalo para el valor bajo
intervalo = New MapWinGIS.ShapefileColorBreak
intervalo.Caption = "BAJO"
intervalo.StartValue = "Bajo"
intervalo.EndValue = "Bajo"
intervalo.StartColor =
Convert.ToUInt32(Drawing.ColorTranslator.ToOle(Color.Yellow))
intervalo.EndColor =
Convert.ToUInt32(Drawing.ColorTranslator.ToOle(Color.Yellow))
'Aadimos el intervalo
esquemaColor.Add(intervalo)
'Creamos un intervalo para el valor muy bajo
intervalo = New MapWinGIS.ShapefileColorBreak
intervalo.Caption = "MUY BAJO"
intervalo.StartValue = "Muy bajo"
intervalo.EndValue = "Muy bajo"
intervalo.StartColor =
Convert.ToUInt32(Drawing.ColorTranslator.ToOle(Color.LightYellow))
intervalo.EndColor =
Convert.ToUInt32(Drawing.ColorTranslator.ToOle(Color.LightYellow))
'Aadimos el intervalo
esquemaColor.Add(intervalo)
'Aplicamos el esquema al mapa
Mapa.ApplyLegendColors(esquemaColor)
'Refrescamos la leyenda para que refleje el degradado
Leyenda.Layers.ItemByHandle(unacapa).Refresh()
End Sub
26
Guardamos el Proyecto.
27
Probamos a ejecutar el programa para contemplar la apariencia que nos ofrecen los
cambios introducidos:
28
Guardamos el Proyecto.
29