Sunteți pe pagina 1din 21

RAUL

ACEVEDO
rfacevedo@yahoo.com

Taller Modelando con PostGIS


Ejercicio 1
Carga de Datos
1. Abra el programa pgAdmin3.
Inicio -> Programas -> PostgreSQL 9.4 -> pgAdmin III

Ingrese la contrasea definida en la instalacin 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 parmetros:

RAUL ACEVEDO
rfacevedo@yahoo.com

Nombre

usuario

Contrasea

usuario

Privilegios

Hereda de roles superiores.


Puede crear objetos de bases de datos.

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

RAUL ACEVEDO
rfacevedo@yahoo.com

b.- Extensiones Geogrficas: Postgis y Postgis_Topology

RAUL ACEVEDO
rfacevedo@yahoo.com

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 geometra, usted debe agregar el campo que almacenar
la geometra utilizando la funcin de PostGis AddGeometryColumn.
Esta funcin requiere, entre otros parmetros, el cdigo 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
cdigos.
Por ejemplo, busque 'Ecuador' en el sitio web para encontrar el cdigo EPSG del
Sistema de Referencia correspondiente.
Para el ejercicio, se emplear el cdigo 4326 que corresponde al Sistema de
Referencia WGS84, compatible con SIRGAS.
Ejecute la instruccin:
SELECT
AddGeometryColumn('tabla_puntos','geom',4326,'POINT',2);
Los argumentos de AddGeometryColumn son:
Nombre de la tabla
Nombre del campo con geometra
Sistema de Referencia (Cdigo EPSG) (-1: Desconocido)
Geometra: [Multi]Point, [Multi]Linestring, [Multi]Polygon (entre otras)
Dimensin
Con esto tenemos una Base de Datos Geogrficos con una tabla que puede almacenar
geometra.

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);

RAUL ACEVEDO
rfacevedo@yahoo.com


INSERT INTO tabla_puntos (geom,altura) VALUES
(ST_GeomFromText('POINT(-74.1164 4.7096)',4326),152);

6. Las consultas sobre tablas con muchos registros suelen generar


problemas de desempeo en Bases de Datos Espaciales. Para
mejorar la velocidad de respuesta se emplean ndices espaciales.
Defina un ndice espacial sobre el campo de la geometra (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 opcin GIST le ordena al servidor el uso del ndice GIST (Generalized Search
Tree) . El ndice GIST est diseado para optimizar el tiempo de bsqueda 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 descripcin
ms apropiada de la geometra con la siguiente consulta, que emplea la funcin
de PostGIS AsText (la funcin AsText retorna la geometra en el formato WKG Well
Known Geometry):
SELECT gid, st_AsText(geom) FROM tabla_puntos;

8. Realice la siguiente consulta empleando la funcin de PostGIS


Distance. (La function Distance de PostGIS devuelve la distancia ms pequea
que existe entre dos geometras):
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 clasula 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

RAUL ACEVEDO
rfacevedo@yahoo.com
antes del punto y coma de la consulta y observe el resultado.

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 informacin en una BD, PostgreSQL emplea el


concepto de Esquema (Schema).
Los esquemas actan como contenedores de informacin, son anlogos 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

RAUL ACEVEDO
rfacevedo@yahoo.com


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

Cree otros dos esquemas llamados:

riesgos: eventos o siniestros de gestin de riesgo


superficies_de_agua: datos de hidrografa.
social,
productivo,
riesgos,
osm.

11. Debido al cargue masivo de datos, la Base de Datos Espaciales


requiere actualizar sus estadsticas internas, utilizadas para
consultas. Para ello, abra la ventana de mantenimiento de la base
de datos, as:
Elija las opciones por defecto (VACUUM, ANALYZE).

RAUL ACEVEDO
rfacevedo@yahoo.com

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


capas:

a.- Importacin ESRI shapes mediante shp2pgsql


El cargador shp2pgsql convierte archivos ESRI Shape en SQL preparado para la insercin en
la base de datos. Se utiliza desde la linea de comandos, aunque existe una versin con interfaz
grfica 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.- Exportacin 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.-

Importacin ESRI shapes mediante PgAdmin o QGIS

QGIS:

RAUL ACEVEDO
rfacevedo@yahoo.com

RAUL ACEVEDO
rfacevedo@yahoo.com

RAUL ACEVEDO
rfacevedo@yahoo.com

RAUL ACEVEDO
rfacevedo@yahoo.com

d.- GDAL/OGR
GDAL/OGR es una librera de lectura y escritura de formatos geoespaciales, tanto Raster con
GDAL como Vectorial con OGR. Se trata de una librera de software libre ampliamente
utilizada.

ogrinfo
ogrinfo obtiene informacin de los datos vectoriales. Podremos utilizar esta herramienta para
la obtencin de esta informacin de las tablas que tenemos almacenadas en la base de datos. El
uso se realiza a travs 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:

RAUL ACEVEDO
rfacevedo@yahoo.com

$ 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,
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 lnea a ejecutar desde psql o pgAdmin III:


# COPY incendios_modis24h FROM
'/path/to/csv/file/incendios_modis.csv' WITH DELIMITER ';' CSV
HEADER;

RAUL ACEVEDO
rfacevedo@yahoo.com

g.- Importacin datos OSM a PostGIS


OpenStreetMap (tambin conocido como OSM) es un proyecto colaborativo para crear mapas libres y
editables.
Los mapas se crean utilizando informacin geogrfica capturada con dispositivos GPS mviles,
ortofotografas y otras fuentes libres. Esta cartografa, tanto las imgenes 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 caracterstico de los SIG. Este
est compuesto de:

Node
Way
Relation

a diferencia de las geometras caractersticas como:

Punto
Linea
Poligono

una caracterstica particular es la ausencia de polgonos dentro del modelo, estos se realizan mediante la
asignacin de una relacin a una linea cerrada. Esta particularidad no impide que los datos de OSM
puedan ser adaptados al modelo de geometras normal mediante cargadores de datos OSM. A
continuacin se presentan dos de los ms 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 importacin, aparecern en nuestra base de datos las tablas que
sern el resultado de esta importacin:

planet_osm_point
planet_osm_line
planet_osm_polygon
planet_osm_roads

Al disponer el modelo de OSM de cientos de etiquetas, la importacin crea en las tablas un gran nmero
de campos de los que la mayora tendrn valor NULL.
La ejecucin 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 pgina nos redireccionar a servicios de descarga
masiva, como http://download.geofabrik.de/south-america/ecuador.html.

RAUL ACEVEDO
rfacevedo@yahoo.com

Ejercicio 2
13.- Relaciones Espaciales:
Los principales mtodos de la clase Geometry para chequear predicados espaciales entra la
geometra en cuestin y otra proporcionada como parmetro son:

Equals (A, B): Las geometras son iguales desde un punto de vista topolgico
Disjoint (A, B): No tienen ningn punto en comn, las geometras son disjuntas
Intersects (A, B):Tienen por lo menos un punto en comn. Es el inverso de Disjoint
Touches (A, B): Las geometras tendrn por lo menos un punto en comn del contorno,
pero no puntos interiores
Crosses (A, B): Comparten parte, pero no todos los puntos interiores, y la dimensin de
la interseccin es menor que la dimensin de al menos una de las geometras
Contains (A, B): Ningn 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 geometras comparten parte pero no todos los puntos y la
interseccin tiene la misma dimensin que las geometras.
Covers (A, B): Ningn 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 geometras sean
espacialmente iguales.
ST_Equals devuelve TRUE si dos geometras 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,


'0104000020CD7F0000010000000101000000613255302AF953C01B0DE02D90A001
C0');

ST_Intersects, ST_Disjoint, ST_Crosses y ST_Overlaps


Comprueban la relacin entre los interiores de las geometras.

RAUL ACEVEDO
rfacevedo@yahoo.com

ST_Intersects
ST_Intersects(geometry A, geometry B)
Devuelve TRUE si la interseccin no es un resultado vacio.

ST_Disjoint
ST_Disjoint(geometry A , geometry B)
Es el inverso de ST_Intersects. indica que dos geometras no tienen ningn punto en comn. 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)
Se cumple esta relacin si el resultado de la inteseccin de dos geometras es de dimensin menor que la
mayor de las dimensiones de las dos geometras y adems esta interseccin est en el interior de ambas.

ST_Overlap
ST_Overlaps(geometry A, geometry B)
compara dos geometras de la misma dimensin y devuelve TRUE si su interseccin resulta una
geometra diferente de ambas pero de la misma dimensin

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 geometra A est completamente dentro de la geometra B. Es el inverso de ST_Contains
ST_Contains(geometry A, geometry B)
Devuelve TRUE si la geometra B est contenida completamente en la geometra 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 geometras.

RAUL ACEVEDO
rfacevedo@yahoo.com


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
);

JOINS espaciales
Permite combinar informacin de diferentes tablas usando relaciones espaciales como clave dentro del
JOIN. Es una de las caracteristicas ms 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.- Anlisis espacial

Operadores espaciales

RAUL ACEVEDO
rfacevedo@yahoo.com

Estos son los encargados de realizar operaciones geomtricas entre las geometras que se les pasa como
argumentos. Estn definidos en la norma SFA y PostGIS soporta todos ellos.

Buffer
Es el conjunto de puntos situados a una determinada distancia de la geometra

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;

Interseccin
Genera una geometra a partir de la interseccin de las geometras que se les pasa como parmetros.

Cal es el area en comn de dos crculos 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) ));

Unin
Al contrario que en el caso anterior, la unin produce un una geometra comn con las geometras que se
le pasa a la funcin como argumento. Esta funcin acepta como parmetro dos opciones, las geometras
que sern unidas:
ST_Union(Geometra A, Geometra B)
o una coleccin de geometras:
ST_Union([Geometry])

Usamos adicionalmente la funcin ST_SnapToGrid para ajustar la geometra de salida lo ms posible a


la rejilla regular definida por su origen y su tamao 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;

RAUL ACEVEDO
rfacevedo@yahoo.com



Diferencia simtrica

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

ST_SymDifference(Geometra A, Geometra B)

Transformacin y edicin 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 bsico de estas utilizaremos las
funciones que PostGIS pone a nuestra disposicin:

ST_Transform(geometra, srid), que nos permite la transformacin de la geometra al


SRID que le pasamos por parmetro.
**ST_SRID(geometria) nos muestra el SRID de la geometra
ST_SetSRID(geometria, srid) asigna el SRID a la geometra pero sin relizar la
transformacin

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 canton para el periodo comprendido entre los aos 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;

RAUL ACEVEDO
rfacevedo@yahoo.com

16.- Vincule la consulta a la capa departamentos.

A travs de una vista en la base de datos es posible conservar consultas complejas


que representan informacin til para el usuario. Por ejemplo, a la consulta anterior
se le puede agregar el componente espacial y almacenarlo en una vista.

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 > '200801-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 travs de una herramienta SIG


de escritorio:

17.- Modelo Relacional


Utilizamos el Software:

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

RAUL ACEVEDO
rfacevedo@yahoo.com

S-ar putea să vă placă și