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

Printemps des cartes 2024

#1 Fri 21 March 2008 17:38

Pierre
DesCartesPourUnMondeMeilleur
Date d'inscription: 22 Sep 2005
Messages: 1643

[oracle] récupérer une liste de doublons

Aloha

Nous sommes sous Oracle Spatial et nous travaillons sur l'enrichissement de notre logiciel de consultation du PLU par les instructeurs de l'urba.
Nous avons ce genre de requête pour croiser différentes table

Code:

/*Rq avec le critère S, S/S >0.1*/
Select PARC.GID, RZPOS."zonage_U" as "ZONAGE", RZPOS."zone_UrG" as "ZONE", '51'||substr(PARC.IDENT,1,3) as "INSEE",
ltrim(substr(PARC.IDENT,7,2),'0') as "SECTION", ltrim(substr(PARC.IDENT,9,4),'0') as "NUMERO",
/*select count(PARC.GID)*/
round((SDO_GEOM.SDO_AREA(SDO_GEOM.SDO_INTERSECTION(PARC.GEOMETRY,RZPOS.GEOMETRY, 0.005),0.005)/(SDO_GEOM.SDO_AREA(PARC.GEOMETRY,0.005)))*100,3) " S INTERSECTION (%)",
round(SDO_GEOM.SDO_AREA(SDO_GEOM.SDO_INTERSECTION(PARC.GEOMETRY,RZPOS.GEOMETRY, 0.005),0.005)/1000000,3) " S INTERSECTION (m2)",
round((SDO_GEOM.SDO_LENGTH(SDO_GEOM.SDO_INTERSECTION(PARC.GEOMETRY,RZPOS.GEOMETRY,0.005),0.1)*0.2),4) "Px0.4/2 INT",
round(SDO_GEOM.SDO_AREA(PARC.GEOMETRY, 0.005)/1000000,2) "S PARCELLE en m2",
round(SDO_GEOM.SDO_LENGTH(SDO_GEOM.SDO_INTERSECTION(PARC.GEOMETRY,RZPOS.GEOMETRY,0.005),0.1)/1000,4) "P INTERSECTION (m)"
from A_REIMS.PP_RZPOS RZPOS, A_REIMS.PCI_PARC PARC, A_REIMS.PP_EMCTR EMP
    where  EMP."numero_e"='10'
    and SDO_FILTER(PARC.GEOMETRY,EMP.GEOMETRY)='TRUE'
    and (SDO_RELATE(RZPOS.GEOMETRY,PARC.GEOMETRY,'mask=contains querytype=WINDOW')='TRUE'
                OR SDO_RELATE(RZPOS.GEOMETRY,PARC.GEOMETRY,'mask=covers querytype=WINDOW')='TRUE'
                OR SDO_RELATE(RZPOS.GEOMETRY,PARC.GEOMETRY,'mask=overlapbdyintersect querytype=WINDOW')='TRUE'
             OR SDO_RELATE(RZPOS.GEOMETRY,PARC.GEOMETRY,'mask=equal querytype=WINDOW')='TRUE')
    and round((SDO_GEOM.SDO_AREA(SDO_GEOM.SDO_INTERSECTION(PARC.GEOMETRY,RZPOS.GEOMETRY, 0.005),0.005)/(SDO_GEOM.SDO_AREA(PARC.GEOMETRY,0.005)))*100,3)>0.1
    and round(SDO_GEOM.SDO_AREA(SDO_GEOM.SDO_INTERSECTION(PARC.GEOMETRY,RZPOS.GEOMETRY, 0.005),0.005)/1000000,3)>0.1
       and substr(PARC.IDENT,1,3)='454';

Ce que je souhaite c'est lancer cette requête mais qu'elle ne me sorte que les enregistrements en double (i.e. même section, même numéro de parcelle) et non tous les enregistrements. Mais tous les doublons avec les valeurs de S intersection, de Zonage_U,...

Quelqu'un a-t'il une idée ?

Une fois la requête exécutée nous utilisons les résultats pour visualiser dans APIC les collections d'objets posant problèmes et arbitrer.

D'avance merci,

Dernière modification par Brindavoine (Fri 21 March 2008 17:39)


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

 

#2 Tue 25 March 2008 13:44

Cartosig
Participant assidu
Date d'inscription: 16 Oct 2006
Messages: 222

Re: [oracle] récupérer une liste de doublons

La méthode classique pour sortir les doublons d'une requête c'est de faire un group by ... having count(*) > 1, mais vous la connaissez surement...
Etant donné la longueur et la complexité de votre requête ça va être assez pénible a écrire, de plus comme il y a des requêtes spatiales je pense que ça ne fonctionnera tout simplement pas !

Une solution possible pourrait être d'englober la requête dans un select sur un seul des champs (le plus discriminant évidemment), et de faire le group by sur ce champ. Par exemple :

Code:

Select PARC.GID, count(*) from ([i]votre requete[/i]) group by PARC.GID having count(*)>1

C'est une piste, je ne garanti pas que ça fonctionne...
Je vous conseille de poster votre question sur le forum Oracle de Developpez.com !

Hors ligne

 

#3 Wed 26 March 2008 10:51

Pierre
DesCartesPourUnMondeMeilleur
Date d'inscription: 22 Sep 2005
Messages: 1643

Re: [oracle] récupérer une liste de doublons

Solution testée.

Code:

/*Rq avec le critère pour ressortir les doublons*/
Select PARC.GID, count(*)
from A_REIMS.PCI_PARC PARC,
(select PARC.GID, RZPOS."zonage_U" as "ZONAGE", RZPOS."zone_UrG" as "ZONE", '51'||substr(PARC.IDENT,1,3) as "INSEE",
ltrim(substr(PARC.IDENT,7,2),'0') as "SECTION", ltrim(substr(PARC.IDENT,9,4),'0') as "NUMERO",
round((SDO_GEOM.SDO_AREA(SDO_GEOM.SDO_INTERSECTION(PARC.GEOMETRY,RZPOS.GEOMETRY, 0.005),0.005)/(SDO_GEOM.SDO_AREA(PARC.GEOMETRY,0.005)))*100,3) " S INTERSECTION (%)",
round(SDO_GEOM.SDO_AREA(SDO_GEOM.SDO_INTERSECTION(PARC.GEOMETRY,RZPOS.GEOMETRY, 0.005),0.005)/1000000,3) " S INTERSECTION (m2)",
round((SDO_GEOM.SDO_LENGTH(SDO_GEOM.SDO_INTERSECTION(PARC.GEOMETRY,RZPOS.GEOMETRY,0.005),0.1)*0.2),4) "Px0.4/2 INT",
round(SDO_GEOM.SDO_AREA(PARC.GEOMETRY, 0.005)/1000000,2) "S PARCELLE en m2",
round(SDO_GEOM.SDO_LENGTH(SDO_GEOM.SDO_INTERSECTION(PARC.GEOMETRY,RZPOS.GEOMETRY,0.005),0.1)/1000,4) "P INTERSECTION (m)"
from A_REIMS.PP_RZPOS RZPOS, A_REIMS.PCI_PARC PARC, A_REIMS.PP_EMCTR EMP
    where  EMP."numero_e"='10'
    and SDO_FILTER(PARC.GEOMETRY,EMP.GEOMETRY)='TRUE'
    and (SDO_RELATE(RZPOS.GEOMETRY,PARC.GEOMETRY,'mask=contains querytype=WINDOW')='TRUE'
                OR SDO_RELATE(RZPOS.GEOMETRY,PARC.GEOMETRY,'mask=covers querytype=WINDOW')='TRUE'
                OR SDO_RELATE(RZPOS.GEOMETRY,PARC.GEOMETRY,'mask=overlapbdyintersect querytype=WINDOW')='TRUE'
             OR SDO_RELATE(RZPOS.GEOMETRY,PARC.GEOMETRY,'mask=equal querytype=WINDOW')='TRUE')
    and round((SDO_GEOM.SDO_AREA(SDO_GEOM.SDO_INTERSECTION(PARC.GEOMETRY,RZPOS.GEOMETRY, 0.005),0.005)/(SDO_GEOM.SDO_AREA(PARC.GEOMETRY,0.005)))*100,3)>0.1
    and round(SDO_GEOM.SDO_AREA(SDO_GEOM.SDO_INTERSECTION(PARC.GEOMETRY,RZPOS.GEOMETRY, 0.005),0.005)/1000000,3)>0.1
       and substr(PARC.IDENT,1,3)='454')
group by PARC.GID
having count(*)>1 ;

Problème j'obtiens toutes mes parcelles. Toutes les parcelles de mon agglomération alors qu'il y a deux trois critères de requêtes géographiques. Et le count est égal au nombre de parcelles intersectant l'emprise.

Une idée ?


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 Wed 26 March 2008 11:44

Cartosig
Participant assidu
Date d'inscription: 16 Oct 2006
Messages: 222

Re: [oracle] récupérer une liste de doublons

J'ai fait une erreur dans mon message précédent. La requête serait plutôt :

Code:

Select A.GID, count(*) from ([i]votre requete[/i]) A group by A.GID having count(*)>1

L'idée étant de regrouper par entité (ID de commune par ex) les enregistrement ramenés plus d'une fois par le Select de la requête fille.

(dans le test que vous avez fait, le select ramène toutes les PARC.GID car vous faite un select sur deux ensembles : toute la table PARC d'abord, plus l'ensemble composé par votre requête. Mais il n'y a pas de critère de corrélation entre ces deux ensembles)

Dernière modification par Cartosig (Wed 26 March 2008 11:45)

Hors ligne

 

Pied de page des forums

Powered by FluxBB