clase6
TRANSCRIPT
FACULTAD DE INGENIERÍAESCUELA DE INGENIERÍA CIVIL Y GEOMÁTICA
Curso Modelo de datos para SIG (720145M )
Clase 6
Fabio Andrés [email protected]
http://cursomdsig.blogspot.com
FACULTAD DE INGENIERÍAESCUELA DE INGENIERÍA CIVIL Y GEOMÁTICA
Curso Modelo de datos para SIG (720145M )
Trigger
FACULTAD DE INGENIERÍAESCUELA DE INGENIERÍA CIVIL Y GEOMÁTICA
Curso Modelo de datos para SIG (720145M )
CREATE TABLE nodos(punto_x int, punto_y int, the_geom geometry);
FACULTAD DE INGENIERÍAESCUELA DE INGENIERÍA CIVIL Y GEOMÁTICA
Curso Modelo de datos para SIG (720145M )
CREATE OR REPLACE FUNCTION calcular_punto()RETURNS "trigger" AS$BODY$BEGINNEW.the_geom:=SetSRID(MakePoint(new.punto_x,
new.punto_y), -1) ;RETURN NEW;END$BODY$
LANGUAGE 'plpgsql' VOLATILE;
FACULTAD DE INGENIERÍAESCUELA DE INGENIERÍA CIVIL Y GEOMÁTICA
Curso Modelo de datos para SIG (720145M )
CREATE TRIGGER insert_nodes_geomBEFORE INSERT OR UPDATEON nodosFOR EACH ROW
EXECUTE PROCEDURE calcular_punto();
FACULTAD DE INGENIERÍAESCUELA DE INGENIERÍA CIVIL Y GEOMÁTICA
Curso Modelo de datos para SIG (720145M )
INSERT INTO nodos (punto_x, punto_y) VALUES (1,2);
FACULTAD DE INGENIERÍAESCUELA DE INGENIERÍA CIVIL Y GEOMÁTICA
Curso Modelo de datos para SIG (720145M )
SELECT punto_x,punto_y,astext(the_geom) FROM nodos ;
FACULTAD DE INGENIERÍAESCUELA DE INGENIERÍA CIVIL Y GEOMÁTICA
Curso Modelo de datos para SIG (720145M )
PL/PGSQL
FACULTAD DE INGENIERÍAESCUELA DE INGENIERÍA CIVIL Y GEOMÁTICA
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 $$DECLAREret double precision;
dir integer;BEGIN
dir := 1; --init to 1 for default positive returnret := 0; --init to zero.--ONLY S or W will trip this. Any other letter or NULL will result in positive return
valueIF UPPER(HEMI) = 'S' OR UPPER(HEMI) = 'W' THENdir := -1; --then southern or western hemisphereEND 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ÍAESCUELA DE INGENIERÍA CIVIL Y GEOMÁTICA
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;
BEGINIF 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'' THENRETURN NULL;
END IF;END IF;
IF srid(geom1) != -1 AND srid(geom2) != srid(geom1) THENgeom2trans := transform(geom2, srid(geom1));
ELSEgeom2trans := geom2;
END IF;
IF x(geom1) = x(geom2trans) AND y(geom1) < y(geom2trans) THENRETURN 0;
ELSIF x(geom1) = x(geom2trans) AND y(geom1) > y(geom2trans) THENRETURN 180;
ELSIF y(geom1) = y(geom2trans) AND x(geom1) < x(geom2trans) THENRETURN 90;
ELSIF y(geom1) = y(geom2trans) AND x(geom1) > x(geom2trans) THENRETURN 270;
ELSIF x(geom1) < x(geom2trans) AND y(geom1) < y(geom2trans) THENRETURN degrees(atan(abs(x(geom1) - x(geom2trans)) / abs(y(geom1) - y(geom2trans))));
ELSIF x(geom1) < x(geom2trans) AND y(geom1) > y(geom2trans) THENRETURN degrees(atan(abs(y(geom1) - y(geom2trans)) / abs(x(geom1) - x(geom2trans)))) + 90;
ELSIF x(geom1) > x(geom2trans) AND y(geom1) > y(geom2trans) THENRETURN degrees(atan(abs(x(geom1) - x(geom2trans)) / abs(y(geom1) - y(geom2trans)))) + 180;
ELSIF x(geom1) > x(geom2trans) AND y(geom1) < y(geom2trans) THENRETURN degrees(atan(abs(y(geom1) - y(geom2trans)) / abs(x(geom1) - x(geom2trans)))) + 270;
ELSERETURN 0;
END IF;
END;'LANGUAGE 'plpgsql' VOLATILE;
select azimuth( makepoint(0,0) , makepoint(1,0));