Servicio de PostGIS Es un sistema de código abierta (open source) de Sistema de Información Geográfico (geographic information system), que proporciona soporte para el manejo de datos geográficos en la base de datos relacional de PostgreSQL. PostGIS PostGIS implem implement enta a las características características esenciales esenciales (sim (simpl ple e feat feature ures) s) para para la especificación SQL del Open Geospatial Consortium. PostGIS habilita a PostgreSQL para el manejo de datos espaciales, permitiéndole se usado como un respaldo de base de datos espacial para los Sistemas de Información Geográfica (GIS por sus siglas en inglés), casi como la extensión Espacial de Oracle. PostGIS implementa las siguientes características: •
•
•
•
• •
Tipos de datos geométricos para points, linestrings, polygons, multipoints, multilinestrings, multipolygons y geometrycollections. Predicados espaciales para determinar las interacciones de geometrías utilizando matriz 3x3 Egenhofer. Operadores espaciales para determinar las medidas geoespaciales como el área, distancia, longitud y perímetro. Oper Operad adore oress espac espacia iales les para para dete determ rmin inar ar el conj conjun unto to de opera operaci cion ones es geoespaciales, como la unión, diferencia, diferencia simétrica y buffer. Índices espaciales de árboles R para rápidas consultas espaciales. Soporte para índices selectivos, para proporcionar alto desempeño en la plan planea eaci ción ón de cons consul ulta tass para para cons consul ulta tass mezc mezcla lada dass espa espaci cial ales es/n /no o espaciales.
La implementación esta basada en geometrías e índices “ligeros” optimizados para reducir el uso de disco y memoria. Utilizando geometrías ligeras ayuda al servidor a incrementar la cantidad de datos migrados desde el almacenamiento físico en el disco hacia la RAM, mejorando el desempeño de las consultas sustancialmente. La primera versión fue lanzada en 2001 por Refractions Research bajo bajo la Licencia Publica General GNU y el desarrollo ha continuado desde entonces activ activam amen ente te.. En 2006 2006 Post PostGI GIS S fue fue cert certifific icado ado como como comp compat atib ible le con con Simp Simple le Features para bases de datos SQL por el Open Geospatial Consortium.
2. Instalación 2.1 Requerimientos Inst Instal alaci ación ón comp comple leta ta de Post Postgre greSQ SQL L (incl (incluy uyen endo do cabe cabecer ceras as del del servi servido dor). r). PostgreSQL esta disponible en http://www.postgreslq.org http://www.postgreslq.org,, Se requiere la versión 7.2 o superior. Compilador GNU de C (gcc). Se pueden utilizar otros compiladores ANSI C pero se han encontrado menos problemas compilando con gcc. La herramienta GNU Make (gmake o make). Para muchos sistemas, GNU make ya viene incluida por defecto. Para verificar la versión de make, ejecute make –v. Se recomienda la librería Proj4 reprojection, es utilizada para proporcionar soporte para para el repro repronós nóstitico co de coor coorden denad adas as en Post PostGI GIS. S. Esta Esta dispo disponib nible le para para su descarga en http://www.remotesensing.org/proj http://www.remotesensing.org/proj.. Se recomienda la librería geométrica GEOS, utilizada para proporcionar pruebas geom geomét étri ricas cas (Touc (Touches hes(), (), Cont Contain ains() s(),, Inte Interse rsect cts() s())) y opera operaci cione oness (Buf (Buffe fer() r(),, GeomUnion(), Difference()) con PostGIS. Esta disponible para su descarga en http://geos.refractions.net.. http://geos.refractions.net
2.2 PostGIS PostGIS puede ser construido en PostgreSQL 7.2 o superior. Versiones anteriores de PostgreSQL no están soportadas. 1. Ante Antess de poder poder compi compila larr los módul módulos os de servido servidorr Post PostGI GIS, S, se debe debe de compilar e instalar el paquete de PostgreSQL. 2. Obtener el archivo con el código fuente de PostGIS de http://postgis.refractions.net/download/postgis-1.1.6.tar.gz.. Desemp http://postgis.refractions.net/download/postgis-1.1.6.tar.gz Desempaqu aqueta etar r el archivo. $ tar –zxvf postgis-1.1.6.tar.gz
3. Entrar en el director directorio io de postgis-1 postgis-1.1.6 .1.6 y ejecutar ejecutar lo siguient siguiente: e: $ ./configure •
Si se desea el soporte para repronostico de coordenadas, se debe tener la librería Proj4 instalada. Si el programa no encuentra nada, intentar usar el parámetro --with-proj=PATH cambiando al directorio especifico de instalación.
•
Si se desea el soporte para utilizar la funcionalidad de GEOS, se debe debe de tene tenerr la libr librer ería ía GEOS GEOS inst instal alad ada. a. Si el prog progra rama ma no
encuentra nada, intentar usar el parámetro –with-geos=PATH para especificar la ruta completa al programa de configuración geos. 4. Ejecutar Ejecutar la compilació compilación n e instalación instalación,, con usuario usuario privilegia privilegiado: do: # make # make install
Todo Todoss los los archiv archivos os son son inst instal alad ados os util utiliz izand ando o la info inform rmac ació ión n proporcionada por el pg_config . •
Las librerías son instaladas en [pkglibdir]/lib/contrib
•
Archivos importantes de soporte como el lwpostgis.sql son instalados en [prefix]/share/contrib.
•
Los binarios de loader y dumper están instalados en [bindir]/.
5. PostGIS requiere como extensión el lenguaje de procedimientos PL/pgSQL. Ante Antess de carga cargarr el archi archivo vo l wpos debe prime primero ro habil habilititar ar el wpos tgis.sql tgis.sql, se debe PL/pgSQL. Se debe de utilizar el comando createlang . $ createdb [basededatos] $ createlang plpgsql [basededatos]
6. Ahora se deben de cargar los los objetos y la definición de funciones dentro de la base de datos mediante la carga del archivo lwpostgis.sql. $ psql -d [basededatos] -f lwpostgis.sql
En este punto las extensiones para el servidor de PostgreSQL están cargadas y listas para utilizarse.
7. Para Para un conjunt conjunto o comple completo to de identi identific ficador adores es defini definidos dos del sistem sistema a de coor coorde dena nada dass EPSG EPSG,, se puede uede adic adicio iona nalm lmen ente te carg cargar ar el arc archiv hivo spatial_ref_sys.sql para rellenar la tabla SPATIAL_REF_SYS. # psql -d [basededatos] -f spatial_ref_sys.sql
Nota: Los archivos lwpostgis.sql y spatial_ref_sys.sql se encuentran ubicandos en la ruta /usr/share/pgsql/postgresql/contrib a menos que se haya cambiado el prefix en la instalación.
2.3 JDBC Las extensiones JDBC proporcionan objetos Java correspondientes a los tipos internos de PostGIS. Estos objetos pueden ser usado para escribir clientes Java los cuales requieren consultar las base de datos PostGIS y dibujar o hacer hac er cálculos en el GIS. 1. Entrar en el subdirec subdirectorio torio jdbc jdbc de la distribuci distribución ón PostGIS. PostGIS. 2. Editar Editar el Makefile Makefile para proporci proporcionar onar las rutas rutas correctas correctas al compila compilador dor de java (JAVAC) y el intérprete (JAVA).
3. Ejecutar el comando make. Copiar el archivo postgis.jar a cualquier lugar donde se coloquen las librerías de java.
3. Generación de Índices Los índices son utilizados en una base de datos espacial, para hacer posible el manejo de grandes conjuntos de datos. Sin el manejo de índices, cualquier búsqueda requerirá de un “escaneo secuencial” de cada registro en la base de datos. Utilizando índices se aumenta la velocidad de búsqueda organizando los datos en una búsqueda en árbol el cual puede ser rápidamente atravesado para encontrar un registro en particular. PostgreSQL soporta tres tipos de Índices por defecto: índice en árboles B, índices en árboles R e índices GiST.
Los árboles B son utilizados cuando pueden almacenar los datos en un solo eje; por ejemplo, ejemplo, números, números, letras, letras, fechas. Los datos datos GIS no pueden ser racionales, ordenados a lo largo de un eje (¿cuál es mayor, (0,0) o (0,1) o (1,0)?) por lo tanto el índice en árboles B no es útil para el manejo adecuado. Los árboles R rompen los datos en rectángulos y sub-rectángulos y en subsub rectángulos, etc. Los índices en árboles R son utilizados por algunas base ases de dat datos espaci aciales para inde ndexar los dat datos GIS, pero la implementación de PostgreSQL PostgreSQL no es tan robusta como la implementación GiST. Los índices GiST (Generalized Search Trees) rompen los datos en “cosas de un lado”, “cosas que se sobreponen”, “cosas que están adentro” y pueden ser utilizados en un gran rango de tipos de datos, incluyendo datos GIS. PostGIS utiliza un índice de árboles R implementado sobre un índice GiST para indexar los datos GIS.
3.1 Índices GiST GiST son las siglas en ingles de “Generalized Search Tree” y es una forma genérica de indexar. Es utilizado para aumentar la velocidad de búsqueda en todo todoss los los tipos tipos de estruc estructu tura ra de dato datoss irre irregu gular lares es (arre (arregl glos os entero enteros, s, dato datoss espaciales, etc) que no son posibles de ordenar con un índice de árbol B. Una vez que una tabla de datos GIS excede algunos cientos de registros, sera posible pensar en mejorar las búsquedas de datos espaciales creando un índice.
La sintaxis para construir un índice GiST en una columna de geometría es: CREATE INDEX [indexname] ON [tablename] USING GIST ( [geometryfield] GIST_GEOMETRY_OPS GIST_GEOMETRY_OPS );
Construir un índice espacial es un ejercicio computacional intenso: en tablas con cerca de un millon de registros, en un equipo Solaris a 300MHz, se ha obtenido que al contruir contruir un índice índice GiST GiST toma toma aproximad aproximadame amente nte una hora. Despúes Despúes de construir construir un índice, índice, es importante importante forzar a PostgreSQL a que recalcule recalcule la tabla de estadisticas interna, que es utilizada para optimizar el planeador de consultas: VACUUM ANALYZE [table_name] [column_name]; -This is only needed for PostgreSQL 7.4 installations and below SELECT UPDATE_GEOMETRY_STATS([table_name], [column_name]);
Los Los índi índice cess GiST GiST tien tienen en dos dos vent ventaj ajas as sobr sobre e los los índi índice cess de árbo árbole less R en PostgreSQL. Primero los índices GiST pueden ser utilizados como “null safe”, significa que pueden indexar columnas que incluyen valores nulos. Segundo, los índice índicess GiST soporta soportan n el concepto concepto de “lossines “lossiness” s” el cual es muy important importante e cuando se manejan grandes objetos GIS que el tamaño de página de PostgreSQL. Lossiness permite a PostgreSQL almacenar solo la parte “importante” de un objeto en el índice – en el caso de los objetos GIS, solo la caja envolvente.
3.2 Utilización de índices Ordi Ordina nari riam amen ente te,, los los índi índice cess aume aument ntan an la velo veloci cida dad d de acce acceso so de form forma a transparente: una vez que el índice es construido, el planeador de consultas transparentemente decide cuando utilizar la información del índice para agilizar el plan de consulta. Desafortunadamente, el planeador de consultas de PostgreSQL no optimiza el uso de índices GiST tan bien, entonces algunas ocasiones las búsqu búsqued edas as que deben deben de util utiliz izar ar el índi índice ce espac espacia iall real realiz izan an una una búsqu búsqueda eda secuencial en toda la tabla. Si parece que los índices espaciales no están siendo utilizados, hay algunas cosas que se pueden realizar: Asegurarse Asegurarse que las estadísticas estadísticas están siendo acumuladas con el número y distribución de valores en una tabla, para poder proporcionar al planeador de consultas mejor información para hacer decisiones sobre el uso de índices. índices. Para PostgreSQL PostgreSQL 8.0 ejecutando ejecutando VACUUM ANALYZE realizará el calcul calculo o de la distri distribuc bución ión y numero numero de valores valores.. Se debe debe regular regularmen mente te ejecut ejecutar ar e vacuum en todas todas las bases bases de datos de cualqui cualquier er forma forma -Algunos administradores de bases de datos tienen ejecutando el VACUUM
como un trabajo de cron fuera del horario de trabajo.
Si realizar el vacuum no funciona, funciona, se puede forzar al planeador a utilizar utilizar la información del índice utilizando SET ENABLE_SEQSCAN=OFF. Solo se debe utilizar este comando a discreción y solo en consultas espaciales indexadas: hablando generalmente, el planeador sabe mejor cuando utilizar un índice normal de árbol B. Una vez que se ha ejecutado la consulta, debe considerarse regresar el valor de ENABLE_SEQSCAN, de esta forma las consultas utilizarán el planeador de forma normal.
Si se encu encuen entr tra a que que el plan planea eado dorr se equi equivo voca ca acer acerca ca del del cost costo o de búsquedas secuenciales contra indexadas, se debe intentar reducir el valor para para rand random om_pa _page ge_co _cost st en el archi archivo vo postg postgre resql sql.c .conf onf o usan usando do SET SET random_page_cost=#. Por defecto el valor del parámetro es 4, tratar de ponerlo ponerlo en 1 o 2. Decrementando Decrementando el valor hace que el planeador se incline más a utilizar las búsquedas indexadas.
3.3 Buscando ventajas de los índices Utilizar PostGIS efectivamente requiere conocer que funciones espaciales están disp dispon onib ible less y aseg asegur urar ar que que los los índi índice cess apro apropi piad ados os esté estén n colo coloca cado doss para para proporcionar un buen desempeño. Cuando construimos una consulta es importante recordar que solo las operaciones basadas en la caja envolvente envolvente como son && pueden tomar ventaja ventaja de los índices espac espacia iale less GiST GiST.. Funci Funcione oness como como dist distan ance( ce()) no puede pueden n usar usar el índic índice e para para optimizar sus operaciones. Por ejemplo la siguiente consulta puede ser algo lenta en una tabla muy grande: SELECT the_geom FROM geom_table WHERE distance( the_geom, GeomFromText( 'POINT(100000 200000)', -1 ) ) < 100
Esta consulta esta seleccionado todas las geometrías en la tabla geom la cual esta a 100 unidades del punto (100000, 200,000). Esta sera lenta debido a que se esta calculando la distancia de cada punto en la tabla con el especificado, es decir un calcu calculo lo de dist distan anci cia a por por cada cada regis registr tro o en la tabl tabla. a. Se puede puede evit evitar ar esto esto util utiliz izan ando do el oper operad ador or && para para reduc reducir ir el nume numero ro de calc calcul ulo o de dist distan anci cias as requeridos: SELECT the_geom FROM geom_table WHERE the_geom && 'BOX3D(90900 190900, 100100 200100)'::box3d AND distance(the_geom, GeomFromText('POINT(100000 GeomFromText('POINT(100000 200000)', -1) - 1) ) < 100
La consulta selecciona las misma geometrías, pero esto lo hace en una forma más eficiente. Asumiendo que existe un índice GiST en la tabla geom, el planeador de consultas reconocerá que usando el índice reducirá el numero de registros antes de calcular el resultado de la función de distancia. Observar que la geometría BOX3D que es utilizada en la operación && es un rectángulo unitario de 200 unidades centrado en el punto original - este es una "caja de consulta". El operador && utiliza el índice para rápidamente reducir el conjunto de resultados a solo aquellas geometrías que tienen cajas envolventes que traslapen la "caja de consulta". Asumiendo que la caja de consulta es mucho menor en gran medida que las geometrías de la tabla, se reducirá el número de distancias calculadas necesarias para realizarlo drásticamente.
4. Configuración del servidor para SIBA 4.1 Instalación en Centos 5.1 (Fedora Core) Intslación de: PostgreSQL (postgresql-8.1.11-1.el5_1.1) PostGIS ( LIB Proj4 (proj.x86_64, 4.5.0-1.el5.rf) LIB Geos (geos.x86_64, 3.0.0-1.el5.rf)
4.2 Instalación en Red Hat Linux (Fedora Core) Instalación de: PostgreSQL (postgresql.i386, 8.1.6-1.fc6), PostGIS (postgis.i386, 1.2.0-4.fc6), LIB Proj4 (proj.i386, 4.5.0-1.fc6), LIB Geos (geos.i386, 2.2.3-1.fc6)
4.3 Instalación mediante YUM El gestor de paquetes buscara las dependencias necesarias para la instalación completa. $ yum install geos $ yum install proj $ yum install postgresql postgresql-server \ postgresql-contrib postgresql-docs postgresql-libs $ yum install postgis
Nota: En Centos es necesario agregar en el repositorio RPMForge.net, ya que la distribución no proporciona estos paquete (rpmforge-release-0.3.6-1.el5.rf.x86_64.rpm). (rpmforge-release-0.3.6-1.el5.rf.x86_64.rpm).
4.4 Configuración del sistema Cambiando el directorio donde se almacenan las bases de datos, con el propósito de utilizar un espacio mayor en el almacenamiento secundario y tener seguridad de los datos mediante el uso de RAID 5 en los discos. 1. Modifi Modificar car el archivo archivo /etc/pa /etc/passw sswd d y cambiar cambiar el home del usuario usuario postgres postgres al directorio en la partición de la unidad de almacenamiento secundaria. postgres:x:UID:GID::/media/s postgres:x:UID:GID::/media/sdata/pgsql:/bin/bash data/pgsql:/bin/bash
2. Copiar Copiar los archivo archivo originales originales instalad instalados os por el paquete paquete postgresq postgresql.l. cp -prf /var/lib/pgsql /media/sdata/
3. Modifi Modificar car el script script de inicia inicializ lizaci ación ón de postgre postgress en /etc/i /etc/init nit.d/ .d/post postgres gresql, ql, localizar la variable PGDATA y PG_LOG, hacer los ajustes necesarios. PGDATA=/var/lib/pgsql PGDATA=/var/lib/pgsql ->PGDATA=/media/sdata/pgsql ->PGDATA=/media/sdata/pgsql PGLOG=/var/lib/pgsql/pgstartu PGLOG=/var/lib/pgsql/pgstartup.log p.log ->PGLOG=$PGDATA/pgs ->PGLOG=$PGDATA/pgstartup.log tartup.log #Modificado para usar el arreglo RAID 5 # en almacenamiento secundario. PGDATA=/media/sdata/pgsql PGLOG=$PGDATA/pgstartup.log if [ -f "$PGDATA/PG_VERSION" ]&&[ -d "$PGDATA/base/template1" ] then echo "Using old-style directory structure" else PGDATA=$PGDATA/data fi
4. Modificar Modificar el archivo archivo pg_hba.co pg_hba.conf nf en el directori directorio o data para garanti garantizar zar el acceso de los usuario y aplicaciones. Permite el acceso desde diferentes redes mediante contraseña en MD5, para conexiones locales se requiere que exista el usuario en el sistema. vi data/pg_hba.conf host
all
all
127.0.0.1/32
ident sameuser
host
all
all
192.168.0.0/16
md5
host
all
all
132.248.0.0/16
md5
5. Para garantiza garantizarr el acceso desde desde otros otros equipos, equipos, se debe debe de iniciar iniciar el servicio servicio de postgres en modo de escucha de peticiones en la interfaz correspondiente, en este caso interesan las peticiones que se hagan en
localhost y en la dirección ip, para seleccionar cualquier interfaz basta con usar un *. vi data/postgresql.conf listen_addresses = '*' port = 5432
6. Garantizar Garantizar las polític políticas as de acceso acceso de seguridad seguridad de firewal firewalll interno, interno, mediante el uso de iptables: iptables -A RH-Firewall-1-INPUT RH-Firewall-1-INPUT -p tcp -m state \ --state NEW -m tcp --dport 5432 -j ACCEPT
7. Acceder Acceder a la base de datos datos con un usuario usuario y el cliente cliente psql a una base de de datos configurada: psql -U postgres -h [direccionip] [database] Contraseña para usuario postgres:
5. Referencias PostGIS Manual versión 1.2.0. http://postgis.refractions.net/docs/. PostGIS on Wikipedia. http://en.wikipedia.org/wiki/PostGIS.