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
Curso Modelo de datos para SIG (720145M )




                                          Trigger



FACULTAD DE INGENIERÍA
ESCUELA 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ÍA
ESCUELA DE INGENIERÍA CIVIL Y GEOMÁTICA
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
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
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
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
Curso Modelo de datos para SIG (720145M )




                                   PL/PGSQL



FACULTAD DE INGENIERÍA
ESCUELA 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 $$
             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
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

Clase6

  • 1.
    Curso Modelo dedatos 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 dedatos para SIG (720145M ) Trigger FACULTAD DE INGENIERÍA ESCUELA DE INGENIERÍA CIVIL Y GEOMÁTICA
  • 3.
    Curso Modelo dedatos 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 dedatos 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 dedatos 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 dedatos 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 dedatos 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 dedatos para SIG (720145M ) PL/PGSQL FACULTAD DE INGENIERÍA ESCUELA DE INGENIERÍA CIVIL Y GEOMÁTICA
  • 9.
    Curso Modelo dedatos 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 dedatos 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