Nous utilisons des cookies pour vous garantir la meilleure expérience sur notre site. Si vous continuez à utiliser ce dernier, nous considèrerons que vous acceptez l'utilisation des cookies. J'ai compris ! ou En savoir plus !.
banniere

Le portail francophone de la géomatique


Toujours pas inscrit ? Mot de passe oublié ?
Nom d'utilisateur    Mot de passe              Toujours pas inscrit ?   Mot de passe oublié ?

Annonce

Rencontres QGIS 2025

L'appel à participation est ouvert jusqu'au 19 janvier 2025!

#1 Thu 08 July 2010 17:09

emilk
Participant occasionnel
Lieu: Wasquehal
Date d'inscription: 8 Dec 2005
Messages: 31
Site web

[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

emilk a écrit:

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

emilk
Participant occasionnel
Lieu: Wasquehal
Date d'inscription: 8 Dec 2005
Messages: 31
Site web

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

emilk a écrit:

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

 

Pied de page des forums

Powered by FluxBB