
FUNCION DE COLINDANCIAS EN POSTGRESQL Y POSTGIS
Publicado por bit (4 intervenciones) el 09/11/2013 17:21:58
ESTOY TRATANDO DE CREAR UNA FUNCION QUE DEVUELVA LAS COLINDANCIAS(VECINOS) DE UN POLIGONO (TERRENO), TENGO MUCHOS PROBLEMAS PORQUE SOY NOVATO EN POSGRESQL PERO CON LOS PUNTOS (4 PUNTOS) DE UN POLIGONO ENCONTRAR LOS POLIGONOS QUE ESTAN POR ENCIMA(NORTE) O ABAJO(SUR) AYUDENME A CORREGIR MIS ERRORES:
-p_codigo_catastral es un valor que identifica al terreno
-quiero poner los resultados en un array:["numero_lote","orientacion",.."numero_loteN","orientaciónN"] Ej: ["1","Norte","3","Sur"], etc
-p_codigo_catastral es un valor que identifica al terreno
-quiero poner los resultados en un array:["numero_lote","orientacion",.."numero_loteN","orientaciónN"] Ej: ["1","Norte","3","Sur"], etc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
CREATE OR REPLACE FUNCTION mapa.b_colindancias(p_codigo_catastral character varying)
RETURNS SETOF record AS
$BODY$
DECLARE
registro RECORD;
reg2 RECORD;
vresultado TEXT[]:='{}';
--i int:=1;
--mi_arreglo: = mi_arreglo | | ARRAY [[rec.dato1 :: texto, rec.dato2 :: text]];
BEGIN
RAISE NOTICE 'mostrando registro:...';
-- i=1;
FOR registro IN
SELECT i.codigo_catastral,i.numero_lote
FROM mapa.inmueble AS i
JOIN mapa.inmueble AS i2
ON ST_DWithin(i2.the_geom,i.the_geom,8)
WHERE i2.codigo_catastral=p_codigo_catastral
LOOP
--si es diferente al codigo catastral pivote trabajar con los otros codigos catastrales
IF registro.codigo_catastral<>p_codigo_catastral THEN
RAISE NOTICE 'codigo_catastral: %s..', quote_ident(registro.numero_lote);
SELECT st_xmin(i.the_geom)::numeric as xmin INTO registro from mapa.inmueble as i where i.codigo_catastral=quote_literal(p_codigo_catastral);
RAISE NOTICE 'el punto: %s..', (registro.punto)::numeric;
--sacar 4 puntos de el poligono
SELECT st_xmin(i.the_geom)::numeric as xmin INTO registro from mapa.inmueble as i where i.codigo_catastral=quote_literal(p_codigo_catastral);
SELECT st_ymin(i.the_geom)::numeric as ymin INTO registro from mapa.inmueble as i where i.codigo_catastral=quote_literal(p_codigo_catastral);
SELECT st_xmax(i.the_geom)::numeric as xmax INTO registro from mapa.inmueble as i where i.codigo_catastral=quote_literal(p_codigo_catastral);
SELECT st_ymax(i.the_geom)::numeric as ymax INTO registro from mapa.inmueble as i where i.codigo_catastral=quote_literal(p_codigo_catastral);
--hacer las comparaciones para introduccir al vector_resultado
IF(reg2.ymax>=registro.ymin)THEN
RAISE NOTICE 'Norte:', quote_ident(registro.numero_lote);
--vresultado[i]='Norte';
--vresultado[i+1]=quote_indent(registro.nuemro_lote);
--asignar al vector la orientacion y el numero_lote
END IF;
IF(reg2.ymin<=registro.ymax)THEN
RAISE NOTICE 'Sur:',quote_ident(registro.numero_lote);
END IF;
IF(reg2.xmax<=registro.xmin)THEN
RAISE NOTICE 'Oeste:',quote_ident(registro.numero_lote);
END IF;
IF(reg2.xmin>=registro.xmax)THEN
RAISE NOTICE 'Este:',quote_ident(registro.numero_lote);
END IF;
END IF;
--i=i+2;
-- Now "registro" has one record from cs_materialized_views
--EXECUTE 'TRUNCATE TABLE ' || quote_ident(registro.codigo_catastral);
--EXECUTE 'INSERT INTO '
-- || quote_ident(registro.codigo_catastral) || ' '
-- || registro.mv_query;
END LOOP;
RAISE NOTICE 'fuera: %s...', quote_ident((reg2.punto)::varchar);
--RETURN; -- FINALIZA O INDICA QUE usado si se ha definido variables de entrada y salida
--RETURN QUERY EXECUTE sql; -- cuando tenemos que devolver REGISTROS DE LA VARIABLE: sql
RETURN NEXT registro;--RETORNA EL VALOR DE LA VARIABLE "registro"
--RETURN NEXT reg2;
END;
$BODY$
LANGUAGE plpgsql VOLATILE
Valora esta pregunta


0