22
1 Manual de Uso de PostGIS Elaborado por: Raúl Acevedo 2017

Manual de Uso de PostGIS - CIIFEN

  • Upload
    others

  • View
    13

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Manual de Uso de PostGIS - CIIFEN

1

Manual de Uso de PostGIS

Elaborado por:

Raúl Acevedo 2017

Page 2: Manual de Uso de PostGIS - CIIFEN

2

Ejercicio 1

Carga de Datos

1. Abra el programa pgAdmin3.

Inicio -> Programas -> PostgreSQL 9.4 -> pgAdmin III

Ingrese la contraseña definida en la instalación para el superusuario (generalmente

es postgres). En este punto, la interfaz debe lucir así:

2.- Cree el rol que administrará la base de datos:

Defina los siguientes parámetros:

Page 3: Manual de Uso de PostGIS - CIIFEN

3

Nombre usuario

Contraseña usuario

Privilegios Hereda de roles superiores. Puede crear objetos de bases de datos.

3.- Crear una base de datos geográfica con el nombre TALLER con el rol usuario utilizando pgAdmin: a.- Base de datos

Page 4: Manual de Uso de PostGIS - CIIFEN

4

b.- Extensiones Geográficas: Postgis y Postgis_Topology

Page 5: Manual de Uso de PostGIS - CIIFEN

5

4.- Cree su primera tabla. En la ventana de consultas SQL ejecute:

CREATE TABLE tabla_puntos ( gid

serial PRIMARY KEY, altura

int4);

ALTER TABLE tabla_puntos OWNER TO usuario;

La tabla creada no posee geometría, usted debe agregar el campo que almacenará la geometría utilizando la función de PostGis AddGeometryColumn. Esta función requiere, entre otros parámetros, el código EPSG del Sistema de Referencia espacial de los datos. Si no lo conoce, puede buscar en el sitio web http://spatialreference.org, el cual tiene una referencia completa de los diferentes códigos.

Por ejemplo, busque 'Ecuador' en el sitio web para encontrar el código EPSG del Sistema de Referencia correspondiente.

Para el ejercicio, se empleará el código 4326 que corresponde al Sistema de Referencia WGS84, compatible con SIRGAS. Ejecute la instrucción:

SELECT

AddGeometryColumn('tabla_puntos','geom',4326,'POINT',2);

Los argumentos de AddGeometryColumn son:

○ Nombre de la tabla ○ Nombre del campo con geometría

○ Sistema de Referencia (Código EPSG) (-1: Desconocido) ○ Geometría: [Multi]Point, [Multi]Linestring, [Multi]Polygon (entre otras)

○ Dimensión

Con esto tenemos una Base de Datos Geográficos con una tabla que puede almacenar geometría.

Nota: Revise la tabla geometry_columns

5.- Agregue algunos datos espaciales a la tabla creada.

INSERT INTO tabla_puntos (geom,altura) VALUES

(ST_GeomFromText('POINT(-74.0677 4.7228)',4326),325);

INSERT INTO tabla_puntos (geom,altura) VALUES

(ST_GeomFromText('POINT(-74.0704 4.6623)',4326),416);

INSERT INTO tabla_puntos (geom,altura) VALUES

(ST_GeomFromText('POINT(-74.1164 4.7096)',4326),152);

Page 6: Manual de Uso de PostGIS - CIIFEN

6

6. Las consultas sobre tablas con muchos registros suelen generar problemas de desempeño en Bases de Datos Espaciales. Para mejorar la velocidad de respuesta se emplean índices espaciales. Defina un índice espacial sobre el campo de la geometría (geom) para incrementar el rendimiento de las consultas en la Base de Datos Espacial:

CREATE INDEX gist_index_puntos ON tabla_puntos

USING GIST (geom);

La opción GIST le ordena al servidor el uso del índice GIST (Generalized Search Tree) . El índice GIST está diseñado para optimizar el tiempo de búsqueda sobre datos espaciales.

7.Realice la siguiente consulta sobre la tabla tabla_puntos:

SELECT * FROM tabla_puntos;

Observe los valores del campo geom, son datos binarios. Obtenga una descripción más apropiada de la geometría con la siguiente consulta, que emplea la función de PostGIS AsText (la función AsText retorna la geometría en el formato WKG Well Known Geometry):

SELECT gid, st_AsText(geom) FROM tabla_puntos;

8. Realice la siguiente consulta empleando la función de PostGIS

“Distance”. (La function Distance de PostGIS devuelve la distancia más pequeña que existe entre dos geometrías):

SELECT p1.gid AS punto1, p2.gid AS punto2,

st_DISTANCE(p1.geom, p2.geom) FROM tabla_puntos p1,

tabla_puntos p2;

Note que si agrega una claúsula WHERE a la consulta podrá obtener la distancia entre cada par de puntos de la tabla (sin repetir parejas y sin tener en cuenta las distancias de un punto consigo mismo). Agregue WHERE p1.gid < p2.gid justo antes del punto y coma de la consulta y observe el resultado.

Page 7: Manual de Uso de PostGIS - CIIFEN

7

9. Como puede observar, la distancia obtenida está en grados, ejecute la siguiente consulta para obtener una distancia en unidades lineales (metros):

SELECT p1.gid AS punto1, p2.gid AS punto2,

st_DISTANCE(st_transform(p1.geom,3116),

st_transform(p2.geom,3116)) FROM tabla_puntos p1,

tabla_puntos p2;

Observe que es necesario proyectar los puntos al Sistema de Referencia 3116 antes de calcular la distancia en metros.

10. Para organizar la información en una BD, PostgreSQL emplea el concepto de Esquema (Schema). Los esquemas actúan como contenedores de información, son análogos a los directorios (carpetas) de un sistema operativo excepto por el hecho de que los esquemas no pueden estar dentro de otros esquemas, los directorios de un sistema operativo si pueden hacerlo.

Cree un nuevo esquema llamado:

limites_administrativos_y_entidades_territoriales: para albergar sus datos de

provincias, cantones y parroquias

Nota: Defina como propietario de los esquemas al usuario 'usuario':

Page 8: Manual de Uso de PostGIS - CIIFEN

8

Cree otros dos esquemas llamados: riesgos: eventos o siniestros de gestión de riesgo superficies_de_agua: datos de hidrografía. social, productivo, riesgos, osm.

11. Debido al cargue masivo de datos, la Base de Datos Espaciales requiere actualizar sus estadísticas internas, utilizadas para consultas. Para ello, abra la ventana de mantenimiento de la base de datos, así:

Elija las opciones por defecto (VACUUM, ANALYZE).

Page 9: Manual de Uso de PostGIS - CIIFEN

9

12.- Cargue de formato shp a la base de datos Taller las siguientes capas:

a.- Importación ESRI shapes mediante shp2pgsql

El cargador shp2pgsql convierte archivos ESRI Shape en SQL preparado para la inserción en

la base de datos. Se utiliza desde la linea de comandos, aunque existe una versión con interfaz

gráfica para el sistema operativo Windows. Se puede acceder a la ayuda de la herramienta

mediante:

$ shp2pgsql -?

Para el uso de la herramienta:

$ shp2pgsql [<opciones>] <ruta_shapefile> [<esquema>.]<tabla>

b.- Exportación desde PostGIS a archivos de tipo ESRI

Shapefile

Para este proceso utilizaremos la herramienta pgsql2shp. Con ella podremos convertir los

datos de nuestra base de datos en archivos ESRI Shape. Igual que para el caso anterior, la

herramienta se utilizará desde la linea de comandos:

$ pgsql2shp [<opciones>] <basedatos> [<esquema>.]<tabla> $

pgsql2shp [<opciones>] <basedatos> <consulta>

c.- Importación ESRI shapes mediante PgAdmin o QGIS

Page 10: Manual de Uso de PostGIS - CIIFEN

10

QGIS:

Page 11: Manual de Uso de PostGIS - CIIFEN

11

Page 12: Manual de Uso de PostGIS - CIIFEN

12

Page 13: Manual de Uso de PostGIS - CIIFEN

13

d.- GDAL/OGR

GDAL/OGR es una librería de lectura y escritura de formatos geoespaciales, tanto Raster con

GDAL como Vectorial con OGR. Se trata de una librería de software libre ampliamente

utilizada.

ogrinfo

ogrinfo obtiene información de los datos vectoriales. Podremos utilizar esta herramienta para

la obtención de esta información de las tablas que tenemos almacenadas en la base de datos. El

uso se realiza a través de la consola:

$ ogrinfo [<opciones>] <ruta fuente datos>

e.- ogr2ogr

OGR es capaz de convertir a PostGIS todos los formatos que maneja, y será capaz de exportar

desde PostGIS todos aquellos en los que tiene permitida la escritura. Ejecutando:

$ ogr2ogr --formats

f.- Cargar fichero CSV

Ahora, podemos elegir una de dos opciones:

Crear a mano una tabla con los campos necesarios y usar el comando COPY de PostgreSQL para copiar directamente el CSV.

Crear un fichero VRT a partir del CSV y cargar con ogr2ogr dicho fichero VRT

Para el primer caso, la tabla a crear es como sigue:

CREATE TABLE eventos_cantones ( Id integer NOT NULL, cod_cant

character, cod_mpio character, id_Event character, fecha

date,cantones character varying,

evento character,

varying,muertos integer,

heridos integer,

desaparecidos integer,

personas integer,

familias integer,

viv_destruidas integer,

viv_averiadas integer,

vias integer,

ptes_vehic integer,

Page 14: Manual de Uso de PostGIS - CIIFEN

14

ptes_peat integer,

acued integer,

alcant integer,

c_salud integer,

c_educat integer,

c_communi integer,

hectareas integer,

menajes integer,

ap_aliment integer,

tejas integer,

sacos integer,

otros_apoyo integer,

economy integer,

total integer,

apoyos_tramite integer

);

Y la línea a ejecutar desde psql o pgAdmin III:

# COPY incendios_modis24h FROM

'/path/to/csv/file/incendios_modis.csv' WITH DELIMITER ';' CSV

HEADER;

g.- Importación datos OSM a PostGIS

OpenStreetMap (también conocido como OSM) es un proyecto colaborativo para crear mapas libres y

editables.

Los mapas se crean utilizando información geográfica capturada con dispositivos GPS móviles,

ortofotografías y otras fuentes libres. Esta cartografía, tanto las imágenes creadas como los datos

vectoriales almacenados en su base de datos, se distribuye bajo licencia abierta Open Database Licence

(ODbL).

OSM dispone de un modelo de datos particular que no responde al modelo característico de los SIG. Este

está compuesto de:

Node Way Relation

a diferencia de las geometrías características como:

Punto Linea Poligono

Una característica particular es la ausencia de polígonos dentro del modelo, estos se realizan mediante la

asignación de una relación a una linea cerrada. Esta particularidad no impide que los datos de OSM

Page 15: Manual de Uso de PostGIS - CIIFEN

15

puedan ser adaptados al modelo de geometrías normal mediante cargadores de datos OSM. A

continuación se presentan dos de los más utilizados

osm2pgsql

Mediante el uso de este programa podremos incorporar en nuestra base de datos los datos obtenidos desde

OSM. Una vez que hemos realizado la importación, aparecerán en nuestra base de datos las tablas que

serán el resultado de esta importación:

planet_osm_point planet_osm_line planet_osm_polygon planet_osm_roads

Al disponer el modelo de OSM de cientos de etiquetas, la importación crea en las tablas un gran número

de campos de los que la mayoría tendrán valor NULL.

La ejecución se realiza desde la consola:

$ osm2pgsql [opciones] ruta_fichero.osm otro_fichero.osm $

osm2pgsql [opciones] ruta_planet.[gz, bz2]

Vamos a exportar datos de OpenStreetMap y cargarlos en PostGIS con osm2pgsql. Para ello, vamos

primero a http://www.openstreetmap.org/export#

Veremos que, si el área a exportar es muy grande, la página nos redireccionará a servicios de descarga

masiva, como http://download.geofabrik.de/south-america/ecuador.html.

Ejercicio 2 13.- Relaciones Espaciales:

Los principales métodos de la clase Geometry para chequear predicados espaciales entra la

geometría en cuestión y otra proporcionada como parámetro son:

Equals (A, B): Las geometrías son iguales desde un punto de vista topológico

Disjoint (A, B): No tienen ningún punto en común, las geometrías son disjuntas

Intersects (A, B):Tienen por lo menos un punto en común. Es el inverso de Disjoint

Touches (A, B): Las geometrías tendrán por lo menos un punto en común del contorno,

pero no puntos interiores

Crosses (A, B): Comparten parte, pero no todos los puntos interiores, y la dimensión de

la intersección es menor que la dimensión de al menos una de las geometrías

Page 16: Manual de Uso de PostGIS - CIIFEN

16

Contains (A, B): Ningún punto de B está en el exterior de A. Al menos un punto del

interior de B está en el interior de A

Within (A, B): Es el inverso de Contains. Within(B, A) = Contains (A, B)

Overlaps (A, B): Las geometrías comparten parte pero no todos los puntos y la

intersección tiene la misma dimensión que las geometrías.

Covers (A, B): Ningún punto de B está en el exterior de A. B está contenido en A.

CoveredBy (A, B): Es el inverso de Covers. CoveredBy(A, B) = Covers(B, A)

ST_Equals ST_Equals(geometry A, geometry B), comprueba que dos geometrías sean

espacialmente iguales.

ST_Equals devuelve TRUE si dos geometrías del mismo tipo tienen identicas coordenadas x,y.

Ejemplo

SELECT codigo, geom, ST_AsText(geom) FROM riesgos.puntos_terremoto_2016 WHERE = '10';

Si usamos el valor obtenido en geom y consultamos a la base de datos: SELECT codigo FROM riesgos.puntos_terremoto_2016 WHERE ST_Equals(geom, '0104000020CD7F0000010000000101000000613255302AF953C01B0DE02D90A001C0');

ST_Intersects, ST_Disjoint, ST_Crosses y ST_Overlaps

Comprueban la relación entre los interiores de las geometrías.

ST_Intersects ST_Intersects(geometry A, geometry B)

Devuelve TRUE si la intersección no es un resultado vacio.

ST_Disjoint ST_Disjoint(geometry A , geometry B)

Es el inverso de ST_Intersects. indica que dos geometrías no tienen ningún punto en común. Es menos

eficiente que ST_Intersects ya que esta no está indexada. Se recomienda comprobar NOT

ST_Intersects

ST_Crosses ST_Crosses(geometry A, geometry B)

Page 17: Manual de Uso de PostGIS - CIIFEN

17

Se cumple esta relación si el resultado de la intesección de dos geometrías es de dimensión menor que la

mayor de las dimensiones de las dos geometrías y además esta intersección está en el interior de ambas.

ST_Overlap ST_Overlaps(geometry A, geometry B)

Compara dos geometrías de la misma dimensión y devuelve TRUE si su intersección resulta una

geometría diferente de ambas pero de la misma dimensión

Ejemplo

SELECT id FROM superficies_de_agua.rios WHERE ST_Intersects(geom, (select geom from superficies_de_agua.rios where gid = 16)) AND gid != 16;

ST_Within y ST_Contains ST_Within(geometry A , geometry B)

es TRUE si la geometría A está completamente dentro de la geometría B. Es el inverso de ST_Contains

ST_Contains(geometry A, geometry B)

Devuelve TRUE si la geometría B está contenida completamente en la geometría A

Ejemplo

SELECT b.dpa_despar from limites_administrativos_y_entidades_territoriales.parroquias b, productivo.sitios_turisticos p WHERE ST_Contains(b.geom, p.geom) and p.tipo = 'ALBERGUES';

ST_Distance and ST_DWithin ST_Distance(geometry A, geometry B)

Calcula la menor distancia entre dos geometrías.

ST_DWithin(geometry A, geometry B, distance)

Permite calcular si dos objetos se encuentran a una distancia dada uno del otro.

Ejemplo

SELECT nombre_de FROM riesgos.puntos_terremoto_2016 WHERE nombre_de is not null and nombre_de != 'PACIFICTEL' and ST_DWithin( ST_Transform(geom, 21818), (SELECT ST_Transform(geom, 21818) FROM riesgos.puntos_terremoto_2016 WHERE nombre_de='PACIFICTEL'), 2000

Page 18: Manual de Uso de PostGIS - CIIFEN

18

);

JOINS espaciales

Permite combinar información de diferentes tablas usando relaciones espaciales como clave dentro del

JOIN. Es una de las caracteristicas más potentes de las bases de datos espaciales.

SELECT b.dpa_despar FROM limites_administrativos_y_entidades_territoriales.parroquias b JOIN productivo.linea_trasmision w ON ST_Crosses(b.geom, w.geom) WHERE w.linea_nomb = 'Culebra-Yuca';

JOIN y GROUP BY

El uso de las relaciones espaciales junto con funciones de agregacion, como group by, permite

operaciones muy poderosas con nuestros datos. Veamos un ejemplo sencillo:

select b.dpa_despar, count(p.tipo) as hostales from limites_administrativos_y_entidades_territoriales.parroquias b join productivo.sitios_turisticos p on st_contains(b.geom, p.geom) where p.tipo = 'HOSTALES' group by b.dpa_despar order by hostales desc;

14.- Análisis espacial

Operadores espaciales

Estos son los encargados de realizar operaciones geométricas entre las geometrías que se les pasa como

argumentos. Están definidos en la norma SFA y PostGIS soporta todos ellos.

Buffer

Es el conjunto de puntos situados a una determinada distancia de la geometría

CREATE TABLE productivo.linea_trasmision_buffer as SELECT 1 as id, ST_Transform(ST_Buffer( (SELECT ST_Transform(geom, 21818) FROM productivo.linea_trasmision WHERE id = 2), 1000, 'endcap=round join=round'), 4326) as geom;

Page 19: Manual de Uso de PostGIS - CIIFEN

19

Intersección

Genera una geometría a partir de la intersección de las geometrías que se les pasa como parámetros.

¿Cúal es el area en común de dos círculos situados en los puntos (0 0) y (3 0) de radio 2?:

SELECT ST_AsText(ST_Intersection(

ST_Buffer('POINT(0 0)', 2),

ST_Buffer('POINT(3 0)', 2) ));

Unión

Al contrario que en el caso anterior, la unión produce un una geometría común con las geometrías que se

le pasa a la función como argumento. Esta función acepta como parámetro dos opciones, las geometrías

que serán unidas:

ST_Union(Geometría A, Geometría B)

O una colección de geometrías:

ST_Union([Geometry])

Usamos adicionalmente la función ST_SnapToGrid para ajustar la geometría de salida lo más posible a

la rejilla regular definida por su origen y su tamaño de celda.

La consulta SQL es ésta:

CREATE TABLE fuentes_agua AS SELECT ST_Union(ST_SnapToGrid(geom,0.0001)) FROM superficies_de_agua.rios GROUP BY nombre_2;

Diferencia simétrica

Es el conjunto de puntos que pertenecen a A o a B pero no a ambas.

ST_SymDifference(Geometría A, Geometría B)

Page 20: Manual de Uso de PostGIS - CIIFEN

20

Transformación y edición de coordenadas

Mediante el uso de diferentes funciones seremos capaces de manejar transformaciones entre sistemas de

coordenadas o hacer reproyeciones de las capas. Para un manejo básico de estas utilizaremos las

funciones que PostGIS pone a nuestra disposición:

ST_Transform(geometría, srid), que nos permite la transformación de la geometría al

SRID que le pasamos por parámetro.

**ST_SRID(geometria) nos muestra el SRID de la geometría

ST_SetSRID(geometria, srid) asigna el SRID a la geometría pero sin relizar la

transformación

select * from spatial_ref_sys where srid=32717;

Ejercicio 3

15.- Haga consultas sobre la tabla emergencias. La siguiente consulta presenta los agregados de muertos, heridos, desaparecidos y viviendas destruidas por cantón para el periodo comprendido entre los años 2008 y 2010 para eventos de deslizamiento. Analice la consulta en detalle. SELECT cod_cant, cantones, sum(muertos) as muertos, sum(heridos)

as heridos, sum(desaparecidos) as desaparecidos,

sum(viv_destruidas) as "Viviendas destruidas" FROM

eventos_cantones WHERE evento = 'Deslizamiento' and fecha <

'2010-01-01' and fecha > '2008-01-01' GROUP BY cod_cant,

cantones;

16.- Vincule la consulta a la capa departamentos. A través de una vista en la base de datos es posible conservar consultas complejas que representan información útil para el usuario. Por ejemplo, a la consulta anterior se le puede agregar el componente espacial y almacenarlo en una vista.

Page 21: Manual de Uso de PostGIS - CIIFEN

21

CREATE OR REPLACE VIEW eventos_08_10_cantones AS SELECT d.id, d.geom, e.cantones, sum(e.muertos) as muertos, sum(e.heridos) as heridos, sum(e.desaparecidos) as desaparecidos, sum(e.viv_destruidas) as "Viviendas destruidas" FROM eventos_cantones e, limites_administrativos_y_entidades_territoriales.cantones d WHERE e.evento = 'Deslizamiento' and e.fecha < '2010-01-01' and e.fecha > '2008-01-01' and e.cod_cant = d.dpa_canton GROUP BY d.id, d.geom, e.cantones; Por ultimo ejecutar:

SELECT Populate_Geometry_Columns('eventos_08_10_cantones'::regclass);

Finalmente, visualice la vista recientemente creada a través de una herramienta SIG de escritorio:

17.- Modelo Relacional Utilizamos el Software:

http://www.sqlpower.ca/page/splash

Page 22: Manual de Uso de PostGIS - CIIFEN

22