PostGIS en una cáscara de nuez
#
27 / 02 / 2016
Micho García
@michogar
micho.garcia@geomati.co
@postgresql
¿Qué es PostgreSQL?
- PostgreSQL es un sistema de gestión de bases de datos objeto-relacional
- Distribuido bajo licencia BSD y con su código fuente disponible libremente.
- Es el sistema de gestión de bases de datos de código abierto más potente del mercado y en sus últimas versiones no tiene nada que envidiarle a otras bases de datos comerciales.
¿Qué es PostgreSQL?
¿Qué es PostgreSQL?
- Ficheros de configuración: Los 3 ficheros principales de configuración utilizados por PostgreSQL, postgresql.conf, pg_hba.conf y pg_ident.conf
- Disco: Disco físico donde se almacenan los datos y toda la información necesaria para que PostgreSQL funcione
Instalación
Instalación
- Desde repositorios Linux
- Docker
- Compilando código fuente, WTF!!
- Instalación en Windows
Desde repositorios
Docker
Estructura de la instalación
- /usr/lib/postgresql/9.x→ ejecutables y librerías
- /usr/share/postgresql/9.x → archivos sql para creación estructura
- /usr/share/postgresql-common → herramientas comunes para administración
- /var/lib/postgresql/9.x
- /etc/postgresql/9.x/main
manejo del servicio
/etc/postgresql/9.x/main
-
pg_hba.conf
- postgresql.conf
Configuración accesos
CONFIGURACIÓN ACCESOS
clientes
Preparar acceso
preparar acceso
-
psql -d nombre_base_de_datos
accederá a la base de datos que le indiquemos
-
psql -f ruta_a_archivo
utiliza las sentencias que se encuentren dentro del archivo
-
psql -h
nombre_servidor
se conecta al servidor que le indiquemos
-
psql -p puerto se conecta
a la instancia de |PG| a través del puerto indicado
-
psql -l
muestra un listado de las bases de datos de la instancia
-
psql -U nombre_usuario
se conecta usando el usuario indicado
-
psql -V
muestra la versión de psql
Opciones
algunas funciones
-
select version(); nos indicará la versión del servidor que tenemos instalada
-
\l muestra un listado de las bases de datos
-
select * from pg_user; nos muestra todos los usuarios del sistema
-
select * from pg_tables; muestra todas las tablas incluidas las del sistema
-
\c database cambia de base de datos
-
\dn muestra todos los esquemas de la base de datos
ALGUNAS funciones
-
\dt muestra las tablas, acepta expresiones para filtrar por ejemplo, \dt p* todas las tablas que empiezan por p
-
\du listado de usuarios/grupos y roles
-
\d tabla columnas, y tipos de datos de la tabla
-
\i ruta_archivo ejecuta las sentencias de un archivo
-
\o ruta_archivo devuelve los datos a un archivo
-
\conninfo muestra la información de la conexión
-
\encoding codificación fija la codificación del sistema, o sin parámetro la muestra
-
\q sale de la consola ``psql``
algunas funciones
pgAdmin 3
pgAdmin 3
instalacion
arranque
añadir conexión
SQL Editor
@postgis
¿qué es postgis?
Instalación
Espacialización de la base de datos
Espacialización de la base de datos
Espacialización de la base de datos
PROJCS["ETRS89 / UTM zone 29N",
GEOGCS["ETRS89",
DATUM["European_Terrestrial_Reference_System_1989",
SPHEROID["GRS 1980",6378137,298.257222101,
AUTHORITY["EPSG","7019"]],
AUTHORITY["EPSG","6258"]],
PRIMEM["Greenwich",0,
AUTHORITY["EPSG","8901"]],
UNIT["degree",0.01745329251994328,
AUTHORITY["EPSG","9122"]],
AUTHORITY["EPSG","4258"]],
UNIT["metre",1,
AUTHORITY["EPSG","9001"]],
PROJECTION["Transverse_Mercator"],
PARAMETER["latitude_of_origin",0],
PARAMETER["central_meridian",-9],
PARAMETER["scale_factor",0.9996],
PARAMETER["false_easting",500000],
PARAMETER["false_northing",0],
AUTHORITY["EPSG","25829"],
AXIS["Easting",EAST],
AXIS["Northing",NORTH]]
Espacialización de la base de datos
Espacialización de la base de datos
Creación de tablas espaciales
Creación de tablas espaciales
Caracteristicas espaciales postgis
Funciones espaciales
Funciones Espaciales
Índices espaciales
Importación y exportación de datos
Objetivos
shp2pgsql
¿ESRI Shapefile?
shp2psql
COMANDOS
mas comandos
pgsql2shp
pgsql2shp
comandos
shp2pgsql-gui
GDAL/OGR
ogrinfo
ogrinfo
comandos
ogr2ogr
ogr2ogr
ogr2ogr
ogr2ogr
ogr2ogr -f "KML" nucleo_poblacion.kml PG:"host=localhost user=gis dbname=gis password=gis" -sql "select gid, nom_ine, geom from gis.nucleo_poblacion"
OSM
osm
Diferente relaciones entre los datos:
osm
osm2pgsql
osm2pgsql
osm2pgsql
comandos
osmosis
osmosis
Simple Feature Model, Geometrias, Tipos y Predicados Espaciales
El estándar SFA de OGC (ISO 19125)
El estándar SFA de OGC (ISO 19125)
- Definió dos modelos de representación externa de la componente espacial del dato geográfico: los estándares WKT y WKB
- Un formato de intercambio de GML
- Un esquema “genérico” de cómo se debería implementar el modelo vectorial definido por la norma SFA en una base de datos SQL: SFA para SQL.
Dimensión
Dimensión de las coordenadas
Interior, contorno y exterior
El estándar SFA de OGC (ISO 19125)
clase geometry
WKT
WKT es el acrónimo en inglés de Well Known Text, que se puede definir como una codificación o sintaxis diseñada específicamente para describir objetos espaciales expresados de forma vectorial.
WKB
definiciones
definiciones
definiciones
métodos básicos
relaciones espaciales
relaciones espaciales
Métodos para realizar análisis espacial.
Relaciones Espaciales
Matriz DE-9IM
ST_Relate
ST_Relate permite el uso de patrones personalizados
El patrón T******** me indica que los interiores de las geometrías tienen que tener alguna dimensión, por lo tanto deben intersecar
Mediante el uso de ST_Relate y los patrones podemos encontrar las relaciones de las geometrías. Es tedioso el uso de los patrones.
PostGIS define operaciones que son particularizaciones del uso de los patrones.
Estas operaciones deben cumplir la definición de la relación impuesta por los estándares
- ST_Equals(geom, geom)
- ST_Disjoint(geom, geom)
- ST_Intersects(geom, geom)
- ST_Touches(geom, geom)
- ST_Crosses(geom, geom)
- ST_Overlaps(geom, geom)
- ST_Within(geom A, geom B)
- ST_Contains(geom A, geom B)
- ST_Covers(geom A, geom B) = ST_CoveredBy(geom B, geom A)
Carreteras que cruzan Vigo
create table gis.carreteras_cruzan_vigo as (select c.gid, c.geom
from gis.nucleo_poblacion as n, gis.tramo_carretera as c
where ST_Crosses(n.geom, c.geom)
and n.nom_ine = 'VIGO');
Tramos de carreteras de Vigo
create table gis.carreteras_de_vigo as (select c.gid, c.geom
from gis.nucleo_poblacion as n, gis.tramo_carretera as c
where ST_Contains(n.geom, c.geom)
and n.nom_ine = 'VIGO');
Operaciones Espaciales
Estas operaciones toman como argumento una o varias geometrías y devuelven otra geometría.
Toman únicamente las coordenadas X e Y de las geometrías ignorando las Z o M
Funcionan con todas las geometrías básicas excepto con las GEOMETRY COLLECION
Buffer
ST_Buffer(geom,distance,optional)
Es el conjunto de puntos situados a una determinada distancia de la geometría. La función acepta en su primer argumento una geometría y en el segundo la distancia con la que construirá la geometría de salida.
create table gis.buffer_castelao as (select c.gid, st_buffer(c.geom, 50)
from gis.tramo_carretera as c
where c.gid = '121')
Otras funciones
-
ST_Intersection(geom, geom)
-
ST_Union(Geometría A, Geometría B)
-
ST_Diference(geom,geom)
-
ST_SymDifference(geom,geom)
-
ST_ConvexHull(geom,geom)
Complejidad en el análisis
Uso intensivo de SQL para definir consultas eficaces y correctas
Estrategias de SQL avanzadas
Definición del problema y planificación de la consulta, diseño previo
¡Uso de índices espaciales!
Tipos de geometrías devueltas
El tipo de geometrías que devuelven estas operaciones no tienen porque ser igual al tipo de geometrías que le son pasadas como argumentos.
Proyecciones
PostGIS soporta varios miles de sistemas de coordenadas.
La gestión de los Sistemas de coordenadas se realiza con las siguientes funciones:
ST_Srid(geom) → devuelve el CRS de la geometría
ST_SetSrid(geom,srid) → devuelve la geometría con el nuevo CRS asignado
ST_Transform(geom, srid) → devuelve la geometría reproyectada
Cambio de CRS a una capa
En caso de que necesitemos cambiar el CRS a una capa por completo no será necesario recorrer todos los registros, podremos utilizar la función:
UpdateGeometrySrid(tabla, columna geom, nuevo SRID)
¡No reproyecta los datos!
Reproyección de una capa
Para reproyectar las geometrías de una capa utilizaremos ST_Transform. Para poder hacer esta operación, hemos de eliminar la restricción sobre el SRID antes de actualizar las geometrías.
create table gis.nucleo_3857 as (select n.gid, n.nom_ine, ST_Transform(n.geom, 3857) as geom from gis.nucleo_poblacion as n)
Indexación Espacial
Índices Espaciales
La caja (box) es el rectángulo definido por las máximas y mínimas coordenadas x e y de una geometría.
Índices Espaciales
Crear un índice espacial
La síntaxis será la siguiente:
CREATE INDEX [Nombre_del_indice] ON [Nombre_de_tabla] USING GIST ([campo_de_geometria]);
Esta operación puede requerir bastante tiempo en tablas de gran tamaño.
Uso del índice
Para usar el índice debemos incluir el operador && en nuestras consultas
Para las geometrías, el operador && significa “la caja que toca (touch) o superpone (overlap)” de la misma manera que para un número el operador = significa “valores iguales”
Operador de cajas
Muchas de las operaciones habituales de PostGIS dispone de operador de cajas, por ejemplo:
ST_Intersects VS _ST_Intersects
django-rest-framework-gis
"@postgis en una cáscara de nuez" by Micho García is licensed under CC BY 2.0
Micho García
micho.garcia@geomati.co
@michogar
@postgis en una cáscara de nuez
By Micho García
@postgis en una cáscara de nuez
Breve introducción a PostGIS para la Hackathon SJ - Vigo - Febrero 2016
- 1,563