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: buffer, epsg buenos aires, gis, posgar 98, postgis, postgres, proyección argentina, proyección buenos aires, SIG, srid buenos aires, transform, trigger
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;