Bonjour,

je suis en train de rédiger une fonction qui me permettra d'attribuer un code INSEE à des tronçons (géométrie linéaire) via une requête spatiale, mais j'ai un soucis pour traiter tous les cas.

Ma fonction doit traiter plusieurs cas :
- Si le centroïde d'un tronçon se trouve dans une commune ;
- Sinon si plus de 50% du tronçon se trouve dans la commune (pratique pour les tronçons situés en bordure de mes communes, dont le centroïde n'est pas compris dans mes communes et qui intersecte plusieurs communes) ;
- Sinon j'attribue le code INSEE de la commune au tronçon qui l'intersecte (une fois les deux premiers tests passés normalement cette requête renvoie un seul résultat pour chaque tronçon) ;

Problème : la fonction que j'ai écrite se compile, mais je n'arrive pas à faire fonctionner la troisième condition : Pour l'instant j'ai réussi à attribuer un code insee quant le centroïde d'un tronçon se trouve dans une commune, ou quand plus de 50% d'un tronçon se trouve dans une commune. Cependant une fois que ces deux test ont été passé j'aimerai pouvoir attribuer à un tronçon le code insee de la commune qu'il intersecte et là, je bloque.
C'est manifestement un problème de logique, mais je ne vois pas où ça coince, du coup si quelqu'un a déjà été confronté à ce problème ou dispose de pistes de réflexion, je suis preneur.

Voici le code en question :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
create or replace FUNCTION GET_CODE_INSEE(v_table_name VARCHAR2, v_geometry SDO_GEOMETRY) RETURN CHAR
DETERMINISTIC
    As
    v_code_insee CHAR(8);
    BEGIN
 
        SELECT 
            b.code_insee INTO v_code_insee 
        FROM 
            MON_SCHEMA.MA_TABLE_DES_COMMUNE b, 
            USER_SDO_GEOM_METADATA m
        WHERE
            m.table_name = v_table_name
            AND SDO_CONTAINS(
                    b.geom,
                    SDO_LRS.CONVERT_TO_STD_GEOM(
                        SDO_LRS.LOCATE_PT(
                                        SDO_LRS.CONVERT_TO_LRS_GEOM(v_geometry,m.diminfo),
                                        SDO_GEOM.SDO_LENGTH(v_geometry,m.diminfo)/2
                        )
                    )
                )='TRUE';
 
        RETURN v_code_insee;
    EXCEPTION
        WHEN NO_DATA_FOUND THEN
            IF v_code_insee IS NULL THEN
                SELECT 
                    b.code_insee INTO v_code_insee 
                FROM 
                    G_REFERENTIEL.MEL_COMMUNE b, 
                    USER_SDO_GEOM_METADATA m
                WHERE
                    m.table_name = v_table_name
                    AND SDO_GEOM.SDO_LENGTH(SDO_GEOM.SDO_INTERSECTION(v_geometry, b.geom, 0.005))/ SDO_GEOM.SDO_LENGTH(v_geometry,m.diminfo)*100 > 50;
            ELSE
                SELECT 
                    b.code_insee INTO v_code_insee 
                FROM 
                    G_REFERENTIEL.MEL_COMMUNE b
                WHERE
                    SDO_FILTER(b.geom, v_geometry) = 'TRUE';
            END IF;
            RETURN v_code_insee;
    END GET_CODE_INSEE;
Je pense que mon erreur se situe dans l'utilisation de la condition IF-THEN-ELSE ou dans le WHEN NOT_DATA_FOUND, mais je ne vois pas comment régler la situation.

Merci d'avance pour vos réponses,