Ejemplo de como Cargar Información Geográfica en Postgis y Oracle

RECU-0028 (Recurso Ejemplo)

Introducción

Es muy habitual en el ámbito de los Sistemas de Información Geográfica el uso del formato shape de ESRI para el intercambio de información geográfica, por lo que a menudo nos encontramos con la necesidad de cargar la información contenida en estos ficheros a una base de datos relacional del tipo Oracle o Postgis. A continuación se exponen algunas pistas sobre como realizar este proceso, proponiéndose el uso de diferentes herramientas que proporcionan utilidades para la conversión de formatos espaciales.

Descripción

Una forma muy sencilla es utilizar un cliente SIG capaz de conectarse y editar sobre estas bases de datos, tales como Kosmo o gvSIG:

  • Kosmo incorpora la utilidad de conexión a Oracle y Postgis en su paquete básico, siendo muy sencillo el proceso de exportación de una capa en formato shp a la base de datos relacional, tan solo hay que usar la opción “guardar como” sobre la capa e indicar la base de datos sobre la que se quiere guardar, indicando obviamente los parámetros de conexión al repositorio. El proceso de exportación entre formatos queda, además, perfectamente documentado en el manual de usuario de la aplicación, disponible en http://www.opengis.es/.
  • gvSIG, por su parte, permite el acceso a Postgis en su paquete básico, pero precisa instalar la extensión geoDB para acceder a otras bases de datos. Esta extensión permite conectarse a Oracle (lectura/escritura), PostGis (lectura/escritura), MySQL (sólo lectura) y HSQLDB (sólo lectura). En el caso concreto de Oracle permite al usuario acceder a cualquier tabla de una instalación de Oracle (a partir de la versión 9i) que tenga una columna con geometrías almacenadas del tipo SDO_GEOMETRY.

Otra opción para subir capas geográficas a Oracle es usar “Oracle's Shapefile Converter”, un conversor de ficheros shape a Oracle disponible en http://www.oracle.com/technology/software/products/spatial/index.html. Este conversor se ejecuta desde la consola de comando mediante la instrucción shp2sdo.

Finalmente, Postgis incorpora en su librería un comando (shp2pgsql) para la exportación de ficheros shape a la base de datos. Como resultado de la ejecución de esta instrucción se genera un fichero .sql, el cual contiene las sentencias necesarias para crear la tabla en Postgis y cargar los datos del shape.

Ejemplos

Oracle's Shapefile Converter

A continuación se muestra un ejemplo de cómo usar el comando shp2sdo en Windows NT para Oracle 9i o superior:

shp2sdo.exe edificio_ja edificio_ja -g geom -d -x (104902.342500,618305.121000) -y (3988572.439900,4273925.999800) -s 23030 -t 0.5 -v

Donde:

  • edificio_ja: es el nombre del shp a convertir (se espera .dbf, .shp, and .shx files)
  • edificio_ja: es nombre de la tabla a crear en Oracle
  • -g geom: es el nombre de la columna donde se va a almacenar la geometría
  • -d: vuelca los datos en el fichero de control generado por la herramienta
  • -x: coordenadas de las esquinas (bounds) en la dimensión X
  • -y: coordenadas de las esquinas en la dimension Y
  • -s: Id del sistema de referencia SRID
  • -t: tolerancia
  • -v: muestra mensaje del proceso en la consola

Este comando genera dos ficheros, edificio_ja.sql y edificio_ja.ctl. El primero contiene las instrucciones SQL para la creación de la tabla en Oracle, mientras que el segundo almacena la información alfanumérica asociada al shape. Los siguientes pasos son, por tanto, crear la tabla en Oracle mediante la ejecución del fichero .sql y cargar los datos del fichero .ctl.

Para ejecutar el fichero .sql hay que logarse en SQL*Plus como el usuario que va a ser dueño de la tabla y ejecutar @edificio_ja.sql , a continuación hay que escribir la instrucción sqlldr usuario/contraseña edificio_ja para cargar los datos alfanuméricos. Otra opción para crear la tabla y cargar los datos es usar el editor y el wizard sql-loader de la aplicación TOAD (recomendado usar versión TOAD 9.1).

Ejemplo del fichero .sql generado:

DROP TABLE EDIFICIO_JA;
CREATE TABLE EDIFICIO_JA (
Id_Edificio NUMBER,
Nombre VARCHAR2(254),
Fecha_baja NUMBER,
Codigo_Postal VARCHAR2(5),
Letra_Portal VARCHAR2(5),
Nom_Via VARCHAR2(254),
Tipo_Via VARCHAR2(25),
Nom_Municipio VARCHAR2(254),
Nom_Provincia VARCHAR2(50),
Coord_X NUMBER,
Coord_Y NUMBER,
Num_Portal VARCHAR2(50),
GEOM MDSYS.SDO_GEOMETRY);
DELETE FROM USER_SDO_GEOM_METADATA
WHERE TABLE_NAME = 'EDIFICIO_JA' AND COLUMN_NAME = 'GEOM' ;
INSERT INTO USER_SDO_GEOM_METADATA (TABLE_NAME, COLUMN_NAME, DIMINFO, SRID)
VALUES ('EDIFICIO_JA', 'GEOM',
MDSYS.SDO_DIM_ARRAY
(MDSYS.SDO_DIM_ELEMENT('X', 104902.342500000, 618305.121000000, 0.500000000),
MDSYS.SDO_DIM_ELEMENT('Y', 3988572.439900000, 4273925.999800000, 0.500000000)
),
23030);
COMMIT;

Una vez la capa ha sido cargada, si esta es de tipo poligonal, hay que migrarla al formato de SDO_GEOMETRY requerido por las base de datos Oracle 8.1.6 o superior, para ello ejecutar:

EXECUTE SDO_MIGRATE.TO_CURRENT('STATES','GEOM');

El último paso es crear el índice espacial de la tabla creada, para ello se utilizará la siguiente instrucción:

CREATE INDEX EDIFICIO_JA_SPATIAL_INDEX ON USUARIO_DE_LA_TABLA.EDIFICIO_JA (GEOM) INDEXTYPE IS MDSYS.SPATIAL_INDEX PARAMETERS ('TABLESPACE=NOMBRE_TABLE_SPACE');Comando Shp2pgsql

Comando Shp2pgsql

A continuación se muestra un ejemplo de cómo ejecutar este comando:

shp2pgsql -s 23030 edificio_ja.shp -c edificio_ja>edificio_ja.sql

Donde:

  • -s: Id del sistema de referencia SRID
  • edificio_ja.shp: nombre del shape a cargar
  • -c: indica que se va a crear una tabla nueva y cargar los datos, otras opciones son:
  • -d: elimina la talba si existiera, la vuelve a generar y carga los datos del shape.
  • - a: añade los datos del shp a una tabla ya existente, el esquema del shape debe ser exactamente igual al de la tabla
  • -p: solo crea la tabla.
  • Edificio_ja: nombre de la tabla a crear en la base de datos
  • Edificio_ja.sql: nombre del fichero .sql generado por el comando

Una vez creado el fichero .sql, este puede ser cargado mediante la siguiente instrucción:

psql -U postgres -f edificio_ja.sql -d sedes

Donde:

  • -U: contraseña de acceso a la base de datos
  • -f: nombre del fichero .sql
  • -d sedes: nombre de la base de datos