clase6

10
FACULTAD DE INGENIERÍA ESCUELA DE INGENIERÍA CIVIL Y GEOMÁTICA Curso Modelo de datos para SIG (720145M ) Clase 6 Fabio Andrés Herrera [email protected] http://cursomdsig.blogspot.com

Upload: t763rm3n

Post on 29-Jun-2015

430 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Clase6

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

Page 2: Clase6

FACULTAD DE INGENIERÍAESCUELA DE INGENIERÍA CIVIL Y GEOMÁTICA

Curso Modelo de datos para SIG (720145M )

Trigger

Page 3: Clase6

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);

Page 4: Clase6

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;

Page 5: Clase6

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();

Page 6: Clase6

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);

Page 7: Clase6

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 ;

Page 8: Clase6

FACULTAD DE INGENIERÍAESCUELA DE INGENIERÍA CIVIL Y GEOMÁTICA

Curso Modelo de datos para SIG (720145M )

PL/PGSQL

Page 9: Clase6

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

Page 10: Clase6

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));