sábado, 3 de enero de 2015

MapBasic (Programación en MapInfo): Registrar CSV y visualizarlo en el MapInfo:

En este Post, se explicara como Registrar y Visualizar un archivo CSV en el MapInfo usando un código en MapBasic. Para ello usaremos el archivo CAPITAL DISTRITO_PSAD56.csv (que es un archivo con las coordenadas de las capitales distritales del departamento de Amazonas, en el Perú y lo pueden bajar desde este ENLACE) y que tiene la siguiente estructura:

NOMBRE: nombre  de la capital distrital.
DISTRITO: nombre del distrito.

PROVINCIA: nombre de la provincia.
DEPARTAMENTO: nombre del departamento.

X: longitud de la capital distrital en PSAD56.
Y: latitud de la capital distrital en PSAD56.

En este ejemplo usaremos las columnas “X” e “Y”.

Registrar un archivo en MapInfo: para poder usar un archivo (en este ejemplo, un archivo CSV que es un archivo ASCII) y visualizar su información en el MapInfo, se debe abrirlo usando el “Open a Table” y escoger el tipo de archivo que se quiere ver (en este caso, el tipo CSV)


 
Luego nos pedirá que si queremos que la primera fila sea la cabecera de las columnas y lo abrimos con el botón “Ok”. Luego se creara un archivo TAB con el mismo nombre del CSV abierto (o registrado). Por ejemplo, si hemos abierto el archivo CAPITALDISTRITO_PSAD56.csv, entonces se creara el archivo CAPITAL DISTRITO_PSAD56.tab. Vemos que no existe el archivo CAPITAL DISTRITO_PSAD56.dat (donde está la base de datos) ni el CAPITAL DISTRITO_PSAD56.map (donde están las geometrías). Para el caso del CAPITAL DISTRITO_PSAD56.dat, se usara el archivo CAPITAL DISTRITO_PSAD56.dat como base de datos. Para crear el CAPITAL DISTRITO_PSAD56.map, se sigue la siguiente secuencia: Menu Table/ Create Points… y aparecerá la siguiente ventana:



 
 

 






 Se usara el Código MapBasic siguiente para recrear lo mismo explicado anteriormente:
Include "MapBasic.Def"

Dim RutaCSV as String
Dim NombreCSV as String
Dim NombreTAB as Alias
Dim ProjActual as String
Dim idWin as Integer
Dim MiX as Alias
Dim MiY as Alias
Dim i as integer

idWin = FrontWindow()'ID DEL MAP ACTUAL
ProjActual = MapperInfo(idWin ,17)'PROYECCION DEL MAP ACTUAL

RutaCSV = "C:\Ingeografos\" 'COLOQUE LA RUTA DEL ARCHIVO CSV
NombreCSV = "CAPITAL DISTRITO_PSAD56" 'NOMBRE DEL ARCHIVO CSV SIN LA EXTENSION
NombreTAB = PathToTableName$(RutaCSV & NombreCSV & ".csv")'SE OBTIENE EL NOMBRE DEL TAB REGISTRADO

If FileExists(RutaCSV & NombreCSV & ".csv") Then 'VERIFICACION SI EXISTE EL CSV

 Register Table RutaCSV & NombreCSV & ".csv" 'REGISTRAMOS EL CSV (COMO "CAPITAL DISTRITO_PSAD56.TAB")
  Type ASCII Delimiter "," Titles 
      ' LE DECIMOS AL MAPBASIC QUE EL ARCHIVO ES ASCII,DELIMITADO CON  COMA "," Y CON TITULO

 Open Table RutaCSV & NombreCSV as NombreTAB  'ABRIMOS EL ARCHIVO "CAPITAL DISTRITO_PSAD56.TAB"
 Browse * From NombreTAB 
 Run Command "Create Map For " & NombreTAB & " " & ProjActual 'CREAMOS "CAPITAL DISTRITO_PSAD56.MAP" CON LA PROYECCION ACTUAL
 
 Add Map Window idWin  Layer NombreTAB 'AGREGAMOS "CAPITAL DISTRITO_PSAD56.MAP" A LA VISTA ACTUAL
 Set Map Window idWin  Layer 1 Editable On 'Y LO PONEMOS EN EDICION

 i = 1 'INICIALIZAMOS UN CONTADOR, CADA REGISRO ES UN PUNTO EN "CAPITAL DISTRITO_PSAD56.MAP"
 Fetch First From NombreTAB 'LEEMOS LA PRIMERA LINEA DEL "CAPITAL DISTRITO_PSAD56.TAB"
 Do While Not EOT(NombreTAB) 'ESTE LOOP LEERA CADA REGISTRO DE "CAPITAL DISTRITO_PSAD56.TAB"
  MiX = NombreTAB & ".col5"'LEEMOS LA LONGITUD DEL REGISTRO ACTUAL
  MiY = NombreTAB & ".col6"'LEEMOS LA LATITUD DEL REGISTRO ACTUAL
  Update NombreTAB 'Y ACTUALIZAMOS EL "CAPITAL DISTRITO_PSAD56.MAP"
   Set Obj = CreatePoint(MiX,MiY) Where Rowid = i

  i = i + 1 'AUMENTAMOS MAS UNO EL CONTADOR DE PUNTOS
  Fetch Next From NombreTAB  'LEEMOS EL SIGUIENTE REGISTRO
 Loop

 Note "LISTO..." 'MENSAJE DE FINALIZACION
Else
 Note "ERROR EN LA LECTURA DEL ARCHIVO CSV..." 'MENSAJE DE ERROR DE LECTURA
End If
 
Explicación:

El código ya tiene una explicación en sus comentarios, pero se debe aclarar que se debe Actualizar y no Agregar los puntos al archivo CAPITAL DISTRITO_PSAD56.map. La razón es que los datos provienen de un archivo CSV (CAPITAL DISTRITO_PSAD56.csv) y lo estamos usando como si fuera un archivo DAT (como si fuera el CAPITAL DISTRITO_PSAD56.dat). Si Agregamos puntos a CAPITAL DISTRITO_PSAD56.map, tendríamos que agregar registros a CAPITAL DISTRITO_PSAD56.csv, cosa que no se requiere, además saldría un error de que el Tab que se está editando es de SOLO LECTURA por ser un archivo registrado.

Esperando que sea de utilidad, será hasta el otro mes. Saludos.
ª