Pular para o conteúdo

Fóruns Banco de dados Oracle TKPROF TKPROF

#88630
ramasine
Participante

    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?