|
Nouveau Membre du Club
Architecte de système d'information Inscription : janvier 2008 Messages : 107 Détails du profil  Informations personnelles : Âge : 33 Localisation : Macao Informations professionnelles :
Activité : Architecte de système d'information Informations forums :
Inscription : janvier 2008 Messages : 107 Points : 37 Points : 37
|
[Oracle Spatial 10] Division par Zéro !
Aloha
J'ai créé une requête pour effectuer différents calculs sur des intersections d'objets :
Code :
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'; |
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.
J'ai essayé de modifier ma requête en :
Code :
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'; |
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.
D'avance merci à ceux qui m'aideront soit à debugger, soit à trouver une voie pour obtenir une requête qui tourne.
----------
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
| /*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'); |
Après debuggage et retour sur les étapes, la requête ci dessus tourne bien.
|