› Fóruns › Banco de dados Oracle › TKPROF › TKPROF
O GET_INTERSECTION_POLYGON é uma FUNCTION, abaixo o código dela:
CREATE OR REPLACE FUNCTION HOR.get_intersection_polygon(p_poligono1 IN MDSYS.SDO_GEOMETRY, p_poligono2 IN MDSYS.SDO_GEOMETRY)
RETURN SDO_GEOMETRY IS
v_pol_valido NUMBER := 0;
v_sdo_gtype NUMBER := 0;
v_pol_inter SDO_GEOMETRY := null;
v_poligono SDO_GEOMETRY := null;
v_pol_final SDO_GEOMETRY := null;
num_elems NUMBER := 0;
area_pol_inv NUMBER;
BEGIN
v_pol_inter := SDO_GEOM.SDO_INTERSECTION(p_poligono1, p_poligono2, MISC.get_tol_inf_esp_cruzamentos);
IF v_pol_inter IS NOT NULL THEN
v_pol_valido := VALIDATE_GEOMETRY_SDO(v_pol_inter); — validar geometria de intercepção
IF v_pol_valido 1 THEN — se poligono de intercepção invalido tentar corrigir o poligono
v_pol_inter := SDO_UTIL.REMOVE_DUPLICATE_VERTICES (v_pol_inter, MISC.get_tol_inf_esp);– MISC.get_tol_inf_esp_simplify
v_pol_inter := SDO_UTIL.SIMPLIFY(v_pol_inter,MISC.get_tol_inf_esp_simplify,MISC.get_tol_inf_esp_simplify);
v_pol_valido := VALIDATE_GEOMETRY_SDO(v_pol_inter);
IF v_pol_valido 1 THEN
area_pol_inv := SDO_GEOM.sdo_area(v_pol_inter, MISC.get_tol_inf_esp_cruzamentos);
IF area_pol_inv < 4.5 THEN
RETURN NULL;
ELSE
–RAISE_APPLICATION_ERROR( -20000,'ERRO : HOR.get_intersection_polygon – poligono inválido');
IF (area_pol_inv < 10) THEN
v_pol_inter := SDO_UTIL.REMOVE_DUPLICATE_VERTICES (v_pol_inter, MISC.get_tol_inf_esp);– MISC.get_tol_inf_esp_simplify
v_pol_inter := SDO_UTIL.SIMPLIFY(v_pol_inter, MISC.get_tol_inf_esp_simplify, MISC.get_tol_inf_esp_simplify); — <– tolerancia para contornar erro
v_pol_valido := VALIDATE_GEOMETRY_SDO(v_pol_inter);
IF v_pol_valido 1 THEN
RAISE_APPLICATION_ERROR( -20000,’ERRO : HOR.get_intersection_polygon – poligono inválido’);
END IF;
ELSE
RAISE_APPLICATION_ERROR( -20000,’ERRO : HOR.get_intersection_polygon – poligono inválido’);
END IF;
—
END IF;
END IF;
END IF;
v_sdo_gtype := v_pol_inter.SDO_GTYPE;–obter tipo de geometria do poligono de intercepção
IF v_sdo_gtype IN (2003, 2007) THEN — se geometria de intercepção é poligono ou multipoligono retorna o poligono ou multipoligono
RETURN v_pol_inter;
ELSIF v_sdo_gtype IN (2001,2002,2005,2006) THEN — se geometria de intercepção é ponto,linha,multiponto ou multilinha retorna null
RETURN null;
ELSIF v_sdo_gtype = 2004 THEN — se geometria de intercepção é uma colecção, criar multipoligono com a união dos poligonos da colecção
num_elems := SDO_UTIL.GETNUMELEM(v_pol_inter);
FOR i IN 1..num_elems
LOOP
v_poligono := SDO_UTIL.EXTRACT(v_pol_inter,i);
v_sdo_gtype := v_poligono.SDO_GTYPE;
IF v_sdo_gtype IN (2003,2007) THEN — se a geometria da colecção de geometrias é poligono ou multipoligono
v_pol_final := SDO_GEOM.SDO_UNION(v_pol_final, v_poligono, MISC.get_tolerancia_inf_espacial);
ELSIF v_sdo_gtype = 2004 THEN — em pricípio não entra neste troço pois segundo doc. oracle uma colecção não contem outra colecção
RAISE_APPLICATION_ERROR( -20000,’ERRO : HOR.get_intersection_polygon – colecção contem outra colecção!’);
END IF;
END LOOP;
v_pol_inter := v_pol_final;
END IF;
END IF;
RETURN v_pol_inter;
END get_intersection_polygon;
Existe alguma ferramenta em que eu possa analisar esse código? E assim obter caminhos alternativos ou melhorias?