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 :
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.
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;
Merci d'avance pour vos réponses,
Partager