Aloha
J'ai créé une requête pour effectuer différents calculs sur des intersections d'objets :
Cependant, comme mon indicateur S INT / P INT est un rapport, et que mon filtre est anyinteract, j'ai un problème de division par 0.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 select parc.IDENT, pos.GID, pos.ZONAGE_U as "ZONAGE", pos.ZONE_URG as "ZONE", substr(parc.IDENT,1,3) as "INSEE", substr(parc.IDENT,7,2) as "SECTION", substr(parc.IDENT,9,4) AS "NUMERO", round((SDO_GEOM.SDO_AREA(SDO_GEOM.SDO_INTERSECTION(parc.GEOMETRY,pos.GEOMETRY, 0.005),0.005)/(SDO_GEOM.SDO_AREA(parc.GEOMETRY,0.005)))*100,2) " SURFACE D'INTERSECTION (%)", round((SDO_GEOM.SDO_AREA(SDO_GEOM.SDO_INTERSECTION(parc.GEOMETRY,pos.GEOMETRY, 0.005),0.005))/1000000,2) " SURFACE D'INTERSECTION (m2)", round(SDO_GEOM.SDO_AREA(parc.GEOMETRY, 0.005)/1000000,2) "SURFACE PARCELLE en m2", round(SDO_GEOM.SDO_LENGTH(SDO_GEOM.SDO_INTERSECTION(parc.GEOMETRY,pos.GEOMETRY,0.005),0.1)/1000,4) "P INT en M", round(((SDO_GEOM.SDO_AREA(SDO_GEOM.SDO_INTERSECTION(parc.GEOMETRY,pos.GEOMETRY, 0.005),0.005)) /(SDO_GEOM.SDO_LENGTH(SDO_GEOM.SDO_INTERSECTION(parc.GEOMETRY,pos.GEOMETRY,0.005),0.1),0.1)),4) "S INT / P INT" from A_REIMS.PP_RZPOS pos, A_REIMS.PCI_PARC parc, A_REIMS.PP_EMCTR empctr where empctr.numero_e='10' and SDO_FILTER(parc.GEOMETRY,empctr.GEOMETRY)='TRUE' and SDO_ANYINTERACT(pos.GEOMETRY,parc.GEOMETRY)='TRUE';
J'ai essayé de modifier ma requête en :
Mais là çà n'a pas l'air de mieux fonctionner puisqu'il semble qu'une parenthèse manque à l'appel, et si j'enlève mon S INT / P INT, la requête prend des plombes à tourner.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 select parc.IDENT, zpos.GID, zpos.ZONAGE_U as "ZONAGE", zpos.ZONE_URG as "ZONE", substr(parc.IDENT,1,3) as "INSEE", substr(parc.IDENT,7,2) as "SECTION", substr(parc.IDENT,9,4) AS "NUMERO", round((SDO_GEOM.SDO_AREA(SDO_GEOM.SDO_INTERSECTION(parc.GEOMETRY,zpos.GEOMETRY, 0.005),0.005)/(SDO_GEOM.SDO_AREA(parc.GEOMETRY,0.005)))*100,2) " SURFACE D'INTERSECTION (%)", round((SDO_GEOM.SDO_AREA(SDO_GEOM.SDO_INTERSECTION(parc.GEOMETRY,zpos.GEOMETRY, 0.005),0.005))/1000000,2) " SURFACE D'INTERSECTION (m2)", round(SDO_GEOM.SDO_AREA(parc.GEOMETRY, 0.005)/1000000,2) "SURFACE PARCELLE en m2", round(SDO_GEOM.SDO_LENGTH(SDO_GEOM.SDO_INTERSECTION(parc.GEOMETRY,zpos.GEOMETRY,0.005),0.1)/1000,4) "P INT en M", round(((SDO_GEOM.SDO_AREA(SDO_GEOM.SDO_INTERSECTION(parc.GEOMETRY,zpos.GEOMETRY, 0.005),0.005)) /(SDO_GEOM.SDO_LENGTH(SDO_GEOM.SDO_INTERSECTION(parc.GEOMETRY,zpos.GEOMETRY,0.005),0.1),0.1)),4) "S INT / P INT" from A_REIMS.PP_RZPOS zpos, A_REIMS.PCI_PARC parc, A_REIMS.PP_EMCTR empctr where empctr.numero_e='10' and SDO_FILTER(parc.GEOMETRY,empctr.GEOMETRY)='TRUE' and SDO_RELATE(zpos.GEOMETRY,parc.GEOMETRY,'mask=inside OR coveredby OR overlabdyintersect OR equal querytype=WINDOW')<>'FALSE';
D'avance merci à ceux qui m'aideront soit à debugger, soit à trouver une voie pour obtenir une requête qui tourne.
----------
Après debuggage et retour sur les étapes, la requête ci dessus tourne bien.
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 /*Rq pour créer les collection */ select parc.IDENT, zpos.GID, zpos.ZONAGE_U as "ZONAGE", zpos.ZONE_URG as "ZONE", substr(parc.IDENT,1,3) as "INSEE", substr(parc.IDENT,7,2) as "SECTION", substr(parc.IDENT,9,4) AS "NUMERO", round((SDO_GEOM.SDO_AREA(SDO_GEOM.SDO_INTERSECTION(parc.GEOMETRY,zpos.GEOMETRY, 0.005),0.005)/(SDO_GEOM.SDO_AREA(parc.GEOMETRY,0.005)))*100,2) " SURFACE D'INTERSECTION (%)", round((SDO_GEOM.SDO_AREA(SDO_GEOM.SDO_INTERSECTION(parc.GEOMETRY,zpos.GEOMETRY, 0.005),0.005))/1000000,2) " SURFACE D'INTERSECTION (m2)", round(SDO_GEOM.SDO_AREA(parc.GEOMETRY, 0.005)/1000000,2) "SURFACE PARCELLE en m2", round(SDO_GEOM.SDO_LENGTH(SDO_GEOM.SDO_INTERSECTION(parc.GEOMETRY,zpos.GEOMETRY,0.005),0.1)/1000,4) "P INT en M", round((SDO_GEOM.SDO_AREA(SDO_GEOM.SDO_INTERSECTION(parc.GEOMETRY,zpos.GEOMETRY, 0.005),0.005)) /(SDO_GEOM.SDO_LENGTH(SDO_GEOM.SDO_INTERSECTION(parc.GEOMETRY,zpos.GEOMETRY,0.005),0.1)),4) "S INT / P INT", SDO_RELATE(zpos.GEOMETRY,parc.GEOMETRY,'mask=DETERMINE querytype=WINDOW') as "RELATION ZONEPOS_PARCELLE" from A_REIMS.PP_RZPOS zpos, A_REIMS.PCI_PARC parc, A_REIMS.PP_EMCTR empctr where empctr.numero_e='10' and SDO_FILTER(parc.GEOMETRY,empctr.GEOMETRY)='TRUE' AND (SDO_RELATE(zpos.GEOMETRY,parc.GEOMETRY,'mask=contains querytype=WINDOW')='TRUE' OR SDO_RELATE(zpos.GEOMETRY,parc.GEOMETRY,'mask=covers querytype=WINDOW')='TRUE' OR SDO_RELATE(zpos.GEOMETRY,parc.GEOMETRY,'mask=overlapbdyintersect querytype=WINDOW')='TRUE' OR SDO_RELATE(zpos.GEOMETRY,parc.GEOMETRY,'mask=equal querytype=WINDOW')='TRUE');
Partager