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