Fonction permettant d'attribuer un code à un objet via une requête spatiale
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:
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,