#1 Thu 08 July 2010 17:09
[oracle] test centroid contenu dans polygone
Bonjour,
J'ai 2 polygones A et B. Les polygones A contiennent les polygones B.
Je veux tester si le centroid des polygones B est contenu dans les polygones A.
Je fais cela car le dessin des polygones B dépassent des polygones A.(topologie non parfaite).
1// Je réussi à trouver les centroid:
Code:
SELECT SDO_GEOM.SDO_CENTROID(c.GEOMETRY, m.diminfo) GEOMETRY FROM MATABLE c, user_sdo_geom_metadata m WHERE m.table_name = 'MATABLE' AND m.column_name = 'GEOMETRY' AND GID='5659'
2// Je réussi à trouver les polygones B contenu dans les polygones A:
Code:
select * from apicadm.MATABLE where mdsys.sdo_relate(MATABLE.geometry,(select geometry from apicadm.vue_commune where "NOM"='SANCOURT'),'mask=INSIDE querytype=JOIN')='TRUE';
3//Par contre si j'essaye d'imbriquer les deux requêtes, cela ne fonctionne pas.
Surement parce que la GEOMETRY renvoyée est de type point et que SDO_relate recherche une geométry polygonale.
Code:
select * from apicadm.MATABLE where mdsys.sdo_relate((SELECT SDO_GEOM.SDO_CENTROID(c.GEOMETRY, m.diminfo) GEOMETRY FROM MATABLE c, user_sdo_geom_metadata m WHERE m.table_name = 'MATABLE' AND m.column_name = 'GEOMETRY' AND GID='5659'),(select geometry from apicadm.vue_commune where "NOM"='SANCOURT'),'mask=INSIDE querytype=JOIN')='TRUE';
Si tu ne sais pas où tu vas. Prends n'importe quel chemin, il t'y emmènera.
Hors ligne
#2 Thu 08 July 2010 17:43
- Nicolas Ribot
- Membre
- Lieu: Toulouse
- Date d'inscription: 9 Sep 2005
- Messages: 1554
Re: [oracle] test centroid contenu dans polygone
Bonjour,
J'ai 2 polygones A et B. Les polygones A contiennent les polygones B.
Je veux tester si le centroid des polygones B est contenu dans les polygones A.
Je fais cela car le dessin des polygones B dépassent des polygones A.(topologie non parfaite).
1// Je réussi à trouver les centroid:Code:
SELECT SDO_GEOM.SDO_CENTROID(c.GEOMETRY, m.diminfo) GEOMETRY FROM MATABLE c, user_sdo_geom_metadata m WHERE m.table_name = 'MATABLE' AND m.column_name = 'GEOMETRY' AND GID='5659'2// Je réussi à trouver les polygones B contenu dans les polygones A:
Code:
select * from apicadm.MATABLE where mdsys.sdo_relate(MATABLE.geometry,(select geometry from apicadm.vue_commune where "NOM"='SANCOURT'),'mask=INSIDE querytype=JOIN')='TRUE';3//Par contre si j'essaye d'imbriquer les deux requêtes, cela ne fonctionne pas.
Surement parce que la GEOMETRY renvoyée est de type point et que SDO_relate recherche une geométry polygonale.Code:
select * from apicadm.MATABLE where mdsys.sdo_relate((SELECT SDO_GEOM.SDO_CENTROID(c.GEOMETRY, m.diminfo) GEOMETRY FROM MATABLE c, user_sdo_geom_metadata m WHERE m.table_name = 'MATABLE' AND m.column_name = 'GEOMETRY' AND GID='5659'),(select geometry from apicadm.vue_commune where "NOM"='SANCOURT'),'mask=INSIDE querytype=JOIN')='TRUE';
bonsoir,
Quel est le message d'erreur Oracle ?
Sinon, passer par des sous requetes dans la clause from, au lieu de mettre les sous requetes directement dans les methodes, peut etre.
Nicolas
En ligne
#3 Thu 08 July 2010 17:54
- Pierre
- DesCartesPourUnMondeMeilleur
- Date d'inscription: 22 Sep 2005
- Messages: 1643
Re: [oracle] test centroid contenu dans polygone
Bonjour
Première remarque, pas de select dans un select sauf si il y a FROM entre les deux. (il y a d'autres exceptions).
Deuxième remarque, il est plus facile de lire une requête mise en forme.
Je pense que SDO_GEOM.RELATE ou SDO_ANYINTERACT sera plus efficace :
Code:
SELECT * FROM apicadm.MATABL, apicadm.vue_commune COMMUNE, user_sdo_geom_metadata m WHERE SDO_ANYINTERACT (COMMUNE.geometry, (SDO_GEOM.SDO_CENTROID (c.GEOMETRY, m.diminfo))) = 'TRUE' AND COMMUNE."NOM" = 'SANCOURT' AND m.table_name = 'MATABLE' AND m.column_name = 'GEOMETRY' AND GID = '5659';
Cordialement,
Dernière modification par Pierre (Thu 08 July 2010 17:54)
art X I. Déclaration des Droits de l’Homme et du Citoyen 1789
La libre communication des pensées et des opinions est un des droits les plus précieux de l’Homme : tout Citoyen peut donc parler, écrire, imprimer librement, sauf à répondre de l’abus de cette liberté, dans les cas déterminés par la Loi.
Hors ligne
#4 Fri 09 July 2010 11:52
Re: [oracle] test centroid contenu dans polygone
1// il YA UN FROM ENTRE LES DEUX
2// vOICI UNE REQUETE QUI FONCTIONNE, avec une mise en forme agréable...
Cette requête fonctionne:
Code:
SELECT SDO_GEOM.RELATE ( (SELECT SDO_GEOM.SDO_CENTROID(c.GEOMETRY, m.diminfo) GEOMETRY FROM MATABLE c, user_sdo_geom_metadata m WHERE m.table_name = 'MATABLE' AND m.column_name = 'GEOMETRY' AND GID='5659'), 'anyinteract', COMMUNE.GEOMETRY, 0.005) FROM MATABLE,COMMUNE WHERE COMMUNE."Nom"='SANCOURT' AND MATABLE.GID = '5659';
Dernière modification par emilk (Fri 09 July 2010 11:55)
Si tu ne sais pas où tu vas. Prends n'importe quel chemin, il t'y emmènera.
Hors ligne
#5 Sun 11 July 2010 12:00
- Pierre
- DesCartesPourUnMondeMeilleur
- Date d'inscription: 22 Sep 2005
- Messages: 1643
Re: [oracle] test centroid contenu dans polygone
1// il YA UN FROM ENTRE LES DEUX
2// vOICI UNE REQUETE QUI FONCTIONNE, avec une mise en forme agréable...
Cette requête fonctionne:Code:
SELECT SDO_GEOM.RELATE ( (SELECT SDO_GEOM.SDO_CENTROID(c.GEOMETRY, m.diminfo) GEOMETRY FROM MATABLE c, user_sdo_geom_metadata m WHERE m.table_name = 'MATABLE' AND m.column_name = 'GEOMETRY' AND GID='5659'), 'anyinteract', COMMUNE.GEOMETRY, 0.005) FROM MATABLE,COMMUNE WHERE COMMUNE."Nom"='SANCOURT' AND MATABLE.GID = '5659';
1/ Je ne pense toujours pas que votre syntaxe respectent les canons du SQL. Et l'effiscience de votre requête pourrait s'en ressentir sur des traitements de lots importants de données.
2/ En effet plus lisible.
art X I. Déclaration des Droits de l’Homme et du Citoyen 1789
La libre communication des pensées et des opinions est un des droits les plus précieux de l’Homme : tout Citoyen peut donc parler, écrire, imprimer librement, sauf à répondre de l’abus de cette liberté, dans les cas déterminés par la Loi.
Hors ligne