Your SlideShare is downloading. ×
0
Clase6
Clase6
Clase6
Clase6
Clase6
Clase6
Clase6
Clase6
Clase6
Clase6
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

Clase6

429

Published on

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
429
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
18
Comments
0
Likes
0
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. Curso Modelo de datos para SIG (720145M ) Clase 6 Fabio Andrés Herrera fandresherrera@hotmail.com http://cursomdsig.blogspot.comFACULTAD DE INGENIERÍAESCUELA DE INGENIERÍA CIVIL Y GEOMÁTICA
  • 2. Curso Modelo de datos para SIG (720145M ) TriggerFACULTAD DE INGENIERÍAESCUELA 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ÍAESCUELA 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ÍAESCUELA 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ÍAESCUELA 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ÍAESCUELA 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ÍAESCUELA DE INGENIERÍA CIVIL Y GEOMÁTICA
  • 8. Curso Modelo de datos para SIG (720145M ) PL/PGSQLFACULTAD DE INGENIERÍAESCUELA 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 longitudeFACULTAD DE INGENIERÍAESCUELA 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ÍAESCUELA DE INGENIERÍA CIVIL Y GEOMÁTICA

×