You are here:GeoTux»Geo-Blogs»Librerías para Geomática»Filtro por atributos para el visor de Shapefiles de MapWinGIS

Estadísticas

Invitados: 38
Usuarios registrados: 3131
Usuarios en línea:
-
Registrados hoy:
-

Registro

Redifusión (RSS)

Blogs y Noticias:
Recibe las actualizaciones en Geo-Noticias y Geo-Blogs

Recibir por e-mail
Recibir Geo-Noticias y Geo-Blogs por e-mail

¿Qué es esto?

Domingo 18 de Mayo de 2008 15:00

Filtro por atributos para el visor de Shapefiles de MapWinGIS

Written by  German Carrillo
Rate this item
(0 votes)

Cuando necesitamos visualizar subconjuntos de datos espaciales contenidos en una capa vectorial, empleamos filtros espaciales. A continuación se muestra una implementación para filtrar datos provenientes de archivos tipo Shapefile en el visor construido en un blog anterior.

 

Introducción

 

Algunos programas para SIG permiten construir filtros sobre los datos espaciales con el fin de prescindir de la información que no se requiera visualizar. Para datos de Postgres/PostGIS se pueden emplear vistas, muy útiles para representar información con filtros. Para datos en formato Shapefile podemos emplear programas como Kosmo SAIG (gvSIG y Quantum GIS no han implementado esta funcionalidad a la fecha) o incluso optar por componentes SIG programables como MapWinGIS del proyecto MapWindow.

 

 

¿Qué se busca con el filtro?

 

Al implementar esta funcionalidad se espera poder definir reglas para visualizar información geográfica con base en sus atributos alfanuméricos.

 

Para lograr una interacción rápida y sencilla de la herramienta con el usuario, se va a limitar el filtro así:

 

  • Solo se podrá seleccionar un atributo de la tabla.

  • Solo se podrá seleccionar un valores del atributo.

 

Esta simplificación permite hacer más claro para el usuario la definición del filtro, dejando de lado operadores de comparación (Mayor que, menor que, mayor o igual que, menor o igual que, diferente, entre otros) y conectores (AND, OR, XOR, entre otros) que pueden complejizar relativamente el desarrollo.

 

El filtro solo aplicará para datos provenientes de archivos Shapefile y aceptará las geometrías punto, línea y polígono.

 

 

Interfaz para filtrar

 

La interfaz de filtrado a implementar luce así:

Interfaz de filtrado

Imagen 1: Interfaz de filtrado.

 

El usuario selecciona la capa sobre la cual se realizará el filtro y posteriormente define la regla de visualización a partir de un campo y su valor.

 

 

¿Cómo se implementa?

 

Para implementar la funcionalidad, se debe descargar la clase Filtro desde aquí (archivo Zip, 4,7 Kb), descomprimirla y cargala al proyecto de Visual Basic .Net que contiene el código del visor.

 

Llamamos la forma para filtrar desde el evento click de un botón así:

Sub BtnFiltroClick(ByVal sender As Object, ByVal e As EventArgs)

If axMap1.NumLayers = 0 Then

MsgBox ("Debes cargar al menos una capa al mapa.")

Else

Dim pFiltro As New MapWindowVisor_1.Filtro(axmap1)

pFiltro.Show()

End If

End Sub

 

En el anterior bloque de código, BtnFiltro es el nombre del botón que carga la ventana para hacer los filtros, axMap1 es el nombre del control AxMap y MapWindow_1 es el nombre del proyecto de Visual Basic .Net.

 

 

Filtrando datos

 

Para filtrar datos en el visor de Shapefiles debemos cargar por lo menos una capa y dar click en el botón de filtrado, con lo cual se despliega la ventana para definir el filtro:

Filtrando datos

Imagen 2: Filtrando datos.

 

Para el ejemplo se construye el filtro para visualizar únicamente las curvas de nivel de tipo índice:

Mapa filtrado

Imagen 3: Mapa filtrado.

 

De este modo, la visualización es más clara y solo presenta la información que se necesita.



{mospagebreak title= Pag.2 Detalles técnicos...}

 

 

Detalles técnicos

 

En cuanto al desarrollo se refiere, el componente MapWinGIS provee el método set_ShapeVisible para el objeto AxMap, que permite definir la visibilidad de cada elemento espacial dentro de la capa de interés.

 

Para realizar el filtrado se siguen estos pasos a nivel de código:

  1. Leer la capa de interés.

  2. Leer el campo que se usará como base para definir el filtro.

  3. Leer el valor asociado al campo.

  4. Para cada elemento espacial (Shape) leer el valor asociado al campo que fue seleccionado por el usuario.

  5. Comparar el valor leído en el punto 4 con el valor seleccionado por el usuario.

  6. Asignar el valor verdadero a la visibilidad de los elementos espaciales (Shapes) que cumplan con la comparación y el valor falso a las restantes.

Se podrían construir consultas más robustas en la interfaz agregando los conectores y operadores de SQL para lograr mayor control sobre el filtro, sin embargo, para efectos de este ejercicio, se ha optado por una consulta sencilla que aún así, permite obtener una funcionalidad útil al momento de discriminar datos de una misma capa espacial.

 

 

Borrando el filtro

 

Se debe dar al usuario la posibilidad de borrar los filtros construidos previamente, para ello, agregamos un nuevo botón y escribimos el siguiente código en su evento click:

 

 

Sub btnBorrarFiltroClick(ByVal sender As Object, ByVal e As EventArgs)

Dim lHandleCapa As Integer

Dim pCapa As MapWinGIS.Shapefile

If axMap1.NumLayers = 0 Then Return

For i As Integer = 0 To axMap1.NumLayers - 1

lHandleCapa = axMap1.get_LayerHandle(i)

pCapa = axMap1.get_GetObject(lHandleCapa)

For j As Integer = 0 To pCapa.NumShapes - 1

axMap1.set_ShapeVisible(lHandleCapa,j,true)

Next

Next

MsgBox("Se han quitado los filtros sobre el mapa.")

End Sub

 

En este código se recorren los elementos espaciales (Shapes) de cada una de las capas del mapa y se asigna el valor verdadero a la visibilidad de cada uno.

Borrando el filtro

Imagen 4: Borrando el filtro.

 

 

Conclusiones

 

El filtrado de datos espaciales es útil para discriminar información de interés y facilitar la visualización y el análisis.

 

A través del componente MapWinGIS es posible desarrollar la funcionalidad de filtrado para datos en formato Shapefile.

 

 

Puedes descargar este artículo en formato PDF en este enlace (315,7 Kb).

 

 

Last modified on Jueves 29 de Septiembre de 2011 04:12

Comentarios  

 
0 # filtro no funciona?jordigg 29-12-2011 16:14
Gracias por colgar esta herramienta, he intentado implementarlo en visual basic (visual estdudio 2008) y esta parte no me funciona:

Dim pFiltro As New MapWindowVisor_ 1.Filtro(axmap1)

Qué puede fallar?
Gracias
Responder | Responder con una citación | Citar
 
 
0 # Re:tuxman 29-12-2011 19:36
Hola jordigg,

te recomiendo leer el mensaje de error que te aparece en VS si es que está fallando algo.

Como puedes leer en el post, necesitas descargar la clase filtro y agregarla a tu proyecto. Dependiendo del mensaje de error podría estar fallando por ejemplo la referencia a la clase filtro. Si ya has cargado la clase filtro y tu proyecto, entonces asegurate que el nombre MapWindowVisor_ 1 coincida exactamente con el nombre de tu proyecto (o de tu clase principal). Por ej. si tu proyecto se llama MiProy, entonces el llamado sería:

Dim pFiltro As New MiProy.Filtro(axmap1)

Saludos,

Tuxman
Responder | Responder con una citación | Citar
 
 
0 # filtrojordigg 31-12-2011 17:01
Gracias por la respuesta, efectivamente ese era uno de los problemas. Ahora no me da ningún error pero no me hace el filtro. Debo tener otro problema.

Gracias
Responder | Responder con una citación | Citar
 
 
0 # set_shapeVisibl eLuisGon 12-06-2012 01:41
hola Tuxman, estoy utilizando la version 4.8.6 del mapwingis y la la funcion set_shapeVisibl e(hnd,index,fal se) no me responde, no oculta ningun shape con esta instruccion y en versiones anteriores si lo hacia, que puede ser el problema?
Responder | Responder con una citación | Citar
 
 
0 # Re:tuxman 12-06-2012 18:40
Hola, bueno, creo que aquí [1] han explicado bien cómo hacerlo.

Saludos,

Tuxman
--------
[1] http://mapwingis.codeplex.com/discussions/261282
Responder | Responder con una citación | Citar
 
 
0 # set_ShapeCatego ryLuisGon 13-06-2012 23:34
Hola Tuxman, aplico exactamente lo que esta alli, pero al instanciar
dim sf MapWinGIS.Shapefile

el set_ShapeCatego ry no me aparece en la lista de metodos del sf, sera algun problema de version o algo asi
sf.set_ShapeCatego ry(ShapeIndex, 0)
Saludos
Responder | Responder con una citación | Citar
 
 
0 # Re:tuxman 14-06-2012 09:52
Hola Luis,

pues aparentemente el método fue agregado en la versión 4.8, como dice en este enlace. No tengo un entorno Windows para probar, pero trata de buscarlo con otro nombre, veo en el código fuente que tiene un nombre put_ShapeCatego ry(). Y por supuesto, fíjate bien que estes usando la versión que mencionan.

Por cierto, te sale algún error al compilar? O el único problema que tienes es que no aparece en el listado de métodos?

Saludos,

Tuxman
Responder | Responder con una citación | Citar
 
 
0 # set_ShapeCatego ryLuis Gonzalez 14-06-2012 15:28
Efectivamente no me aparece en la lista, en versiones anteriores me funcionaba perfectamente, estoy usando vb.net
la idea es
dim sf as mapwingis.shapefile
.
.
mapMain.set_shapeVisibl e(handle, index, true o false)

esto me funcionaba con versiones anteriores
Responder | Responder con una citación | Citar
 
 
0 # Re:tuxman 14-06-2012 19:40
Pero no respondiste la pregunta. Algún mensaje de error al compilar?
Responder | Responder con una citación | Citar
 
 
0 # set_ShapeCatego ryLuis Gonzalez 14-06-2012 22:49
no me da ningun error, asi como decis tal vez deba buscar con otros nombres, baje la version 4.7 y alli me funciona sin problemas el AxMap.set_shapeVisibl e(hdl,index,fal se), pero seria bueno implementar las categorias del 4.8.
Gracias Tuxman por la atencion
Responder | Responder con una citación | Citar
 
 
0 # Re:tuxman 17-06-2012 11:45
Hola Luis, finalmente pude probar en un Windows; como te mencioné la solución está en la 1era respuesta. La diferencia es que en VB.NET no usas métodos set_ Entonces para ocultar el shape lo que haces es esto:

'---------------------
Dim cat As MapWinGIS.ShapefileCatego ry
cat = psf.Categories.Add("Invisible")
cat.DrawingOptions.Visible = False
psf.ShapeCategory(38) = 0
axMap1.Refresh
'---------------------

Donde 38 es el índice del shape y 0 es el índice de la categoría que hemos agregado.

Ten presente eso, el:

pSf.set_ShapeCatego ry(38,0) // En C#

se convierte en:

pSf.ShapeCategory(38) = 0 ' En VB.NET

Saludos,

Tuxman
Responder | Responder con una citación | Citar
 
 
0 # set_ShapeCatego ryLuis Gonzalez 18-06-2012 14:11
Mil gracias Tuxman, ahora mismo lo pruebo y vuelvo a la version 4.8
Muchas gracias
Responder | Responder con una citación | Citar
 
 
0 # El tipo 'SIGPOT.Filtro' no está definido. (BC30002)blue 19-02-2013 20:39
hola, tome los 3 archivos del zip filtro, y los copie en la carpeta de mi proyecto, los cuales ya aparecen en el panel de proyectos del sharpdevelop, el nombre de mi proyecto es "SIGPOT", modifique como dices el codigo en la clase mainForm.vb, de la siguiente forma:
Dim pFiltro As New SIGPOT.Filtro(axmap1)
pFiltro.Show()

mi axmap se llama tal cual "axmap1".
sin embargo cuando intento ejecutar el programa me aparece el siguiente error
"El tipo 'SIGPOT.Filtro' no está definido. (BC30002)", agradeceria si pudiera ayudarme gracias.
Responder | Responder con una citación | Citar
 
 
0 # impresionedwin 29-05-2015 15:13
como puedo imprimir desde axmap algún polygono y como seleccionar ese poligono
Responder | Responder con una citación | Citar
 

Escribir un comentario


Código de seguridad
Refescar

 

¿Dónde nos leen?