1. Curso Modelo de datos para SIG (720145M )
Clase 6
Fabio Andrés Herrera
fandresherrera@hotmail.com
http://cursomdsig.blogspot.com
FACULTAD DE INGENIERÍA
ESCUELA DE INGENIERÍA CIVIL Y GEOMÁTICA
2. Curso Modelo de datos para SIG (720145M )
Trigger
FACULTAD DE INGENIERÍA
ESCUELA DE INGENIERÍA CIVIL Y GEOMÁTICA
3. Curso Modelo de datos para SIG (720145M )
CREATE TABLE nodos(punto_x int, punto_y int,
the_geom geometry);
FACULTAD DE INGENIERÍA
ESCUELA DE INGENIERÍA CIVIL Y GEOMÁTICA
4. Curso Modelo de datos para SIG (720145M )
CREATE OR REPLACE FUNCTION calcular_punto()
RETURNS "trigger" AS
$BODY$
BEGIN
NEW.the_geom:=SetSRID(MakePoint(new.punto_x,
new.punto_y), -1) ;
RETURN NEW;
END
$BODY$
LANGUAGE 'plpgsql' VOLATILE;
FACULTAD DE INGENIERÍA
ESCUELA DE INGENIERÍA CIVIL Y GEOMÁTICA
5. Curso Modelo de datos para SIG (720145M )
CREATE TRIGGER insert_nodes_geom
BEFORE INSERT OR UPDATE
ON nodos
FOR EACH ROW
EXECUTE PROCEDURE calcular_punto();
FACULTAD DE INGENIERÍA
ESCUELA DE INGENIERÍA CIVIL Y GEOMÁTICA
6. Curso Modelo de datos para SIG (720145M )
INSERT INTO nodos (punto_x, punto_y) VALUES (1,2);
FACULTAD DE INGENIERÍA
ESCUELA DE INGENIERÍA CIVIL Y GEOMÁTICA
7. Curso Modelo de datos para SIG (720145M )
SELECT punto_x,punto_y,astext(the_geom) FROM nodos ;
FACULTAD DE INGENIERÍA
ESCUELA DE INGENIERÍA CIVIL Y GEOMÁTICA
8. Curso Modelo de datos para SIG (720145M )
PL/PGSQL
FACULTAD DE INGENIERÍA
ESCUELA DE INGENIERÍA CIVIL Y GEOMÁTICA
9. Curso Modelo de datos para SIG (720145M )
CREATE OR REPLACE FUNCTION dms2dd( D integer, M integer, S double
precision , HEMI character varying(1) )
RETURNS double precision AS $$
DECLARE
ret double precision;
dir integer;
BEGIN
dir := 1; --init to 1 for default positive return
ret := 0; --init to zero.
--ONLY S or W will trip this. Any other letter or NULL will result in positive return
value
IF UPPER(HEMI) = 'S' OR UPPER(HEMI) = 'W' THEN
dir := -1; --then southern or western hemisphere
END IF;
--SOME data has negative values in minutes and seconds as well as degrees.
Use ABS to standardize all three.
ret := (ABS(CAST(D as double precision)) + (ABS((CAST(M as double
precision) + (ABS((CAST(S as double precision))/60)))/60)));
ret := ret * dir;
RETURN ret;
END;
$$ LANGUAGE plpgsql;
SELECT dms2dd(76,32,26.39,'W') as latitude, dms2dd(3,27,78.69,'N') as longitude
FACULTAD DE INGENIERÍA
ESCUELA DE INGENIERÍA CIVIL Y GEOMÁTICA
10. Curso Modelo de datos para SIG (720145M )
CREATE OR REPLACE FUNCTION azimuth(geometry, geometry)
RETURNS float8 AS
'
DECLARE
geom1 ALIAS FOR $1;
geom2 ALIAS FOR $2;
geom2trans geometry;
BEGIN
IF geom1 IS NULL OR geom2 IS NULL THEN
RETURN NULL;
ELSE
IF isempty(geom1) OR isempty(geom2) OR geometrytype(geom1) != ''POINT'' OR geometrytype(geom2) != ''POINT'' THEN
RETURN NULL;
END IF;
END IF;
IF srid(geom1) != -1 AND srid(geom2) != srid(geom1) THEN
geom2trans := transform(geom2, srid(geom1));
ELSE
geom2trans := geom2;
END IF;
IF x(geom1) = x(geom2trans) AND y(geom1) < y(geom2trans) THEN
RETURN 0;
ELSIF x(geom1) = x(geom2trans) AND y(geom1) > y(geom2trans) THEN
RETURN 180;
ELSIF y(geom1) = y(geom2trans) AND x(geom1) < x(geom2trans) THEN
RETURN 90;
ELSIF y(geom1) = y(geom2trans) AND x(geom1) > x(geom2trans) THEN
RETURN 270;
ELSIF x(geom1) < x(geom2trans) AND y(geom1) < y(geom2trans) THEN
RETURN degrees(atan(abs(x(geom1) - x(geom2trans)) / abs(y(geom1) - y(geom2trans))));
ELSIF x(geom1) < x(geom2trans) AND y(geom1) > y(geom2trans) THEN
RETURN degrees(atan(abs(y(geom1) - y(geom2trans)) / abs(x(geom1) - x(geom2trans)))) + 90;
ELSIF x(geom1) > x(geom2trans) AND y(geom1) > y(geom2trans) THEN
RETURN degrees(atan(abs(x(geom1) - x(geom2trans)) / abs(y(geom1) - y(geom2trans)))) + 180;
ELSIF x(geom1) > x(geom2trans) AND y(geom1) < y(geom2trans) THEN
RETURN degrees(atan(abs(y(geom1) - y(geom2trans)) / abs(x(geom1) - x(geom2trans)))) + 270;
ELSE
RETURN 0;
END IF;
END;
'
select azimuth( makepoint(0,0) , makepoint(1,0));
LANGUAGE 'plpgsql' VOLATILE;
FACULTAD DE INGENIERÍA
ESCUELA DE INGENIERÍA CIVIL Y GEOMÁTICA