domingo, 4 de septiembre de 2011

ODBC y GIS: Mapinfo

En este mes hablaremos sobre algunos tipos de conexiones a fuente de datos, también conocidos como ODBC (Open DataBase Connectivity) como una base de datos en Access, Excel y Postgres, ya que a veces necesitamos recuperar información remotamente a un servidor ya establecido para nuestros trabajos en GIS.

Previamente, debemos tener nuestras conexiones ODBC en nuestra computadora, para lo cual, usaremos tres distintas fuentes:

En el siguiente dibujo mostrado abajo se ve los archivos respectivos en Access y Excel y la tabla en Postgres:

Donde:

1) Usaremos una base de datos de Access con nombre “INGEOGRAFOS_BD.mdb” y esta tendrá una tabla con nombre “Tabla1”.

2) Usaremos una hoja de cálculo de Excel con nombre “PERU_CAPITALES_DEPARTAMENTOS.xls” y esta tendrá una hoja o sheet con nombre “PERU_CAPITALES”.

3) Usaremos Postgres y esta tendrá una base de datos con nombre “INGEOGRAFOS” y tendrá una tabla con nombre “PERU_CAPITALES_DEPARTAMENTOS.”

En esta oportunidad se mostrar algunas sentencias en Mapbasic para hacer dichas conexiones:

En Access:

La sentencia en MapBasic que sigue nos enlaza a la base de datos:

INCLUDE "MAPBASIC.DEF"


Dim hdbc As Integer
Dim hstmt As Integer
Dim Col As Integer
Dim numFilas As Integer

hdbc = Server_Connect("ODBC", "DSN=ODBC_ACCESS") ';UID=ADMIN;PWD=SECRET") ' hace la coneccion a la base de datos "INGEOGRAFOS_BD"
hstmt = Server_Execute(hdbc, "Select * from Tabla1") 'recupera la informacion de la tabla "Tabla1"

'Cuenta el numero de filas
Server hstmt Fetch First
numFilas = 0
While Not Server_EOT(hstmt)
numFilas = numFilas + 1
Server hstmt Fetch Next
Wend

Print "Numero de Columnas: " + Server_NumCols( hstmt ) 'Imprime el numero de Columnas en la tabla "Tabla1"
Print "Numero de Entidades/Filas: " + numFilas 'Cuenta e imprime el numero de Entidades / Filas en la tabla "Tabla1"

'muestra el contenido de una fila:
Server hstmt Fetch NEXT
For Col = 1 To Server_NumCols(hstmt )
Print Server_ColumnInfo(hstmt , Col, SRV_COL_INFO_NAME) + " = " + Server_ColumnInfo(hstmt , Col, SRV_COL_INFO_VALUE)
Next


En Excel:

La sentencia en MapBasic que sigue nos enlaza a la base de datos:


INCLUDE "MAPBASIC.DEF"

Dim hdbc As Integer
Dim hstmt As Integer
Dim Col As Integer
Dim numFilas As Integer

hdbc = Server_Connect("ODBC", "DSN=ODBC_Excel") 'hace la coneccion a la base de datos "PERU_CAPITALES_DEPARTAMENTOS"
hstmt = Server_Execute(hdbc, "Select * from [PERU_CAPITALES$]") 'recupera la informacion de la hoja "PERU_CAPITALES"


'Cuenta el numero de filas
Server hstmt Fetch First
numFilas = 0
While Not Server_EOT(hstmt)
numFilas = numFilas + 1
Server hstmt Fetch Next
Wend

Print "Numero de Columnas: " + Server_NumCols( hstmt ) 'Imprime el numero de Columnas en la hoja "PERU_CAPITALES"
Print "Numero de Entidades/Filas: " + numFilas 'Cuenta e imprime el numero de Entidades / Filas en la hoja "PERU_CAPITALES"

'muestra el contenido de una fila:
Server hstmt Fetch NEXT
For Col = 1 To Server_NumCols(hstmt )
Print Server_ColumnInfo(hstmt , Col, SRV_COL_INFO_NAME) + " = " + Server_ColumnInfo(hstmt , Col, SRV_COL_INFO_VALUE)
Next


En Postgres:

Nota: solo se tendrá acceso a la base de datos, es decir, no se tendrá acceso a los datos espaciales (como polígonos, líneas o puntos)

La sentencia en MapBasic que sigue nos enlaza a la base de datos:

INCLUDE "MAPBASIC.DEF"

Dim hdbc As Integer
Dim hstmt As Integer
Dim Col As Integer
Dim numFilas As Integer

hdbc = Server_Connect("ODBC", "DSN=PostgreSQL;UID=postgres;PWD=TU_PASSWORD") ' hace la coneccion a la base de datos "INGEOGRAFOS"

dim aux as string
aux = "Select * from " + Chr$(34)+ "PERU_CAPITALES_DEPARTAMENTOS" + + Chr$(34)
hstmt = Server_Execute(hdbc, aux ) 'recupera la informacion de la tabla "PERU_CAPITALES_DEPARTAMENTOS"

'Cuenta el numero de filas
Server hstmt Fetch First
numFilas = 0
While Not Server_EOT(hstmt)
numFilas = numFilas + 1
Server hstmt Fetch Next
Wend

Print "Numero de Columnas: " + Server_NumCols( hstmt ) 'Imprime el numero de Columnas en la tabla "PERU_CAPITALES_DEPARTAMENTOS"
Print "Numero de Entidades/Filas: " + numFilas 'Cuenta e imprime el numero de Entidades / Filas en la tabla "PERU_CAPITALES_DEPARTAMENTOS"

'muestra el contenido de una fila:
Server hstmt Fetch NEXT
For Col = 1 To Server_NumCols(hstmt )
Print Server_ColumnInfo(hstmt , Col, SRV_COL_INFO_NAME) + " = " + Server_ColumnInfo(hstmt , Col, SRV_COL_INFO_VALUE)
Next


EL resultado sera un "Print" con:

a) Número de columnas por cada base de datos.

b) Número de filas por cada base de datos.

c) Una fila de cada base de datos (ver figura siguiente).


Esperando que sea de utilidad esta entrada, sera hasta el proximo mes. Gracias por su atención.






ª