You are here:GeoTux»Geo-Blogs»Librerías para Geomática»Herramienta para identificar objetos espaciales en el Visor de Shapefiles de MapWinGIS

Estadísticas

Invitados: 32
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?

Martes 05 de Agosto de 2008 23:51

Herramienta para identificar objetos espaciales en el Visor de Shapefiles de MapWinGIS

Written by  German Carrillo
Rate this item
(1 Vote)

En toda aplicación SIG es importante disponer de una herramienta que permita conocer los atributos de un elemento espacial determinado por el usuario. A continuación se describe la manera de realizar esta funcionalidad (conocida como Identify en inglés) para el visor de Shapefiles construido en un blog anterior.

 

¿En qué consiste la funcionalidad para identificar objetos espaciales?

 

La funcionalidad para identificar objetos espaciales consiste en permitir al usuario conocer los atributos de un elemento espacial del mapa. El elemento espacial es seleccionado a través de una intersección realizada entre un punto que el usuario defina en el mapa y los objetos de una capa de información geográfica, en este caso con formato vectorial.

 

 

Problema 1

 

El usuario puede tener cargada más de una capa en el mapa, con lo cual el punto que defina para identificar puede tener varios elementos espaciales que lo intersecten, obteniendo múltiples resultados, uno para cada capa.

 

 

Formas de abordar el problema 1

 

Para desarrollar una herramienta de este tipo se puede optar básicamente por dos opciones:

 

  1. El usuario selecciona la herramienta de identificar objetos, luego da click en el mapa y la aplicación le retorna los resultados de los elementos espaciales intersectados sin importar la capa en la que se encuentren.


  2. En esta opción el usuario obtiene todos los resultados de su selección sobre el mapa, por lo que no es necesario que elija una de las capas para realizar la consulta. Sin embargo, obtener todos los resultados puede llegar a ser confuso por la cantidad de información desplegada.

     

    En la Figura 1 se observa un ejemplo de esta opción:

    Información en todas las capas

    Figura 1. Información de elementos intersectados

    en todas las capas. (Kosmo SAIG v.1.2)

     

  3. El usuario selecciona la capa sobre la que realizará la consulta, luego da click en el botón de la herramienta para que le habilite el cursor que identifica objetos, da click en el mapa seleccionado un objeto espacial y posteriormente se muestra una ventana con la información referente a los elementos espaciales de la capa seleccionada.

     

    Esta aproximación se puede encontrar en varias aplicaciones que manejan el concepto de capa activa, sobre la cual se realizan las consultas.

El orden de interacción en esta opción puede verse alterado, es decir, el usuario puede seleccionar el objeto espacial en el mapa y luego definir la capa de interés, pero el concepto de capa activa es el mismo.

 

En la Figura 2 se muestra un ejemplo, se selecciona la capa estacion en la tabla de contenido y sobre esa capa se realiza la consulta.

 

Información de una capa de interés.

Figura 2. Información de elementos intersectados

en la capa seleccionada. (Kosmo SAIG v.1.2)

 

Pueden existir alternativas como presentar información al usuario mientras el cursor se desplaza por elementos espaciales en el mapa, pero en esencia, podemos pensar en las dos opciones presentadas con anterioridad.

 

 

NOTA:

Para realizar este ejercicio se optará por la opción 2, es decir, elegir una capa como base para las consultas.

 

 

Problema 2

 

Superado el problema 1 debemos considerar que debido a la escala de representación, el punto que el usuario seleccione en el mapa puede llegar a intersectar dos o más elementos espaciales de la misma capa.

 

Formas de abordar el problema 2

 

  1. Listar de alguna forma los atributos de todos los elementos seleccionados.

  2. No listar los atributos si la selección intersecta dos o más elementos espaciales, limitando a uno el número de objetos a identificar.

 

NOTA:

Para este ejercicio se optará por la opción 2, solo se podrá seleccionar un elemento a la vez para obtener sus atributos.

 

 

Detalles técnicos

 

En cuanto al desarrollo se refiere, se deben realizar los siguientes pasos para conseguir los atributos de un elemento en el mapa:

 

  1. Habilitar el cursor de selección de elementos en el mapa.

     

  2. Capturar las coordenadas de control para el punto seleccionado en el mapa. Estas coordenadas tienen su origen en la esquina superior izquierda del control mapa que provee el componente MapWinGIS.

     

  3. Capturar la capa de interés sobre la que se realiza la consulta.

     

  4. Validar el tipo de geometría de la capa de interés. Si la geometría es polígono se salta al paso 5, si la geometría es punto o polilínea se aplica una tolerancia para permitir la selección.

     

  5. Proyectar las coordenadas de control a coordenadas de mapa.

     

  6. Construir un objeto Extent que representa un rectángulo empleado para realizar la intersección de geometrías. El Extent se define por un par de coordenadas: (X mínimo, Y mínimo) y (X máximo, Y máximo) que corresponden a los puntos inferior izquierdo y superior derecho del rectángulo. Si la geometría de la capa de interés es polígono, los dos puntos mencionados coinciden porque no se aplica tolerancia.

     

  7. Realizar la intersección entre el objeto Extent construido y la capa de interés, lo cual genera una colección de elementos intersectados.

     

  8. Validar el número de elementos intersectados. Si no hay elementos o si hay más de uno se envía un mensaje al usuario, de lo contrario se sigue con el paso 8.

     

  9. Se recorre la tabla de atributos asociada al elemento seleccionado y se agrega el nombre del campo y su valor a un control de visualización.

 

Con estos pasos se consigue identificar los atributos de un elemento espacial en el mapa, según la selección que realice el usuario.

 

 

Interfaz de identificación de objetos espaciales

 

La interfaz de identificación de objetos espaciales luce así:

 

Interfaz de la herramienta

Figura 3: Interfaz de la herramienta.

 

Esta ventana aparece cuando el usuario ha seleccionado el botón de la herramienta y ha dado click sobre el mapa.

 

Como se observa, en la parte superior se tiene un listado de capas para que el usuario elija la de su interés.

 

 

 

¿Cómo se implementa?

 

Se debe agregar un nuevo botón al visor de Shapefiles llamado btnIdentify. En el evento click de dicho botón agregamos el siguiente código:

 

 

1

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

2

 

3

'Validar si hay capas cargadas en el mapa

4

If axMap1.NumLayers = 0 Then

5

 

6

msgbox ("Debes cargar al menos una capa al mapa.",

 

MsgBoxStyle.OkOnly,"Identificar elementos espaciales")

7

 

8

Else

9

 

10

AxMap1.SendMouseDown = True 'Enviar evento MouseDown

11

AxMap1.CursorMode = MapWinGIS.tkCursorMode.cmSelection 'Cambiar cursor

12


13

End If

14

 

15

End Sub

 

Si hay capas cargadas en el mapa, se activa el envío del evento Mouse Down (línea 10) que por defecto está deshabilitado. Además se elige el cursor de selección en el mapa (línea 11).

 

 

En el evento Mouse Down del control mapa se capturan las coordenadas del punto seleccionado por el usuario:

 

1

Private Sub AxMap1_MouseDownEvent(ByVal sender As Object, ByVal e As

 

AxMapWinGIS._DMapEvents_MouseDownEvent) Handles AxMap1.MouseDownEvent

2

 

3

'Valida si está activa la herramienta identificar

4

If AxMap1.CursorMode <> MapWinGIS.tkCursorMode.cmSelection Then Exit Sub

5

 

6

'Dibuja un punto rojo que representa la selección del usuario sobre el mapa

7

Dim xDibujo As Double, yDibujo As Double

8

AxMap1.PixelToProj(e.x, e.y, xDibujo, yDibujo)

9

AxMap1.ClearDrawings()

10

AxMap1.NewDrawing(MapWinGIS.tkDrawReferenceList.dlSpatiallyReferencedList)

11

AxMap1.DrawPoint(xDibujo, yDibujo, 5, System.Convert.ToUInt32(RGB(0, 255, 210)))

12


13

'Capturar las coordenadas del punto picado en el control AxMap

14

Dim pPuntoPantalla As New MapWinGIS.PointClass

15

pPuntoPantalla.x = e.x

16

pPuntoPantalla.y = e.y

17

 

18

'Llamar formulario de Identificar enviando el punto picado en el control

19

Dim pIdentificar As frmIdentificar

20

pIdentificar = frmIdentificar.ObtenerInstancia()

21

pIdentificar.Inicializar(axmap1,pPuntoPantalla)

22

pIdentificar.Show()

23

 

24

End Sub

 

 

En las líneas 7 a 11 se dibuja un cuadrado pequeño en el mapa que representa el punto picado por el usuario.

 

En las líneas 14 a 16 se capturan las coordenadas del control requeridas por la clase Identificar, que se encarga de toda la lógica de la herramienta.

 

En las líneas 19 a 22 se declara, se inicializa y se muestra la interfaz de la herramienta.

 

 

 

La clase Identificar puede ser descargada desde aquí (archivo Zip, 5.3 Kb), se debe descomprimir y agregar al proyecto que contiene el código del visor en el entorno de desarrollo SharpDevelop. El código de la clase Identificar se encuentra documentado para mejorar su comprensión.

 

Con el uso del patrón Singleton para la clase Identificar se evita el problema de cargar una ventana en cada click del usuario sobre el mapa.

 

Identificar elementos espaciales

Figura 4: Herramienta para identificar elementos espaciales.

 

Conclusiones

 

El uso de una herramienta para identificar objetos espaciales es indispensable en cualquier programa SIG pues le permite al usuario responder a la pregunta: ¿Qué es este objeto?.

 

Existen varias maneras de diseñar la herramienta para identificar objetos espaciales, todo depende de las necesidades del usuario.

 

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

 

 

Referencias Bibliográficas

 




Pdf Puedes descargar este artículo en formato pdf desde aquí (165.6 Kb).

 

 



 

Last modified on Miércoles 29 de Agosto de 2012 08:40

Comentarios  

 
0 # selección de polígonos y obtencion de atributos al hacer click en un poligonojordigg 23-12-2011 22:34
Bunas noches, seguí las instrucciones del artículo CONSTRUCCIÓN DE UN VISOR DE SHAPEFILES CON HERRAMIENTAS LIBRES. Todo funciona correctamente pero quería añadir alguna aplicación extra y no lo consigo.

Quería poder hacer click en el botón creado para información
Private Sub tbbtnInfo_Click (ByVal sender As System.Object, ByVal e As System.EventArgs) Handles tbbtnInfo.Click
Me.AxMap1.CursorMode = MapWinGIS.tkCursorMode.cmSelection
End Sub

y que así después al hacer click en un poligono de la shapefile que aparezcan uno o varios atributos de ese polígono (puede ser en forma de tabla por ejemplo).

Otra cosa que quería hacer era poder seleccionar varios polígonos para así abrir la tabla de atributos y que en dicha tabla estén coloreadas las filas de esos polígonos.

Me han dicho que tengo que utilizar el mouseupevent pero no tengo experiencia en programación y no se utilizarlo...

Muchas gracias
Responder | Responder con una citación | Citar
 
 
0 # selección de polígonos y obtencion de atributos al hacer click en un poligonojordigg 23-12-2011 22:39
Por cierto,

Estoy programando la herramienta en Visual Basic, visual studio 2008.

Un saludo y gracias espero que me puedan ayudar
Responder | Responder con una citación | Citar
 
 
0 # Re:tuxman 25-12-2011 22:50
Hola jordigg,

con respecto a tu 1era pregunta, si te fijas, este post hace lo que necesitas pero con puntos. Para extenderlo y tener en cuenta polígonos, puedes utilizar la función drawpolygon [1] del control map. La usas en el evento AxMap1_MouseDownEvent (o AxMap1_MouseUpEvent, como mencionas), lo que dibujarías es la geometría del polígono que se intersecte con el punto picado por el usuario, así que antes de dibujar debes traer la geometría del polígono intersectado. Tal vez después pueda extender mi respuesta pero no he vuelto a trabajar con MapWinGIS, así que no te confíes de ello.

Se me ocurre que tu 2da pregunta puedes resolverla cuando implementes la solución de la 1era. En este caso, en el evento AxMap1_MouseDownEvent podrías verificar si la tecla Control está presionada para agregar un nuevo dibujo al mapa, de esta manera puedes seleccionar más de un polígono.

Saludos,

Tuxman

----------
[1]http://www.scribd.com/doc/54272900/163/DrawPolygon
Responder | Responder con una citación | Citar
 
 
0 # Problema con poligonosVictor Magnawar 05-04-2012 17:35
Saludos, me gusto tu aporte, pero me gustaria saber todos los cambios que tengo que hacer a tu libreria para que funcione con poligonos, gracias 8)
Responder | Responder con una citación | Citar
 
 
0 # Re:tuxman 05-04-2012 21:37
No entiendo a qué te refieres con "para que funcione con polígonos". Si has revisado el código verás que funciona con capas tipo punto, línea y polígono.

Si otro fuera el caso, de todas formas no podría decirte "todos los cambios que tengo que hacer" si tú antes no comentas qué has hecho para conseguirlo. Es decir, primero le trabajas, luego preguntas ;-)
Responder | Responder con una citación | Citar
 

Escribir un comentario


Código de seguridad
Refescar

 

¿Dónde nos leen?