Una zona para el usuario

Bueno, siguiendo mas o menos el esquema de mi último post, y de los anteriores relacionados. La idea de este post es crear un trigger que cuando se genere un nuevo usuario guarde en la tabla regiones una zona, la zona va a ser su dirección “expandida” 400 metros. Veámos cómo quedaría eso..

Primero que nada tenemos que hacer una función que expanda nuestro punto, esto va a diferir de este post, en que en vez de usar radians para expandir el punto vamos a usar metros, 400 para ser exactos, por lo cual tenemos que reproyectar ese punto a metros.

El sistema de proyección que usaremos en el POSGAR 98, faja 5 (-60) ya que es el que mejor se adapta a los datos que se usan en estre proyecto. Si quieren echarle un ojo a los sistemas de proyecciones de Argentina les recomiento este pdf. Entonces como el resto de nuestras geometrías están en wgs84 (srid 4326) tenemos que reproyectar a POSGAR 98 faja 5 (srid 22175).

Lo primero que necesitamos es una funciòn que nos devuelva el punto geográfico de una dirección de calle (calle y altura o intersección de dos calles).

CREATE OR REPLACE FUNCTION expandpoint(the_geom geometry, meters int)
RETURNS geometry AS
$BODY$
DECLARE
the_geom geometry;
begin
select buffer(transform($1,22175),$2) into the_geom;
return the_geom;
end;
$BODY$
LANGUAGE 'plpgsql' VOLATILE
COST 100;

Y ahora creamos un trigger sobre usuario, primero una función que nos de la dirección del usuario:

CREATE OR REPLACE FUNCTION getuserdir(idusuario int)
  RETURNS geometry AS
$BODY$
begin
return (select the_geom from direccionesdecalle as dirca join direccionesdepiso as dir on dir.iddireccionesdecalle = dirca.iddireccionesdecalle
		join direcciones_personas as dirpe on dirpe.iddirecciones = dir.iddireccionesdepiso
		join personas as pe on pe.idpersonas = dirpe.idpersonas
		join personas_usuarios as peus on pe.idpersonas = peus.idpersonas
		where idusuarios = $1);
end;
$BODY$
  LANGUAGE 'plpgsql' VOLATILE
  COST 100;

Ahora creamos el trigger:

CREATE OR REPLACE FUNCTION zona_usuario()
  RETURNS trigger AS
$BODY$
begin
INSERT into regiones (nombre, idtiporegiones, the_geom) values (new.alias, '21',expandpoint(getuserdir(new.idusuarios),400));
end;
$BODY$
  LANGUAGE 'plpgsql' VOLATILE
  COST 100;

Agregamos el trigger a usuarios:

CREATE TRIGGER zonausuario
AFTER INSERT OR UPDATE ON usuarios
    FOR EACH ROW EXECUTE PROCEDURE zona_usuario();

Y buala espero que les sirva.

Tags: , , , , , , , , , , ,

One Response to “Una zona para el usuario”

  1. Matias Neiff says:

    Tuve que hacer estas modificaciones para que esto quede bien:

    CREATE OR REPLACE FUNCTION getuserdir(idusuario int)
    RETURNS geometry AS
    $BODY$
    begin
    return (select the_geom from direccionesdecalle as dirca
    join sucursales as sucu on dirca.iddireccionesdecalle = sucu.iddirecciones
    JOIN personas_sucursales as pesucu ON sucu.IdSucursales = pesucu.IdSucursales
    join personas_usuarios as peus on peus.idpersonas = pesucu.idpersonas
    where idusuarios = $1);
    end;
    $BODY$
    LANGUAGE ‘plpgsql’ VOLATILE
    COST 100;

    CREATE OR REPLACE FUNCTION expandpoint(the_geom geometry, meters int)
    RETURNS geometry AS
    $BODY$
    DECLARE
    the_geom geometry;
    begin
    select transform(buffer(transform($1,22175),$2),4326) into the_geom;
    return the_geom;
    end;
    $BODY$
    LANGUAGE ‘plpgsql’ VOLATILE
    COST 100;

    CREATE OR REPLACE FUNCTION zona_usuario()
    RETURNS trigger AS
    $BODY$
    begin
    INSERT into regiones (nombre, idtiporegiones, the_geom) values (new.alias, ’21’,expandpoint(getuserdir(new.idusuarios),400));
    RETURN NEW;
    end;
    $BODY$
    LANGUAGE ‘plpgsql’ VOLATILE
    COST 100;
    ALTER FUNCTION zona_usuario() OWNER TO postgres;