You are here:GeoTux»Geo-Blogs»Bases de datos geográficos»Cargar shapefiles a Postgis por medio de scripts en Bash para GNU/Linux

Estadísticas

Invitados: 47
Usuarios registrados: 3132
Usuarios en línea:
-
Registrados hoy:
-

Registro

Redifusión (RSS)

Blogs y Noticias:
Recibe las actualizaciones en Geo-Noticias y Geo-Blogs

Recibir por e-mail
Recibir Geo-Noticias y Geo-Blogs por e-mail

¿Qué es esto?

Jueves 14 de Agosto de 2008 11:49

Cargar shapefiles a Postgis por medio de scripts en Bash para GNU/Linux

Written by  German Carrillo
Rate this item
(0 votes)

Algunas veces queremos disponer nuestra información espacial en bases de datos, dependiendo de la cantidad, puede resultar siendo un proceso tedioso. Con la ayuda de scripts en Bash podemos cargar rápidamente los Shapefiles de un directorio a una base de datos de PostgreSQL/Postgis en un entorno GNU/Linux.

 

¿Qué es Bash?

 

El bash es el intérprete de comandos del proyecto GNU. Los scripts en bash tienen las extensiones .sh o .bash y si dispones de un ambiente GNU/Linux puedes ejecutarlos desde una terminal de comandos siempre y cuando tengas permiso para ello.

 

Para ejecutar un script en bash llamado primero.sh que está en la carpeta /home/geotux/ escribimos en una consola:

$/home/geotux/primero.sh

 

o vamos a la carpeta en la que se encuentra a través del comando cd /home/geotux/ y luego ejecutamos:

$./primero.sh

 

Necesitamos permisos de lectura y ejecución para ello.

 

 

Scripts en Bash

 

Después de buscar en la red sin mucho éxito (por ejemplo en osdir y geoserver), elaboré tres scripts que nos pueden ser útiles en algún momento:

 

1. Cambiar extensiones de archivos Shapefiles de mayúsculas a minúsculas (.SHP a .shp):

Algunas veces nos encontramos con archivos Shapefile que tienen extensiones en mayúsculas, tal vez no sea un error, pero mejor pensemos en cambiarlas. ¿Para qué? Para poder usar los scripts 2 y 3 por ejemplo :)

El script para pasar de "SHP" a "shp" no solamente debe cambiar la extensión SHP sino todas las asociadas al archivo principal, es decir, las requeridas:

  • SHP: Entidades geométricas.
  • SHX: Índice de la geometría.
  • DBF: Atributos.

 

y las opcionales:

  • SBN y SBX: Índice espacial.
  • FBN y FBX: Índice espacial para Shapefiles de solo lectura.
  • AIN y AIH: Índice de atributos.
  • PRJ: Sistema de referencia.
  • SHP.XML: Metadatos.

 

SCRIPT (Puedes descargarlo aquí):

#!/bin/bash
# Script para cambiar las extensiones de un Shapefile
#     de mayúsculas a minúsculas
# 20080811
#
# Germán Carrillo ( Esta dirección electrónica esta protegida contra spambots. Es necesario activar Javascript para visualizarla )
#    GeoTux       (http://geotux.tuxfamily.org)
#
#
Shapefiles=($(find -name "*.SHP"));numShapefiles=${#Shapefiles[*]}   
if [ $numShapefiles = 0 ]; then
echo "No hay Shapefiles con extensión en mayúsculas en el directorio "`pwd`        else       
for file in $( find -name "*.SHP" )
do
filename=`basename $file`;filename=${filename%SHP}
mv ${filename}SHP ${filename}shp               
if [ -e ${filename}SHX ]; then
mv ${filename}SHX ${filename}shx
fi
if [ -e ${filename}DBF ]; then
mv ${filename}DBF ${filename}dbf           
fi           
if [ -e ${filename}SBN ]; then
mv ${filename}SBN ${filename}sbn
fi   
if [ -e ${filename}SBX ]; then
mv ${filename}SBX ${filename}sbx
fi   
if [ -e ${filename}FBN ]; then
mv ${filename}FBN ${filename}fbn
fi   
if [ -e ${filename}FBX ]; then
mv ${filename}FBX ${filename}fbx
fi   
if [ -e ${filename}AIN ]; then
mv ${filename}AIN ${filename}ain
fi   
if [ -e ${filename}AIH ]; then
mv ${filename}AIH ${filename}aih
fi   
if [ -e ${filename}PRJ ]; then
mv ${filename}PRJ ${filename}prj           
fi   
if [ -e ${filename}SHP.XML ]; then
mv ${filename}SHP.XML ${filename}shp.xml           
fi               
done   
echo "Se han cambiado las extensiones de los Shapefiles encontrados!"
fi   
exit 0
#Fin del script

 

 

2. Cargar todos los archivos Shapefile de un directorio a una base de datos de PostgreSQL/Postgis empleando la herramienta shp2pgsql:

Con este script puedes llevar todos los Shapefiles que tengas en una carpeta a una base de datos geográficos utilizando el comando shp2pgsql de Postgis.

 

Para poder emplearlo debes tener una base de datos creada y tener permisos para crear tablas y para crear registros en la tabla Geometry_Columns, en palabras cortas, casi que debes ser el propietario de la base de datos.

 

En la línea 11 del script puedes ajustar los parámetros que hacen referencia a la base de datos.

 

El script y los Shapefiles deben estar en el mismo directorio y tú debes situarte allí para poder ejecutarlo.

 

El script valida si existen archivos Shapefile en el directorio donde estás ubicado en la consola, si los hay ejecuta el comando shp2pgsql con las siguientes opciones:

-s 4326: Sistema de referencia definido por el código EPSG 4326.
-d: Sobreescribir la tabla en la base de datos si existe.
-g the_geom: Nombre del campo que almacena la geometría.
-D: Usar el formato dump de PostgreSQL para insertar los registros.
-i: Usar Int4 para los campos enteros del dbf.
-I: Crear índice GiST para la geometría.
-S: Crear geometrías simples en lugar de múltiples.
-N skip: Saltar los registros con geometrías nulas.

 

El resultado completo de la ejecución del script se almacena en el archivo log.txt, es recomendable leerlo para conocer cualquier eventualidad que se haya presentado. En la consola se muestra un resumen de los archivos procesados.

 

SCRIPT (Puedes descargarlo aquí):

#!/bin/bash
# Copiar los shapefiles de un directorio a Postgis empleando shp2pgsql
# 20080811
#
# Germán Carrillo ( Esta dirección electrónica esta protegida contra spambots. Es necesario activar Javascript para visualizarla )
#    GeoTux       (http://geotux.tuxfamily.org)
#
#
echo;echo "Iniciando el cargue...";echo
rm -f log.txt   
bd="nombrebd";U="usuario";esquema="public" #Parámetros
Shapefiles=($(find -name "*.shp"));numShapefiles=${#Shapefiles[*]}   
if [ $numShapefiles = 0 ]; then
echo "No hay shapefiles en el directorio "`pwd`       
else           
for file in $( find -name "*.shp" )
do           
filename=`basename $file`;fullname=`pwd`/$filename                       
echo;echo "Nombre: $filename"
shp2pgsql -s 4326 -d -g the_geom -D -i -I -S -N skip $fullname $esquema.${filename%.shp} | psql -d $bd -U $U >> log.txt 2>&1
done       
echo;echo "Terminando el cargue..."
echo "Más información del proceso en el archivo log.txt";echo
fi
exit 0
#Fin del script

 

 

3. Cargar todos los archivos Shapefile de un directorio a una base de datos de PostgreSQL/Postgis empleando la herramienta ogr2ogr:

Con este script puedes llevar todos los Shapefiles que tengas en una carpeta a una base de datos geográficos utilizando la herramienta ogr2ogr de la librería GDAL/OGR.

 

Para poder emplearlo debes tener una base de datos creada y tener permisos para crear tablas y para crear registros en la tabla Geometry_Columns, en palabras cortas, casi que debes ser el propietario de la base de datos.

 

En la línea 11 del script puedes ajustar los parámetros que hacen referencia a la base de datos.

 

El script y los Shapefiles deben estar en el mismo directorio y tú debes situarte allí para poder ejecutarlo.

 

El script valida si existen archivos Shapefile en el directorio donde estás ubicado en la consola, si los hay ejecuta el comando ogr2ogr con la opción:

-overwrite: Sobreescribir la tabla en la base de datos si existe.

 

El script almacena información del cargue en el archivo log.txt, es recomendable leerlo para conocer cualquier eventualidad que se haya presentado. Si el cargue ha sido satisfactorio el archivo queda vacío.

 

SCRIPT (Puedes descargarlo aquí):

#!/bin/bash
# Copiar los shapefiles de un directorio a Postgis empleando ogr2ogr
# 20080814
#
# Germán Carrillo ( Esta dirección electrónica esta protegida contra spambots. Es necesario activar Javascript para visualizarla )
#    GeoTux       (http://geotux.tuxfamily.org)
#
#
echo;echo "Iniciando el cargue...";echo
rm -f log.txt   
bd="nombrebd";U="usuario"; #Parámetros
Shapefiles=($(find -name "*.shp"));numShapefiles=${#Shapefiles[*]}   
if [ $numShapefiles = 0 ]; then
echo "No hay shapefiles en el directorio "`pwd`       
else       
for file in $( find -name "*.shp" )
do
filename=`basename $file`;fullname=`pwd`/$filename   
echo;echo "Nombre: $filename"                   
ogr2ogr -f PostgreSQL PG:"host=localhost dbname=$bd user=$U port=5432" -overwrite $fullname >> log.txt 2>&1
done
echo;echo "Terminando el cargue..."
echo "Más información del proceso en el archivo log.txt";echo
fi
exit 0
#Fin del script

 

 

Sin duda bash puede ser de gran utilidad para automatizar tareas en GNU/Linux.

No dudes en comentarme cualquier sugerencia o inquietud.

 


Referencias:

 

 

 

 

Last modified on Jueves 29 de Septiembre de 2011 03:04

Comentarios  

 
0 # error de sintáxisgilbeRt_fox 18-12-2009 13:15
tengo le siguiente error luego de correr cualquiera de los scripts:

bash_shp2pgsql.sh: 12: Syntax error: "(" unexpected

o

bash_ogr2ogr.sh: 12: Syntax error: "(" unexpected
Responder | Responder con una citación | Citar
 
 
0 # error de sintáxistuxman 21-12-2009 17:57
Hola gilbeRt_fox, intenta ejecutar el comando de la siguiente forma:

$bash ./script.sh

Saludos.
Responder | Responder con una citación | Citar
 

Escribir un comentario


Código de seguridad
Refescar

 

¿Dónde nos leen?