viernes, 29 de abril de 2016

Disolver polígonos en MapInfo (con MapBasic)

En este mes se presenta un ejemplo de disolver polígonos por un campo con MapBasic. Para ello usamos como archivo de entrada “LIMITE DEPARTAMENTOS.TAB” cuyos polígonos representan los departamentos del Perú y “DISOLVER_LIMITE DEPARTAMENTOS.TAB” (los pueden descargar de este ENLACE) donde se guardara el resultado producto de disolverlo por un campo.
El archivo de entrada “LIMITE DEPARTAMENTOS.TAB” tiene los siguientes campos:

NAME: donde están los nombres de los departamentos
REGION: donde está la región natural por cada departamento (COSTA, SIERRA, SELVA) y también  el valor de LAGO para los polígonos que representen dichos cuerpos de agua. Este campo lo usaremos para disolver los polígonos.

Debe ser como la imagen siguiente:












Para realizar esto, se utiliza la función Combine (Object1, Object2), donde Object1 y Object2 para este ejemplo son polígonos que se deseen combinar. El resultado de esta función (para este ejemplo) es un nuevo polígono. Para más información pueden consultar el Help de MapBasic. Para la ejecución de este ejemplo, deben estar los dos archivos mencionados arriba (“LIMITE DEPARTAMENTOS.TAB” y “DISOLVER_LIMITE DEPARTAMENTOS.TAB”) en la misma vista.

El código con comentarios es el siguiente:
Include "Mapbasic.def"

Dim CampoMerge as String
Dim Valor as String
Dim i as Integer

CampoMerge = "REGION"

Select REGION, Count(*) From LIMITE_DEPARTAMENTOS  Group By CampoMerge Order By CampoMerge  into MiCuenta NoSelect 'CUENTA LOS VALORES EN EL CAMPO REGION

Fetch First From MiCuenta 
Do While Not EOT (MiCuenta) 'RECORREMOS LOS VALORES DE MiCuenta
 Valor = MiCuenta.col1 'LEO EL VALOR DEL CAMPO REGION
 i = 0
 
 Select * From LIMITE_DEPARTAMENTOS where REGION = Valor 'SELECCIONA SEGUN EL Valor EN EL CAMPO REGION
 Fetch First From Selection 'RECORREMOS LOS VALORES DE CADA SELECCION
 Do While Not EOT (Selection)
  If (i = 0) Then
   Dim Poligono as Object
   Poligono = Selection.obj 'EN LA VARIABLE Poligono GUARDO EL PRIMER POLIGONO DE CADA SERIE DE Valor
  Else
   Poligono = Combine(Poligono, Selection.obj) 'LUEGO COMBINO CADA POLIGONO QUE LEE CON EL ANTERIOR
  End If
  i = i + 1
 Fetch Next From Selection
 Loop
 
 Insert Into DISOLVER_LIMITE_DEPARTAMENTOS (obj, REGION) Values (Poligono, Valor) 'INSERTAMOS LOS POLIGONOS EN LA TABLA DISOLVER_LIMITE_DEPARTAMENTOS
 Fetch Nex

Solo indicar que se utiliza un valor centinela (también conocido como flag) en cada momento que la variable i sea 0, en ese momento se crea una variable llamada Poligono de tipo Object y se guarda el polígono de dicho registró. Cuando la variable i tome otro valor se ejecuta la función Combine (Object1, Object2) que en este caso sería Combine (Poligono, Selection.obj) y el resultado es guardado en la misma variable Poligono (se actualiza dicha variable). Ademas que falta las funciones de guardar los cambios para  “DISOLVER_LIMITE DEPARTAMENTOS.TAB”.

En la siguiente imagen vemos el resultado:












Esperando que sea útil este ejemplo sencillo, será hasta el otro mes. Saludos
ª