domingo, 20 de septiembre de 2015

Diferencias entre un archivo DBF (Shapefile) y un archivo DAT (Tab de MapInfo)

Se dice que un archivo DBF de un Shapefile (donde se almacena la descripción de cada geometría de este Shapefile) es muy similar a un archivo DAT de un Tab de Mapinfo. Se verá algunas diferencias entre este tipo de archivos.

Nota 1: esto es producto de propia investigación. Úsese con  sumo cuidado.

Para este ejemplo, se usara un Shapefile y un Tab  (los enlaces de estos dos archivos en las palabras Shapefile y Tab) de los departamentos del Perú como ejemplo. En ambos casos se tiene la siguiente información:

Tabla 1: Descripción de las columnas
Columna
Tipo de Valor - Shapefile
Tipo de Valor - Tab
Descripción
AREA
Double (19,18,15)
Float
Área del Departamento
PERIMETER
Double (19,18,15)
Float
Perímetro del Departamento
PERUDEP_
Double (11,11,0)
Decimal(11,0)
Identificador
PERUDEP_ID
Double (11,11,0)
Decimal(11,0)
Identificador
CODIGO_DEP
Text(2)
Character(2)
Código del Departamento
NAME
Text(35)
Character(35)
Nombre del Departamento
NAMECAPITA
Text(35)
Character(35)
Nombre de la Capital del Departamento
COUNTPROVI
Double (11,11,0)
Decimal(11,0)
Cantidad de Provincias
COUNTDISTR
Double (11,11,0)
Decimal(11,0)
Cantidad de Distritos
DECRETOLEY
Text(4)
Character(4)
Ley que promulga la creación
DATE_
Date(8)
Date
Fecha de creación
COUNTPOBLA
Double (19,18,15)
Float
Cantidad de población
ID
Double (11,11,0)
Decimal(11,0)
Identificador
TRANSP
Long (5,5,0)
Decimal(5,0)
Valor de Transparencia de la geometría
para Tipo de Valor - Shapefile:
Tipo de valor(Longitud, Precisión, Escala)
Longitud: vendría ser la Precisión de un numero sumado el separador decimal *
Precisión:  longitud del campo (cantidad de solo números)
Escala: posiciones de decimales
(*) se infiere que para los números con decimales, la Longitud será siempre una unidad más que la Precisión




para Tipo de Valor - Tab:
Tipo de valor(Longitud del valor, cantidad de numero de la parte entera del valor)

Si abrimos este Shapefile en el ArcGIS, vemos su tabla de atributos (el archivo DBF) y observamos toda la información que se explicó en la Tabla 1, lo mismo ocurre si abrimos la tabla de atributos (el archivo DAT) del Tab en el MapInfo, se observa la misma información. Si abrimos los archivos DBF y DAT en el Microsoft Excel, vemos lo siguiente:

Vista en el Microsoft Excel de un archivo DAT


Vista en el Microsoft Excel de un archivo DBF


Observamos que el DBF muestra los valores tal cual se puede ver en el ArcGIS. Para el caso del DAT, se nota algunos caracteres ininteligibles en las columnas Area, Perimeter, Date_ y Countpobla. Si observamos la tabla mostrada anteriormente, vemos que Area, Perimeter y Countpobla para el DAT son columnas de tipo Float (para lo que el ArcGIS y el DBF es una columna de tipo Numérico con decimales) y que la columna Date_ para el DAT se mantiene como una columna de tipo Date. Entonces se podría decir que la diferencia radicaría en:
1)  La manera como trata el DAT a las columnas de tipo Float.
2)  La manera como trata el DAT a las columnas de tipo Date.

Vistazo a la estructura interna de un archivo DBF:
Nota 2: Es algo requerido el conocimiento de programación y de la interpretación de bytes y offsets de un archivo (interpretación y lectura binaria de un archivo).

De acuerdo al documento: http://www.whitetown.com/es/misc/dbf/   (es algo necesario leer este documento para encontrar la razón de esta diferencia que es motivo de este articulo) que explica la estructura interna de un DBF, que para este ejemplo, solo veremos los tipos de columnas que son usados (esta información se encuentra en lo que se conoce como Cabecera de DBF y DAT):
  • C – Carácter
  • N – Numérico
  • F – Flotante
  • D – Fecha
  • L – Lógico
  • M – Memo
  • G – General
  • C – Carácter (binario)
  • M – Memo (binario)
  • B – Doble
  • I – Entero
  • Y – Monetario
  • T – Fecha-Hora
  • P – Imagen
Si usamos un programa lector hexadecimal (como el Free Hex Editor Neo, si desean descargarlo, solo deben hacer click sobre el nombre del programa) que permite ver el contenido (en un formato binario) de todos los archivos y por supuesto de los DBF y  DAT. Al abrirlos, observamos algo como esto:




Tabla 2: Tipos de Columnas
Columna
DBF*
DAT*
AREA
N (19,15)
C (8)
PERIMETER
N (19,15)
C (8)
PERUDEP_
N (11,0)
N (11,0)
PERUDEP_ID
N (11,0)
N (11,0)
CODIGO_DEP
C (2)
C (2)
NAME
C (35)
C (35)
NAMECAPITA
C (35)
C (35)
COUNTPROVI
N (11,0)
N (11,0)
COUNTDISTR
N (11,0)
N (11,0)
DECRETOLEY
C (4)
C (4)
DATE_
D (8)
C (4)
COUNTPOBLA
N (19,15)
C (8)
ID
N (11,0)
N (11,0)
TRANSP
N (5,0)
N (5,0)
(*) Tamaño: (longitud campo, numero decimales)

Se observa en la Tabla 2, que el DAT trata a las columnas de tipo Float como si fueran de tipo Texto con una longitud de 8 bytes y al de tipo Date como si fueran de tipo Texto con una longitud de 4 bytes. Al haber esta transformación de tipo de columnas, se observan estos caracteres extraños si se abre en el Microsoft Excel.



Vista del archivo DAT usando el Free Hex Editor Neo

















Vista del archivo DBF usando el Free Hex Editor Neo

















¿Dónde están los valores del Float y del Date en un archivo DAT?
Aun estando en el programa Free Hex Editor Neo, viendo la estructura interna de un DAT, si queremos hallar el lugar donde están los valores de estos archivos hacemos esta operación matemática para hallar en que byte esta esta información:
ByteInformacion = 32 + 32 * Numero de columnas + 1 + 1
Dónde:
32, es la longitud desde el inicio del archivo, hasta donde comienza la descripción de las columnas.
32 * Numero de Columnas, el 32 es la longitud de cada descripción de cada columna multiplicada por la cantidad de columnas que existen.
1, que es byte que indica el final de la cabecera del DBF y del DAT.
1, que es byte que indica el inicio de la información.
Para nuestro ejemplo:
ByteInformacion = 32 + 32 * 14 + 1 + 1
ByteInformacion = 482

Si usamos el Free HexEditor Neo, podemos apretar la combinación de teclas control + G y aparecerá una ventana llamada “Go to Offset” y seleccionando la opción “Absolute offset”, ponemos el valor calculado (482) y nos llevara a dicho Offset.



Si vemos en la ventana del lado izquierdo llamada “Data Inspector”, en la parte donde dice double, vemos el valor de 1.3616490000000001, que es el valor del área de este registro (como sabemos, la columna Area es la primera en aparecer en el DAT).























Si queremos hallar el valor de la columna Perimetro (la segunda columna en aparecer) repetimos la combinación de teclas control + G (“Go to Offset”) y seleccionamos la opción “Relative offset” y colocamos el valor de 8 (como se explicó en la Tabla 2), apretamos el botón de “Ok” y vemos en la ventana “Data Inspector” para el valor del double 6.0574199999999995, que es el valor del perímetro del primer registro.

























Para el caso del Date, la longitud de la columna DATE_ es 4 bytes, si nos ubicamos con el “Go To Offset” hacia el offset 618, leemos en el “Data Inspector”, valor de USHORT de 1877 (que es el año), nos desplazamos 2 offset hacia adelante (offset 620), leemos en el “Data Inspector”,  el valor de BYTE de 6 (valor del mes) y nos desplazamos hacia el offset 621 y vemos en el valor BYTE el valor de 25 (valor del día). Como se dijo, esta columna tiene una longitud de 4 Bytes, el USHORT tiene 2 bytes de longitud, y el BYTE tiene un byte de longitud, como el año es USHORT, el mes y el día es BYTE, suman los 4 bytes de longitud de esta columna DATE_.

Esperando que sea útil esta información, sobre todo los que programamos en GIS, será hasta el otro mes. Saludos



ª