Your browser doesn't support the features required by impress.js, so you are presented with a simplified version of this presentation.

For the best experience please use the latest Chrome, Safari or Firefox browser.

Taller de PostGIS

María Arias de Reyna Domínguez - @delawen

Qué es PostGIS

“Everything is related to everything else, but near things are more related than distant things”, First Law of Geography
+

sudo apt-get install postgresql-9.1-postgis

sudo apt-get install postgresql-*-postgis

¡¡Cuidado con el paquete "postgis"!!

Al instalar postGIS se crea un template_postgis(_20).

Este template define una base de datos con capacidad espacial.

Podemos ver la versión de postGIS instalada con

SELECT postgis_full_version();

sudo apt-get install postgresql-9.1-postgis

psql -h localhost -U postgres -c'createdb -E UTF8 -U postgres template_postgis'

sudo su postgres -c'createdb -E UTF8 -U postgres template_postgis'

sudo su postgres -c'createlang -d template_postgis plpgsql;'

psql -U postgres -d template_postgis -f /usr/share/postgresql/9.1/contrib/postgis-1.5/postgis.sql

psql -U postgres -d template_postgis -f /usr/share/postgresql/9.1/contrib/postgis-1.5/spatial_ref_sys.sql

psql -U postgres -d template_postgis -c "GRANT ALL ON geometry_columns TO PUBLIC;"

psql -U postgres -d template_postgis -c "GRANT ALL ON spatial_ref_sys TO PUBLIC;"

psql -U postgres -d template_postgis -c "GRANT ALL ON geography_columns TO PUBLIC;"

psql -U postgres -d template_postgis -c "UPDATE pg_database SET datistemplate='true' WHERE datname='template_postgis';"

Con el template creado, ya podemos crear bases de datos espaciales como churros.

createdb -E UTF8 -U postgres -T template_postgis db_taller

El tipo Geometría

Es un tipo más de la base de datos.

Permite definirse en "cualquier" sistema de coordenadas.

Número ilimitado de dimensiones.

Point

LineString

LinearRing

Polygon

MultiPoint

MultiLineString

MultiPolygon

GeometryCollection

Latitud, Longitud

Conjunto ordenado de puntos

Curvas. Poco usado salvo para polígonos.

Conjunto de líneas cerrado

Nube de Puntos

Manojo de líneas

Varios polígonos

Caos

Los datos pueden sacarse de muchas fuentes:

Shapefiles

Osm

Comandos insert

GPS

 

 

osm2pgsql -U postgres -d db_taller barcelona.osm

 

 

Si queremos definir una tabla manualmente, hay que especificar las columnas geométricas de forma especial.

SELECT AddGeometryColumn ('my_schema','my_spatial_table','my_col',4326,'LINESTRING',2);

 

 

 

 

 

CONSTRAINT enforce_dims_my_col CHECK (st_ndims(my_col)=2)

 

CONSTRAINT enforce_geotype_my_col CHECK (geometrytype(my_col) = 'LINESTRING'::text OR my_col IS NULL),

 

CONSTRAINT enforce_srid_my_col CHECK (st_srid(my_col) = 4326)

También podemos meter esas constraint a mano

O utilizar Populate_Geometry_Columns

Personalmente no me fío de esta última función

El tipo geometría tiene sus propios índices, normalmente en forma de árbol.

Funciones básicas

Existen muchas funciones geográficas en PostGIS

ST_MakePoint(Longitude, Latitude)

ST_GeomFromText(WellKnownText, srid)

ST_SetSRID(geometry, srid)

 

ST_AsText(geometry)

ST_AsGeoJSON(geometry)

ST_AsGML(geometry)

ST_X(point)

ST_Y(point)

 

ST_StartPoint(geometry)

ST_EndPoint(geometry)

Hay muchas formas de ver si dos geometrías son iguales.

Puede interesarte una forma más estricta o no según tus necesidades.

ST_OrderingEquals: Exactamente iguales

ST_Equals: Ocupan el mismo espacio físico

=: Ocupan el mismo bounding box

&&: Bounding Box que se tocan

ST_Area(geometry)

ST_Length(geometry)

ST_NumPoints(linestring)

ST_NumGeometries(geometry)

ST_Distance(geometry, geometry)

ST_DWithin(geometry, geometry, radius)

ST_Intersects(geometry, geometry)

ST_Contains(geometry, geometry)

ST_Crosses(geometry, geometry)

ST_Disjoint(geometry, geometry)

ST_Overlaps(geometry, geometry)

Lo mismo que se aplica a un postgreSQL.

Al menos respecto a parámetros de SO.

Es fundamental usar índices espaciales.

Si además podemos hacer cluster, mejor.

Suelen ser más útiles que los índices sobre otros campos.

(en igualdad de condiciones)

Shared Buffers

Memoria que comparten los procesos (por ejemplo datos que sacan de una tabla)

Recomendado: 75% de la RAM

NOTE: There is a kernel parameter that needs to be adjusted to allow large values of shared_buffers to work, since the kernel puts limits on how much shared memory can be allocated (to prevent accidents). Work out how much memory you're going to allocate to shared_buffers, double it, then echo that value (in bytes) to /proc/sys/kernel/shmmax and /proc/sys/kernel/shmall, and persist that setting on reboot in /etc/sysctl.conf.

Work Mem

Espacio en RAM que usa cada sub-query dentro de la query.

En PG >= 9 el EXPLAIN ANALYZE te enseña cuanta memoria va a gastar la query.

Recomendado: Para un servidor en producción Memoria Disponible / 2 * max_connections.

NOTE: Set this value at your own risk and only after significant testing. Having it too high can have rather unexpected consequences. Setting it to 1 or 2GB, unless you have VERY few threads, or a TON of memory, is a very, very bad idea.

So, if you're doing data warehousing, and you're pretty much the only user (or there's only one at a time), setting it up pretty high is acceptable, but you do need to watch the box and make sure you don't run it out of memory. Also, make sure you have things configured correctly, if you're using Linux, to prevent the OOM killer from kicking in. Also, as I suggested before, set it to a reasonable level for the 'default' and just up it for specific queries that may benefit from it.

Maintenance Work Mem

Work Mem para VACUUM, Index, etc...

Recomendado: Memoria Disponible / 8

Wal Buffers

Establece la cantidad de memoria utilizada para escritura anticipada registro (WAL) de datos.

Recomendado: Si tu base de datos es estática, no necesitas mucho. Si tu base de datos es muy dinámica, necesitarás más espacio.

Mientras que el valor por defecto es a menudo suficiente para la mayoría de los datos, los datos geoespaciales tiende a ser mucho más grandes. Por lo tanto, se recomienda aumentar el tamaño de este parámetro (1 MB).

Effective Cache Size

Espacio de memoria que el query planner usa para cachear.

Recomendado: 50/75% Memoria Disponible

Mientras que el valor por defecto es a menudo suficiente para la mayoría de los datos, los datos geoespaciales tiende a ser mucho más grandes. Por lo tanto, se recomienda aumentar el tamaño de este parámetro (1 MB).

Para saber más

Workshop de OpenGeo.

Visitar este otro Workshop de bases de datos geográficas en general.

Que no sea por tutoriales y más tutoriales.