viernes, 15 de julio de 2016

Recomendación bibliográfica para geoprocesamiento en POSTGIS

Pasar del goeprocesamiento en un software comercial de interfase gráfica, soluciones en caja de herramienta y de "ingeniería de ratón" en la que se pueden obtener resultados con hacer click sin tener las bases de conocimiento necearías a un ambiente de modelo relacional y programación es un choque grande para un profesional SIG.
Llevo cerca de 5 años trabajando con postgis (desde la v 1.4) y uno de los  libros de mayor utilidad ha sido PostGIS 2 Análisis Espacial Avanzado de José Carlos Martínez Llario.

Una de las mayores diferencias al trabajar una base de postgis es que permite almacenar varias geometrías en una misma columna ya que hay un tipo de dato genérico "geometry" que no esta limitado a un solo tipo de geometría.
Existen funciones que retornan tipo "geometrycollection" es decir puede retornar punto, linea y polígono en un sólo registro. Esto no es común en el ambiente de software comercial  y de "ingeniería de ratón" por que realiza decisiones de las que el usuario no está enterado. Las geometrías mixtas son el resultado correcto de muchas operaciones espaciales según el "Dimensionally Extended 9-Intersection model" (modelo 9 - interseccional dimensionalmente extendido).
También existen funciones que reciben solo un tipo de geometría, por ejemplo no tiene sentido calcular el área de un punto, por lo que de un resultado de geometrías mixto en la práctica se tiene la necesidad de extraer sólo un tipo de geometría.
Actualmente existe funciones como ST_Relate (condicional),ST_CollectionExtract y ST_CollectionHomogenize que en algunas circunstancias logran este cometido, antes de que se introdujeran estas funciones a postgis esta tarea se podía lograr con una función que encontré en el libro mencionado:

-- Function: stx_extract(geometry, integer)
-- DROP FUNCTION stx_extract(geometry, integer);

CREATE OR REPLACE FUNCTION stx_extract(
    geometry,
    integer)
  RETURNS geometry AS
$BODY$
DECLARE
 geom alias for $1;
 dimension alias for $2;
 out Geometry;
 tipo Varchar;
BEGIN
 tipo:= geometrytype(geom);
 if (tipo = 'LINESTRING') THEN
 if (dimension <> 1) THEN RETURN null;
 ELSE RETURN st_multi(geom);
 END IF;
 ELSIF (tipo = 'POINT') THEN
 if (dimension <> 0) THEN RETURN null;
 ELSE RETURN st_multi(geom);
 END IF;
 ELSIF (tipo = 'POLYGON') THEN
 if (dimension <> 2) THEN RETURN null;
 ELSE RETURN st_multi(geom);
 END IF;
 END IF;
 out := ST_collectionextract(geom,dimension+1);
 IF (ST_isEmpty(out)) THEN
RETURN null;
 END IF;
 RETURN st_Multi(out);
END;
$BODY$
  LANGUAGE plpgsql IMMUTABLE STRICT
  COST 100;
ALTER FUNCTION stx_extract(geometry, integer)
  OWNER TO postgres;

En la actualidad continúo usando las cuatro funciones ya que dependiendo del contexto de uso una función puede ser más pertinente o eficiente que la otra.

No hay comentarios:

Publicar un comentario