PostgreSQL - FUNCION DE COLINDANCIAS EN POSTGRESQL Y POSTGIS

   
Vista:
Imágen de perfil de bit

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
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
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder