Reemplazando Arcmap y Autocad con QGis y Postgres para trazar Redes de Agua y Alcantarillado
José Venegas Acevedo
jvenegasperu
PRESENTACIÓN
José Venegas Acevedo
jvenegasperu
Trabajo en Servicio de Agua Potable y Alcantarillado de la libertad SEDALIB SA en Trujillo – Perú
BIMOSIG Consultores: desarrollo de sistemas de información con inteligencia de negocios sobre Postgres
Miembro de la comunidad de usuarios de Postgres
AGENDA
1.- QUE NECESITAMOS?
2.- QUE HACE CADA UNO?
3.- ICONOGRAFÍA
4.- CONFIG WINDOWS
5.- CONFIG QGIS
José Venegas [email protected] jvenegasperu
6.- CONFIG POSTGRES
7.- DEMO
8.- QUE HAY POR DENTRO?
PREGUNTAS
¿Que hace cada uno?
https://inkscape.org
INKSCAPE
Este software nos permite dibujar figuras y guardarlas en formato SVG
Aquí lo usamos para dibujar la iconografía que vamos a necesitar al momento de realizar el trazado de las redes de agua y alcantarillado
Recordar realizar las figuras en tamaño pequeño no mas de 100 x 100 pixeles ya que se trata de iconos que se usaran en un mapa
¿Que hace cada uno?
www.postgis.net
Nos permite trabajar con tipos de datos espaciales en postgres implementando la matriz DE-9IM de predicados espaciales
Permite aplicar funciones espaciales a la logica de negocio a traves de plpgsql de postgres como por ejemplo st_intersects dentro de un trigger
Nos provee un standar para el manejo de datos espaciales dentro de la propia base de datos que inclusive soporta datos del tipo raster.
¿Que hace cada uno?
www.qgis.org
Es la interfaz que interactuá con el usuario para efectuar las actividades de trazado de redes de agua y alcantarillado mostrándole al usuario los datos espaciales de acuerdo a los criterios o temáticos que requiera
Permite al usuario interactuar con otros servicios como googlemaps, Google Street View, Openstreetmap, Bing, etc
El usuario puede agregar funcionalidades o plugins de acuerdo a sus requerimientos de trabajo
¿Que Hace Cada Uno?
Permite gestionar los perfiles usuarios por ejemplo Cadista, Operador de Catastro, Jefe de Catastro, Usuario de Consulta, Gerente, etc.
Almacena y mantiene actualizada la nformación para servirla al usuario a traves de las interfaces de escritorio, web o moviles
Garantiza la confiabilidad, seguridad, portabilidad y escalabilidad de la información
CONFIGURACIÓN
Desactivar Compresión Diferencial Remota
Elegir modo en que quieres que se entreguen las actualizaciones Desactivado
Retira aplicaciones preinstaladas que no uses.
Apagar servicios no utilizados
Desactiva servicios en segundo plano como one Drive
Si tienes 4 Gb de RAM o menos configura la memoria virtual a 1.5x y 3X la RAM como minimo y maximo.
WINDOWS
CONFIGURACIÓN
Agregar complementos:
Intersect It
CAD Digitize
Configurar el Auto ensamblado
Opcional puede agregar openlayers plugin y go2streetview para visualizar los servicios de google y otros proveedores
CONFIGURACIÓN
Adicionar scripts de auditoria completa para las tablas espacialesMuym importante guardar todas las operaciones (insert update delete)
Crear los perfiles y usuarios para trabajar con los datos espaciales (Edición, Consulta, otro que requiera)
Asignar los permisos a los perfiles de usuario de acuerdo a las tablas que va a utilizar.
QUE HAY POR DENTRO
● Extracto de plpgsql para Rotar Accesorios de Red de Agua● Extracto de plpgslq para Guardar Insert Update Delete● Extracto de plgsql para Borrar Accesorio● Extracto de plpgsql para Trazar Esquinero● Extracto de plpgsql para borrar Esquinero
Extracto Rotación para Tapon de Agua
if (new.tipo = 'TAPON') thenif (cuenta != 1) then
raise exception 'Registro incorrecto el Tapon se coloca solo en una tuberia final se encontraron % tuberias',cuenta;
elseif (cuenta = 1) thenIF (new.the_geom ~= finagua and rotagua <= 180) then
new.rotacion = rotagua + 90;end if;IF (new.the_geom ~= finagua and rotagua > 180) then
new.rotacion = rotagua - 270;end if;
elseraise exception 'Debe colocar el tapon en una tuberia';
end if;end if;
Extracto auditoria para guardar (insert update delete)
CREATE FUNCTION public.ap_accesorios_audit_upd() RETURNS trigger LANGUAGE 'plpgsql' COST 100 VOLATILE NOT LEAKPROOF STRICT ROWS 0AS $BODY$
DECLARE rows_affected INTEGER; BEGIN IF TG_OP = 'INSERT' THEN INSERT INTO ap_accesorios_audit (audit_action, audit_new) VALUES ('I', NEW ); RETURN NEW; ELSIF (TG_OP = 'DELETE') THEN INSERT INTO ap_accesorios_audit (audit_action, audit_new) VALUES ('D', OLD ); ELSIF (TG_OP = 'UPDATE') THEN INSERT INTO ap_accesorios_audit (audit_action, audit_old, audit_new) VALUES ('U', OLD , NEW );
Extracto auditoria para guardar (insert update delete)
RETURN NEW; ELSE RAISE EXCEPTION 'TG_OP % is none of INSERT, UPDATE or DELETE.', TG_OP; END IF; GET DIAGNOSTICS rows_affected = ROW_COUNT; IF rows_affected = 1 THEN IF TG_OP IN ('INSERT', 'UPDATE') THEN RETURN NEW; ELSE RETURN OLD; END IF; ELSE RAISE EXCEPTION 'INSERT failed on ap_accesorios_audit'; END IF; END $BODY$;
ALTER FUNCTION public.ap_accesorios_audit_upd() OWNER TO postgres;
Extracto para guardar (insert update delete)
-- DROP TRIGGER ap_accesorios_audit_upd ON public.ap_accesorios;
CREATE TRIGGER ap_accesorios_audit_upd BEFORE INSERT OR DELETE OR UPDATE ON public.ap_accesorios FOR EACH ROW EXECUTE PROCEDURE public.ap_accesorios_audit_upd();
Extracto para Trazar EsquineroCREATE FUNCTION public.trazo_esquinero2() RETURNS trigger LANGUAGE 'plpgsql' COST 100 VOLATILE NOT LEAKPROOF ROWS 0AS $BODY$
DECLARE distancia numeric;
BEGIN
distancia = (select valor_numero from parametros where tabla = 'ap_accesorios' and parametro = 'distancia' and activo = 1);delete from accesorio_mz3 where id_accesorio = NEW.gid;
insert into accesorio_mz3 (id_accesorio,id_manzana,punto)SELECT id_accesorio,id_manzana,(dp).geom as puntoFROM ( SELECT a.gid as id_accesorio,c.gid as id_manzana,ST_DumpPoints(c.the_geom) AS dp FROM cat_manzana c, ap_accesorios a WHERE ST_DWithin(a.the_geom,c.the_geom,distancia) and c.gid in (SELECT b.gid FROM ap_accesorios as d, cat_manzana as bWHERE ST_DWithin(d.the_geom,b.the_geom,distancia) and d.gid = a.gid and a.gid = new.gidGROUP BY a.gid,b.gid, a.tipo,b.nombre_municipal ) ) as foo;
delete from accesorio_mz4 where id_accesorio = NEW.gid;
Extracto para Trazar Esquineroinsert into accesorio_mz4 (id_accesorio,id_manzana,punto)select distinct on(punto) * from accesorio_mz3;delete from accesorio_mz7 where gid = NEW.gid;
insert into accesorio_mz7 (gid,id_manzana,tipo,geo1,st_distance)SELECT a.gid,b.id_manzana,a.tipo,b.punto, ST_Distance (a.the_geom, b.punto)FROM ap_accesorios as a, accesorio_mz4 as bWHERE ST_DWithin(a.the_geom,b.punto,distancia) and a.gid = new.gidGROUP BY a.gid,b.id_manzana,a.the_geom,b.punto, a.tipoorder by ST_Distance (a.the_geom, b.punto) desc;
delete from accesorio_mz8 where gid = new.gid;insert into accesorio_mz8 (gid,id_manzana,tipo,geo1,st_distance)select * from accesorio_mz7 where gid = new.gid order by st_distance limit 3;delete from ap_esquinero where ap_accesorio_id = new.gid;
insert into ap_esquinero (distancia,the_geom,ap_accesorio_id,tipo_accesorio)--select st_distance,ST_MakeLine(a.the_geom,st_GeomFromEWKT('SRID=32717;'||b.st_astext||'')),b.gid,b.tiposelect st_distance,ST_MakeLine(a.the_geom,b.geo1),b.gid,b.tipofrom ap_accesorios a join accesorio_mz8 b on a.gid = b.gidand a.gid = new.gid;
--select * from accesorio_mz3 where id_accesorio = 1610
RETURN NEW; END;
$BODY$;
Extracto Borrar Esquinero
CREATE FUNCTION public.delete_esquinero1() RETURNS trigger LANGUAGE 'plpgsql' COST 100 VOLATILE NOT LEAKPROOF ROWS 0AS $BODY$
DECLARE
BEGIN
delete from ap_esquinero where ap_accesorio_id = old.gid;
RETURN NEW; END;
$BODY$;